detail.vue 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. <template>
  2. <view>
  3. <!-- 顶部导航 -->
  4. <fa-navbar :title="diyform.title || '详情'"></fa-navbar>
  5. <view class="u-p-30">
  6. <block v-for="(item, index) in fieldsList" :key="index">
  7. <!-- -->
  8. <view class="u-p-b-30" v-if="['string', 'text', 'number', 'city'].indexOf(item.type) != -1">
  9. <view class="title u-text-weight">{{ item.title }}:</view>
  10. <view class="content u-tips-color">{{ item.value }}</view>
  11. </view>
  12. <!-- 编辑器 -->
  13. <view class="u-p-b-30" v-if="item.type == 'editor'">
  14. <view class="title u-text-weight">{{ item.title }}:</view>
  15. <view class="content u-tips-color"><u-parse :html="item.value" @linkpress="navigate"></u-parse></view>
  16. </view>
  17. <!-- 时间 -->
  18. <view class="u-p-b-30" v-if="['date', 'time', 'datetime', 'datetimerange'].indexOf(item.type) != -1">
  19. <view class="title u-text-weight">{{ item.title }}:</view>
  20. <view class="content u-tips-color">{{ item.value }}</view>
  21. </view>
  22. <!-- 数组 -->
  23. <view class="u-p-b-30" v-if="item.type == 'array'">
  24. <view class="title u-text-weight">{{ item.title }}:</view>
  25. <view class="u-p-t-30">
  26. <u-table>
  27. <u-tr class="u-tr">
  28. <u-th class="u-th" v-text="item.setting.key"></u-th>
  29. <u-th class="u-th" v-text="item.setting.value"></u-th>
  30. </u-tr>
  31. <u-tr class="u-tr" v-for="(arr, ak) in item.value" :key="ak">
  32. <u-td class="u-td">{{ ak }}</u-td>
  33. <u-td class="u-td">{{ arr }}</u-td>
  34. </u-tr>
  35. </u-table>
  36. </view>
  37. </view>
  38. <!-- 单选 -->
  39. <view class="u-p-b-30" v-if="item.type == 'radio' || item.type == 'select'">
  40. <view class="title u-text-weight">{{ item.title }}:</view>
  41. <view class="content u-tips-color">{{ item.content_list[item.value] }}</view>
  42. </view>
  43. <!-- 多选 -->
  44. <view class="u-p-b-30" v-if="item.type == 'checkbox' || item.type == 'selects'">
  45. <view class="title u-text-weight">{{ item.title }}:</view>
  46. <view class="content u-tips-color">{{ item | checkboxmat }}</view>
  47. </view>
  48. <!-- 开关 -->
  49. <view class="u-p-b-30" v-if="item.type == 'switch'">
  50. <view class="title u-text-weight">{{ item.title }}:</view>
  51. <view class="content u-tips-color">{{ item.value }}</view>
  52. </view>
  53. <!-- 单图 -->
  54. <view class="u-p-b-30" v-if="item.type == 'image'">
  55. <view class="title u-text-weight">{{ item.title }}:</view>
  56. <view class="contents u-flex u-flex-wrap"><image :src="item.value" @click="preview(item.value)" mode="aspectFill"></image></view>
  57. </view>
  58. <!-- 多图 -->
  59. <view class="u-p-b-30" v-if="item.type == 'images'">
  60. <view class="title u-text-weight">{{ item.title }}:</view>
  61. <view class="contents u-flex u-flex-wrap">
  62. <image v-for="(res, ids) in item.value" :src="res" :key="res" mode="aspectFill" @click="preview(item.value, ids)"></image>
  63. </view>
  64. </view>
  65. <!-- 单文件 -->
  66. <view class="u-p-b-30" v-if="item.type == 'file'">
  67. <view class="title u-text-weight">{{ item.title }}:</view>
  68. <view class="file u-flex u-flex-wrap">
  69. <view class="opeate u-text-center" @click="download(item.value, item.name)">
  70. <view class="u-text-weight">{{ item.value | fileNameMat }}</view>
  71. <view class="">下载</view>
  72. </view>
  73. </view>
  74. <view class="u-m-t-30" v-if="downtips && downame == item.name">
  75. <u-alert-tips
  76. type="warning"
  77. title="下载成功,保存路径为:"
  78. :close-able="true"
  79. :show="downtips"
  80. :description="description"
  81. @close="downtips = false"
  82. ></u-alert-tips>
  83. </view>
  84. </view>
  85. <!-- 多文件 -->
  86. <view class="u-p-b-30" v-if="item.type == 'files'">
  87. <view class="title u-text-weight">{{ item.title }}:</view>
  88. <view class="file u-flex u-flex-wrap">
  89. <view class="opeate u-text-center" v-for="(file, fk) in item.value" :key="fk" @click="download(file, item.name)">
  90. <view class="u-text-weight">{{ file | fileNameMat }}</view>
  91. <view class="">下载</view>
  92. </view>
  93. </view>
  94. <view class="u-m-t-30" v-if="downtips && downame == item.name">
  95. <u-alert-tips
  96. type="warning"
  97. title="下载成功,保存路径为:"
  98. :close-able="true"
  99. :show="downtips"
  100. :description="description"
  101. @close="downtips = false"
  102. ></u-alert-tips>
  103. </view>
  104. </view>
  105. </block>
  106. </view>
  107. <u-gap height="120" bg-color="#fff"></u-gap>
  108. <view class="u-p-30 footer u-border-top u-flex u-row-around" v-if="diyform.isedit==1">
  109. <!-- <view class="u-flex u-row-center btn" :style="{ backgroundColor: theme.bgColor, color: theme.color }" @click="collection(diydata.id,'diyform')">
  110. <u-icon name="heart-fill"></u-icon>
  111. <text class="u-m-l-10">收藏</text>
  112. </view> -->
  113. <view class="u-flex u-row-center btn" :style="{ backgroundColor: theme.bgColor, color: theme.color }" @click="edit">
  114. <u-icon name="edit-pen"></u-icon>
  115. <text class="u-m-l-10">编辑</text>
  116. </view>
  117. </view>
  118. <!-- 底部导航 -->
  119. <fa-tabbar></fa-tabbar>
  120. </view>
  121. </template>
  122. <script>
  123. import { tools,vote } from '@/common/fa.mixin.js';
  124. var _self;
  125. export default {
  126. mixins: [tools,vote],
  127. created() {
  128. _self = this;
  129. },
  130. onLoad(e) {
  131. let query = this.$Route.query || e || {};
  132. this.id = query.id || 0;
  133. this.diyname = query.diyname || '';
  134. this.getformShow();
  135. },
  136. data() {
  137. return {
  138. id: 0,
  139. diyname: '',
  140. diydata: {},
  141. diyform: {},
  142. fieldsList: [],
  143. downtips: false,
  144. description: '',
  145. downame: ''
  146. };
  147. },
  148. methods: {
  149. edit() {
  150. this.$Router.push({
  151. path: '/pages/diyform/diyform',
  152. query: { diyname: this.diyname, id: this.id }
  153. });
  154. },
  155. getformShow() {
  156. this.$api.formShow({ id: this.id, diyname: this.diyname }).then(res => {
  157. if (res.code) {
  158. this.diydata = res.data.diydata;
  159. this.fieldsList = res.data.fieldsList;
  160. this.diyform = res.data.diyform;
  161. } else {
  162. this.$u.toast(res.msg);
  163. }
  164. });
  165. },
  166. preview(img, index = 0) {
  167. let arr = [];
  168. if (typeof img == 'string') {
  169. arr.push(img);
  170. } else {
  171. arr = img;
  172. }
  173. uni.previewImage({
  174. current: index,
  175. urls: arr,
  176. longPressActions: {
  177. itemList: ['发送给朋友', '保存图片', '收藏'],
  178. success: function(data) {},
  179. fail: function(err) {
  180. console.log(err.errMsg);
  181. }
  182. }
  183. });
  184. },
  185. download(url, name) {
  186. let that = this;
  187. that.downame = name;
  188. // #ifndef H5
  189. uni.downloadFile({
  190. url: url,
  191. success: res => {
  192. if (res.statusCode === 200) {
  193. // #ifndef H5
  194. uni.saveFile({
  195. tempFilePath: res.tempFilePath,
  196. success: function(res) {
  197. that.downtips = true;
  198. that.description = res.savedFilePath;
  199. },
  200. fail(err) {
  201. console.log(err);
  202. }
  203. });
  204. // #endif
  205. }
  206. }
  207. });
  208. // #endif
  209. // #ifdef H5
  210. window.open(url);
  211. // #endif
  212. }
  213. },
  214. filters: {
  215. checkboxmat: function(item) {
  216. let val = item.value.split(',');
  217. let arr = [];
  218. val.forEach(it => {
  219. arr.push(item.content_list[it]);
  220. });
  221. return arr.join(',');
  222. },
  223. fileNameMat: function(value) {
  224. let index1 = value.lastIndexOf('.');
  225. let index2 = value.length;
  226. return value.substring(index1, index2);
  227. }
  228. }
  229. };
  230. </script>
  231. <style lang="scss">
  232. page {
  233. background-color: #ffffff;
  234. }
  235. .content {
  236. background-color: #f0f8ff;
  237. padding: 30rpx;
  238. margin-top: 20rpx;
  239. border-radius: 5rpx;
  240. }
  241. .contents {
  242. display: flex;
  243. image {
  244. width: 150rpx;
  245. height: 150rpx;
  246. margin-top: 30rpx;
  247. margin-right: 20rpx;
  248. }
  249. }
  250. .file {
  251. .opeate {
  252. background-color: #e3e3e3;
  253. width: 150rpx;
  254. height: 150rpx;
  255. line-height: 70rpx;
  256. margin-top: 30rpx;
  257. margin-right: 20rpx;
  258. }
  259. }
  260. .u-alert-desc {
  261. word-break: break-word;
  262. }
  263. .footer {
  264. position: fixed;
  265. width: 100%;
  266. bottom: 0;
  267. background-color: #ffffff;
  268. .btn {
  269. border-radius: 50rpx;
  270. height: 60rpx;
  271. line-height: 60rpx;
  272. width: 80vw;
  273. }
  274. }
  275. </style>