DrawerCommon.vue 9.2 KB

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