form.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441
  1. <template>
  2. <view>
  3. <view class="padding-sm bg-red text-center" v-if="form.usernumber>0 && form.form_log_count>=form.usernumber">因提交次数过多,您已不能再提交该表单</view>
  4. <view class="bg-white padding solids-bottom">
  5. <view class="cu-steps">
  6. <view class="cu-item" :class="0>stepsnum?'':'text-blue'">
  7. <text class="num" data-index="1"></text> 说明
  8. </view>
  9. <view class="cu-item" :class="1>stepsnum?'':'text-blue'">
  10. <text class="num" data-index="2"></text> 填写
  11. </view>
  12. <view class="cu-item" :class="2>stepsnum?'':'text-blue'">
  13. <text class="num" data-index="3"></text> 完成
  14. </view>
  15. </view>
  16. </view>
  17. <view class="echo-formmain padding bg-white" v-if="stepsnum==0">
  18. <u-parse :content="form.explain" noData="详情内容..." @navigate="navigate"></u-parse>
  19. <view class="padding-xl"></view>
  20. </view>
  21. <view class="cu-bar bg-white tabbar border shop foot" v-if="stepsnum==0">
  22. <view class="bg-blue submit" @tap="stepsNum(1)">下一步</view>
  23. </view>
  24. <form @submit="formSubmit" v-if="stepsnum==1">
  25. <view class="echo-formmain padding bg-white">
  26. <block v-for="(item,index) in form.formItem" :key="index">
  27. <view>
  28. <view class="cu-bar bg-white">
  29. <view class="action" style="margin-left: 0rpx;">
  30. <text class="cuIcon-title text-red" v-if="item.imust==1"></text>
  31. <text class="text-sm">{{item.title}}</text>
  32. </view>
  33. <view class="action" v-if="item.itype==8">
  34. {{setform['item'+item.id].length}}/{{item.picnumber}}
  35. </view>
  36. </view>
  37. <view class="padding-sm radius bg-white solid-bottom" v-if="item.itype==1">
  38. <input :name="'item'+item.id" :data-itemid="item.id" @input="setInput" placeholder="请输入..."></input>
  39. </view>
  40. <view class="padding-sm radius bg-white solid-bottom" v-if="item.itype==2">
  41. <textarea class="echo-formmain-textarea" :name="'item'+item.id" :data-itemid="item.id" @input="setInput"
  42. maxlength="-1" placeholder="请输入..."></textarea>
  43. </view>
  44. <view class="padding-sm radius bg-white solid-bottom" v-if="item.itype==3">
  45. <picker mode="selector" :name="'item'+item.id" :data-itemid="item.id" @change="pickerChange" :value="setform['item'+item.id]"
  46. :range="item.options">
  47. <view class="picker">{{setform['item'+item.id]>-1 ? item.options[setform['item'+item.id]] : "请选择..."}}</view>
  48. </picker>
  49. </view>
  50. <view class="radius bg-white solid-bottom" v-if="item.itype==4">
  51. <radio-group class="block" :name="'item'+item.id" :data-itemid="item.id" @change="radioChange">
  52. <label class="cu-form-group" v-for="(oitem,oindex) in item.options" :key="oindex">
  53. <view class="title">{{oitem}}</view>
  54. <radio :class="setform['item'+item.id]==oindex?'checked':''" :checked="setform['item'+item.id]==oindex?true:false"
  55. :value="oindex"></radio>
  56. </label>
  57. </radio-group>
  58. </view>
  59. <view class="radius bg-white solid-bottom" v-if="item.itype==5">
  60. <checkbox-group class="block" :name="'item'+item.id" :data-itemid="item.id" @change="checkboxChange">
  61. <label class="cu-form-group" v-for="(oitem,oindex) in item.options" :key="oindex">
  62. <view class="title">{{oitem}}</view>
  63. <checkbox :class="setform['item'+item.id][oindex].checked?'checked':''" :checked="setform['item'+item.id][oindex].checked?true:false"
  64. :value="oindex"></checkbox>
  65. </label>
  66. </checkbox-group>
  67. </view>
  68. <view class="padding-sm radius bg-white solid-bottom" v-if="item.itype==6">
  69. <picker mode="date" :name="'item'+item.id" :data-itemid="item.id" :value="setform['item'+item.id]" @change="dateChange">
  70. <view class="picker">
  71. {{setform['item'+item.id]}}
  72. </view>
  73. </picker>
  74. </view>
  75. <view class="padding-sm radius bg-white solid-bottom" v-if="item.itype==7">
  76. <picker mode="time" :name="'item'+item.id" :data-itemid="item.id" :value="setform['item'+item.id]" @change="timeChange">
  77. <view class="picker">
  78. {{setform['item'+item.id]}}
  79. </view>
  80. </picker>
  81. </view>
  82. <view class="grid col-4 grid-square flex-sub" v-if="item.itype==8">
  83. <block v-for="(picitem,picindex) in setform['item'+item.id]" :key="picindex">
  84. <view class="bg-img" :data-itemid="item.id" @tap="viewImage" :data-url="picitem">
  85. <image :src="picitem" mode="aspectFill"></image>
  86. <view class="cu-tag bg-red" :data-itemid="item.id" @tap.stop="delImg" :data-index="index">
  87. <text class='cuIcon-close'></text>
  88. </view>
  89. </view>
  90. </block>
  91. <view class="solids" :data-itemid="item.id" :data-picnumber="item.picnumber" @tap="chooseImage" v-if="setform['item'+item.id].length < item.picnumber">
  92. <text class='cuIcon-cameraadd'></text>
  93. </view>
  94. </view>
  95. <view class="padding-top-xs text-gray text-sm">{{item.placeholder}}</view>
  96. </view>
  97. </block>
  98. <view class="padding-xl"></view>
  99. <!-- <view class="padding-tb flex flex-direction">
  100. <button class="cu-btn lg bg-blue margin-bottom" form-type="submit" v-if="form.usernumber==0 || form.form_log_count<form.usernumber">立即提交</button>
  101. <button class="cu-btn lg" @tap="stepsNum(0)">返回上一步</button>
  102. </view> -->
  103. </view>
  104. <view class="cu-bar bg-white tabbar border shop foot" v-if="stepsnum==1">
  105. <view class="submit" @tap="stepsNum(0)">上一步</view>
  106. <button class="bg-blue submit" style="border-radius: 0rpx !important;" form-type="submit" v-if="form.usernumber==0 || form.form_log_count<form.usernumber">立即提交</button>
  107. </view>
  108. </form>
  109. <view class="echo-formmain padding bg-white" v-if="stepsnum==2">
  110. <view class="padding">
  111. <view class="flex-sub text-center padding-tb">
  112. <image :src="$getImageUrl('static/images/applet/formend.jpg')" mode="widthFix" style="width: 370rpx; height: 350rpx;"></image>
  113. <view class="text-lg padding-tb">
  114. <text class="text-black">《{{form.title}}》信息提交成功</text>
  115. </view>
  116. <view class="flex flex-direction padding-xl">
  117. <button class="cu-btn lg bg-blue" @tap="toIndex">返回首页</button>
  118. </view>
  119. </view>
  120. </view>
  121. </view>
  122. </view>
  123. </template>
  124. <script>
  125. import uParse from '@/components/gaoyia-parse/parse.vue';
  126. var _this;
  127. export default {
  128. components: {
  129. uParse
  130. },
  131. data() {
  132. return {
  133. isRotate: false,
  134. userinfo: {},
  135. form: {},
  136. stepsnum: 0,
  137. setform: {}
  138. }
  139. },
  140. onLoad: function(option) {
  141. _this = this;
  142. var formid = option.formid || 0;
  143. _this.userinfo = _this.checkLogin("/pages/form/form?formid=" + formid);
  144. if (_this.userinfo === false) {
  145. return false;
  146. }
  147. _this.$req.ajax({
  148. path: "form/getform",
  149. data: {
  150. formid: formid
  151. }
  152. }).then((data) => {
  153. _this.form = data.form;
  154. for (let key in data.form.formItem) {
  155. var item = data.form.formItem[key];
  156. var date = new Date();
  157. switch (item.itype) {
  158. case 1:
  159. case 2:
  160. _this.$set(_this.setform, 'item' + item.id, "");
  161. break;
  162. case 3:
  163. case 4:
  164. _this.$set(_this.setform, 'item' + item.id, -1);
  165. break;
  166. case 5:
  167. var optionsarr = [];
  168. for (var i = 0, lenI = item.options.length; i < lenI; ++i) {
  169. optionsarr.push({
  170. name: item.options[i],
  171. value: i,
  172. checked: false
  173. });
  174. }
  175. _this.$set(_this.setform, 'item' + item.id, optionsarr);
  176. break;
  177. case 6:
  178. _this.$set(_this.setform, 'item' + item.id, _this.formatDate(date));
  179. break;
  180. case 7:
  181. _this.$set(_this.setform, 'item' + item.id, _this.formatTime(date));
  182. break;
  183. case 8:
  184. _this.$set(_this.setform, 'item' + item.id, []);
  185. break;
  186. default:
  187. _this.$set(_this.setform, 'item' + item.id, "");
  188. break;
  189. }
  190. }
  191. uni.setNavigationBarTitle({
  192. title: _this.form.title
  193. });
  194. }).catch((err) => {
  195. uni.showModal({
  196. title: '信息提示',
  197. content: err,
  198. showCancel: false
  199. });
  200. });
  201. },
  202. onShareAppMessage: function(res) {
  203. return {
  204. title: _this.form.sharetil,
  205. path: "/pages/form/form?formid=" + _this.form.id,
  206. imageUrl: _this.form.sharepic
  207. }
  208. },
  209. methods: {
  210. // 提交表单
  211. formSubmit: function(e) {
  212. if (_this.isRotate) {
  213. return false;
  214. }
  215. _this.isRotate = true;
  216. var formdata = {
  217. userid: _this.userinfo.id,
  218. formid: _this.form.id
  219. };
  220. for (let key in _this.form.formItem) {
  221. var item = _this.form.formItem[key];
  222. switch (item.itype) {
  223. case 1:
  224. formdata['item' + item.id] = _this.setform['item' + item.id];
  225. break;
  226. case 2:
  227. formdata['item' + item.id] = _this.setform['item' + item.id];
  228. break;
  229. case 3:
  230. formdata['item' + item.id] = _this.setform['item' + item.id] == -1 ? "" : item.options[_this.setform['item' +
  231. item.id]];
  232. break;
  233. case 4:
  234. formdata['item' + item.id] = _this.setform['item' + item.id] == -1 ? "" : item.options[_this.setform['item' +
  235. item.id]];
  236. break;
  237. case 5:
  238. formdata['item' + item.id] = "";
  239. var optionsarr = _this.setform['item' + item.id];
  240. for (var i = 0, lenI = optionsarr.length; i < lenI; ++i) {
  241. if (optionsarr[i].checked) {
  242. formdata['item' + item.id] += "###" + item.options[optionsarr[i].value];
  243. }
  244. }
  245. if (formdata['item' + item.id].substr(0, 3) == '###') {
  246. formdata['item' + item.id] = formdata['item' + item.id].substr(3);
  247. }
  248. break;
  249. case 6:
  250. formdata['item' + item.id] = _this.setform['item' + item.id];
  251. break;
  252. case 7:
  253. formdata['item' + item.id] = _this.setform['item' + item.id];
  254. break;
  255. case 8:
  256. formdata['item' + item.id] = _this.setform['item' + item.id].join("###");
  257. break;
  258. default:
  259. formdata['item' + item.id] = _this.setform['item' + item.id];
  260. break;
  261. }
  262. if (item.imust == 1 && formdata['item' + item.id] == "") {
  263. uni.showModal({
  264. title: '信息提示',
  265. content: item.title + " 为必填项,不能为空。",
  266. showCancel: false
  267. });
  268. _this.isRotate = false;
  269. return false;
  270. }
  271. }
  272. _this.$req.ajax({
  273. path: "form/setform",
  274. data: formdata,
  275. }).then((data) => {
  276. _this.isRotate = false;
  277. _this.stepsNum(2);
  278. }).catch((err) => {
  279. _this.isRotate = false;
  280. uni.showModal({
  281. title: '信息提示',
  282. content: err,
  283. showCancel: false
  284. });
  285. });
  286. },
  287. // 单行输入框 & 多行输入框
  288. setInput: function(e) {
  289. var itemid = e.currentTarget.dataset.itemid;
  290. _this.setform['item' + itemid] = e.detail.value;
  291. },
  292. // 普通选择
  293. pickerChange: function(e) {
  294. var itemid = e.currentTarget.dataset.itemid;
  295. _this.setform['item' + itemid] = e.detail.value;
  296. },
  297. // 单选选择
  298. radioChange: function(e) {
  299. var itemid = e.currentTarget.dataset.itemid;
  300. _this.setform['item' + itemid] = e.detail.value;
  301. },
  302. // 多选选择
  303. checkboxChange: function(e) {
  304. var itemid = e.currentTarget.dataset.itemid;
  305. var items = _this.setform['item' + itemid];
  306. var values = e.detail.value;
  307. for (var i = 0, lenI = items.length; i < lenI; ++i) {
  308. items[i].checked = false;
  309. for (var j = 0, lenJ = values.length; j < lenJ; ++j) {
  310. if (items[i].value == values[j]) {
  311. items[i].checked = true;
  312. break
  313. }
  314. }
  315. }
  316. },
  317. // 日期选择
  318. dateChange: function(e) {
  319. var itemid = e.currentTarget.dataset.itemid;
  320. _this.setform['item' + itemid] = e.detail.value
  321. },
  322. // 时间选择
  323. timeChange: function(e) {
  324. var itemid = e.currentTarget.dataset.itemid;
  325. _this.setform['item' + itemid] = e.detail.value
  326. },
  327. // 图片上传
  328. chooseImage: function(e) {
  329. var itemid = e.currentTarget.dataset.itemid;
  330. var picnumber = e.currentTarget.dataset.picnumber;
  331. uni.chooseImage({
  332. count: picnumber,
  333. sizeType: ['original', 'compressed'],
  334. sourceType: ['album'],
  335. success: (res) => {
  336. _this.$req.ajaxFile({
  337. path: "attachment/tplfieldimage",
  338. title: '正在上传',
  339. filePath: res.tempFilePaths[0],
  340. fileName: 'file',
  341. }).then((filedata) => {
  342. var data = JSON.parse(filedata.data);
  343. _this.setform['item' + itemid].push(data.data.src);
  344. }).catch((err) => {
  345. uni.showModal({
  346. title: '信息提示',
  347. content: err,
  348. showCancel: false
  349. });
  350. });
  351. }
  352. });
  353. },
  354. viewImage: function(e) {
  355. var itemid = e.currentTarget.dataset.itemid;
  356. uni.previewImage({
  357. urls: _this.setform['item' + itemid],
  358. current: e.currentTarget.dataset.url
  359. });
  360. },
  361. delImg: function(e) {
  362. var itemid = e.currentTarget.dataset.itemid;
  363. _this.setform['item' + itemid].splice(e.currentTarget.dataset.index, 1);
  364. },
  365. // 日期时间格式
  366. formatDate: function(date) {
  367. var myyear = date.getFullYear();
  368. var mymonth = date.getMonth() + 1;
  369. var myweekday = date.getDate();
  370. if (mymonth < 10) {
  371. mymonth = "0" + mymonth;
  372. }
  373. if (myweekday < 10) {
  374. myweekday = "0" + myweekday;
  375. }
  376. return (myyear + "-" + mymonth + "-" + myweekday);
  377. },
  378. formatTime: function(date) {
  379. var myhours = date.getHours();
  380. var myminutes = date.getMinutes();
  381. if (myhours < 10) {
  382. myhours = "0" + myhours;
  383. }
  384. if (myminutes < 10) {
  385. myminutes = "0" + myminutes;
  386. }
  387. return (myhours + ":" + myminutes);
  388. },
  389. stepsNum: function(num) {
  390. _this.stepsnum = num;
  391. },
  392. toIndex: function() {
  393. uni.reLaunch({
  394. url: '/pages/index/home'
  395. });
  396. },
  397. navigate: function(href, e) {
  398. // #ifdef H5
  399. location.href = href;
  400. // #endif
  401. // #ifndef H5
  402. uni.navigateTo({
  403. url: '/pages/tool/webview?pagesrc=' + encodeURIComponent(href)
  404. });
  405. // #endif
  406. },
  407. }
  408. }
  409. </script>
  410. <style lang="scss">
  411. .echo-formmain {
  412. min-height: calc(100vh - 182rpx);
  413. }
  414. .echo-formmain-textarea {
  415. width: 100%;
  416. height: 4.6em;
  417. }
  418. .echo-top-height {
  419. height: 180rpx;
  420. }
  421. </style>