suggestionsDetails.vue 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351
  1. <template>
  2. <el-dialog
  3. :title="title"
  4. :visible.sync="open"
  5. width="60%"
  6. append-to-body
  7. :close-on-click-modal="false"
  8. @close="cancel"
  9. >
  10. <div class="form-dialog-box"
  11. v-loading="loading"
  12. :element-loading-text="loadingText"
  13. element-loading-spinner="el-icon-loading"
  14. element-loading-background="rgba(0, 0, 0, 0)">
  15. <div
  16. v-loading="loading"
  17. :element-loading-text="''"
  18. element-loading-spinner="''"
  19. element-loading-background="rgba(0, 0, 0, 0.8)"
  20. >
  21. <el-form :model="form" ref="form" :rules="rules" label-width="100px">
  22. <div style="display: flex;">
  23. <el-form-item label="姓名:" prop="contactsName">
  24. <span style="min-width: 350px;display: inline-block;">{{ form.contactsName }}</span>
  25. </el-form-item>
  26. <el-form-item label="联系电话:" prop="contactsMobile">
  27. <span style="min-width: 350px;display: inline-block;">{{ form.contactsMobile }}</span>
  28. </el-form-item>
  29. </div>
  30. <el-form-item label="留言内容:" prop="content">
  31. <span>{{ form.content }}</span>
  32. </el-form-item>
  33. <div style="display: flex;">
  34. <el-form-item label="类型:" prop="type">
  35. <span style="min-width: 350px;display: inline-block;"><dict-tag :options="dict.type.tourism_suggestions_type" :value="form.type"/></span>
  36. </el-form-item>
  37. <el-form-item label="留言时间:" prop="createTime">
  38. <span style="min-width: 350px;display: inline-block;">{{ form.createTime }}</span>
  39. </el-form-item>
  40. </div>
  41. <div style="display: flex;">
  42. <el-form-item label="状态:" prop="status">
  43. <span style="min-width: 350px;display: inline-block;"><dict-tag :options="dict.type.tourism_suggestions_status" :value="form.status"/></span>
  44. </el-form-item>
  45. <el-form-item label="处理时间:" v-if="form.status == 1" prop="answerTime">
  46. <span style="min-width: 350px;display: inline-block;">{{ form.answerTime }}</span>
  47. </el-form-item>
  48. </div>
  49. <el-form-item label="回复内容:" v-if="form.status == 1" prop="answerContent">
  50. <span>{{ form.answerContent }}</span>
  51. </el-form-item>
  52. </el-form>
  53. </div>
  54. </div>
  55. <span slot="footer" class="dialog-footer" v-if="formStatus==1">
  56. <el-button @click="cancel">关闭</el-button>
  57. </span>
  58. <!-- 添加或修改对话框 End -->
  59. </el-dialog>
  60. </template>
  61. <script>
  62. import {
  63. getTableDeatilsByIdApi,
  64. addTableApi
  65. } from '@/api/CURD'
  66. export default {
  67. name: "addAndEdit",
  68. dicts: ['tourism_suggestions_type','tourism_suggestions_status'],
  69. data() {
  70. return {
  71. title: "",
  72. model: "", // EDIT: 编辑模式 ADD : 新增模式 EDITInit : 编辑模式(需要请求详情)
  73. open: false,
  74. loading: false,
  75. loadingText: "拼命加载数据中...",
  76. formStatus: null, // 0/null : 加载中 1 : 获取详情成功 2 : 获取详情失败
  77. configUrl: {
  78. add: '', // 新增地址
  79. details: '/member/memberSuggestion/selectById', // 详情地址
  80. edit: '', // 编辑地址
  81. },
  82. form: {
  83. id: undefined,
  84. },
  85. rules: {
  86. contactsName: [{ required: false, message: "请输入姓名", trigger: ["change","blur"] }],
  87. contactsMobile: [{ required: false, message: "请输入联系电话", trigger: ["change","blur"] }],
  88. content: [{ required: false, message: "请输入留言内容", trigger: ["change","blur"] }],
  89. type: [{ required: false, message: "请选择类型", trigger: ["change","blur"] }],
  90. createTime: [{ required: false, message: "请选择留言时间", trigger: ["change","blur"] }],
  91. status: [{ required: false, message: "请选择状态", trigger: ["change","blur"] }],
  92. answerTime: [{ required: false, message: "请选择处理时间", trigger: ["change","blur"] }],
  93. answerContent: [{ required: false, message: "请输入回复内容", trigger: ["change","blur"] }],
  94. },
  95. };
  96. },
  97. methods: {
  98. async initData(title , model,row){
  99. this.title = title
  100. this.open = true
  101. this.loadingText = "拼命加载数据中..."
  102. this.loading = true
  103. this.model = model
  104. this.formStatus = 0
  105. if(model=='ADD') { // 新增
  106. this.$set(this,'form',row)
  107. this.formStatus = 1
  108. }else if(model=='EDIT') { // 新增
  109. let obj = {
  110. ...row
  111. }
  112. this.$set(this,'form',obj)
  113. this.formStatus = 1
  114. }else if(model=='EDITInit' || model=='DEATILSInit') { // 新增 或 详情
  115. await this.getTableDeatilsFun(row)
  116. }
  117. this.loading = false
  118. this.$nextTick(()=>{
  119. if(this.$refs["form"]) {
  120. this.$refs["form"].clearValidate();
  121. }
  122. })
  123. },
  124. /** 获取详情 */
  125. async getTableDeatilsFun(row) {
  126. const id = row.id
  127. this.loading = true
  128. try {
  129. let res = await getTableDeatilsByIdApi(this.configUrl.details,{id})
  130. if(res.code == 200) {
  131. let obj = {
  132. ...res.data
  133. }
  134. this.$set(this,'form',JSON.parse(JSON.stringify(obj)))
  135. this.formStatus = 1
  136. }else {
  137. this.$message.error('获取详情失败!!!');
  138. this.formStatus = 2
  139. this.loading = false
  140. this.open = false;
  141. }
  142. this.loading = false
  143. } catch (error) {
  144. console.error('获取详情失败!!!!',error)
  145. this.formStatus = 2
  146. this.loading = false
  147. this.open = false;
  148. }
  149. },
  150. /**
  151. * 保存
  152. * @date 2023-11-22
  153. * @returns {any}
  154. */
  155. submitForm() {
  156. this.$refs["form"].validate(valid => {
  157. if (valid) {
  158. this.loadingText = "提交数据中..."
  159. this.loading = true
  160. if (this.model != 'ADD') {
  161. addTableApi(
  162. this.configUrl.edit,{
  163. ...this.form
  164. }).then(response => {
  165. this.$modal.msgSuccess("修改成功");
  166. this.loading = false
  167. this.open = false;
  168. this.$emit('refresh')
  169. }).catch(()=>{
  170. this.$message.error("修改失败!!!");
  171. this.loading = false
  172. })
  173. } else {
  174. addTableApi(this.configUrl.edit,{
  175. ...this.form
  176. }).then(response => {
  177. this.$modal.msgSuccess("新增成功");
  178. this.loading = false
  179. this.open = false;
  180. this.$emit('refresh')
  181. }).catch(()=>{
  182. this.$message.error("新增失败!!!");
  183. this.loading = false
  184. })
  185. }
  186. }
  187. });
  188. },
  189. /**
  190. * 重置
  191. * @date 2023-11-22
  192. * @returns {any}
  193. */
  194. reset() {
  195. if(this.$refs["form"]) {
  196. this.$refs["form"].clearValidate();
  197. }
  198. },
  199. /**
  200. * 关闭弹框
  201. * @date 2023-11-22
  202. * @returns {any}
  203. */
  204. cancel() {
  205. this.reset();
  206. this.open = false;
  207. },
  208. },
  209. };
  210. </script>
  211. <style lang="scss" scoped>
  212. .form-dialog-box {
  213. padding: 0 30px;
  214. padding: 0 30px;
  215. min-height: 50vh;
  216. max-height: 65vh;
  217. overflow-y: auto;
  218. >div {
  219. width: 100%;
  220. min-height: 50vh;
  221. }
  222. .form-title {
  223. padding: 0 0 10px 0;
  224. span {
  225. display: flex;
  226. color: rgba(65,80,88,1);
  227. font-size: 16px;
  228. font-family: SourceHanSansSC;
  229. font-weight: 700;
  230. line-height: 23px;
  231. border-left: 4px solid rgb(22, 132, 252);
  232. padding-left: 10px;
  233. }
  234. }
  235. ::v-deep .ql-editor {
  236. height: 400px;
  237. }
  238. .upload-btn {
  239. width: 100px;
  240. height: 100px;
  241. background-color: #fbfdff;
  242. border: dashed 1px #c0ccda;
  243. border-radius: 5px;
  244. i {
  245. font-size: 30px;
  246. margin-top: 20px;
  247. }
  248. &-text {
  249. margin-top: -10px;
  250. }
  251. }
  252. .avatar {
  253. cursor: pointer;
  254. }
  255. }
  256. .el-table{
  257. .upload-btn {
  258. width: 100px;
  259. height: 100px;
  260. background-color: #fbfdff;
  261. border: dashed 1px #c0ccda;
  262. border-radius: 5px;
  263. i {
  264. font-size: 30px;
  265. margin-top: 20px;
  266. }
  267. &-text {
  268. margin-top: -10px;
  269. }
  270. }
  271. .avatar {
  272. cursor: pointer;
  273. }
  274. }
  275. .area-container {
  276. min-height: 400px;
  277. }
  278. ::v-deep .area-wrap-city.el-cascader {
  279. line-height: normal;
  280. .el-input {
  281. cursor: pointer;
  282. width: 100% !important;
  283. height: 28px !important;
  284. .el-input__inner {
  285. display: none !important;
  286. }
  287. span.el-input__suffix {
  288. position: inherit !important;
  289. i.el-input__icon {
  290. line-height: inherit;
  291. margin-left: 5px;
  292. }
  293. }
  294. .el-input__wrapper {
  295. box-shadow: none;
  296. input {
  297. display: none;
  298. }
  299. }
  300. }
  301. .el-cascader__tags {
  302. display: none;
  303. }
  304. }
  305. .area-city-popper {
  306. .el-cascader-panel {
  307. .el-scrollbar.el-cascader-menu {
  308. .el-cascader-menu__wrap.el-scrollbar__wrap {
  309. height: 315px;
  310. }
  311. }
  312. }
  313. }
  314. ::v-deep .avatar-uploader .el-upload {
  315. border: 1px dashed #d9d9d9;
  316. border-radius: 6px;
  317. cursor: pointer;
  318. position: relative;
  319. overflow: hidden;
  320. }
  321. ::v-deep .avatar-uploader .el-upload:hover {
  322. border-color: #409EFF;
  323. }
  324. ::v-deep .avatar-uploader-icon {
  325. font-size: 28px;
  326. color: #8c939d;
  327. width: 100px;
  328. height: 100px;
  329. line-height: 100px;
  330. text-align: center;
  331. }
  332. ::v-deep .avatar {
  333. width: 100px;
  334. height: 100px;
  335. display: block;
  336. }
  337. </style>
  338. <style>
  339. .custom-class-box {
  340. z-index: 999999 !important;
  341. }
  342. </style>