DrawerCommon.vue 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282
  1. <template>
  2. <div>
  3. <el-drawer v-model="openDrawer" :title="props.drawerType === 'add' ? '添加模板' : '编辑模板'">
  4. <el-form ref="ruleDrawerRef" :model="form" label-width="100px">
  5. <el-form-item
  6. label="模板名称"
  7. prop="name"
  8. :rules="[
  9. {
  10. required: true,
  11. message: '输入模板名称',
  12. trigger: 'blur',
  13. },
  14. ]"
  15. >
  16. <el-input placeholder="请输入模板名称" v-model="form.name" />
  17. </el-form-item>
  18. <el-form-item
  19. label="模板编码"
  20. prop="code"
  21. :rules="[
  22. {
  23. required: true,
  24. message: '输入模板编码',
  25. trigger: 'blur',
  26. },
  27. ]"
  28. >
  29. <el-input placeholder="请输入模板编码" v-model="form.code" />
  30. </el-form-item>
  31. <el-form-item label="看板组件">
  32. <el-select v-model="form.component" disabled>
  33. <el-option label="Zone one" value="shanghai" />
  34. <el-option label="Zone two" value="beijing" />
  35. </el-select>
  36. </el-form-item>
  37. <el-form-item
  38. label="预览图片"
  39. prop="thumbnail"
  40. :rules="[
  41. {
  42. required: true,
  43. message: '上传预览图片',
  44. trigger: 'blur',
  45. },
  46. ]"
  47. >
  48. <el-upload
  49. ref="uploadRef"
  50. :class="{ 'no-el-upload': fileList.length > 0 }"
  51. :action="actionUrl"
  52. :on-preview="handlePictureCardPreview"
  53. :on-remove="handleUploadRemove"
  54. :on-success="handleUploadSuccess"
  55. :before-upload="beforeThumbnailUpload"
  56. :limit="1"
  57. :headers="getHeaders()"
  58. :data="{ bizType: 'COMPANY_THUMBNAIL' }"
  59. list-type="picture-card"
  60. v-model:file-list="fileList"
  61. >
  62. <!-- <img v-if="ruleForm.thumbnail" :src="ruleForm.thumbnail" />
  63. <el-icon v-else><Plus /></el-icon> -->
  64. <el-icon v-if="!form.thumbnail || form.thumbnail.length === 0"><Plus /></el-icon>
  65. </el-upload>
  66. </el-form-item>
  67. <el-form-item label="备注" prop="remark">
  68. <el-input placeholder="请输入备注" v-model="form.remark" />
  69. </el-form-item>
  70. <!-- <el-form-item label="模板上传">
  71. <el-upload>
  72. <el-button disabled>上传</el-button>
  73. </el-upload>
  74. </el-form-item> -->
  75. <!-- <el-form-item label="状态" prop="status">
  76. <el-switch v-model="form.status" :active-value="0" :inactive-value="1" />
  77. </el-form-item> -->
  78. <!-- <el-form-item label="状态" label-position="right">
  79. <el-radio-group v-model="status" aria-label="label position">
  80. <el-radio-button :value="0">启用</el-radio-button>
  81. <el-radio-button :value="1">禁用</el-radio-button>
  82. </el-radio-group>
  83. </el-form-item> -->
  84. <el-form-item style="margin-top: 100px">
  85. <el-button style="margin-left: auto" @click="resetForm(ruleDrawerRef)">重置</el-button>
  86. <el-button @click="submitDrawer(ruleDrawerRef)" type="primary">提交</el-button>
  87. </el-form-item>
  88. </el-form>
  89. </el-drawer>
  90. </div>
  91. </template>
  92. <script setup lang="ts">
  93. import { ref, computed, defineExpose } from 'vue';
  94. import { FormInstance, ElMessage } from 'element-plus';
  95. import { onMounted } from 'vue';
  96. // import { cloneDeep, isEqual } from 'lodash-es';
  97. import type { UploadRawFile, UploadFile } from 'element-plus';
  98. import { Plus } from '@element-plus/icons-vue';
  99. import { getHeaders } from '@/utils/http/axios';
  100. import { useGlobSetting } from '@/hooks/setting';
  101. import urlJoin from 'url-join';
  102. import { SceneModule } from '@/api/template/template';
  103. // import { uid } from 'uid';
  104. export interface FormModelCommon {
  105. id?: number | null;
  106. code: string;
  107. name: string;
  108. component: string;
  109. remark: string;
  110. thumbnail: string | null | undefined;
  111. isDisabled?: number;
  112. }
  113. export type CreateType = 'create' | 'edit';
  114. const props = defineProps<{
  115. type: string;
  116. drawerType: string;
  117. addItem: (data: SceneModule) => unknown;
  118. editItem: (data: SceneModule) => unknown;
  119. }>();
  120. const openDrawer = ref(false);
  121. const form = ref<FormModelCommon>({
  122. name: '',
  123. code: '',
  124. component: '',
  125. remark: '',
  126. thumbnail: null,
  127. });
  128. const dataUpload = ref<SceneModule>({
  129. code: '',
  130. name: '',
  131. previewImage: null,
  132. remark: '',
  133. // isDisabled: 0,
  134. });
  135. const status = ref(0); //el-radio不能绑对象,因此把他独立出来
  136. const { urlPrefix } = useGlobSetting();
  137. const actionUrl = computed(() => {
  138. return urlJoin(urlPrefix!, `admin/minio/uploadFile`);
  139. });
  140. const uploadRef = ref();
  141. const fileList = ref<UploadFile[]>([]);
  142. // watch(
  143. // fileList,
  144. // (newVal) => {
  145. // form.value.thumbnail = newVal[0]?.url;
  146. // },
  147. // {
  148. // deep: true, // 如果数组中是对象,则需要设置deep选项来深度监听
  149. // },
  150. // );
  151. const dialogImageUrl = ref('');
  152. const dialogVisible = ref(false);
  153. const handlePictureCardPreview = (file: UploadFile) => {
  154. dialogImageUrl.value = file.url!;
  155. dialogVisible.value = true;
  156. };
  157. const handleUploadRemove = () => {
  158. form.value.thumbnail = '';
  159. };
  160. const handleUploadSuccess = (res) => {
  161. form.value.thumbnail = res.data.url;
  162. };
  163. const beforeThumbnailUpload = (file: UploadRawFile) => {
  164. if (file.type !== 'image/png' && file.type !== 'image/jpeg') {
  165. ElMessage.error('仅支持上传png/jpg/jpeg格式的图片');
  166. return false;
  167. } else if (file.size / 1024 / 1024 > 10) {
  168. ElMessage.error('上传图片大小不能超过10MB');
  169. return false;
  170. }
  171. return true;
  172. };
  173. const ruleDrawerRef = ref<FormInstance>();
  174. function resetForm(formE1: FormInstance | undefined) {
  175. if (!formE1) return;
  176. formE1.resetFields();
  177. form.value.name = '';
  178. form.value.code = '';
  179. form.value.remark = '';
  180. status.value = 0;
  181. form.value.thumbnail = null;
  182. reSetFileList();
  183. // console.log('resetForm');
  184. }
  185. const setForm = (details: FormModelCommon) => {
  186. // console.log('form=====', form.value);
  187. form.value.id = details.id;
  188. form.value.name = details.name;
  189. form.value.code = details.code;
  190. form.value.remark = details.remark;
  191. status.value = details.isDisabled ? details.isDisabled : 0;
  192. form.value.thumbnail = details.thumbnail;
  193. };
  194. const drawerSwitch = (index: boolean) => {
  195. openDrawer.value = index;
  196. };
  197. const setFileList = (name: string, url: string) => {
  198. fileList.value = [];
  199. fileList.value.push({
  200. name: name + '模板图片',
  201. status: 'success',
  202. uid: 1,
  203. url: url,
  204. });
  205. };
  206. const reSetFileList = () => {
  207. fileList.value = [];
  208. };
  209. defineExpose({
  210. setForm,
  211. drawerSwitch,
  212. setFileList,
  213. reSetFileList,
  214. });
  215. function submitDrawer(formEl: FormInstance | undefined) {
  216. if (!formEl) return;
  217. formEl.validate((valid, fields) => {
  218. if (valid) {
  219. if (props.drawerType === 'add') {
  220. dataUpload.value.code = form.value.code;
  221. dataUpload.value.name = form.value.name;
  222. dataUpload.value.previewImage = form.value.thumbnail;
  223. dataUpload.value.remark = form.value.remark;
  224. // dataUpload.value.isDisabled = status.value;
  225. props.addItem(dataUpload.value);
  226. } else {
  227. dataUpload.value.id = form.value.id;
  228. dataUpload.value.code = form.value.code;
  229. dataUpload.value.name = form.value.name;
  230. dataUpload.value.previewImage = form.value.thumbnail;
  231. dataUpload.value.remark = form.value.remark;
  232. // dataUpload.value.isDisabled = status.value;
  233. props.editItem(dataUpload.value);
  234. }
  235. } else {
  236. console.log('error submit!', fields);
  237. }
  238. });
  239. }
  240. onMounted(() => {
  241. if (props.drawerType === 'add') {
  242. resetForm(undefined);
  243. }
  244. });
  245. </script>
  246. <style scoped>
  247. :deep(.no-el-upload .el-upload--picture-card) {
  248. display: none;
  249. }
  250. </style>
  251. <style></style>