addEditDialog.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. <template>
  2. <div class="add-edit-dialog-container">
  3. <el-dialog :title="title" :visible.sync="visible" width="600px" :before-close="close" :close-on-click-modal="false">
  4. <el-form :model="formData" ref="formData" :rules="rules" label-width="90px">
  5. <el-form-item label="标题:" prop="title">
  6. <el-input placeholder="请输入" v-model="formData.title"></el-input>
  7. </el-form-item>
  8. <el-form-item label="专家:" >
  9. <el-select v-model="formData.expert" placeholder="请选择专家" filterable clearable >
  10. <el-option v-for="item in exportList" :key="item.userId" :value="item.userId" :label="item.name"></el-option>
  11. </el-select>
  12. </el-form-item>
  13. <el-form-item label="品牌:" prop="brandId" class="classify-input">
  14. <BrandList @brandChange="brandChange" @brandEmpty="brandEmpty" :brandName="brandName" ref="brand"></BrandList>
  15. </el-form-item>
  16. <el-form-item label="问题现象:" prop="expression">
  17. <el-input placeholder="请输入" v-model="formData.expression" type="textarea"></el-input>
  18. </el-form-item>
  19. <el-form-item label="解决方法:" prop="solution">
  20. <el-input placeholder="请输入" v-model="formData.solution" type="textarea"></el-input>
  21. </el-form-item>
  22. <el-form-item label="图片:" prop="file" class="plate-icon">
  23. <Upload :fileList="fileList" @changeUploadFile="changeUploadFile" @validateUpload="validateUpload" :limitUpload="limitUpload" :maximumSize="maximumSize" :uploadType="1" ref="upload"></Upload>
  24. </el-form-item>
  25. <el-form-item prop="lockFlag" label="是否打赏:">
  26. <el-switch v-model="formData.lockFlag" active-text="是" inactive-text="否" :active-value="1" :inactive-value="0"></el-switch>
  27. </el-form-item>
  28. <!-- 后台新增默认是不启用状态 -->
  29. <!-- <el-form-item label="启用状态:">
  30. <el-switch
  31. v-model="formData.statuz"
  32. active-text="开"
  33. inactive-text="关"
  34. :active-value="1"
  35. :inactive-value="0"
  36. ></el-switch>
  37. </el-form-item>-->
  38. </el-form>
  39. <div slot="footer" class="dialog-footer">
  40. <el-button @click="close()">取 消</el-button>
  41. <el-button type="primary" @click="submitForm('formData')" :disabled="submitBtndisabled">确 定</el-button>
  42. </div>
  43. </el-dialog>
  44. </div>
  45. </template>
  46. <script>
  47. import { validPrice } from '@/apps/mobile/utils/validate';
  48. import Upload from '@/apps/mobile/components/uploadAuto/index';
  49. import { addData, editData } from '@/apps/mobile/api/question/index';
  50. import { queryAllExpert } from '@/apps/mobile/api/expert/index';
  51. import { staticPath } from '@/apps//mobile/utils/util';
  52. import BrandList from '@/apps/mobile/components/brandLongSerch/index'; // 电梯品牌远程搜索
  53. export default {
  54. components: {
  55. Upload,
  56. BrandList,
  57. },
  58. data() {
  59. // 验证数字
  60. var checkNumber = (rule, value, callback) => {
  61. if (value && !validPrice(value)) {
  62. callback(new Error('格式不正确'));
  63. } else {
  64. callback();
  65. }
  66. };
  67. return {
  68. type: null,
  69. title: '新增',
  70. submitBtndisabled: false,
  71. visible: false,
  72. rules: {
  73. title: [
  74. { required: true, message: '请输入标题', trigger: 'blur' },
  75. { max: 30, message: '长度最大30个字符', trigger: 'blur' },
  76. ],
  77. expression: [
  78. {
  79. required: true,
  80. message: '请输入问题现象',
  81. trigger: 'blur',
  82. },
  83. { max: 500, message: '长度最大500个字符', trigger: 'blur' },
  84. ],
  85. solution: [
  86. {
  87. required: true,
  88. message: '请输入解决方法',
  89. trigger: 'blur',
  90. },
  91. { max: 500, message: '长度最大500个字符', trigger: 'blur' },
  92. ],
  93. //图片非必填
  94. // file: [
  95. // {
  96. // required: true,
  97. // message: '请上传图片',
  98. // trigger: 'blur',
  99. // },
  100. // ],
  101. brandId: [
  102. {
  103. required: true,
  104. message: '请从列表中选择品牌,直接输入无效',
  105. trigger: ['blur', 'change'],
  106. },
  107. ],
  108. },
  109. fileList: [], // 图片列表
  110. maximumSize: 3, //图片大小 不超过3MB
  111. limitUpload: 3, //图片不超过3张
  112. formData: { file: null, brandId: null, lockFlag: 0 },
  113. exportList: [], //专家列表
  114. brandName: '', //电梯名称
  115. };
  116. },
  117. methods: {
  118. open(type, data) {
  119. console.log(data, 'data');
  120. this.type = type;
  121. let obj1 = {
  122. file: null,
  123. };
  124. if (type === 'edit') {
  125. this.title = '编辑';
  126. this.brandName = data.brandName;
  127. this.formData = { ...data, file: true };
  128. if (this.formData.imgs)
  129. this.fileList = this.formData.imgs.map((item) => {
  130. let url = staticPath(item);
  131. return {
  132. name: '',
  133. url,
  134. response: {
  135. data: { pathUrl: item },
  136. },
  137. };
  138. });
  139. } else {
  140. this.title = '新增';
  141. this.formData = { ...obj1 };
  142. }
  143. this.visible = true;
  144. },
  145. close() {
  146. this.type = null;
  147. this.$refs.upload.clearFiles(); // 清空已上传的文件列表
  148. this.fileList = [];
  149. this.formData = { file: null, brandId: null };
  150. this.submitBtndisabled = false;
  151. this.visible = false;
  152. this.brandName = null; //清空品牌框内容
  153. this.$refs['brand'].reset(); //清空品牌框内容 两种方法都要写
  154. this.$refs['formData'].resetFields();
  155. },
  156. submitForm(formName) {
  157. this.$refs[formName].validate((valid) => {
  158. if (valid) {
  159. this.submitBtndisabled = true;
  160. let message = '';
  161. let imgs = [];
  162. if (this.fileList.length > 0) {
  163. console.log(this.fileList, 'this.fileList');
  164. imgs = this.fileList.map((item) => {
  165. return item.response.data.pathUrl;
  166. });
  167. }
  168. imgs = imgs.join(',');
  169. console.log(imgs, 'imgs');
  170. let obj = Object.assign({}, { ...this.formData, imgs });
  171. console.log(obj);
  172. if (this.type === 'add') {
  173. message = '新增成功';
  174. delete obj.file;
  175. addData(obj)
  176. .then((res) => {
  177. if (res.statusCode === '1') {
  178. this.completeOperation(res.message);
  179. } else {
  180. this.$message.warning(res.message);
  181. }
  182. })
  183. .catch((err) => err);
  184. }
  185. if (this.type === 'edit') {
  186. message = '修改成功';
  187. let editObj = {
  188. id: obj.id,
  189. statuz: obj.statuz,
  190. title: obj.title,
  191. expert: obj.expert,
  192. expression: obj.expression,
  193. solution: obj.solution,
  194. imgs,
  195. brandId: obj.brandId,
  196. lockFlag: obj.lockFlag,
  197. };
  198. console.log(editObj, 'editObj');
  199. editData(editObj)
  200. .then((res) => {
  201. if (res.statusCode === '1') {
  202. this.completeOperation(res.message);
  203. } else {
  204. this.$message.warning(res.message);
  205. }
  206. })
  207. .catch((err) => err);
  208. }
  209. }
  210. });
  211. },
  212. /**
  213. * 将新增、编辑操作完成之后共同需要调用的方法放在此函数里面
  214. * @param {String} message 提示信息
  215. */
  216. completeOperation(message) {
  217. this.$message({
  218. type: 'success',
  219. message,
  220. });
  221. this.close();
  222. this.submitBtndisabled = false;
  223. this.$emit('queryListData');
  224. },
  225. /**
  226. * 手动验证upload、更新选择完成的图片数据
  227. * @param {Object} data: fileList是上传的图片数据 validateValues为true时说明有上传图片 为null时无上传图片
  228. */
  229. validateUpload(data) {
  230. this.changeUploadFile(data.fileList);
  231. // console.log(data,'data');
  232. this.formData.file = data.validateValues;
  233. this.$refs['formData'].validateField('file');
  234. },
  235. changeUploadFile(fileList) {
  236. this.fileList = fileList;
  237. console.log(this.fileList, 'this.fileList');
  238. },
  239. queryExpert() {
  240. queryAllExpert()
  241. .then((res) => {
  242. console.log(res, '专家列表');
  243. this.exportList = res.data;
  244. this.exportList.forEach((item) => {
  245. // 需转字符串才能回显
  246. item.userId = Number(item.userId);
  247. });
  248. })
  249. .catch((err) => err);
  250. },
  251. brandChange(data) {
  252. if (data.id) {
  253. this.$set(this.formData, 'brandId', data.id);
  254. } else {
  255. this.formData.brandId = null;
  256. }
  257. console.log(this.formData, 'this.formData');
  258. this.$refs['formData'].validateField('brandId');
  259. },
  260. brandEmpty() {
  261. this.formData.brandId = null;
  262. this.$refs['formData'].validateField('brandId');
  263. },
  264. },
  265. created() {
  266. this.queryExpert();
  267. },
  268. watch: {
  269. fileList(val) {
  270. this.$nextTick(() => {
  271. this.$refs.upload.changeHideUpload();
  272. });
  273. },
  274. },
  275. };
  276. </script>
  277. <style lang="stylus" scoped>
  278. .add-edit-dialog-container {
  279. ::v-deep .el-input {
  280. width: auto;
  281. }
  282. ::v-deep .el-input__inner {
  283. width: 200px;
  284. }
  285. .upload {
  286. display: inline-block;
  287. }
  288. }
  289. </style>