.prettierrc.cjs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/api/demo/demo.ts | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/api/demo/demo/index.ts | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/api/demo/demo/types.ts | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/api/demo/tree.ts | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/api/demo/tree/index.ts | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/api/demo/tree/types.ts | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/api/demo/types.ts | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/types/global.d.ts | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/demo/demo/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/demo/tree/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
.prettierrc.cjs
@@ -38,9 +38,9 @@ htmlWhitespaceSensitivity: 'css', // Vueæä»¶èæ¬åæ ·å¼æ ç¾ç¼©è¿ vueIndentScriptAndStyle: false, //å¨ windows æä½ç³»ç»ä¸æ¢è¡ç¬¦é常æ¯å车 (CR) å æ¢è¡åé符 (LF)ï¼ä¹å°±æ¯å车æ¢è¡(CRLF)ï¼ //ç¶èå¨ Linux å Unix ä¸åªä½¿ç¨ç®åçæ¢è¡åé符 (LF)ã //对åºçæ§å¶å符为 "\n" (LF) å "\r\n"(CRLF)ãautoæä¸ºä¿æç°æçè¡å°¾ // å¨ windows æä½ç³»ç»ä¸æ¢è¡ç¬¦é常æ¯å车 (CR) å æ¢è¡åé符 (LF)ï¼ä¹å°±æ¯å车æ¢è¡(CRLF)ï¼ // ç¶èå¨ Linux å Unix ä¸åªä½¿ç¨ç®åçæ¢è¡åé符 (LF)ã // 对åºçæ§å¶å符为 "\n" (LF) å "\r\n"(CRLF)ãautoæä¸ºä¿æç°æçè¡å°¾ // æ¢è¡ç¬¦ä½¿ç¨ lf ç»å°¾æ¯ å¯éå¼"<auto|lf|crlf|cr>" endOfLine: 'auto' }; src/api/demo/demo.ts
ÎļþÒÑɾ³ý src/api/demo/demo/index.ts
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,62 @@ import request from '@/utils/request'; import { AxiosPromise } from 'axios'; import { DemoVO, DemoForm, DemoQuery } from '@/api/demo/demo/types'; /** * æ¥è¯¢æµè¯åå表 * @param query * @returns {*} */ export const listDemo = (query?: DemoQuery): AxiosPromise<DemoVO[]> => { return request({ url: '/demo/demo/list', method: 'get', params: query }); }; /** * æ¥è¯¢æµè¯åè¯¦ç» * @param id */ export const getDemo = (id: string | number): AxiosPromise<DemoVO> => { return request({ url: '/demo/demo/' + id, method: 'get' }); }; /** * æ°å¢æµè¯å * @param data */ export const addDemo = (data: DemoForm) => { return request({ url: '/demo/demo', method: 'post', data: data }); }; /** * ä¿®æ¹æµè¯å * @param data */ export const updateDemo = (data: DemoForm) => { return request({ url: '/demo/demo', method: 'put', data: data }); }; /** * å 餿µè¯å * @param id */ export const delDemo = (id: string | number | Array<string | number>) => { return request({ url: '/demo/demo/' + id, method: 'delete' }); }; src/api/demo/demo/types.ts
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,90 @@ export interface DemoVO { /** * ä¸»é® */ id: string | number; /** * é¨é¨id */ deptId: string | number; /** * ç¨æ·id */ userId: string | number; /** * æåºå· */ orderNum: number; /** * keyé® */ testKey: string; /** * å¼ */ value: string; } export interface DemoForm extends BaseEntity { /** * ä¸»é® */ id?: string | number; /** * é¨é¨id */ deptId?: string | number; /** * ç¨æ·id */ userId?: string | number; /** * æåºå· */ orderNum?: number; /** * keyé® */ testKey?: string; /** * å¼ */ value?: string; } export interface DemoQuery extends PageQuery { /** * é¨é¨id */ deptId?: string | number; /** * ç¨æ·id */ userId?: string | number; /** * æåºå· */ orderNum?: number; /** * keyé® */ testKey?: string; /** * å¼ */ value?: string; } src/api/demo/tree.ts
ÎļþÒÑɾ³ý src/api/demo/tree/index.ts
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,62 @@ import request from '@/utils/request'; import { AxiosPromise } from 'axios'; import { TreeVO, TreeForm, TreeQuery } from '@/api/demo/tree/types'; /** * æ¥è¯¢æµè¯æ å表 * @param query * @returns {*} */ export const listTree = (query?: TreeQuery): AxiosPromise<TreeVO[]> => { return request({ url: '/demo/tree/list', method: 'get', params: query }); }; /** * æ¥è¯¢æµè¯æ è¯¦ç» * @param id */ export const getTree = (id: string | number): AxiosPromise<TreeVO> => { return request({ url: '/demo/tree/' + id, method: 'get' }); }; /** * æ°å¢æµè¯æ * @param data */ export const addTree = (data: TreeForm) => { return request({ url: '/demo/tree', method: 'post', data: data }); }; /** * ä¿®æ¹æµè¯æ * @param data */ export const updateTree = (data: TreeForm) => { return request({ url: '/demo/tree', method: 'put', data: data }); }; /** * å 餿µè¯æ * @param id */ export const delTree = (id: string | number | Array<string | number>) => { return request({ url: '/demo/tree/' + id, method: 'delete' }); }; src/api/demo/tree/types.ts
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,75 @@ export interface TreeVO { /** * ä¸»é® */ id: string | number; /** * ç¶id */ parentId: string | number; /** * é¨é¨id */ deptId: string | number; /** * ç¨æ·id */ userId: string | number; /** * å¼ */ treeName: string; } export interface TreeForm extends BaseEntity { /** * ä¸»é® */ id?: string | number; /** * ç¶id */ parentId?: string | number; /** * é¨é¨id */ deptId?: string | number; /** * ç¨æ·id */ userId?: string | number; /** * å¼ */ treeName?: string; } export interface TreeQuery { /** * ç¶id */ parentId?: string | number; /** * é¨é¨id */ deptId?: string | number; /** * ç¨æ·id */ userId?: string | number; /** * å¼ */ treeName?: string; } src/api/demo/types.ts
ÎļþÒÑɾ³ý src/types/global.d.ts
@@ -57,6 +57,7 @@ interface BaseEntity { createBy?: any; createDept?: any; createTime?: string; updateBy?: any; updateTime?: any; src/views/demo/demo/index.vue
@@ -3,26 +3,23 @@ <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> <div class="search" v-show="showSearch"> <el-form :model="queryParams" ref="queryFormRef" :inline="true" label-width="68px"> <el-form-item label="é¨é¨id" prop="deptId"> <el-input v-model="queryParams.deptId" placeholder="请è¾å ¥é¨é¨id" clearable @keyup.enter="handleQuery" /> </el-form-item> <el-form-item label="ç¨æ·id" prop="userId"> <el-input v-model="queryParams.userId" placeholder="请è¾å ¥ç¨æ·id" clearable @keyup.enter="handleQuery" /> </el-form-item> <el-form-item label="æåºå·" prop="orderNum"> <el-input v-model="queryParams.orderNum" placeholder="请è¾å ¥æåºå·" clearable @keyup.enter="handleQuery" /> </el-form-item> <el-form-item label="keyé®" prop="testKey"> <el-input v-model="queryParams.testKey" placeholder="请è¾å ¥keyé®" clearable style="width: 200px" @keyup.enter="handleQuery" /> <el-input v-model="queryParams.testKey" placeholder="请è¾å ¥keyé®" clearable @keyup.enter="handleQuery" /> </el-form-item> <el-form-item label="å¼" prop="value"> <el-input v-model="queryParams.value" placeholder="请è¾å ¥å¼" clearable style="width: 200px" @keyup.enter="handleQuery" /> </el-form-item> <el-form-item label="å建æ¶é´"> <el-date-picker v-model="daterangeCreateTime" value-format="YYYY-MM-DD HH:mm:ss" type="daterange" range-separator="-" start-placeholder="å¼å§æ¥æ" end-placeholder="ç»ææ¥æ" :default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]" ></el-date-picker> <el-input v-model="queryParams.value" placeholder="请è¾å ¥å¼" clearable @keyup.enter="handleQuery" /> </el-form-item> <el-form-item> <el-button type="primary" icon="search" @click="handleQuery">æç´¢</el-button> <el-button type="primary" icon="search" @click="handlePage">æç´¢(èªå®ä¹å页æ¥å£)</el-button> <el-button type="primary" icon="Search" @click="handleQuery">æç´¢</el-button> <el-button icon="Refresh" @click="resetQuery">éç½®</el-button> </el-form-item> </el-form> @@ -39,12 +36,7 @@ <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['demo:demo:edit']">ä¿®æ¹</el-button> </el-col> <el-col :span="1.5"> <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['demo:demo:remove']"> å é¤ </el-button> </el-col> <el-col :span="1.5"> <el-button type="info" plain icon="Upload" @click="handleImport" v-hasPermi="['demo:demo:import']">å¯¼å ¥(æ ¡éª)</el-button> <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['demo:demo:remove']">å é¤</el-button> </el-col> <el-col :span="1.5"> <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['demo:demo:export']">导åº</el-button> @@ -55,40 +47,33 @@ <el-table v-loading="loading" :data="demoList" @selection-change="handleSelectionChange"> <el-table-column type="selection" width="55" align="center" /> <el-table-column label="主é®" align="center" prop="id" v-if="columns[0].visible" /> <el-table-column label="é¨é¨id" align="center" prop="deptId" v-if="columns[1].visible" /> <el-table-column label="ç¨æ·id" align="center" prop="userId" v-if="columns[2].visible" /> <el-table-column label="æåºå·" align="center" prop="orderNum" v-if="columns[3].visible" /> <el-table-column label="keyé®" align="center" prop="testKey" v-if="columns[4].visible" /> <el-table-column label="å¼" align="center" prop="value" v-if="columns[5].visible" /> <el-table-column label="å建æ¶é´" align="center" prop="createTime" v-if="columns[6].visible" width="180"> <template #default="scope"> <span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span> </template> </el-table-column> <el-table-column label="å建人" align="center" prop="createByName" v-if="columns[7].visible" /> <el-table-column label="æ´æ°æ¶é´" align="center" prop="updateTime" v-if="columns[8].visible" width="180"> <template #default="scope"> <span>{{ parseTime(scope.row.updateTime, '{y}-{m}-{d}') }}</span> </template> </el-table-column> <el-table-column label="æ´æ°äºº" align="center" prop="updateByName" v-if="columns[9].visible" /> <el-table-column label="æä½" fixed="right" align="center" width="150" class-name="small-padding fixed-width"> <el-table-column label="主é®" align="center" prop="id" v-if="true" /> <el-table-column label="é¨é¨id" align="center" prop="deptId" /> <el-table-column label="ç¨æ·id" align="center" prop="userId" /> <el-table-column label="æåºå·" align="center" prop="orderNum" /> <el-table-column label="keyé®" align="center" prop="testKey" /> <el-table-column label="å¼" align="center" prop="value" /> <el-table-column label="æä½" align="center" class-name="small-padding fixed-width"> <template #default="scope"> <el-tooltip content="ä¿®æ¹" placement="top"> <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['demo:demo:edit']"></el-button> </el-tooltip> <el-tooltip content="ä¿®æ¹" placement="top"> <el-tooltip content="å é¤" placement="top"> <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['demo:demo:remove']"></el-button> </el-tooltip> </template> </el-table-column> </el-table> <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" /> <pagination v-show="total>0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" /> </el-card> <!-- æ·»å æä¿®æ¹æµè¯åè¡¨å¯¹è¯æ¡ --> <!-- æ·»å æä¿®æ¹æµè¯åå¯¹è¯æ¡ --> <el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body> <el-form ref="demoFormRef" :model="form" :rules="rules" label-width="80px"> <el-form-item label="é¨é¨id" prop="deptId"> @@ -106,10 +91,6 @@ <el-form-item label="å¼" prop="value"> <el-input v-model="form.value" placeholder="请è¾å ¥å¼" /> </el-form-item> <el-form-item label="å建æ¶é´" prop="createTime"> <el-date-picker clearable v-model="form.createTime" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="éæ©å建æ¶é´"> </el-date-picker> </el-form-item> </el-form> <template #footer> <div class="dialog-footer"> @@ -118,39 +99,14 @@ </div> </template> </el-dialog> <!-- ç¨æ·å¯¼å ¥å¯¹è¯æ¡ --> <el-dialog :title="upload.title" v-model="upload.open" width="400px" append-to-body> <el-upload ref="uploadRef" :limit="1" accept=".xlsx, .xls" :headers="upload.headers" :action="upload.url + '?updateSupport=' + upload.updateSupport" :disabled="upload.isUploading" :on-progress="handleFileUploadProgress" :on-success="handleFileSuccess" :auto-upload="false" drag > <i class="el-icon-upload"></i> <div class="el-upload__text">å°æä»¶æå°æ¤å¤ï¼æ<em>ç¹å»ä¸ä¼ </em></div> </el-upload> <template #footer> <div class="dialog-footer"> <el-button type="primary" @click="submitFileForm">ç¡® å®</el-button> <el-button @click="upload.open = false">å æ¶</el-button> </div> </template> </el-dialog> </div> </template> <script setup name="Demo" lang="ts"> import { listDemo, pageDemo, getDemo, delDemo, addDemo, updateDemo } from "@/api/demo/demo"; import { getToken } from "@/utils/auth"; import { ComponentInternalInstance } from "vue"; import { ElUpload, UploadFile, UploadFiles, DateModelType } from 'element-plus'; import { DemoForm, DemoQuery, DemoVO } from "@/api/demo/types"; import { listDemo, getDemo, delDemo, addDemo, updateDemo } from '@/api/demo/demo'; import { DemoVO, DemoQuery, DemoForm } from '@/api/demo/demo/types'; import { ComponentInternalInstance } from 'vue'; import { ElForm } from 'element-plus'; const { proxy } = getCurrentInstance() as ComponentInternalInstance; @@ -158,200 +114,159 @@ const buttonLoading = ref(false); const loading = ref(true); const showSearch = ref(true); const ids = ref<Array<string | number>>([]) const ids = ref<Array<string | number>>([]); const single = ref(true); const multiple = ref(true); const total = ref(0); const daterangeCreateTime = ref<[DateModelType, DateModelType]>(['', '']); const demoFormRef = ref(ElForm); const queryFormRef = ref(ElForm); const uploadRef = ref(ElUpload); const demoFormRef = ref(ElForm); const dialog = reactive<DialogOption>({ visible: false, title: '' visible: false, title: '' }); /** ç¨æ·å¯¼å ¥åæ° */ const upload = reactive<ImportOption>({ // æ¯å¦æ¾ç¤ºå¼¹åºå±ï¼ç¨æ·å¯¼å ¥ï¼ open: false, // å¼¹åºå±æ é¢ï¼ç¨æ·å¯¼å ¥ï¼ title: "", // æ¯å¦ç¦ç¨ä¸ä¼ isUploading: false, // 设置ä¸ä¼ ç请æ±å¤´é¨ headers: { Authorization: "Bearer " + getToken() }, // ä¸ä¼ çå°å url: import.meta.env.VITE_APP_BASE_API + "demo/demo/importData" }) // åæ¾éä¿¡æ¯ const columns = ref<FieldOption[]>([ { key: 0, label: `主é®`, visible: false }, { key: 1, label: `é¨é¨id`, visible: true }, { key: 2, label: `ç¨æ·id`, visible: true }, { key: 3, label: `æåºå·`, visible: true }, { key: 4, label: `keyé®`, visible: true }, { key: 5, label: `å¼`, visible: true }, { key: 6, label: `å建æ¶é´`, visible: true }, { key: 7, label: `å建人`, visible: true }, { key: 8, label: `æ´æ°æ¶é´`, visible: true }, { key: 9, label: `æ´æ°äºº`, visible: true } ]); const initDataForm: DemoForm = { id: undefined, deptId: undefined, userId: undefined, orderNum: 0, testKey: '', value: '', version: '', ossConfigId: undefined, const initFormData: DemoForm = { id: undefined, deptId: undefined, userId: undefined, orderNum: undefined, testKey: undefined, value: undefined, } const data = reactive<PageData<DemoForm, DemoQuery>>({ form: { ...initDataForm }, queryParams: { pageNum: 1, pageSize: 10, testKey: '', value: '', createTime: '', }, rules: { testKey: [{ required: true, message: "keyé®ä¸è½ä¸ºç©º", trigger: "blur" }], value: [{ required: true, message: "å¼ä¸è½ä¸ºç©º", trigger: "blur" }], } form: {...initFormData}, queryParams: { pageNum: 1, pageSize: 10, deptId: undefined, userId: undefined, orderNum: undefined, testKey: undefined, value: undefined, }, rules: { id: [ { required: true, message: "主é®ä¸è½ä¸ºç©º", trigger: "blur" } ], deptId: [ { required: true, message: "é¨é¨idä¸è½ä¸ºç©º", trigger: "blur" } ], userId: [ { required: true, message: "ç¨æ·idä¸è½ä¸ºç©º", trigger: "blur" } ], orderNum: [ { required: true, message: "æåºå·ä¸è½ä¸ºç©º", trigger: "blur" } ], testKey: [ { required: true, message: "keyé®ä¸è½ä¸ºç©º", trigger: "blur" } ], value: [ { required: true, message: "å¼ä¸è½ä¸ºç©º", trigger: "blur" } ], } }); const { queryParams, form, rules } = toRefs(data); /** æ¥è¯¢OSS对象åå¨å表 */ /** æ¥è¯¢æµè¯åå表 */ const getList = async () => { loading.value = true; const res = await listDemo(proxy?.addDateRange(queryParams.value, daterangeCreateTime.value, "CreateTime")); demoList.value = res.rows; total.value = res.total; loading.value = false; loading.value = true; const res = await listDemo(queryParams.value); demoList.value = res.rows; total.value = res.total; loading.value = false; } /** èªå®ä¹å页æ¥è¯¢ */ const getPage = async () => { loading.value = true; const res = await pageDemo(proxy?.addDateRange(queryParams.value, daterangeCreateTime.value, "CreateTime")); demoList.value = res.rows; total.value = res.total; loading.value = false; } /** åæ¶æé® */ const cancel = () => { reset(); dialog.visible = false; reset(); dialog.visible = false; } /** 表åéç½® */ const reset = () => { form.value = { ...initDataForm }; demoFormRef.value.resetFields(); form.value = {...initFormData}; demoFormRef.value.resetFields(); } /** æç´¢æé®æä½ */ const handleQuery = () => { queryParams.value.pageNum = 1; getList(); queryParams.value.pageNum = 1; getList(); } /** æç´¢æé®æä½ */ const handlePage = () => { queryParams.value.pageNum = 1; getList(); } /** éç½®æé®æä½ */ const resetQuery = () => { daterangeCreateTime.value = ['', '']; queryFormRef.value.resetFields(); handleQuery(); queryFormRef.value.resetFields(); handleQuery(); } /** éæ©æ¡æ° */ /** å¤éæ¡é䏿°æ® */ const handleSelectionChange = (selection: DemoVO[]) => { ids.value = selection.map(item => item.id); single.value = selection.length != 1; multiple.value = !selection.length; ids.value = selection.map(item => item.id); single.value = selection.length != 1; multiple.value = !selection.length; } /** æ°å¢æé®æä½ */ const handleAdd = () => { dialog.visible = true; dialog.title = "æ·»å æµè¯å表"; nextTick(() => { reset(); }) dialog.visible = true; dialog.title = "æ·»å æµè¯å"; nextTick(() => { reset(); }); } /** ä¿®æ¹æé®æä½ */ const handleUpdate = async (row?: DemoVO) => { loading.value = true; dialog.visible = true; dialog.title = "ä¿®æ¹æµè¯å表"; const _ids = row?.id || ids.value[0]; const res = await getDemo(_ids); nextTick(() => { reset(); Object.assign(form.value, res.data) loading.value = false; }) const handleUpdate = (row?: DemoVO) => { loading.value = true dialog.visible = true; dialog.title = "ä¿®æ¹æµè¯å"; nextTick(async () => { reset(); const _id = row?.id || ids.value[0] const res = await getDemo(_id); loading.value = false; Object.assign(form.value, res.data); }); } /** æäº¤æé® */ const submitForm = () => { demoFormRef.value.validate(async (valid: boolean) => { if (valid) { buttonLoading.value = true; if (form.value.ossConfigId) { await updateDemo(form.value).finally(() => buttonLoading.value = false); } else { await addDemo(form.value).finally(() => buttonLoading.value = false); } proxy?.$modal.msgSuccess("æä½æå"); dialog.visible = false; getList(); } }); demoFormRef.value.validate(async (valid: boolean) => { if (valid) { buttonLoading.value = true; if (form.value.id) { await updateDemo(form.value).finally(() => buttonLoading.value = false); } else { await addDemo(form.value).finally(() => buttonLoading.value = false); } proxy?.$modal.msgSuccess("ä¿®æ¹æå"); dialog.visible = false; await getList(); } }); } /** å é¤æé®æä½ */ const handleDelete = async (row?: DemoVO) => { const _ids = row?.id || ids.value; await proxy?.$modal.confirm('æ¯å¦ç¡®è®¤å 餿µè¯å表ç¼å·ä¸º"' + _ids + '"çæ°æ®é¡¹?'); await delDemo(_ids).finally(() => loading.value = false); loading.value = false; getList(); proxy?.$modal.msgSuccess("å 餿å"); const _ids = row?.id || ids.value; await proxy?.$modal.confirm('æ¯å¦ç¡®è®¤å 餿µè¯åç¼å·ä¸º"' + _ids + '"çæ°æ®é¡¹ï¼').finally(() => loading.value = false); await delDemo(_ids); proxy?.$modal.msgSuccess("å 餿å"); await getList(); } /** å¯¼å ¥æé®æä½ */ const handleImport = () => { upload.title = "æµè¯å¯¼å ¥"; upload.open = true; } /** å¯¼åºæé®æä½ */ const handleExport = () => { proxy?.download("demo/demo/export", { ...queryParams.value, }, `demo_${new Date().getTime()}.xlsx`); } /**æä»¶ä¸ä¼ ä¸å¤ç */ const handleFileUploadProgress = () => { upload.isUploading = true; } /** æä»¶ä¸ä¼ æåå¤ç */ const handleFileSuccess = (res: any, file: UploadFile, fileList: UploadFiles) => { upload.open = false; upload.isUploading = false; uploadRef.value.clearFiles(); ElMessageBox.alert(res.msg, "å¯¼å ¥ç»æ", { dangerouslyUseHTMLString: true }); getList(); } /** æäº¤ä¸ä¼ æä»¶ */ function submitFileForm() { uploadRef.value.submit(); proxy?.download('demo/demo/export', { ...queryParams.value }, `demo_${new Date().getTime()}.xlsx`) } onMounted(() => { getList() getPage() }) getList(); }); </script> src/views/demo/tree/index.vue
@@ -2,23 +2,12 @@ <div class="p-2"> <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> <div class="search" v-show="showSearch"> <el-form :model="queryParams" ref="qeuryFormRef" :inline="true" label-width="68px"> <el-form :model="queryParams" ref="queryFormRef" :inline="true" label-width="68px"> <el-form-item label="æ èç¹å" prop="treeName"> <el-input v-model="queryParams.treeName" placeholder="请è¾å ¥æ èç¹å" clearable style="width: 200px" @keyup.enter="handleQuery" /> </el-form-item> <el-form-item label="å建æ¶é´"> <el-date-picker v-model="daterangeCreateTime" value-format="YYYY-MM-DD HH:mm:ss" type="daterange" range-separator="-" start-placeholder="å¼å§æ¥æ" end-placeholder="ç»ææ¥æ" :default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]" ></el-date-picker> <el-input v-model="queryParams.treeName" placeholder="请è¾å ¥æ èç¹å" clearable @keyup.enter="handleQuery" /> </el-form-item> <el-form-item> <el-button type="primary" icon="search" @click="handleQuery">æç´¢</el-button> <el-button type="primary" icon="Search" @click="handleQuery">æç´¢</el-button> <el-button icon="Refresh" @click="resetQuery">éç½®</el-button> </el-form-item> </el-form> @@ -27,62 +16,54 @@ <el-card shadow="never"> <template #header> <el-row :gutter="10"> <el-row :gutter="10" class="mb8"> <el-col :span="1.5"> <el-button type="primary" plain icon="Plus" @click="handleAdd()" v-hasPermi="['demo:tree:add']">æ°å¢</el-button> </el-col> <el-col :span="1.5"> <el-button type="info" plain icon="Sort" @click="handleToggleExpandAll">å±å¼/æå </el-button> </el-col> <right-toolbar :columns="columns" v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> </el-row> </template> <el-table v-if="refreshTable" v-loading="loading" :data="treeList" row-key="id" :default-expand-all="isExpandAll" :tree-props="{ children: 'children', hasChildren: 'hasChildren' }" ref="demoTreeTableRef" :tree-props="{children: 'children', hasChildren: 'hasChildren'}" ref="treeTableRef" > <el-table-column label="ç¶id" prop="parentId" v-if="columns[0].visible" /> <el-table-column label="é¨é¨id" align="center" prop="deptId" v-if="columns[1].visible" /> <el-table-column label="ç¨æ·id" align="center" prop="userId" v-if="columns[2].visible" /> <el-table-column label="æ èç¹å" align="center" prop="treeName" v-if="columns[3].visible" /> <el-table-column label="å建æ¶é´" align="center" prop="createTime" v-if="columns[4].visible" width="180"> <template #default="scope"> <span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span> </template> </el-table-column> <el-table-column label="æä½" fixed="right" align="center" width="150" class-name="small-padding fixed-width"> <el-table-column label="ç¶id" align="center" prop="parentId" /> <el-table-column label="é¨é¨id" align="center" prop="deptId" /> <el-table-column label="ç¨æ·id" align="center" prop="userId" /> <el-table-column label="æ èç¹å" align="center" prop="treeName" /> <el-table-column label="æä½" align="center" class-name="small-padding fixed-width"> <template #default="scope"> <el-tooltip content="ä¿®æ¹" placement="top"> <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['demo:tree:edit']"></el-button> <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['demo:tree:edit']" /> </el-tooltip> <el-tooltip content="æ°å¢" placement="top"> <el-button link type="primary" icon="Plus" @click="handleAdd(scope.row)" v-hasPermi="['demo:tree:add']"></el-button> <el-button link type="primary" icon="Plus" @click="handleAdd(scope.row)" v-hasPermi="['demo:tree:add']" /> </el-tooltip> <el-tooltip content="å é¤" placement="top"> <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['demo:tree:remove']"></el-button> <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['demo:tree:remove']" /> </el-tooltip> </template> </el-table-column> </el-table> </el-card> <!-- æ·»å æä¿®æ¹æµè¯æ è¡¨å¯¹è¯æ¡ --> <!-- æ·»å æä¿®æ¹æµè¯æ å¯¹è¯æ¡ --> <el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body> <el-form ref="treeRef" :model="form" :rules="rules" label-width="80px"> <el-form ref="treeFormRef" :model="form" :rules="rules" label-width="80px"> <el-form-item label="ç¶id" prop="parentId"> <el-tree-select v-model="form.parentId" :data="treeOptions" :props="{ value: 'id', label: 'treeName', children: 'children' }" value-key="id" check-strictly placeholder="è¯·éæ©ç¶id" check-strictly /> </el-form-item> <el-form-item label="é¨é¨id" prop="deptId"> @@ -91,8 +72,8 @@ <el-form-item label="ç¨æ·id" prop="userId"> <el-input v-model="form.userId" placeholder="请è¾å ¥ç¨æ·id" /> </el-form-item> <el-form-item label="æ èç¹å" prop="treeName"> <el-input v-model="form.treeName" placeholder="请è¾å ¥æ èç¹å" /> <el-form-item label="å¼" prop="treeName"> <el-input v-model="form.treeName" placeholder="请è¾å ¥å¼" /> </el-form-item> </el-form> <template #footer> @@ -106,188 +87,191 @@ </template> <script setup name="Tree" lang="ts"> import { listTree, getTree, delTree, addTree, updateTree } from '@/api/demo/tree'; import { DemoTreeVO, DemoTreeForm, DemoTreeOptionsType, DemoTreeQuery } from '@/api/demo/types'; import { listTree, getTree, delTree, addTree, updateTree } from "@/api/demo/tree"; import { TreeVO, TreeQuery, TreeForm } from '@/api/demo/tree/types'; import { ComponentInternalInstance } from 'vue'; import { ElTree, ElForm, ElTable, DateModelType } from 'element-plus'; import { ElForm, ElTable } from 'element-plus'; const { proxy } = getCurrentInstance() as ComponentInternalInstance; const treeList = ref<DemoTreeVO[]>([]); type TreeOption = { id: number; treeName: string; children?: TreeOption[]; } const { proxy } = getCurrentInstance() as ComponentInternalInstance;; const treeList = ref<TreeVO[]>([]); const treeOptions = ref<TreeOption[]>([]); const buttonLoading = ref(false); const loading = ref(true); const showSearch = ref(true); const isExpandAll = ref(true); const refreshTable = ref(true); const treeOptions = ref<DemoTreeOptionsType[]>([]); const daterangeCreateTime = ref<[DateModelType, DateModelType]>(['', '']); const loading = ref(false); const treeRef = ref(ElTree); const qeuryFormRef = ref(ElForm); const demoTreeTableRef = ref(ElTable) const queryFormRef = ref(ElForm); const treeFormRef = ref(ElForm); const treeTableRef = ref(ElTable) const dialog = reactive<DialogOption>({ visible: false, title: '' }); // åæ¾éä¿¡æ¯ const columns = ref<FieldOption[]>([ { key: 0, label: `ç¶id`, visible: false }, { key: 1, label: `é¨é¨id`, visible: true }, { key: 2, label: `ç¨æ·id`, visible: true }, { key: 3, label: `æ èç¹å`, visible: true }, { key: 4, label: `å建æ¶é´`, visible: true } ]); const initFormData = { const initFormData: TreeForm = { id: undefined, parentId: undefined, deptId: undefined, userId: undefined, treeName: '' treeName: undefined, } const data = reactive<PageData<DemoTreeForm, DemoTreeQuery>>({ // æ¥è¯¢åæ° queryParams: { treeName: '', createTime: '', }, // 表ååæ° form: {...initFormData}, // è¡¨åæ ¡éª rules: { treeName: [{ required: true, message: "æ èç¹åä¸è½ä¸ºç©º", trigger: "blur" }], } const data = reactive<PageData<TreeForm, TreeQuery>>({ form: {...initFormData}, queryParams: { parentId: undefined, deptId: undefined, userId: undefined, treeName: undefined, }, rules: { id: [ { required: true, message: "主é®ä¸è½ä¸ºç©º", trigger: "blur" } ], parentId: [ { required: true, message: "ç¶idä¸è½ä¸ºç©º", trigger: "blur" } ], deptId: [ { required: true, message: "é¨é¨idä¸è½ä¸ºç©º", trigger: "blur" } ], userId: [ { required: true, message: "ç¨æ·idä¸è½ä¸ºç©º", trigger: "blur" } ], treeName: [ { required: true, message: "å¼ä¸è½ä¸ºç©º", trigger: "blur" } ], } }); const { queryParams, form, rules } = toRefs(data); /** æ¥è¯¢æµè¯æ 表å表 */ const getList = () => { loading.value = true; listTree(proxy?.addDateRange(queryParams.value, daterangeCreateTime.value, "CreateTime")).then(res => { const data = proxy?.handleTree<DemoTreeVO>(res.data, "id", "parentId"); if (data) { treeList.value = data } loading.value = false; }); /** æ¥è¯¢æµè¯æ å表 */ const getList = async () => { loading.value = true; const res = await listTree(queryParams.value); const data = proxy?.handleTree<TreeVO>(res.data, "id", "parentId"); if (data) { treeList.value = data; loading.value = false; } } /** æ¥è¯¢é¨é¨ä¸ææ ç»æ */ const getTreeSelect = async () => { listTree(proxy?.addDateRange(queryParams.value, daterangeCreateTime.value, "CreateTime")).then(res => { const topData: DemoTreeOptionsType = { id: 0, treeName: '顶级èç¹', children: [] }; topData.children = proxy?.handleTree<DemoTreeOptionsType>(res.data, "id", "parentId"); treeOptions.value.push(topData); }); /** æ¥è¯¢æµè¯æ 䏿æ ç»æ */ const getTreeselect = async () => { const res = await listTree(); treeOptions.value = []; const data: TreeOption = { id: 0, treeName: '顶级èç¹', children: [] }; data.children = proxy?.handleTree<TreeOption>(res.data, "id", "parentId"); treeOptions.value.push(data); } /** åæ¶æé® */ // åæ¶æé® const cancel = () => { reset(); dialog.visible = false; reset(); dialog.visible = false; } /** 表åéç½® */ // 表åéç½® const reset = () => { form.value = {...initFormData} treeRef.value.resetFields(); form.value = {...initFormData} treeFormRef.value.resetFields(); } /** æç´¢æé®æä½ */ const handleQuery = () => { getList(); getList(); } /** éç½®æé®æä½ */ const resetQuery = () => { daterangeCreateTime.value = ['', '']; qeuryFormRef.value.resetFields(); handleQuery(); queryFormRef.value.resetFields(); handleQuery(); } /** æ°å¢æé®æä½ */ const handleAdd = (row?: DemoTreeVO) => { dialog.visible = true; dialog.title = "æ·»å æµè¯æ 表"; nextTick(() => { reset(); getTreeSelect(); if (row != null && row.id) { form.value.parentId = row.id; } else { form.value.parentId = 0; } }) const handleAdd = (row?: TreeVO) => { dialog.visible = true; dialog.title = "æ·»å æµè¯æ "; nextTick(() => { reset(); getTreeselect(); if (row != null && row.id) { form.value.parentId = row.id; } else { form.value.parentId = 0; } }); } /** å±å¼/æå æä½ */ const handleToggleExpandAll = () => { isExpandAll.value = !isExpandAll.value; toggleExpandAll(treeList.value, isExpandAll.value) isExpandAll.value = !isExpandAll.value; toggleExpandAll(treeList.value, isExpandAll.value) } /** å±å¼/æå ææ */ const toggleExpandAll = (data: DemoTreeVO[], status: boolean) => { data.forEach((item) => { demoTreeTableRef.value.toggleRowExpansion(item, status) if(item.children && item.children.length > 0) toggleExpandAll(item.children, status) }) /** å±å¼/æå æä½ */ const toggleExpandAll = (data: TreeVO[], status: boolean) => { data.forEach((item) => { treeTableRef.value.toggleRowExpansion(item, status) if (item.children && item.children.length > 0) toggleExpandAll(item.children, status) }) } /** ä¿®æ¹æé®æä½ */ const handleUpdate = async (row: DemoTreeVO) => { loading.value = true; dialog.visible = true; dialog.title = "ä¿®æ¹æµè¯æ 表"; nextTick(async () => { reset(); getTreeSelect(); if (row) { form.value.parentId = row.id; } getTree(row.id).then((response) => { loading.value = false; form.value = response.data; }); }) const handleUpdate = (row: TreeVO) => { loading.value = true; dialog.visible = true; dialog.title = "ä¿®æ¹æµè¯æ "; nextTick(async () => { reset(); await getTreeselect(); if (row != null) { form.value.parentId = row.id; } const res = await getTree(row.id); loading.value = false; Object.assign(form.value, res.data); }); } /** æäº¤æé® */ const submitForm = () => { treeRef.value.validate((valid: boolean) => { if (valid) { buttonLoading.value = true; if (form.value.id != null) { updateTree(form.value).then(() => { proxy?.$modal.msgSuccess("ä¿®æ¹æå"); dialog.visible = false; getList(); }).finally(() => { buttonLoading.value = false; }); } else { addTree(form.value).then(() => { proxy?.$modal.msgSuccess("æ°å¢æå"); dialog.visible = false; getList(); }).finally(() => { buttonLoading.value = false; }); } } }); treeFormRef.value.validate((valid: boolean) => { if (valid) { buttonLoading.value = true; if (form.value.id) { updateTree(form.value).finally(() => buttonLoading.value = false); } else { addTree(form.value).finally(() => buttonLoading.value = false); } proxy?.$modal.msgSuccess("æä½æå"); dialog.visible = false; getList(); } }); } /** å é¤æé®æä½ */ const handleDelete = (row: DemoTreeVO) => { proxy?.$modal.confirm('æ¯å¦ç¡®è®¤å 餿µè¯å表ç¼å·ä¸º"' + row.id + '"çæ°æ®é¡¹?').then(() => { loading.value = true; return delTree(row.id); }).then(() => { loading.value = false; getList(); proxy?.$modal.msgSuccess("å 餿å"); }).finally(() => { loading.value = false; }); const handleDelete = async (row: TreeVO) => { await proxy?.$modal.confirm('æ¯å¦ç¡®è®¤å 餿µè¯æ ç¼å·ä¸º"' + row.id + '"çæ°æ®é¡¹ï¼'); loading.value = true; await delTree(row.id).finally(() => loading.value = false); await getList(); proxy?.$modal.msgSuccess("å 餿å"); } onMounted(() => { getList() }) getList(); }); </script>