dialog.vue 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. <style scoped lang="scss">
  2. </style>
  3. <template>
  4. <div class="system-dialog-container">
  5. <el-dialog
  6. :title="state.dialog.title"
  7. v-model="state.dialog.isShowDialog"
  8. width="820px"
  9. draggable
  10. destroy-on-close
  11. :close-on-click-modal="false"
  12. @close="onClose"
  13. align-center>
  14. <el-form
  15. inline
  16. :model="state.ruleForm"
  17. :rules="state.rules"
  18. ref="formRef"
  19. size="default"
  20. label-width="125px"
  21. class="mt5">
  22. <!-- <el-form-item label="主活动" prop="activityId">
  23. <ext-select
  24. v-model="state.ruleForm.activityId"
  25. placeholder="关联活动"
  26. url="activity"
  27. url-method="get"
  28. clearable
  29. class="wd200">
  30. </ext-select>
  31. </el-form-item>-->
  32. <el-form-item label="banner图片" prop="bannerUrl">
  33. <ext-upload v-model="state.ruleForm.bannerUrl"></ext-upload>
  34. <!-- <el-input-->
  35. <!-- v-model.trim="state.ruleForm.bannerUrl"-->
  36. <!-- placeholder="banner图片地址"-->
  37. <!-- clearable-->
  38. <!-- class="wd200">-->
  39. <!-- </el-input>-->
  40. </el-form-item>
  41. <el-form-item label="描述" prop="bannerDesc" class="w100">
  42. <el-input
  43. v-model.trim="state.ruleForm.bannerDesc"
  44. placeholder="描述"
  45. maxlength="200"
  46. show-word-limit
  47. type="textarea"
  48. :rows="2"
  49. clearable
  50. class="w100">
  51. </el-input>
  52. </el-form-item>
  53. <el-form-item label="关联跳转地址" prop="linkUrl" class="w100">
  54. <el-input
  55. v-model.trim="state.ruleForm.linkUrl"
  56. placeholder="关联跳转地址"
  57. clearable
  58. class="w100">
  59. </el-input>
  60. </el-form-item>
  61. <el-form-item label="开始时间" prop="startTime">
  62. <ext-date-picker
  63. v-model.trim="state.ruleForm.startTime"
  64. placeholder="开始时间"
  65. type="datetime"
  66. clearable
  67. class="wd200">
  68. </ext-date-picker>
  69. </el-form-item>
  70. <el-form-item label="结束时间" prop="endTime">
  71. <ext-date-picker
  72. v-model.trim="state.ruleForm.endTime"
  73. placeholder="结束时间"
  74. type="datetime"
  75. clearable
  76. class="wd200">
  77. </ext-date-picker>
  78. </el-form-item>
  79. <el-form-item label="状态" prop="status">
  80. <ext-d-select
  81. v-model.trim="state.ruleForm.status"
  82. type="Banner.status"
  83. placeholder="状态"
  84. clearable
  85. class="wd200">
  86. </ext-d-select>
  87. </el-form-item>
  88. <el-form-item label="备注" prop="remark" class="w100">
  89. <el-input
  90. maxlength="500"
  91. show-word-limit
  92. type="textarea"
  93. :rows="3"
  94. v-model.trim="state.ruleForm.remark"
  95. placeholder="备注信息"
  96. clearable
  97. class="w100">
  98. </el-input>
  99. </el-form-item>
  100. </el-form>
  101. <template #footer>
  102. <div class="dialog-footer">
  103. <el-button @click="onCancel" size="default">取 消</el-button>
  104. <el-button :loading="state.btnLoading" type="primary" @click="onSubmit" size="default">{{ state.dialog.submitTxt }}</el-button>
  105. </div>
  106. </template>
  107. </el-dialog>
  108. </div>
  109. </template>
  110. <script setup lang="ts" name="BannerDialog">
  111. import {defineAsyncComponent, reactive, onMounted, ref} from 'vue';
  112. import {Msg} from "/@/utils/message";
  113. import {$body, $get} from "/@/utils/request";
  114. import u from '/@/utils/u'
  115. import ExtSelect from "/@/components/form/ExtSelect.vue";
  116. import ExtUpload from "/@/components/form/ExtUpload.vue";
  117. import ExtDatePicker from "/@/components/form/ExtDatePicker.vue";
  118. import ExtDSelect from "/@/components/form/ExtDSelect.vue";
  119. // 定义子组件向父组件传值/事件
  120. const emit = defineEmits(['refresh']);
  121. const formRef = ref();
  122. //定义初始变量,重置使用
  123. const initState = () => ({
  124. ruleForm: {
  125. id: 0,
  126. status:1
  127. },
  128. btnLoading: false,
  129. dialog: {
  130. isShowDialog: false,
  131. type: '',
  132. title: '',
  133. submitTxt: '',
  134. },
  135. rules: {
  136. startTime:[u.validator.required],
  137. endTime:[u.validator.required],
  138. // status:[u.validator.required],
  139. },
  140. })
  141. // 定义变量内容
  142. const state = reactive(initState());
  143. // 打开弹窗
  144. const open = (action: string = 'add', row: any) => {
  145. state.dialog.title = u.dialog.actions[action].title + "『banner配置』"
  146. state.dialog.submitTxt = u.dialog.actions[action].btn + "『banner配置』"
  147. state.dialog.isShowDialog = true;
  148. if (action !== 'add') {
  149. loadData(row.id);
  150. } else {
  151. state.ruleForm = Object.assign(state.ruleForm, row);
  152. }
  153. };
  154. // 关闭弹窗
  155. const onClose = () => {
  156. state.dialog.isShowDialog = false;
  157. Object.assign(state, initState())
  158. };
  159. // 取消
  160. const onCancel = () => {
  161. onClose();
  162. };
  163. // 提交
  164. const onSubmit = () => {
  165. formRef.value.validate((valid:boolean) => {
  166. if(valid){
  167. if(new Date(state.ruleForm.startTime).getTime()>new Date(state.ruleForm.endTime).getTime()){
  168. Msg.message("开始时间不能晚于结束时间","error")
  169. return false;
  170. }
  171. state.btnLoading = true;
  172. const url = state.ruleForm.id > 0 ? "banner/modify" : "banner/add"
  173. $body(url, state.ruleForm).then(() => {
  174. state.btnLoading = false;
  175. Msg.message('操作成功');
  176. console.log('submit!')
  177. onClose();
  178. emit('refresh');
  179. })
  180. }
  181. }).catch(() => {
  182. state.btnLoading = false;
  183. Msg.message('请先完整填写表单', 'error');
  184. })
  185. };
  186. const handleFormChange = (formData: any) => {
  187. console.log(formData)
  188. }
  189. // 初始化表格数据
  190. const loadData = (id: number) => {
  191. $get(`banner/${id}`).then((res: any) => {
  192. state.ruleForm = res;
  193. })
  194. }
  195. // 暴露变量
  196. defineExpose({
  197. open
  198. });
  199. </script>