list.vue 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357
  1. <template>
  2. <div class='main-content'>
  3. <baseTable
  4. ref='WishingTree'
  5. :tableHeader='tableHeader'
  6. :tableData='tableData'
  7. :searchParams='searchParams'
  8. @searchFn='searchFn'
  9. @resetFn='resetFn'
  10. :moreOperation='false'
  11. @addFn="addFn"
  12. >
  13. <template slot='search'>
  14. <el-form-item label='手机号'>
  15. <el-input v-model.trim='searchParams.name' />
  16. </el-form-item>
  17. <el-form-item label='内容关键字'>
  18. <el-input v-model.trim='searchParams.discription' />
  19. </el-form-item>
  20. </template>
  21. </baseTable>
  22. <el-dialog width="900px" :title="formDialog.title" :visible.sync="formDialog.visible" :close-on-click-modal="false">
  23. <el-form
  24. ref="userForm"
  25. size="small"
  26. label-width="120px"
  27. :model="formDialog.formData"
  28. :rules="formDialog.formRules"
  29. >
  30. <el-row>
  31. <el-form-item label="许愿树名称" prop="name">
  32. <el-input v-model.trim="formDialog.formData.name" />
  33. </el-form-item>
  34. <el-form-item label="经度" prop="longitude">
  35. <el-input v-model.trim="formDialog.formData.longitude" />
  36. </el-form-item>
  37. <el-form-item label="纬度" prop="latitude">
  38. <el-input v-model.trim="formDialog.formData.latitude" />
  39. </el-form-item>
  40. <el-form-item label="可许愿半径" prop="radius">
  41. <el-input type="number" v-model.trim="formDialog.formData.radius" />
  42. </el-form-item>
  43. <el-form-item label='封面图片' prop='coverImage'>
  44. <el-input style="display: none" v-model.trim="formDialog.formData.coverImage" />
  45. <el-upload
  46. class="avatar-uploader"
  47. :action="upload.action"
  48. :headers="upload.headers"
  49. :show-file-list="false"
  50. :on-success="handleSuccess"
  51. >
  52. <img v-if="imageUrl" :src="imageUrl" class="avatar" alt="" />
  53. <i v-else class="el-icon-plus avatar-uploader-icon"></i>
  54. </el-upload>
  55. </el-form-item>
  56. <el-form-item label="许愿树描述" prop="description">
  57. <el-input type='textarea' v-model.trim='formDialog.formData.description' :rows='4' />
  58. </el-form-item>
  59. </el-row>
  60. </el-form>
  61. <div slot="footer" class="dialog-footer">
  62. <el-button type="primary" :loading="formDialog.loading" @click="submitFn">确定</el-button>
  63. <el-button @click="cancelFn">取消</el-button>
  64. </div>
  65. </el-dialog>
  66. </div>
  67. </template>
  68. <script>
  69. import { creatTree, queryTreePage } from '@api/wishing/tree';
  70. import { removeUser, updateUserDetail } from '@api/upms/api-user';
  71. import { isNumber, isInteger } from '@utils/validate';
  72. export default {
  73. name: 'WishingTree',
  74. data() {
  75. let validateNumber = (rule, value, callback) => {
  76. if (!isNumber(value)) {
  77. return callback(new Error('经纬度只能是数字'));
  78. } else {
  79. return callback();
  80. }
  81. };
  82. let validateInteger = (rule, value, callback) => {
  83. if (!isInteger(value)) {
  84. return callback(new Error('可许愿半径只能是整数'));
  85. } else {
  86. return callback();
  87. }
  88. };
  89. return {
  90. tableHeader: [
  91. {
  92. label: '许愿树名称',
  93. prop: 'name',
  94. align: 'center'
  95. },
  96. {
  97. label: '经度',
  98. prop: 'longitude',
  99. align: 'center'
  100. },
  101. {
  102. label: '维度',
  103. prop: 'latitude',
  104. align: 'center'
  105. },
  106. {
  107. label: '地址',
  108. prop: 'address',
  109. align: 'center'
  110. },
  111. {
  112. label: '封面图片',
  113. prop: 'coverImage',
  114. align: 'center'
  115. },
  116. {
  117. label: '是否启动',
  118. prop: 'isActive',
  119. align: 'center'
  120. },
  121. {
  122. label: '可许愿半径',
  123. prop: 'radius',
  124. align: 'center'
  125. },
  126. {
  127. label: '许愿次数',
  128. prop: 'totalWishes',
  129. align: 'center',
  130. type: 'render',
  131. render: (h, params) => {
  132. return h('span', params.row.totalWishes || 0);
  133. }
  134. },
  135. {
  136. label: '创建时间',
  137. prop: 'createdAt',
  138. align: 'center'
  139. }
  140. ],
  141. tableData: [],
  142. defaultSearch: {},
  143. searchParams: Object.assign({}, this.$search),
  144. upload: {
  145. headers: { Authorization: `Bearer ${this.$store.getters.accessToken}` },
  146. action: '/dgapi/upms/attachment/upload-file',
  147. extraData: {}
  148. },
  149. imageUrl: '',
  150. formDialog: {
  151. title: '',
  152. visible: false,
  153. loading: false,
  154. isAdd: false,
  155. formData: {
  156. id: 0,
  157. address: '',
  158. coverImage: '',
  159. description: '',
  160. latitude: null,
  161. longitude: null,
  162. name: '',
  163. radius: 100,
  164. totalWishes: 0
  165. },
  166. formRules: {
  167. name: [
  168. {
  169. required: true,
  170. message: '请输入许愿树名称',
  171. trigger: 'blur'
  172. }
  173. ],
  174. latitude: [
  175. {
  176. required: true,
  177. message: '请输入纬度',
  178. trigger: 'blur'
  179. },
  180. {
  181. validator: validateNumber,
  182. trigger: 'blur'
  183. }
  184. ],
  185. longitude: [
  186. {
  187. required: true,
  188. message: '请输入经度',
  189. trigger: 'blur'
  190. },
  191. {
  192. validator: validateNumber,
  193. trigger: 'blur'
  194. }
  195. ],
  196. radius: [
  197. {
  198. validator: validateInteger,
  199. trigger: 'blur'
  200. }
  201. ]
  202. }
  203. }
  204. };
  205. },
  206. created() {
  207. this.searchFn();
  208. },
  209. mounted() {
  210. },
  211. methods: {
  212. searchFn(isReset = false) {
  213. let vm = this;
  214. if (isReset) {
  215. vm.searchParams = Object.assign(vm.searchParams, vm.$search);
  216. }
  217. queryTreePage(vm.searchParams).then(
  218. (res) => {
  219. vm.tableData = res.data.records;
  220. vm.searchParams.total = res.data.total;
  221. },
  222. (error) => {
  223. vm.$notify.error({
  224. title: error.data.msg,
  225. message: error.data.data
  226. });
  227. }
  228. );
  229. },
  230. resetFn() {
  231. let vm = this;
  232. vm.searchParams = Object.assign({}, vm.defaultSearch, this.$search);
  233. vm.searchFn();
  234. },
  235. addFn() {
  236. let vm = this;
  237. vm.formDialog.title = '新增';
  238. vm.formDialog.visible = true;
  239. vm.formDialog.loading = false;
  240. vm.formDialog.isAdd = true;
  241. vm.formDialog.formData = {};
  242. },
  243. cancelFn() {
  244. let vm = this;
  245. vm.formDialog.visible = false;
  246. vm.formDialog.loading = false;
  247. vm.formDialog.isAdd = false;
  248. vm.formDialog.formData = {};
  249. vm.$refs.userForm.resetFields();
  250. },
  251. submitFn() {
  252. let vm = this;
  253. vm.formDialog.loading = true;
  254. if (!vm.formDialog.formData.coverImage || vm.formDialog.formData.coverImage === '') {
  255. vm.$message.error('请上传封面图片');
  256. vm.formDialog.loading = false;
  257. return;
  258. }
  259. vm.$refs.userForm.validate((valid) => {
  260. if (!valid) {
  261. vm.formDialog.loading = false;
  262. return;
  263. }
  264. if (this.formDialog.formData.id) {
  265. let formData = vm.formDialog.formData;
  266. updateUserDetail(formData).then(
  267. (res) => {
  268. vm.$message.success('修改成功');
  269. vm.formDialog.visible = false;
  270. vm.formDialog.loading = false;
  271. vm.searchFn(true);
  272. },
  273. (error) => {
  274. vm.$notify.error({
  275. title: error.data.msg,
  276. message: error.data.data
  277. });
  278. vm.formDialog.loading = false;
  279. }
  280. );
  281. } else {
  282. let formData = vm.formDialog.formData;
  283. creatTree(formData).then(
  284. (res) => {
  285. vm.$message.success('新增成功');
  286. vm.formDialog.visible = false;
  287. vm.formDialog.loading = false;
  288. vm.formDialog.formData = {};
  289. vm.searchFn(true);
  290. },
  291. (error) => {
  292. vm.$notify.error({
  293. title: error.data.msg,
  294. message: error.data.data
  295. });
  296. vm.formDialog.loading = false;
  297. }
  298. );
  299. }
  300. });
  301. },
  302. delFn(row) {
  303. let vm = this;
  304. vm.$confirm('此操作将删除该记录, 是否继续?', '提示', {
  305. type: 'warning'
  306. }).then(() => {
  307. let ids = [row.id];
  308. removeUser({ ids: ids }).then(
  309. (res) => {
  310. vm.$message.success('删除成功');
  311. vm.searchFn(true);
  312. },
  313. (error) => {
  314. vm.$notify.error({
  315. title: error.data.msg,
  316. message: error.data.data
  317. });
  318. }
  319. );
  320. });
  321. },
  322. handleSuccess(res, file, fileList) {
  323. if (res.code === 200) {
  324. this.imageUrl = res.data.url;
  325. this.formDialog.formData.coverImage = res.data.url;
  326. } else {
  327. this.$message.error(res.msg);
  328. }
  329. }
  330. }
  331. };
  332. </script>
  333. <style scoped type="less">
  334. .avatar-uploader .avatar {
  335. width: 178px;
  336. height: 178px;
  337. display: block;
  338. }
  339. .avatar-uploader-icon {
  340. font-size: 28px;
  341. color: #8c939d;
  342. width: 178px;
  343. height: 178px;
  344. line-height: 178px;
  345. text-align: center;
  346. border: 2px dashed #d9d9d9;
  347. }
  348. </style>