yxuse 3.0.66 → 3.0.68

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.es6.js","sources":["../packages/components/YxDialog/index.vue","../packages/components/YxDrawer/index.vue","../packages/utils/excel/index.ts","../packages/components/YxTable/index.vue","../packages/components/YxForm/icon/question.svg?component","../packages/components/YxForm/index.vue","../packages/utils/common/update.ts","../packages/components/Update/index.vue","../packages/components/YxIcon/index.vue","../packages/components/YxUpload/index.vue","../packages/components/LogoTitle/index.vue","../packages/components/LogoTitle/index.ts"],"sourcesContent":["<!--\n * @Author: WangXin\n * @Date: 2024-01-17 18:18:08\n * @LastEditors: WangXin\n * @LastEditTime: 2025-05-15 16:06:10\n * @FilePath: /yxuse/packages/components/YxDialog/index.vue\n * @Description: \n * \n * Copyright (c) 2024 by YuXing, All Rights Reserved. \n-->\n\n<script setup lang=\"ts\" name=\"YxDialog\">\nimport { reactive } from \"vue\";\nimport type { DialogOptions } from \"./type\";\nconst dialogOptions = reactive({\n\twidth: \"40%\",\n\tshow: false,\n\ttitle: \"\",\n\tloading: false,\n\tshowFooter: true,\n\tautoClose: true\n});\nconst close = () => {\n\tconsole.log(\"关闭\");\n\tdialogMap[\"cancel\"] && dialogMap[\"cancel\"]();\n\tdialogOptions.show = false;\n};\nconst dialogMap: Record<string, Function> = {};\nconst submit = async () => {\n\t//执行提交之前的回调\n\tif (dialogMap[\"beforeSubmit\"] && !(await dialogMap[\"beforeSubmit\"]())) return;\n\tdialogOptions.loading = true;\n\ttry {\n\t\tdialogMap[\"submit\"] && (await dialogMap[\"submit\"]());\n\t\tdialogOptions.loading = false;\n\t\tif (dialogOptions.autoClose) close();\n\t} catch (err) {\n\t\tdialogOptions.loading = false;\n\t}\n};\nconst show = async ({ width, title, submit, cancel, showFooter, autoClose, beforeOpen, beforeSubmit }: DialogOptions) => {\n\tif (width) dialogOptions.width = width;\n\tif (title) dialogOptions.title = title;\n\tif (showFooter !== undefined) dialogOptions.showFooter = showFooter;\n\tif (autoClose !== undefined) dialogOptions.autoClose = autoClose;\n\tif (submit) dialogMap[\"submit\"] = submit;\n\tif (cancel) dialogMap[\"cancel\"] = cancel;\n\tif (beforeSubmit) dialogMap[\"beforeSubmit\"] = beforeSubmit;\n\tif (beforeOpen) {\n\t\tawait beforeOpen();\n\t}\n\tdialogOptions.show = true;\n};\n\ndefineExpose({\n\tshow,\n\tclose\n});\n</script>\n\n<template>\n\t<el-dialog\n\t\t:close-on-click-modal=\"false\"\n\t\tattrs\n\t\t:width=\"dialogOptions.width\"\n\t\tv-model=\"dialogOptions.show\"\n\t\t:title=\"dialogOptions.title\"\n\t\tdestroy-on-close\n\t\t:before-close=\"close\"\n\t>\n\t\t<slot />\n\t\t<template #footer v-if=\"dialogOptions.showFooter\">\n\t\t\t<span class=\"dialog-footer flex justify-end\">\n\t\t\t\t<el-button plain @click=\"dialogOptions.show = false\">取消</el-button>\n\t\t\t\t<el-button :loading=\"dialogOptions.loading\" @click=\"submit\">确认</el-button>\n\t\t\t</span>\n\t\t</template>\n\t</el-dialog>\n</template>\n\n<style scoped lang=\"scss\"></style>\n","<!--\n * @Author: WangXin\n * @Date: 2024-01-17 18:18:08\n * @LastEditors: WangXin\n * @LastEditTime: 2025-05-15 16:05:44\n * @FilePath: /yxuse/packages/components/YxDrawer/index.vue\n * @Description: \n * \n * Copyright (c) 2024 by YuXing, All Rights Reserved. \n-->\n\n<script setup lang=\"ts\" name=\"YxDrawer\">\nimport { reactive } from \"vue\";\nimport type { DrawerOptions } from \"./type\";\nconst drawerOptions = reactive({\n\twidth: \"40%\",\n\tshow: false,\n\ttitle: \"\",\n\tloading: false,\n\tshowFooter: true,\n\tautoClose: true\n});\nconst close = () => {\n\tdrawerMap[\"cancel\"] && drawerMap[\"cancel\"]();\n\tdrawerOptions.show = false;\n\tconsole.log(\"关闭\");\n};\nconst drawerMap: Record<string, Function> = {};\nconst submit = async () => {\n\t//执行提交之前的回调\n\tif (drawerMap[\"beforeSubmit\"] && !(await drawerMap[\"beforeSubmit\"]())) return;\n\tdrawerOptions.loading = true;\n\ttry {\n\t\tdrawerMap[\"submit\"] && (await drawerMap[\"submit\"]());\n\t\tdrawerOptions.loading = false;\n\t\tif (drawerOptions.autoClose) close();\n\t} catch (err) {\n\t\tdrawerOptions.loading = false;\n\t}\n};\nconst show = async ({ width, title, submit, cancel, showFooter, autoClose, beforeOpen, beforeSubmit }: DrawerOptions) => {\n\tif (width) drawerOptions.width = width;\n\tif (title) drawerOptions.title = title;\n\tif (showFooter !== undefined) drawerOptions.showFooter = showFooter;\n\tif (autoClose !== undefined) drawerOptions.autoClose = autoClose;\n\tif (submit) drawerMap[\"submit\"] = submit;\n\tif (cancel) drawerMap[\"cancel\"] = cancel;\n\tif (beforeSubmit) drawerMap[\"beforeSubmit\"] = beforeSubmit;\n\tif (beforeOpen) {\n\t\tawait beforeOpen();\n\t}\n\tdrawerOptions.show = true;\n};\ndefineExpose({\n\tshow,\n\tclose\n});\n</script>\n<template>\n\t<el-drawer\n\t\t:close-on-click-modal=\"false\"\n\t\tattrs\n\t\t:size=\"drawerOptions.width\"\n\t\tv-model=\"drawerOptions.show\"\n\t\t:title=\"drawerOptions.title\"\n\t\tdestroy-on-close\n\t\t@close=\"close\"\n\t>\n\t\t<slot />\n\t\t<template #footer v-if=\"drawerOptions.showFooter\">\n\t\t\t<span class=\"dialog-footer flex justify-end\">\n\t\t\t\t<el-button plain @click=\"drawerOptions.show = false\">取消</el-button>\n\t\t\t\t<el-button :loading=\"drawerOptions.loading\" @click=\"submit\">确认</el-button>\n\t\t\t</span>\n\t\t</template>\n\t</el-drawer>\n</template>\n\n<style scoped lang=\"scss\"></style>\n","import * as XLSX from \"xlsx\";\nimport { saveAs } from \"file-saver\";\nimport XLSXStyle from \"xlsx-js-style\";\n\nfunction generateArray(table) {\n\tlet out = [];\n\tlet rows = table.querySelectorAll(\"tr\");\n\tlet ranges = [];\n\tfor (var R = 0; R < rows.length; ++R) {\n\t\tvar outRow = [];\n\t\tlet row = rows[R];\n\t\tlet columns = row.querySelectorAll(\"td\");\n\t\tfor (let C = 0; C < columns.length; ++C) {\n\t\t\tlet cell = columns[C];\n\t\t\tlet colspan = cell.getAttribute(\"colspan\");\n\t\t\tlet rowspan = cell.getAttribute(\"rowspan\");\n\t\t\tlet cellValue = cell.innerText;\n\t\t\tif (cellValue !== \"\" && cellValue == +cellValue) cellValue = +cellValue;\n\n\t\t\t//Skip ranges\n\t\t\tranges.forEach(function (range) {\n\t\t\t\tif (R >= range.s.r && R <= range.e.r && outRow.length >= range.s.c && outRow.length <= range.e.c) {\n\t\t\t\t\tfor (let i = 0; i <= range.e.c - range.s.c; ++i) outRow.push(null);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t//Handle Row Span\n\t\t\tif (rowspan || colspan) {\n\t\t\t\trowspan = rowspan || 1;\n\t\t\t\tcolspan = colspan || 1;\n\t\t\t\tranges.push({\n\t\t\t\t\ts: {\n\t\t\t\t\t\tr: R,\n\t\t\t\t\t\tc: outRow.length\n\t\t\t\t\t},\n\t\t\t\t\te: {\n\t\t\t\t\t\tr: R + rowspan - 1,\n\t\t\t\t\t\tc: outRow.length + colspan - 1\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t//Handle Value\n\t\t\toutRow.push(cellValue !== \"\" ? cellValue : null);\n\n\t\t\t//Handle Colspan\n\t\t\tif (colspan) for (let k = 0; k < colspan - 1; ++k) outRow.push(null);\n\t\t}\n\t\tout.push(outRow);\n\t}\n\treturn [out, ranges];\n}\n\nfunction datenum(v, date1904) {\n\tif (date1904) v += 1462;\n\tlet epoch = Date.parse(v);\n\treturn (epoch - new Date(Date.UTC(1899, 11, 30))) / (24 * 60 * 60 * 1000);\n}\n\nfunction sheet_from_array_of_arrays(data, opts) {\n\tlet ws = {};\n\tlet range = {\n\t\ts: {\n\t\t\tc: 10000000,\n\t\t\tr: 10000000\n\t\t},\n\t\te: {\n\t\t\tc: 0,\n\t\t\tr: 0\n\t\t}\n\t};\n\tfor (let R = 0; R != data.length; ++R) {\n\t\tfor (let C = 0; C != data[R].length; ++C) {\n\t\t\tif (range.s.r > R) range.s.r = R;\n\t\t\tif (range.s.c > C) range.s.c = C;\n\t\t\tif (range.e.r < R) range.e.r = R;\n\t\t\tif (range.e.c < C) range.e.c = C;\n\t\t\tlet cell = {\n\t\t\t\tv: data[R][C]\n\t\t\t};\n\t\t\tif (cell.v == null) continue;\n\t\t\tlet cell_ref = XLSX.utils.encode_cell({\n\t\t\t\tc: C,\n\t\t\t\tr: R\n\t\t\t});\n\n\t\t\tif (typeof cell.v === \"number\") cell.t = \"n\";\n\t\t\telse if (typeof cell.v === \"boolean\") cell.t = \"b\";\n\t\t\telse if (cell.v instanceof Date) {\n\t\t\t\tcell.t = \"n\";\n\t\t\t\tcell.z = XLSX.SSF._table[14];\n\t\t\t\tcell.v = datenum(cell.v);\n\t\t\t} else cell.t = \"s\";\n\n\t\t\tws[cell_ref] = cell;\n\t\t}\n\t}\n\tif (range.s.c < 10000000) ws[\"!ref\"] = XLSX.utils.encode_range(range);\n\treturn ws;\n}\n\nfunction Workbook() {\n\tif (!(this instanceof Workbook)) return new Workbook();\n\tthis.SheetNames = [];\n\tthis.Sheets = {};\n}\n\nfunction s2ab(s) {\n\tlet buf = new ArrayBuffer(s.length);\n\tlet view = new Uint8Array(buf);\n\tfor (let i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xff;\n\treturn buf;\n}\n\nexport function export_table_to_excel(id) {\n\tlet theTable = document.getElementById(id);\n\tlet oo = generateArray(theTable);\n\tlet ranges = oo[1];\n\n\t/* original data */\n\tlet data = oo[0];\n\tlet ws_name = \"SheetJS\";\n\n\tlet wb = new Workbook(),\n\t\tws = sheet_from_array_of_arrays(data);\n\n\t/* add ranges to worksheet */\n\t// ws['!cols'] = ['apple', 'banan'];\n\tws[\"!merges\"] = ranges;\n\n\t/* add worksheet to workbook */\n\twb.SheetNames.push(ws_name);\n\twb.Sheets[ws_name] = ws;\n\n\tlet wbout = XLSX.write(wb, {\n\t\tbookType: \"xlsx\",\n\t\tbookSST: false,\n\t\ttype: \"binary\"\n\t});\n\n\tsaveAs(\n\t\tnew Blob([s2ab(wbout)], {\n\t\t\ttype: \"application/octet-stream\"\n\t\t}),\n\t\t\"test.xlsx\"\n\t);\n}\n\nexport function export_json_to_excel({\n\tmultiHeader = [],\n\theader,\n\tdata,\n\tfilename,\n\tmerges = [],\n\tautoWidth = true,\n\texcelWidth = true,\n\tbookType = \"xlsx\"\n} = {}) {\n\t/* original data */\n\t// console.log( multiHeader,header,data,filename)\n\tfilename = filename || \"excel-list\";\n\tdata = [...data];\n\tdata.unshift(header);\n\n\tfor (let i = multiHeader.length - 1; i > -1; i--) {\n\t\tdata.unshift(multiHeader[i]);\n\t}\n\n\tlet ws_name = \"SheetJS\";\n\tlet wb = new Workbook(),\n\t\tws = sheet_from_array_of_arrays(data);\n\n\tif (merges.length > 0) {\n\t\tif (!ws[\"!merges\"]) ws[\"!merges\"] = [];\n\t\tmerges.forEach(item => {\n\t\t\tws[\"!merges\"].push(XLSX.utils.decode_range(item));\n\t\t});\n\t}\n\n\tif (autoWidth) ws[\"!cols\"] = getColWidth(data);\n\tif (excelWidth) setColMaxW(data, ws);\n\n\t/* add worksheet to workbook */\n\twb.SheetNames.push(ws_name);\n\twb.Sheets[ws_name] = ws;\n\n\tlet wbout = XLSX.write(wb, {\n\t\tbookType: bookType,\n\t\tbookSST: false,\n\t\ttype: \"binary\"\n\t});\n\tsaveAs(\n\t\tnew Blob([s2ab(wbout)], {\n\t\t\ttype: \"application/octet-stream\"\n\t\t}),\n\t\t`${filename}.${bookType}`\n\t);\n}\n\n// export function readFile(file) {\n// return new Promise((resolve) => {\n// let reader = new FileReader();\n// reader.readAsBinaryString(file);\n// reader.onload = (ev) => {\n// let dataBinary = ev.target.result;\n// let workBook = XLSX.read(dataBinary, { type: \"binary\", cellDates: true });\n// let workSheet = workBook.Sheets[workBook.SheetNames[0]];\n// const data = XLSX.utils.sheet_to_json(workSheet, {defval:\"\"});\n// resolve(data);\n// };\n// });\n// }\n\nexport function readFile(file) {\n\treturn new Promise(resolve => {\n\t\tlet reader = new FileReader();\n\t\treader.readAsBinaryString(file);\n\t\treader.onload = ev => {\n\t\t\tresolve(ev.target.result);\n\t\t};\n\t});\n}\n\n// 读取excel,返回一维数组,第一行格式:{列名:值,列名:值}\nexport async function readExcel(file) {\n\tlet dataBinary = await readFile(file);\n\tlet workBook = XLSX.read(dataBinary, { type: \"binary\", cellDates: true });\n\tlet workSheet = workBook.Sheets[workBook.SheetNames[0]];\n\tconst data = XLSX.utils.sheet_to_json(workSheet, { defval: \"\" });\n\treturn data;\n}\n\n// 读取excel,返回二维数组,第一行表头,后面行是数据\nexport async function readExcelToArray(file) {\n\tlet dataBinary = await readFile(file);\n\tlet workBook = XLSX.read(dataBinary, { type: \"binary\", cellDates: true });\n\tlet workSheet = workBook.Sheets[workBook.SheetNames[0]];\n\tconst data = XLSX.utils.sheet_to_json(workSheet, { defval: \"\", header: 1 });\n\treturn data;\n}\n\nexport async function saveFile(content, fileName) {\n\tlet file = new Blob([content]);\n\tsaveAs(file, fileName);\n}\n\n// 判断列宽\nfunction getColWidth(list) {\n\t/*设置worksheet每列的最大宽度*/\n\tconst colWidth = list.map(row =>\n\t\trow.map(val => {\n\t\t\t/*先判断是否为null/undefined*/\n\t\t\tif (val == null) {\n\t\t\t\treturn {\n\t\t\t\t\twch: 10\n\t\t\t\t};\n\t\t\t} else if (val.toString().charCodeAt(0) > 255) {\n\t\t\t\t/*再判断是否为中文*/\n\t\t\t\treturn {\n\t\t\t\t\twch: val.toString().length * 2\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\treturn {\n\t\t\t\t\twch: val.toString().length\n\t\t\t\t};\n\t\t\t}\n\t\t})\n\t);\n\t/*以第一行为初始值*/\n\tlet result = colWidth[0];\n\tfor (let i = 1; i < colWidth.length; i++) {\n\t\tfor (let j = 0; j < colWidth[i].length; j++) {\n\t\t\tif (result[j][\"wch\"] < colWidth[i][j][\"wch\"]) {\n\t\t\t\tresult[j][\"wch\"] = colWidth[i][j][\"wch\"];\n\t\t\t}\n\t\t}\n\t}\n\treturn result;\n}\n\n// 设置最大列宽\nfunction setColMaxW(list, ws) {\n\t/*设置worksheet每列的最大宽度*/\n\tconst colWidth = list.map(row =>\n\t\trow.map(val => {\n\t\t\t/*先判断是否为null/undefined*/\n\t\t\t// console.log(val)\n\t\t\tif (val == null) {\n\t\t\t\treturn {\n\t\t\t\t\twch: 10\n\t\t\t\t};\n\t\t\t} else if (val.toString().charCodeAt(0) > 255) {\n\t\t\t\t/*再判断是否为中文*/\n\t\t\t\treturn {\n\t\t\t\t\twch: 20\n\t\t\t\t};\n\t\t\t} else if (val.toString().indexOf(\"<operation\") !== -1) {\n\t\t\t\t/* 判断是否为报文数据*/\n\t\t\t\treturn {\n\t\t\t\t\twch: 30\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\treturn {\n\t\t\t\t\twch: val.toString().length\n\t\t\t\t};\n\t\t\t}\n\t\t})\n\t);\n\t// console.log(colWidth)\n\t/*以第一行为初始值*/\n\tlet result = colWidth[0];\n\tfor (let i = 1; i < colWidth.length; i++) {\n\t\tfor (let j = 0; j < colWidth[i].length; j++) {\n\t\t\tif (result[j][\"wch\"] < colWidth[i][j][\"wch\"]) {\n\t\t\t\tresult[j][\"wch\"] = colWidth[i][j][\"wch\"];\n\t\t\t}\n\t\t}\n\t}\n\t// console.log(result)\n\tresult[0].wch = 20;\n\tresult[4] ? (result[4].wch = 10) : \"\";\n\tws[\"!cols\"] = result;\n}\n\n// 导出excel,且可带单元格注释及样式\nconst englishLetter = [\n\t\"A\",\n\t\"B\",\n\t\"C\",\n\t\"D\",\n\t\"E\",\n\t\"F\",\n\t\"G\",\n\t\"H\",\n\t\"I\",\n\t\"J\",\n\t\"K\",\n\t\"L\",\n\t\"M\",\n\t\"N\",\n\t\"O\",\n\t\"P\",\n\t\"Q\",\n\t\"R\",\n\t\"S\",\n\t\"T\",\n\t\"U\",\n\t\"V\",\n\t\"W\",\n\t\"X\",\n\t\"Y\",\n\t\"X\"\n];\nexport function export_excel_style({ header, data, filename, merges = [], autoWidth = true, excelWidth = true } = {}) {\n\t// 创建一个工作簿\n\tconst workBook = XLSX.utils.book_new();\n\tdata = [...data];\n\tdata.unshift(header.map(item => item.label));\n\t// 创建工作表 worksheet\n\tconst workSheet = sheet_from_array_of_arrays(data);\n\tif (merges.length > 0) {\n\t\tif (!workSheet[\"!merges\"]) workSheet[\"!merges\"] = [];\n\t\tmerges.forEach(item => {\n\t\t\tworkSheet[\"!merges\"].push(XLSX.utils.decode_range(item));\n\t\t});\n\t}\n\tif (autoWidth) workSheet[\"!cols\"] = getColWidth(data);\n\tif (excelWidth) setColMaxW(data, workSheet);\n\theader.forEach((head, index) => {\n\t\tlet cell = workSheet[`${englishLetter[index]}1`];\n\t\t// cell.s = { font:{ bold: true } };\n\t\tif (cell && head.note) {\n\t\t\tif (!cell.c) cell.c = [];\n\t\t\tcell.c.hidden = true;\n\t\t\tcell.c.push({ a: head.label, t: head.note });\n\t\t}\n\t});\n\t// 将工作表放入工作簿中\n\tXLSX.utils.book_append_sheet(workBook, workSheet, \"Sheet1\");\n\t// 生成数据保存\n\tXLSXStyle.writeFile(workBook, `${filename}.xlsx`, { bookType: \"xlsx\" });\n}\n\n// 验证文件格式\nexport function checkFileType(file, fileType) {\n\tlet index = file.name.lastIndexOf(\".\");\n\tlet ext = file.name.substr(index);\n\tlet extList = fileType instanceof Array ? fileType : [fileType];\n\tif (fileType === \"Excel\") {\n\t\textList = [\".xls\", \".xlsx\", \".csv\"];\n\t}\n\tif (!extList.includes(ext)) {\n\t\treturn `请上传${extList.join(\"或\") || \"指定格式\"}文件!`;\n\t}\n\treturn \"\";\n}\n\n// 解析文件并判断文件类型\nexport async function parseFile(file, config) {\n\tlet typeErrorMsg = checkFileType(file, config.fileType);\n\tif (typeErrorMsg) return { code: 0, message: typeErrorMsg };\n\tif (config.fileType === \"Excel\") {\n\t\tlet data = await readExcelToArray(file);\n\t\treturn { code: 200, data };\n\t}\n\tlet dataBinary = await readFile(file);\n\treturn { code: 200, data: dataBinary };\n}\n\n// 导出多Sheet Excel\nexport async function exportMultiSheetExcel(fileName, list) {\n\tconst wb = XLSX.utils.book_new();\n\n\t// 使用 Promise 包装异步操作\n\tconst generateSheetAsync = async section => {\n\t\treturn new Promise(resolve => {\n\t\t\tsetTimeout(() => {\n\t\t\t\tconst ws = XLSX.utils.json_to_sheet(section.data);\n\t\t\t\tXLSX.utils.book_append_sheet(wb, ws, section.sheetName.replace(/[\\\\/:*?\\[\\]]/g, \"-\"));\n\t\t\t\tresolve(true);\n\t\t\t}, 0);\n\t\t});\n\t};\n\n\t// 使用 for...of 循环和 await 处理异步操作\n\tfor (const section of list) {\n\t\tawait generateSheetAsync(section);\n\t}\n\n\tconst excelBuffer = XLSX.write(wb, { bookType: \"xlsx\", type: \"array\" });\n\tconst data = new Blob([excelBuffer], { type: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\" });\n\tsaveAs(data, fileName);\n}\n\nexport const exportToExcel = ({ header, tableData, fileName }: any) => {\n\t// 1. 获取表头(columns)并处理为 Excel 中的第一行\n\tconst tHeader = header.map(col => col.label); // 获取每一列的 label 作为表头\n\t// 2. 获取表格数据(data)\n\tconst data = tableData.map(row => {\n\t\treturn header.map(col => row[col.prop]); // 按照表头的顺序排列每行数据\n\t});\n\t// 3. 将表头和数据合并\n\tconst finalData = [tHeader, ...data]; // 把表头和数据组合成一个数组\n\t// 4. 创建工作表(sheet)\n\tconst ws = XLSX.utils.aoa_to_sheet(finalData); // 使用 aoa_to_sheet 转换为工作表\n\tconst wb = XLSX.utils.book_new(); // 创建工作簿\n\tXLSX.utils.book_append_sheet(wb, ws, \"Sheet1\"); // 添加工作表\n\n\t// 5. 导出 Excel 文件\n\tXLSX.writeFile(wb, `${fileName}.xlsx`); // 下载 Excel 文件\n};\n","<!--\n * @Author: WangXin\n * @Date: 2024-01-04 16:35:08\n * @LastEditors: WangXin\n * @LastEditTime: 2025-06-03 14:42:33\n * @FilePath: /yxuse/packages/components/YxTable/index.vue\n * @Description: \n * \n * Copyright (c) 2024 by YuXing, All Rights Reserved. \n-->\n<script setup lang=\"tsx\">\nimport {\n\tref,\n\tonMounted,\n\tonBeforeMount,\n\tnextTick,\n\tuseSlots,\n\tuseAttrs,\n\twithModifiers,\n\twatch,\n\tresolveComponent,\n\tdefineOptions\n} from \"vue\";\nimport type { FormItemRule } from \"element-plus\";\nimport type { TableColumn, YxTableProps, ColumnsConfig } from \"./type.ts\";\nimport { exportToExcel } from \"@packages/utils/excel\";\nimport Sortable from \"sortablejs\";\nconst props = defineProps<YxTableProps>();\nconst slots = useSlots();\nconst attrs = useAttrs();\nconst tableRef = ref();\nconst tableFormRef = ref();\nconst columns = ref<TableColumn[]>([]);\n/**是否为编辑表单,且需要进行表格校验 */\nconst isFormTable = ref(false);\nconst formTableRules = ref<{ [key: string]: FormItemRule[] }>({});\nconst emit = defineEmits<{\n\t(e: \"operate-handle\", type: string, data: object, index: number): void;\n\t(e: \"sort-end\", oldIndex: number, newIndex: number): void;\n\t(e: \"update-page\", type: string, value: number): void;\n}>();\nonMounted(() => {\n\tnextTick(() => {\n\t\tstartSort();\n\t});\n});\nwatch(\n\t() => props.columns,\n\t() => {\n\t\tinitTable();\n\t}\n);\nonBeforeMount(async () => {\n\tawait initTable();\n});\nconst initTable = async () => {\n\tcolumns.value = typeof props.columns === \"function\" ? await props.columns() : props.columns;\n\tcolumns.value.forEach((col: TableColumn) => {\n\t\tif (col.required || col.rules?.length) {\n\t\t\tisFormTable.value = true;\n\t\t}\n\t\tif (col?.renderType && [\"select\", \"cascader\"].includes(col?.renderType) && col?.config?.loadOptions) {\n\t\t\tloadOptions(col.config);\n\t\t}\n\t});\n\tif (isFormTable.value) {\n\t\tgetRules();\n\t}\n};\n/**远程加载下拉数据 */\nconst loadOptions = async (config: any) => {\n\tif (config?.options && config?.options.length === 0 && config?.loadOptions && typeof config?.loadOptions === \"function\") {\n\t\tconfig.options = await config?.loadOptions();\n\t}\n};\nconst startSort = () => {\n\tif (!props.sort) return;\n\tconst sortDom = tableRef.value?.$el?.querySelector(\".el-table__body tbody\");\n\tSortable.create(sortDom, {\n\t\tanimation: 200,\n\t\t// group: \"el-table__row table-row\",\n\t\tsort: true,\n\t\thandle: props.sortHandle ? `.${props.sortHandle}` : null,\n\t\tonEnd: ({ oldIndex, newIndex }: { oldIndex: number; newIndex: number }) => {\n\t\t\temit(\"sort-end\", oldIndex, newIndex);\n\t\t}\n\t});\n};\n/***渲染动态组件 */\nconst dynamicComponent = (column: TableColumn, { $index, row }: any) => {\n\tconst { renderType, event = {}, prop, label, config = {}, required, rules } = column;\n\tif (!prop || !renderType) return null;\n\tconst Component = resolveComponent(\"el-\" + renderType) as any;\n\tconst { options = [], ...restConfig } = config;\n\t// 渲染子组件(如 select 的 options)\n\tconst renderChildComponent = () => {\n\t\tif (!options || options.length === 0) return null;\n\t\tif (renderType === \"select\") {\n\t\t\treturn options.map((item: any) => <el-option label={item.label} value={item.value} key={item.value} />);\n\t\t}\n\t\tif (renderType === \"radio-group\") {\n\t\t\treturn options.map((item: any) => (\n\t\t\t\t<el-radio label={item.value} key={item.value}>\n\t\t\t\t\t{item.label}\n\t\t\t\t</el-radio>\n\t\t\t));\n\t\t}\n\t\treturn null;\n\t};\n\t// 单独处理 cascader\n\tif (renderType === \"cascader\") {\n\t\treturn <el-cascader v-model={row[prop]} placeholder={`请选择${label}`} options={options} {...event} {...restConfig} />;\n\t}\n\t// 通用组件渲染\n\tconst isSelect = [\"select\", \"cascader\"].includes(renderType);\n\t//是否为编辑表格必填项\n\tconst isFormCell = required || rules?.length;\n\tconst modelValue = row[prop];\n\tconst updateModelValue = (val: any) => {\n\t\t//处理配置是数值类型\n\t\trow[prop] = config?.type === \"number\" ? Number(val) : val;\n\t};\n\tconst component = (\n\t\t<Component\n\t\t\tmodelValue={modelValue}\n\t\t\tonUpdate:modelValue={updateModelValue}\n\t\t\tplaceholder={`请${isSelect ? \"选择\" : \"输入\"}${label}`}\n\t\t\t{...event}\n\t\t\t{...restConfig}\n\t\t>\n\t\t\t{renderChildComponent()}\n\t\t</Component>\n\t);\n\tif (!isFormCell) return component;\n\t//编辑表格\n\treturn renderForm(prop, $index, component);\n};\nconst renderForm = (prop: any, index: number, component: any) => {\n\treturn (\n\t\t<el-form-item prop={\"tableData.\" + index + \".\" + prop} rules={formTableRules.value[prop]}>\n\t\t\t{component}\n\t\t</el-form-item>\n\t);\n};\n/**初始化规则 */\nconst getRules = () => {\n\tconst rules: { [key: string]: FormItemRule[] } = {};\n\tif (!isFormTable.value) return;\n\tconst handleRule = (item: TableColumn) => {\n\t\tif (!item.prop) return;\n\t\tconst isSelect = item?.renderType && [\"select\", \"cascader\"].includes(item?.renderType);\n\t\tconst defaultRule = { required: true, message: `${item.label ?? \"该字段\"}不能为空`, trigger: isSelect ? \"change\" : \"blur\" };\n\t\tif (item.required) {\n\t\t\trules[item.prop] = [defaultRule];\n\t\t}\n\t\tif (item.rules && item.rules.length > 0) {\n\t\t\trules[item.prop] = [...(rules[item?.prop] || []), ...item.rules];\n\t\t}\n\t};\n\tcolumns.value\n\t\t.filter(cell => (cell?.renderType || cell?.render) && (cell?.required || cell?.rules))\n\t\t.forEach((form: any) => {\n\t\t\tform.children?.forEach(handleRule); // 处理子项\n\t\t\thandleRule(form); // 处理自身\n\t\t});\n\tformTableRules.value = rules;\n\tconsole.log(\"rules\", formTableRules.value);\n};\n/**编辑表格校验 */\nconst tableFormValidate = async (): Promise<boolean> => {\n\tif (!isFormTable.value) return Promise.resolve(true);\n\tif (!tableFormRef.value) return Promise.resolve(false);\n\treturn await tableFormRef.value.validate(() => Promise.resolve());\n};\nconst render = (props: YxTableProps) => {\n\tconst { rowKey, tableData, pageInfo } = props;\n\t//动态插槽\n\tconst columnSlots = (cell: TableColumn, scope: any) => cell.slotName && slots[cell.slotName]?.(scope);\n\t//处理列;\n\tconst renderColumn = (columns: TableColumn[]) => {\n\t\treturn columns\n\t\t\t.filter(cell => !cell.show || cell.show(cell))\n\t\t\t.map((cell: TableColumn) => {\n\t\t\t\tconst { children, ...cellConf } = cell;\n\t\t\t\treturn (\n\t\t\t\t\t<el-table-column {...cellConf}>\n\t\t\t\t\t\t{{\n\t\t\t\t\t\t\tdefault: (scope: any) => {\n\t\t\t\t\t\t\t\t//先处理操作栏\n\t\t\t\t\t\t\t\tif (cell?.renderType === \"operate\") return renderOperate(cell, scope);\n\t\t\t\t\t\t\t\t//处理动态渲染的组件,绑定动态row\n\t\t\t\t\t\t\t\tif (cell?.renderType && cell?.renderType !== \"operate\") {\n\t\t\t\t\t\t\t\t\treturn dynamicComponent(cell, scope);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t//处理自定义渲染函数,判断是否为表单组件\n\t\t\t\t\t\t\t\tif (cell?.render) {\n\t\t\t\t\t\t\t\t\tconst renderResult = cell.render(scope.row, scope.$index, cell);\n\t\t\t\t\t\t\t\t\t//是否为编辑表单\n\t\t\t\t\t\t\t\t\tconst needsValidation = cell.required || cell.rules;\n\t\t\t\t\t\t\t\t\t//是否为组件节点\n\t\t\t\t\t\t\t\t\tconst isFragment = [\"symbol\", \"object\"].includes(typeof renderResult?.type);\n\t\t\t\t\t\t\t\t\t// 如果为表单节点且需要校验,进行form-item包裹\n\t\t\t\t\t\t\t\t\tif (needsValidation && isFragment) {\n\t\t\t\t\t\t\t\t\t\treturn renderForm(cell.prop, scope.$index, renderResult);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\treturn renderResult;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t//处理多级表头\n\t\t\t\t\t\t\t\tif (children && children?.length > 0) return renderColumn(children);\n\t\t\t\t\t\t\t\t//处理自定义插槽\n\t\t\t\t\t\t\t\treturn cell?.slotName && columnSlots(cell, scope);\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\theader: (scope: any) => {\n\t\t\t\t\t\t\t\t//添加必填标识\n\t\t\t\t\t\t\t\tif (cell?.required) {\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<span class=\"flex items-center gap-5\">\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"text-[var(--color-error-100)]\">* </span>\n\t\t\t\t\t\t\t\t\t\t\t{scope?.column?.label ?? \"\"}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t//处理自定义渲染函数\n\t\t\t\t\t\t\t\tif (cell?.headerRender) return cell?.headerRender(scope.row);\n\t\t\t\t\t\t\t\t//处理表头自定义插槽\n\t\t\t\t\t\t\t\tif (cell?.headerSlotName) return slots[cell?.headerSlotName]?.(scope);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t</el-table-column>\n\t\t\t\t);\n\t\t\t});\n\t};\n\t//操作栏;\n\t// const renderOperate = (cell: TableColumn, scope: any) => {\n\t// \treturn (\n\t// \t\t<div class={`flex justify-center items-center cursor-pointer gap-10 ${cell.config?.className ?? \"\"}`}>\n\t// \t\t\t{cell.operate\n\t// \t\t\t\t?.filter(op => !op.show || op.show(scope.row))\n\t// \t\t\t\t.map(op => {\n\t// \t\t\t\t\tif (op?.render) return op.render(scope.row, scope.$index);\n\t// \t\t\t\t\treturn (\n\t// \t\t\t\t\t\t<span\n\t// \t\t\t\t\t\t\tonClick={withModifiers(() => {\n\t// \t\t\t\t\t\t\t\top?.onClick && op?.onClick(scope.row);\n\t// \t\t\t\t\t\t\t\temit(\"operate-handle\", op.key, scope.row, scope.$index);\n\t// \t\t\t\t\t\t\t}, [\"stop\"])}\n\t// \t\t\t\t\t\t\tclass={`table-handle whitespace-nowrap ${op?.className ?? \"\"}`}\n\t// \t\t\t\t\t\t>\n\t// \t\t\t\t\t\t\t{op.label}\n\t// \t\t\t\t\t\t</span>\n\t// \t\t\t\t\t);\n\t// \t\t\t\t})}\n\t// \t\t</div>\n\t// \t);\n\t// };\n\tconst renderOperate = (cell: TableColumn, scope: any) => {\n\t\treturn (\n\t\t\t<div class={`flex justify-center items-center cursor-pointer gap-10 ${cell.config?.className ?? \"\"}`}>\n\t\t\t\t{cell.operate\n\t\t\t\t\t?.filter(op => !op.show || op.show(scope.row))\n\t\t\t\t\t.map(op => {\n\t\t\t\t\t\tif (op?.render) return op.render(scope.row, scope.$index);\n\t\t\t\t\t\tconst disabled = typeof op?.disabled === \"function\" ? op.disabled(scope.row, scope.$index) : op?.disabled ?? false;\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tonClick={withModifiers(() => {\n\t\t\t\t\t\t\t\t\tif (!disabled) {\n\t\t\t\t\t\t\t\t\t\top?.onClick && op?.onClick(scope.row);\n\t\t\t\t\t\t\t\t\t\temit(\"operate-handle\", op.key, scope.row, scope.$index);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}, [\"stop\"])}\n\t\t\t\t\t\t\t\tclass={`table-handle whitespace-nowrap ${op?.className ?? \"\"} ${disabled ? \"table-handle-disabled\" : \"\"}`}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{op.label}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t);\n\t\t\t\t\t})}\n\t\t\t</div>\n\t\t);\n\t};\n\t//分页\n\tconst pagination = () => {\n\t\tif (!pageInfo) return null;\n\t\tconst handleSizeChange = (e: number) => {\n\t\t\temit(\"update-page\", \"pageSize\", e);\n\t\t};\n\t\tconst handleCurrentChange = (e: number) => {\n\t\t\temit(\"update-page\", \"pageIndex\", e);\n\t\t};\n\t\treturn (\n\t\t\t<div class=\"pagination-wrap\">\n\t\t\t\t<el-pagination\n\t\t\t\t\tv-model:currentPage={pageInfo.pageIndex}\n\t\t\t\t\tv-model:pageSize={pageInfo.pageSize}\n\t\t\t\t\tsmall={false}\n\t\t\t\t\tdisabled={false}\n\t\t\t\t\tpage-sizes={[10, 20, 50, 100]}\n\t\t\t\t\tlayout={pageInfo?.layout ? pageInfo?.layout : \"total,sizes,prev, pager, next\"}\n\t\t\t\t\tbackground={false}\n\t\t\t\t\ttotal={pageInfo.total}\n\t\t\t\t\tonSizeChange={handleSizeChange}\n\t\t\t\t\tonCurrentChange={handleCurrentChange}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t);\n\t};\n\tif (!columns.value) return;\n\treturn (\n\t\t<>\n\t\t\t{isFormTable.value ? (\n\t\t\t\t<el-form model={props} ref={tableFormRef}>\n\t\t\t\t\t{renderTable()}\n\t\t\t\t</el-form>\n\t\t\t) : (\n\t\t\t\trenderTable()\n\t\t\t)}\n\t\t\t{pagination()}\n\t\t</>\n\t);\n\t/**渲染表格 */\n\tfunction renderTable() {\n\t\treturn (\n\t\t\t<el-table ref={tableRef} {...attrs} row-key={rowKey} data={tableData}>\n\t\t\t\t{renderColumn(columns.value)}\n\t\t\t</el-table>\n\t\t);\n\t}\n};\nconst exportDataToExcel = (fileName?: string) => {\n\tconst header = columns.value.filter(cell => cell.prop);\n\tconst tableData = props.tableData;\n\texportToExcel({ header, tableData, fileName: fileName || Date.now() });\n};\n/** 更新列 */\nconst updateColumns = async (newColumns: ColumnsConfig) => {\n\tif (!columns.value) return;\n\tcolumns.value = typeof newColumns === \"function\" ? await newColumns() : newColumns;\n};\ndefineExpose({\n\ttableRef,\n\texportDataToExcel,\n\tupdateColumns,\n\ttableFormValidate\n});\ndefineOptions({\n\tname: \"YxTable\",\n\tinheritAttrs: false\n});\n</script>\n\n<template>\n\t<component :is=\"render(props)\" />\n</template>\n\n<style scoped lang=\"scss\"></style>\n","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 1024 1024\"\n}\n\nexport function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", _hoisted_1, _cache[0] || (_cache[0] = [\n _createElementVNode(\"path\", {\n fill: \"currentColor\",\n d: \"M512 64a448 448 0 1 1 0 896 448 448 0 0 1 0-896m23.744 191.488c-52.096 0-92.928 14.784-123.2 44.352-30.976 29.568-45.76 70.4-45.76 122.496h80.256c0-29.568 5.632-52.8 17.6-68.992 13.376-19.712 35.2-28.864 66.176-28.864 23.936 0 42.944 6.336 56.32 19.712 12.672 13.376 19.712 31.68 19.712 54.912 0 17.6-6.336 34.496-19.008 49.984l-8.448 9.856c-45.76 40.832-73.216 70.4-82.368 89.408-9.856 19.008-14.08 42.24-14.08 68.992v9.856h80.96v-9.856c0-16.896 3.52-31.68 10.56-45.76 6.336-12.672 15.488-24.64 28.16-35.2 33.792-29.568 54.208-48.576 60.544-55.616 16.896-22.528 26.048-51.392 26.048-86.592q0-64.416-42.24-101.376c-28.16-25.344-65.472-37.312-111.232-37.312m-12.672 406.208a54.27 54.27 0 0 0-38.72 14.784 49.4 49.4 0 0 0-15.488 38.016c0 15.488 4.928 28.16 15.488 38.016A54.85 54.85 0 0 0 523.072 768c15.488 0 28.16-4.928 38.72-14.784a51.52 51.52 0 0 0 16.192-38.72 51.97 51.97 0 0 0-15.488-38.016 55.94 55.94 0 0 0-39.424-14.784\"\n }, null, -1)\n ])))\n}\nexport default { render: render }","<!--\n * @Author: WangXin\n * @Date: 2023-06-08 10:10:13\n * @LastEditors: WangXin\n * @LastEditTime: 2025-06-04 14:15:03\n * @FilePath: /yxuse/packages/components/YxForm/index.vue\n * @Description: \n * \n * Copyright (c) 2023 by YuXing, All Rights Reserved. \n-->\n<script setup lang=\"tsx\">\nimport { ref, useAttrs, useSlots, resolveComponent, watch, onBeforeMount, onUnmounted } from \"vue\";\nimport type { FormInstance, FormItemRule } from \"element-plus\";\nimport type { YxFormProps, FormItem, FormStyle } from \"./type\";\nimport Question from \"./icon/question.svg?component\";\nconst formData = ref<{ [key: string]: any }>({});\nconst formRules = ref<{ [key: string]: FormItemRule[] }>({});\nconst formColumn = ref<FormItem[]>([]);\nconst attrs = useAttrs();\nconst props = withDefaults(defineProps<YxFormProps>(), {\n\tformLayout: \"horizontal\",\n\tformStyle: () => ({\n\t\trow: 3,\n\t\tgap: \"15px\",\n\t\tlabelWidth: \"100px\",\n\t\talignItems: \"start\"\n\t})\n});\nconst isOptionsComponent = (type?: string): any => type && [\"select\", \"cascader\"].includes(type);\n//初始化表单data\nconst initForm = async () => {\n\tconst { formList, formParams } = props as YxFormProps;\n\t// 获取表单配置\n\tformColumn.value = typeof formList === \"function\" ? await formList() : formList;\n\tif (!Array.isArray(formColumn.value) || formColumn.value.length === 0) {\n\t\tconsole.warn(\"请配置表单项\");\n\t\treturn;\n\t}\n\t// 初始化表单数据\n\tconst initialData: Record<string, any> = {};\n\t// 填充默认值并加载选项(递归处理嵌套)\n\tconst fillFormData = (item: any) => {\n\t\tif (item.prop && !(item.prop in initialData)) {\n\t\t\tinitialData[item.prop] = undefined;\n\t\t}\n\t\tif (isOptionsComponent(item?.renderType)) {\n\t\t\tloadOptions(item); // 异步加载选项数据\n\t\t}\n\t\tif (Array.isArray(item.children)) {\n\t\t\titem.children.forEach(fillFormData);\n\t\t}\n\t\t//如果有配置关联的选项\n\t\thandleLinkOptions(item);\n\t};\n\tformColumn.value.forEach(item => fillFormData(item));\n\t// 编辑模式下回填数据\n\tif (formParams && Object.keys(formParams).length > 0) {\n\t\tif (hasLoadOptions()) {\n\t\t\tfor (const item of formColumn.value) {\n\t\t\t\tif (!item.prop) continue;\n\t\t\t\tconst isAsyncOption = item.config?.loadOptions && typeof item.config.loadOptions === \"function\";\n\t\t\t\t// 如果不是需要跳过赋值的字段,就赋值\n\t\t\t\tif (!(isAsyncOption && formParams[item.prop] !== undefined)) {\n\t\t\t\t\tformData.value[item.prop] = formParams[item.prop];\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t//兼容老版本回写formParams数据\n\t\t\tformData.value = formParams;\n\t\t}\n\t} else {\n\t\tconsole.log(\"initialData\", initialData);\n\t\tformData.value = initialData;\n\t}\n\tconsole.log(\"formData\", formData.value);\n};\n/**处理关联选项的逻辑 */\nconst handleLinkOptions = (item: any) => {\n\tif (!item.config?.linkOptions || item?._linkedHandled) return;\n\tconst linkOptions = item.config.linkOptions;\n\tconst originOnChange = item.event?.onChange;\n\tconst newOnChange = async (e: any) => {\n\t\tconsole.log(\"执行事件\", e);\n\t\t// 执行你自己的逻辑\n\t\tconst updateForm: FormItem = formColumn.value.find((form: any) => form?.prop === linkOptions) as any;\n\t\t//没有自定义事件,不做处理\n\t\tif (!updateForm || !updateForm?.config?.loadOptions) return;\n\t\tconst options = await updateForm.config.loadOptions(e);\n\t\t//更新options\n\t\tupdateForm.config.options = options;\n\t\t// 调用原始事件\n\t\tif (typeof originOnChange === \"function\") {\n\t\t\toriginOnChange(e);\n\t\t}\n\t};\n\t// 保证 event 是对象\n\titem.event = {\n\t\t...item.event,\n\t\tonChange: newOnChange\n\t};\n\t//添加处理标识\n\titem._linkedHandled = true;\n};\n/**表单配置中是否有loadOptions兼容老版本formParams回写数据 */\nconst hasLoadOptions = () => {\n\treturn formColumn.value.some(item => item.config?.loadOptions && typeof item.config.loadOptions === \"function\");\n};\n/**远程加载下拉数据 */\nconst loadOptions = async ({ config, prop }: FormItem) => {\n\t//不自动加载选项\n\tif (!config || config.notAutoLoadOptions) return;\n\tconst { loadOptions, options } = config;\n\tif (!options || typeof loadOptions !== \"function\") return;\n\tconst { formParams } = props as YxFormProps;\n\t//回写联级表单\n\tconst parentProp = formColumn.value.find((item: any) => item?.config?.linkOptions === prop)?.prop;\n\tconst parentValue = parentProp ? formParams?.[parentProp] : undefined;\n\ttry {\n\t\tconfig.options = await loadOptions(parentValue);\n\t\t// 回填下拉框数据\n\t\tif (prop && formParams?.[prop]) {\n\t\t\tformData.value[prop] = formParams[prop];\n\t\t}\n\t} catch (err) {\n\t\tconsole.error(`加载选项失败: ${prop}`, err);\n\t}\n};\n//监听form配置更新后,则立即初始化form\nwatch(\n\t() => props.formList,\n\tformList => {\n\t\tif (formList.length > 0) {\n\t\t\tconsole.log(\"监听到了,formlist\", formList);\n\t\t\tinitForm();\n\t\t\tgetRules();\n\t\t}\n\t}\n);\n//监听默认参数变化后,重置form\nwatch(\n\t() => props.formParams,\n\tformParams => {\n\t\tif (formParams) {\n\t\t\tconsole.log(\"监听到了,formlist\");\n\t\t\tinitForm();\n\t\t}\n\t}\n);\n\n/**初始化规则 */\nconst getRules = () => {\n\tconst rules: { [key: string]: FormItemRule[] } = {};\n\tif (!formColumn.value?.length) return;\n\tconst handleRule = (item: FormItem) => {\n\t\tif (!item.prop) return;\n\t\tconst isSelect = item?.renderType && [\"select\", \"cascader\"].includes(item?.renderType);\n\t\tconst defaultRule = { required: true, message: `${item.label ?? \"该字段\"}不能为空`, trigger: isSelect ? \"change\" : \"blur\" };\n\t\tif (item.required) {\n\t\t\trules[item.prop] = [defaultRule];\n\t\t}\n\t\tif (item.rules && item.rules.length > 0) {\n\t\t\trules[item.prop] = [...(rules[item?.prop] || []), ...item.rules];\n\t\t}\n\t};\n\tformColumn.value.forEach((form: any) => {\n\t\tform.children?.forEach(handleRule); // 处理子项\n\t\thandleRule(form); // 处理自身\n\t});\n\tformRules.value = rules;\n\tconsole.log(\"rules\", rules);\n};\n\nonBeforeMount(async () => {\n\tif (props.formList) {\n\t\tawait initForm();\n\t\tgetRules();\n\t}\n});\nonUnmounted(() => {\n\t// formRef?.value && formRef?.value.resetFields();\n});\nconst formRef = ref<FormInstance>();\nconst getFormStyle = () => {\n\tconst { formStyle } = props;\n\tconst { row, gap, ...style } = formStyle as FormStyle;\n\treturn {\n\t\t\"grid-template-columns\": `repeat(${row}, 1fr)`,\n\t\t\"grid-gap\": gap,\n\t\t...style\n\t};\n};\n//分组样式\nconst getGroupStyle = (groupStyle: FormStyle) => {\n\tif (!groupStyle) return {};\n\tconst { row, gap, ...style } = groupStyle;\n\treturn {\n\t\t\"grid-template-columns\": `repeat(${row}, 1fr)`,\n\t\t\"grid-gap\": gap,\n\t\t...style\n\t};\n};\n/**动态渲染组件 */\nconst dynamicComponent = ({ renderType, event, prop, label, config }: FormItem) => {\n\tif (!prop) return;\n\tconst { options, ...conf } = config || {};\n\tif (renderType === \"cascader\")\n\t\treturn (\n\t\t\t<el-cascader\n\t\t\t\t{...event}\n\t\t\t\t{...conf}\n\t\t\t\toptions={options}\n\t\t\t\tv-model={formData.value[prop]}\n\t\t\t\tplaceholder={`请选择${label}`}\n\t\t\t></el-cascader>\n\t\t);\n\tconst Component = resolveComponent(\"el-\" + renderType) as any;\n\tconst renderChildComponent = () => {\n\t\tif (renderType === \"select\" && config?.options) {\n\t\t\treturn config?.options.map((item: any) => <el-option label={item.label} value={item.value} />);\n\t\t} else if (renderType === \"radio-group\" && config?.options) {\n\t\t\treturn config?.options.map((item: any) => <el-radio label={item.label} value={item.value} />);\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t};\n\tconst isSelect = renderType && [\"select\", \"cascader\"].includes(renderType);\n\treturn (\n\t\t<Component {...event} placeholder={`请${isSelect ? \"选择\" : \"输入\"}${label}`} {...conf} v-model={formData.value[prop]}>\n\t\t\t{renderChildComponent()}\n\t\t</Component>\n\t);\n};\nconst render = (props: YxFormProps) => {\n\tconst { formStyle, formLayout } = props;\n\tif (!formColumn.value?.length) return;\n\tconst slots = useSlots();\n\tconsole.log(\"slots\", slots);\n\t//动态插槽\n\tconst formItemSlots = (form: FormItem) => form.slotName && slots[form.slotName]?.(formData.value);\n\tconst renderFormItem = (formList: any[]) => {\n\t\tconst renderForm = (form: FormItem) => {\n\t\t\tconst { className, ...formProps } = form;\n\t\t\treturn (\n\t\t\t\t<el-form-item\n\t\t\t\t\tclass={`${formLayout === \"vertical\" ? \"flex flex-col \" : \"\"} ${formStyle?.formItemClassName ?? \"\"} ${className ?? \"\"} ${\n\t\t\t\t\t\t!form.label ? \"no-label-item\" : \"\"\n\t\t\t\t\t}`}\n\t\t\t\t\t{...formProps}\n\t\t\t\t\tprop={form.prop}\n\t\t\t\t\tlabelWidth={formStyle?.labelWidth}\n\t\t\t\t\tkey={form.prop}\n\t\t\t\t>\n\t\t\t\t\t{{\n\t\t\t\t\t\tdefault: () => {\n\t\t\t\t\t\t\tif (form?.render) return form?.render(formData.value);\n\t\t\t\t\t\t\tif (form.renderType) return dynamicComponent(form);\n\t\t\t\t\t\t\treturn form?.slotName && formItemSlots(form);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tlabel: () =>\n\t\t\t\t\t\t\tform.label ? (\n\t\t\t\t\t\t\t\t<div class={`flex items-center gap-5 ${form.labelClassName ?? \"\"}`}>\n\t\t\t\t\t\t\t\t\t{form.label}\n\t\t\t\t\t\t\t\t\t{form.promptConf ? (\n\t\t\t\t\t\t\t\t\t\t<el-tooltip {...form.promptConf?.tooltipConf}>\n\t\t\t\t\t\t\t\t\t\t\t<el-icon size={form.promptConf?.size ?? 15} color={form.promptConf?.color}>\n\t\t\t\t\t\t\t\t\t\t\t\t<Question />\n\t\t\t\t\t\t\t\t\t\t\t</el-icon>\n\t\t\t\t\t\t\t\t\t\t</el-tooltip>\n\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\"\"\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t) : null\n\t\t\t\t\t}}\n\t\t\t\t</el-form-item>\n\t\t\t);\n\t\t};\n\t\t//处理分组的情况\n\t\treturn formList\n\t\t\t.filter(form => !form.show || form.show(formData.value))\n\t\t\t.map((form: FormItem) => {\n\t\t\t\tif (form.children && form.children.length > 0) {\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<div class={`flex flex-col ${form.groupWrapClassName ?? \"\"}`} style={{ ...form?.groupWrapStyle }}>\n\t\t\t\t\t\t\t<div class={form.groupTitleClassName ?? \"\"} style={{ ...form?.groupTitleStyle }}>\n\t\t\t\t\t\t\t\t{form.groupName}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class={`grid ${form.groupClassName ?? \"\"}`} style={{ ...getGroupStyle(form?.groupStyle ?? {}) }}>\n\t\t\t\t\t\t\t\t{form.children.filter(form => !form.show || form.show(formData.value)).map(form => renderForm(form))}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\treturn renderForm(form);\n\t\t\t\t}\n\t\t\t});\n\t};\n\treturn (\n\t\t<>\n\t\t\t<el-form\n\t\t\t\tscroll-to-error\n\t\t\t\tmodel={formData.value}\n\t\t\t\trules={formRules.value}\n\t\t\t\tclass=\"grid\"\n\t\t\t\tref={formRef}\n\t\t\t\tvalidate-on-rule-change={false}\n\t\t\t\t{...attrs}\n\t\t\t\tstyle={{ ...getFormStyle() }}\n\t\t\t>\n\t\t\t\t{renderFormItem(formColumn.value)}\n\t\t\t</el-form>\n\t\t</>\n\t);\n};\n//表单验证\nconst formValidate = async (): Promise<boolean> => {\n\tif (!formRef.value) return Promise.resolve(false);\n\treturn await formRef.value.validate(() => Promise.resolve());\n};\ndefineExpose({\n\tformData,\n\tformValidate,\n\tformRef\n});\ndefineOptions({\n\tname: \"YxForm\"\n});\n</script>\n<template>\n\t<component :is=\"render(props)\" />\n</template>\n<style scoped lang=\"scss\">\n.no-label-item :deep() .el-form-item__label {\n\tpadding-right: 0;\n\theight: 0;\n\tline-height: 0;\n}\n</style>\n","/*\n * @Author: WangXin\n * @Date: 2023-12-06 17:21:49\n * @LastEditors: WangXin\n * @LastEditTime: 2023-12-08 10:35:59\n * @FilePath: \\yxUse\\packages\\utils\\common\\update.ts\n * @Description:\n *\n * Copyright (c) 2023 by YuXing, All Rights Reserved.\n */\nimport { Update } from \"@packages/components\";\nimport { createApp } from \"vue\";\nlet versionKey, versionJsonUrl, _timer, curVersion, updateApp, timeGap;\n//每5分钟请求一次\nexport const monitorUpdate = (systemName, gap = 300) => {\n\ttimeGap = gap;\n\ttimedExecution(systemName);\n};\nconst timedExecution = systemName => {\n\t_timer = setTimeout(() => {\n\t\tgetVersion(systemName);\n\t\t_timer && clearTimeout(_timer);\n\t\ttimedExecution(systemName);\n\t\t// localStorage.removeItem(versionKey + \"delayTime\");\n\t}, timeGap * 1000);\n};\nconst getVersion = async (systemName: string) => {\n\tversionKey = `${systemName}_version`;\n\tconst systemPre = window.location.pathname.split(\"/\")[1] || \"ttc\";\n\tconsole.log(versionKey, systemPre);\n\t// versionJsonUrl = `/${systemPre}/${systemName}/version.json`;\n\tversionJsonUrl = \"/version.json\";\n\tconst oldVersion = localStorage.getItem(versionKey) || \"\";\n\tconst data = await fetch(versionJsonUrl, { cache: \"no-cache\" });\n\tconst { version, message, isNotice } = await data.json();\n\t// 没有历史版本则给缓存注入版本\n\tif (!oldVersion) {\n\t\tlocalStorage.setItem(versionKey, version);\n\t}\n\t//如果新版本与用户当前版本不一致,则提醒用户有版本更新\n\n\tif (oldVersion !== version) {\n\t\tif (isNotice) {\n\t\t\t//通知用户\n\t\t\tconsole.log(\"监测到有新版本\", version);\n\t\t\tnoticeUser(message);\n\t\t}\n\t\tcurVersion = version;\n\t}\n};\n//立即更新\nexport const updateSysVersion = () => {\n\tlocalStorage.setItem(versionKey, curVersion);\n\twindow.location.reload(true);\n};\n//暂不更新,加入延迟时间1小时\nexport const delayUpdateSysVersion = () => {\n\t//隐藏弹窗\n\tupdateApp.unmount();\n\tdocument.body.removeChild(document.querySelector(\"#update\"));\n\tlocalStorage.setItem(versionKey, curVersion);\n};\nconst noticeUser = message => {\n\tif (!document.querySelector(\"#update\")) {\n\t\tconst div = document.createElement(\"div\");\n\t\tdiv.setAttribute(\"id\", \"update\");\n\t\tdiv.style.position = \"absolute\";\n\t\tdiv.style.width = \"100%\";\n\t\tdiv.style.height = \"100%\";\n\t\tdiv.style.top = \"0\";\n\t\tdiv.style.left = \"0\";\n\t\tdocument.body.appendChild(div);\n\t\tupdateApp = createApp(Update, message);\n\t\tupdateApp.mount(\"#update\");\n\t}\n};\n","<script setup lang=\"ts\">\nimport { ref, reactive, defineProps } from \"vue\";\nimport { updateSysVersion, delayUpdateSysVersion } from \"@packages/utils/common/update\";\n// const props =\ninterface UpdateProps {\n\ttitle: String;\n\tdescription: String;\n\tcontent: Object;\n\ttime: String;\n}\n\nconst props = defineProps<UpdateProps>();\nconsole.log(props);\n</script>\n<template>\n\t<div class=\"update-wrap flex items-center justify-center\">\n\t\t<div class=\"relative update-content\">\n\t\t\t<div class=\"flex items-center justify-center\">{{ props?.title }}</div>\n\t\t\t<div class=\"flex flex-col gap-5 mt-10\">\n\t\t\t\t<div class=\"update-title\">{{ props?.description }}</div>\n\t\t\t\t<div class=\"update-item px-20\" v-for=\"(item, key) in props?.content\">\n\t\t\t\t\t<span>{{ key }}:</span> <span>{{ item }}</span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"text-end\">{{ props.time }} 软件专业部</div>\n\t\t\t\t<div class=\"flex justify-end items-center mt-10\">\n\t\t\t\t\t<el-button plain @click=\"delayUpdateSysVersion\">暂不更新</el-button>\n\t\t\t\t\t<el-button @click=\"updateSysVersion\">立即更新</el-button>\n\t\t\t\t</div>\n\t\t\t\t<span class=\"tips mt-10\"\n\t\t\t\t\t>提示: 选择立即更新后,会立即刷新页面更新系统,当前页面缓存数据会消失选择暂不更新后,请稍后自行刷新页面更新系统。</span\n\t\t\t\t>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n<style scoped lang=\"scss\">\n.update-wrap {\n\tposition: absolute;\n\twidth: 100%;\n\theight: 100%;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbottom: 0;\n\tbackground: var(--dialog-overlay-background);\n\tz-index: 9999;\n\tcolor: var(--dialog-header-text-color);\n\tfont-family: YX-TEXT;\n\t.update-content {\n\t\twidth: 30%;\n\t\theight: fit-content;\n\t\tbackground: var(--dialog-background);\n\t\tborder-radius: var(--border-radius-medium);\n\t\tpadding: 20px 20px 10px 20px;\n\t\tbox-sizing: border-box;\n\t\t.tips {\n\t\t\tfont-size: 12px;\n\t\t}\n\t}\n}\n</style>\n","<!--\n * @Author: WangXin\n * @Date: 2024-04-02 20:01:00\n * @LastEditors: WangXin\n * @LastEditTime: 2024-04-11 15:11:58\n * @FilePath: /yxuse/packages/components/YxIcon/index.vue\n * @Description: \n * \n * Copyright (c) 2024 by YuXing, All Rights Reserved. \n-->\n<template>\n\t<i class=\"yx-icon\" :style=\"[{ '--color': color, 'font-size': size + 'px' }]\">\n\t\t<slot />\n\t</i>\n</template>\n\n<script>\n// import { version, createApp } from \"vue\";\n// console.log(this.$options);\nexport default {\n\tprops: {\n\t\tcolor: {\n\t\t\ttype: String,\n\t\t\tdefault: \"inherit\"\n\t\t},\n\t\tsize: {\n\t\t\ttype: String,\n\t\t\tdefault: \"16\"\n\t\t}\n\t}\n};\n</script>\n\n<style scoped>\n.yx-icon {\n\t--color: inherit;\n\tposition: relative;\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: 1em;\n\theight: 1em;\n\tline-height: 1em;\n\tcolor: var(--color);\n\tfill: currentColor;\n}\n</style>\n","<!--\r\n * @Author: WangXin\r\n * @Date: 2024-03-20 09:40:21\r\n * @LastEditors: WangXin\r\n * @LastEditTime: 2025-05-22 09:26:11\r\n * @FilePath: /yxuse/packages/components/YxUpload/index.vue\r\n * @Description: \r\n * \r\n * Copyright (c) 2024 by YuXing, All Rights Reserved. \r\n-->\r\n<script setup lang=\"tsx\">\r\nimport { ref, useAttrs, useSlots } from \"vue\";\r\nimport type { UploadProps, UploadRawFile, UploadUserFile, UploadInstance } from \"element-plus\";\r\nimport { genFileId } from \"element-plus\";\r\nimport type { YxUploadProps } from \"./type\";\r\nimport { assets } from \"@packages/api\";\r\nconst attrs = useAttrs();\r\nconst slots = useSlots();\r\nconst fileList = ref<UploadUserFile[]>([]);\r\nconst props = defineProps<YxUploadProps>();\r\nlet uploadFileList: UploadUserFile[] = [];\r\nconst fileObsUrl = ref(\"\");\r\nconst upload = ref<UploadInstance>();\r\nconst emit = defineEmits<{\r\n\t(e: \"update:fileObsUrl\", value: string): void;\r\n\t(e: \"getFile\", value: any): void;\r\n}>();\r\nconst uploadFile = async (file: any) => {\r\n\tif (props?.customUpload) {\r\n\t\treturn props?.customUpload(file);\r\n\t}\r\n\tconst fromData = new FormData();\r\n\tfromData.append(\"file\", file);\r\n\tconst { data } = await (props?.uploadResourceApi ? props?.uploadResourceApi(fromData) : assets.uploadResourceApi(fromData));\r\n\tfileObsUrl.value = data.fileUrl;\r\n\temit(\"update:fileObsUrl\", fileObsUrl.value);\r\n};\r\nconst onExceed: UploadProps[\"onExceed\"] = async files => {\r\n\tupload.value!.clearFiles();\r\n\tconst file = files[0] as UploadRawFile;\r\n\tfile.uid = genFileId();\r\n\tupload.value!.handleStart(file);\r\n};\r\nconst onChange = async (file: UploadUserFile, uploadFiles: UploadUserFile[]) => {\r\n\tuploadFileList = uploadFiles;\r\n\tif (attrs?.limit && attrs?.limit === 1) {\r\n\t\tawait uploadFile(uploadFileList[0]?.raw);\r\n\t} else {\r\n\t\tawait uploadFile(uploadFileList);\r\n\t}\r\n};\r\n/**多文件使用 getFileList*/\r\nconst getFileList = () => uploadFileList;\r\ndefineExpose({ upload, getFileList });\r\nconst render = (props: YxUploadProps) => {\r\n\tconst defaultTrigger = () => {\r\n\t\treturn <el-button>{props.triggerText ?? \"上传文件\"}</el-button>;\r\n\t};\r\n\treturn (\r\n\t\t<>\r\n\t\t\t<el-upload\r\n\t\t\t\tref={upload}\r\n\t\t\t\tclass=\"w-full h-full\"\r\n\t\t\t\thttp-request={uploadFile}\r\n\t\t\t\tfile-list={fileList.value}\r\n\t\t\t\t{...attrs}\r\n\t\t\t\ton-exceed={onExceed}\r\n\t\t\t\ton-change={onChange}\r\n\t\t\t\tauto-upload={false}\r\n\t\t\t>\r\n\t\t\t\t{{\r\n\t\t\t\t\ttrigger: () => {\r\n\t\t\t\t\t\treturn props?.triggerRender\r\n\t\t\t\t\t\t\t? props?.triggerRender(fileObsUrl.value)\r\n\t\t\t\t\t\t\t: slots[\"trigger\"]\r\n\t\t\t\t\t\t\t? slots[\"trigger\"]()\r\n\t\t\t\t\t\t\t: defaultTrigger();\r\n\t\t\t\t\t},\r\n\t\t\t\t\ttip: () => {\r\n\t\t\t\t\t\treturn <div class=\"el-upload__tip\">{props?.uploadTips}</div>;\r\n\t\t\t\t\t}\r\n\t\t\t\t}}\r\n\t\t\t</el-upload>\r\n\t\t</>\r\n\t);\r\n};\r\n</script>\r\n<template>\r\n\t<component :model-value=\"fileObsUrl\" :is=\"render(props)\" />\r\n</template>\r\n<style scoped lang=\"scss\"></style>\r\n","<!--\n * @Author: WangXin\n * @Date: 2025-05-08 14:48:05\n * @LastEditors: WangXin\n * @LastEditTime: 2025-05-12 10:02:39\n * @FilePath: /yxuse/packages/components/LogoTitle/index.vue\n * @Description: \n * \n * Copyright (c) ${2024} by YuXing, All Rights Reserved. \n-->\n<script lang=\"ts\">\nimport { auth } from \"@packages/api\";\nimport type { SystemConfig } from \"./type\";\nexport default {\n\tname: \"LogoTitle\",\n\tprops: {\n\t\tshowLogo: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true\n\t\t},\n\t\tshowTitle: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false\n\t\t},\n\t\tlogoCanJump: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true\n\t\t}\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tcustomConfig: {\n\t\t\t\ticonStyle: {\n\t\t\t\t\twidth: \"116px\",\n\t\t\t\t\theight: \"20px\"\n\t\t\t\t}\n\t\t\t} as SystemConfig\n\t\t};\n\t},\n\tasync created() {\n\t\ttry {\n\t\t\tconst data = await auth.getUserConfig();\n\t\t\tthis.customConfig = {\n\t\t\t\t...this.customConfig,\n\t\t\t\t...data\n\t\t\t};\n\t\t} catch (e) {\n\t\t\tconsole.error(\"获取用户配置失败\", e);\n\t\t}\n\t},\n\tmethods: {\n\t\tlogoJumpHandle() {\n\t\t\tif (this.customConfig?.logoCanJump === false) return;\n\t\t\tauth.jumpToHome();\n\t\t}\n\t}\n};\n</script>\n\n<template>\n\t<div\n\t\tclass=\"flex items-center gap-x-10 logo-wrap\"\n\t\t:class=\"{ 'cursor-pointer': customConfig?.logoCanJump !== false }\"\n\t\t@click=\"logoJumpHandle\"\n\t>\n\t\t<div\n\t\t\tv-if=\"showLogo && customConfig?.icon\"\n\t\t\t:style=\"customConfig.iconStyle\"\n\t\t\tclass=\"yx-icon theme-icon\"\n\t\t\tv-html=\"customConfig.icon\"\n\t\t/>\n\t\t<div\n\t\t\t:style=\"customConfig.titleStyle\"\n\t\t\tv-if=\"showTitle && customConfig?.title\"\n\t\t\tclass=\"text-xl text-[var(--text-color-title)] title\"\n\t\t>\n\t\t\t{{ customConfig?.title }}\n\t\t</div>\n\t</div>\n</template>\n\n<style scoped>\n.logo-wrap {\n\tline-height: 1;\n}\n.yx-icon :deep() svg {\n\tvertical-align: middle;\n}\n</style>\n","/*\n * @Author: WangXin\n * @Date: 2025-05-08 14:48:05\n * @LastEditors: WangXin\n * @LastEditTime: 2025-05-08 18:01:08\n * @FilePath: /yxuse/packages/components/LogoTitle/index.ts\n * @Description:\n *\n * Copyright (c) ${2024} by YuXing, All Rights Reserved.\n */\nexport { default as LogoTitle } from \"./index.vue\";\nimport { version, createApp } from \"vue\";\nimport type { LogoTitleProps } from \"./type\";\nimport LogoTitle from \"./index.vue\";\nexport class LogoTitleRender {\n\tconstructor(props: LogoTitleProps, domId: string = \"system-logo-title\") {\n\t\tthis.render(props, domId);\n\t}\n\tget vueVersion(): \"2\" | \"3\" {\n\t\treturn version[0] as `${\"2\" | \"3\"}`;\n\t}\n\trender(props: LogoTitleProps, domId: string) {\n\t\tif (this.vueVersion === \"3\") {\n\t\t\tcreateApp(LogoTitle, props).mount(`#${domId}`);\n\t\t} else {\n\t\t\tconst Vue = require(\"vue\");\n\t\t\treturn new Vue({ render: h => h(LogoTitle, { props }) }).$mount(`#${domId}`);\n\t\t}\n\t}\n}\n"],"names":["submit","XLSX.utils","XLSX.writeFile","_isSlot","s","Object","prototype","toString","call","_isVNode","props","__props","slots","useSlots","attrs","useAttrs","tableRef","ref","tableFormRef","columns","isFormTable","formTableRules","emit","__emit","onMounted","nextTick","startSort","watch","initTable","onBeforeMount","value","forEach","col","required","rules","length","renderType","includes","config","loadOptions","getRules","options","sort","sortDom","$el","querySelector","Sortable","create","animation","handle","sortHandle","onEnd","oldIndex","newIndex","dynamicComponent","column","$index","row","_slot","event","prop","label","Component","resolveComponent","restConfig","renderChildComponent","map","item","_createVNode","_resolveComponent","default","_mergeProps","$event","isSelect","isFormCell","modelValue","updateModelValue","val","type","Number","component","renderForm","index","handleRule","defaultRule","message","trigger","filter","cell","render","form","children","tableFormValidate","Promise","resolve","validate","_slot2","rowKey","tableData","pageInfo","columnSlots","scope","slotName","renderColumn","show","cellConf","renderOperate","renderResult","needsValidation","isFragment","header","_createTextVNode","headerRender","headerSlotName","className","operate","op","disabled","withModifiers","onClick","key","pagination","handleSizeChange","e","handleCurrentChange","pageIndex","pageSize","layout","total","_Fragment","renderTable","_slot3","exportDataToExcel","fileName","exportToExcel","Date","now","updateColumns","newColumns","__expose","_hoisted_1","_openBlock","_createElementBlock","_createElementVNode","formData","formRules","formColumn","isOptionsComponent","initForm","formList","formParams","Array","isArray","initialData","fillFormData","undefined","handleLinkOptions","keys","hasLoadOptions","isAsyncOption","linkOptions","_linkedHandled","originOnChange","onChange","newOnChange","updateForm","find","some","notAutoLoadOptions","parentProp","parentValue","err","onUnmounted","formRef","getFormStyle","formStyle","gap","style","getGroupStyle","groupStyle","conf","formLayout","formItemSlots","renderFormItem","formProps","formItemClassName","labelWidth","labelClassName","promptConf","tooltipConf","size","color","Question","groupWrapClassName","groupWrapStyle","groupTitleClassName","groupTitleStyle","groupName","groupClassName","formValidate","_sfc_main","_normalizeStyle","_renderSlot","fileList","uploadFileList","fileObsUrl","upload","uploadFile","file","customUpload","fromData","FormData","append","data","uploadResourceApi","assets","fileUrl","onExceed","files","clearFiles","uid","genFileId","handleStart","uploadFiles","limit","raw","getFileList","defaultTrigger","triggerText","triggerRender","tip","uploadTips","auth.getUserConfig","auth.jumpToHome","_normalizeClass","_createCommentVNode","_toDisplayString"],"mappings":"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"}
1
+ {"version":3,"file":"index.es6.js","sources":["../packages/components/YxDialog/index.vue","../packages/components/YxDrawer/index.vue","../packages/utils/excel/index.ts","../packages/components/YxTable/index.vue","../packages/components/YxForm/icon/question.svg?component","../packages/components/YxForm/index.vue","../packages/utils/common/update.ts","../packages/components/Update/index.vue","../packages/components/YxIcon/index.vue","../packages/components/YxUpload/index.vue","../packages/components/LogoTitle/index.vue","../packages/components/LogoTitle/index.ts"],"sourcesContent":["<!--\n * @Author: WangXin\n * @Date: 2024-01-17 18:18:08\n * @LastEditors: WangXin\n * @LastEditTime: 2025-06-06 14:31:11\n * @FilePath: /yxuse/packages/components/YxDialog/index.vue\n * @Description: \n * \n * Copyright (c) 2024 by YuXing, All Rights Reserved. \n-->\n\n<script setup lang=\"ts\" name=\"YxDialog\">\nimport { reactive } from \"vue\";\nimport type { DialogOptions } from \"./type\";\nconst dialogOptions = reactive({\n\twidth: \"40%\",\n\tshow: false,\n\ttitle: \"\",\n\tloading: false,\n\tshowFooter: true,\n\tautoClose: true\n});\nconst close = () => {\n\tconsole.log(\"关闭\");\n\tdialogMap[\"cancel\"] && dialogMap[\"cancel\"]();\n\tdialogOptions.show = false;\n};\nconst dialogMap: Record<string, Function> = {};\nconst submit = async () => {\n\t//执行提交之前的回调\n\tif (dialogMap[\"beforeSubmit\"] && !(await dialogMap[\"beforeSubmit\"]())) return;\n\tdialogOptions.loading = true;\n\ttry {\n\t\tdialogMap[\"submit\"] && (await dialogMap[\"submit\"]());\n\t\tdialogOptions.loading = false;\n\t\tif (dialogOptions.autoClose) close();\n\t} catch (err) {\n\t\tdialogOptions.loading = false;\n\t}\n};\nconst show = async ({ width, title, submit, cancel, showFooter, autoClose, beforeOpen, beforeSubmit }: DialogOptions) => {\n\tif (width) dialogOptions.width = width;\n\tif (title) dialogOptions.title = title;\n\tif (showFooter !== undefined) dialogOptions.showFooter = showFooter;\n\tif (autoClose !== undefined) dialogOptions.autoClose = autoClose;\n\tif (submit) dialogMap[\"submit\"] = submit;\n\tif (cancel) dialogMap[\"cancel\"] = cancel;\n\tif (beforeSubmit) dialogMap[\"beforeSubmit\"] = beforeSubmit;\n\tif (beforeOpen) {\n\t\tawait beforeOpen();\n\t}\n\tdialogOptions.show = true;\n};\n\ndefineExpose({\n\tshow,\n\tclose\n});\n</script>\n\n<template>\n\t<el-dialog\n\t\t:close-on-click-modal=\"false\"\n\t\tattrs\n\t\t:width=\"dialogOptions.width\"\n\t\tv-model=\"dialogOptions.show\"\n\t\t:title=\"dialogOptions.title\"\n\t\tdestroy-on-close\n\t\t:before-close=\"close\"\n\t>\n\t\t<el-scrollbar height=\"100%\">\n\t\t\t<slot />\n\t\t</el-scrollbar>\n\t\t<template #footer v-if=\"dialogOptions.showFooter\">\n\t\t\t<span class=\"dialog-footer flex justify-end\">\n\t\t\t\t<el-button plain @click=\"dialogOptions.show = false\">取消</el-button>\n\t\t\t\t<el-button :loading=\"dialogOptions.loading\" @click=\"submit\">确认</el-button>\n\t\t\t</span>\n\t\t</template>\n\t</el-dialog>\n</template>\n\n<style scoped lang=\"scss\"></style>\n","<!--\n * @Author: WangXin\n * @Date: 2024-01-17 18:18:08\n * @LastEditors: WangXin\n * @LastEditTime: 2025-05-15 16:05:44\n * @FilePath: /yxuse/packages/components/YxDrawer/index.vue\n * @Description: \n * \n * Copyright (c) 2024 by YuXing, All Rights Reserved. \n-->\n\n<script setup lang=\"ts\" name=\"YxDrawer\">\nimport { reactive } from \"vue\";\nimport type { DrawerOptions } from \"./type\";\nconst drawerOptions = reactive({\n\twidth: \"40%\",\n\tshow: false,\n\ttitle: \"\",\n\tloading: false,\n\tshowFooter: true,\n\tautoClose: true\n});\nconst close = () => {\n\tdrawerMap[\"cancel\"] && drawerMap[\"cancel\"]();\n\tdrawerOptions.show = false;\n\tconsole.log(\"关闭\");\n};\nconst drawerMap: Record<string, Function> = {};\nconst submit = async () => {\n\t//执行提交之前的回调\n\tif (drawerMap[\"beforeSubmit\"] && !(await drawerMap[\"beforeSubmit\"]())) return;\n\tdrawerOptions.loading = true;\n\ttry {\n\t\tdrawerMap[\"submit\"] && (await drawerMap[\"submit\"]());\n\t\tdrawerOptions.loading = false;\n\t\tif (drawerOptions.autoClose) close();\n\t} catch (err) {\n\t\tdrawerOptions.loading = false;\n\t}\n};\nconst show = async ({ width, title, submit, cancel, showFooter, autoClose, beforeOpen, beforeSubmit }: DrawerOptions) => {\n\tif (width) drawerOptions.width = width;\n\tif (title) drawerOptions.title = title;\n\tif (showFooter !== undefined) drawerOptions.showFooter = showFooter;\n\tif (autoClose !== undefined) drawerOptions.autoClose = autoClose;\n\tif (submit) drawerMap[\"submit\"] = submit;\n\tif (cancel) drawerMap[\"cancel\"] = cancel;\n\tif (beforeSubmit) drawerMap[\"beforeSubmit\"] = beforeSubmit;\n\tif (beforeOpen) {\n\t\tawait beforeOpen();\n\t}\n\tdrawerOptions.show = true;\n};\ndefineExpose({\n\tshow,\n\tclose\n});\n</script>\n<template>\n\t<el-drawer\n\t\t:close-on-click-modal=\"false\"\n\t\tattrs\n\t\t:size=\"drawerOptions.width\"\n\t\tv-model=\"drawerOptions.show\"\n\t\t:title=\"drawerOptions.title\"\n\t\tdestroy-on-close\n\t\t@close=\"close\"\n\t>\n\t\t<slot />\n\t\t<template #footer v-if=\"drawerOptions.showFooter\">\n\t\t\t<span class=\"dialog-footer flex justify-end\">\n\t\t\t\t<el-button plain @click=\"drawerOptions.show = false\">取消</el-button>\n\t\t\t\t<el-button :loading=\"drawerOptions.loading\" @click=\"submit\">确认</el-button>\n\t\t\t</span>\n\t\t</template>\n\t</el-drawer>\n</template>\n\n<style scoped lang=\"scss\"></style>\n","import * as XLSX from \"xlsx\";\nimport { saveAs } from \"file-saver\";\nimport XLSXStyle from \"xlsx-js-style\";\n\nfunction generateArray(table) {\n\tlet out = [];\n\tlet rows = table.querySelectorAll(\"tr\");\n\tlet ranges = [];\n\tfor (var R = 0; R < rows.length; ++R) {\n\t\tvar outRow = [];\n\t\tlet row = rows[R];\n\t\tlet columns = row.querySelectorAll(\"td\");\n\t\tfor (let C = 0; C < columns.length; ++C) {\n\t\t\tlet cell = columns[C];\n\t\t\tlet colspan = cell.getAttribute(\"colspan\");\n\t\t\tlet rowspan = cell.getAttribute(\"rowspan\");\n\t\t\tlet cellValue = cell.innerText;\n\t\t\tif (cellValue !== \"\" && cellValue == +cellValue) cellValue = +cellValue;\n\n\t\t\t//Skip ranges\n\t\t\tranges.forEach(function (range) {\n\t\t\t\tif (R >= range.s.r && R <= range.e.r && outRow.length >= range.s.c && outRow.length <= range.e.c) {\n\t\t\t\t\tfor (let i = 0; i <= range.e.c - range.s.c; ++i) outRow.push(null);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t//Handle Row Span\n\t\t\tif (rowspan || colspan) {\n\t\t\t\trowspan = rowspan || 1;\n\t\t\t\tcolspan = colspan || 1;\n\t\t\t\tranges.push({\n\t\t\t\t\ts: {\n\t\t\t\t\t\tr: R,\n\t\t\t\t\t\tc: outRow.length\n\t\t\t\t\t},\n\t\t\t\t\te: {\n\t\t\t\t\t\tr: R + rowspan - 1,\n\t\t\t\t\t\tc: outRow.length + colspan - 1\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t//Handle Value\n\t\t\toutRow.push(cellValue !== \"\" ? cellValue : null);\n\n\t\t\t//Handle Colspan\n\t\t\tif (colspan) for (let k = 0; k < colspan - 1; ++k) outRow.push(null);\n\t\t}\n\t\tout.push(outRow);\n\t}\n\treturn [out, ranges];\n}\n\nfunction datenum(v, date1904) {\n\tif (date1904) v += 1462;\n\tlet epoch = Date.parse(v);\n\treturn (epoch - new Date(Date.UTC(1899, 11, 30))) / (24 * 60 * 60 * 1000);\n}\n\nfunction sheet_from_array_of_arrays(data, opts) {\n\tlet ws = {};\n\tlet range = {\n\t\ts: {\n\t\t\tc: 10000000,\n\t\t\tr: 10000000\n\t\t},\n\t\te: {\n\t\t\tc: 0,\n\t\t\tr: 0\n\t\t}\n\t};\n\tfor (let R = 0; R != data.length; ++R) {\n\t\tfor (let C = 0; C != data[R].length; ++C) {\n\t\t\tif (range.s.r > R) range.s.r = R;\n\t\t\tif (range.s.c > C) range.s.c = C;\n\t\t\tif (range.e.r < R) range.e.r = R;\n\t\t\tif (range.e.c < C) range.e.c = C;\n\t\t\tlet cell = {\n\t\t\t\tv: data[R][C]\n\t\t\t};\n\t\t\tif (cell.v == null) continue;\n\t\t\tlet cell_ref = XLSX.utils.encode_cell({\n\t\t\t\tc: C,\n\t\t\t\tr: R\n\t\t\t});\n\n\t\t\tif (typeof cell.v === \"number\") cell.t = \"n\";\n\t\t\telse if (typeof cell.v === \"boolean\") cell.t = \"b\";\n\t\t\telse if (cell.v instanceof Date) {\n\t\t\t\tcell.t = \"n\";\n\t\t\t\tcell.z = XLSX.SSF._table[14];\n\t\t\t\tcell.v = datenum(cell.v);\n\t\t\t} else cell.t = \"s\";\n\n\t\t\tws[cell_ref] = cell;\n\t\t}\n\t}\n\tif (range.s.c < 10000000) ws[\"!ref\"] = XLSX.utils.encode_range(range);\n\treturn ws;\n}\n\nfunction Workbook() {\n\tif (!(this instanceof Workbook)) return new Workbook();\n\tthis.SheetNames = [];\n\tthis.Sheets = {};\n}\n\nfunction s2ab(s) {\n\tlet buf = new ArrayBuffer(s.length);\n\tlet view = new Uint8Array(buf);\n\tfor (let i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xff;\n\treturn buf;\n}\n\nexport function export_table_to_excel(id) {\n\tlet theTable = document.getElementById(id);\n\tlet oo = generateArray(theTable);\n\tlet ranges = oo[1];\n\n\t/* original data */\n\tlet data = oo[0];\n\tlet ws_name = \"SheetJS\";\n\n\tlet wb = new Workbook(),\n\t\tws = sheet_from_array_of_arrays(data);\n\n\t/* add ranges to worksheet */\n\t// ws['!cols'] = ['apple', 'banan'];\n\tws[\"!merges\"] = ranges;\n\n\t/* add worksheet to workbook */\n\twb.SheetNames.push(ws_name);\n\twb.Sheets[ws_name] = ws;\n\n\tlet wbout = XLSX.write(wb, {\n\t\tbookType: \"xlsx\",\n\t\tbookSST: false,\n\t\ttype: \"binary\"\n\t});\n\n\tsaveAs(\n\t\tnew Blob([s2ab(wbout)], {\n\t\t\ttype: \"application/octet-stream\"\n\t\t}),\n\t\t\"test.xlsx\"\n\t);\n}\n\nexport function export_json_to_excel({\n\tmultiHeader = [],\n\theader,\n\tdata,\n\tfilename,\n\tmerges = [],\n\tautoWidth = true,\n\texcelWidth = true,\n\tbookType = \"xlsx\"\n} = {}) {\n\t/* original data */\n\t// console.log( multiHeader,header,data,filename)\n\tfilename = filename || \"excel-list\";\n\tdata = [...data];\n\tdata.unshift(header);\n\n\tfor (let i = multiHeader.length - 1; i > -1; i--) {\n\t\tdata.unshift(multiHeader[i]);\n\t}\n\n\tlet ws_name = \"SheetJS\";\n\tlet wb = new Workbook(),\n\t\tws = sheet_from_array_of_arrays(data);\n\n\tif (merges.length > 0) {\n\t\tif (!ws[\"!merges\"]) ws[\"!merges\"] = [];\n\t\tmerges.forEach(item => {\n\t\t\tws[\"!merges\"].push(XLSX.utils.decode_range(item));\n\t\t});\n\t}\n\n\tif (autoWidth) ws[\"!cols\"] = getColWidth(data);\n\tif (excelWidth) setColMaxW(data, ws);\n\n\t/* add worksheet to workbook */\n\twb.SheetNames.push(ws_name);\n\twb.Sheets[ws_name] = ws;\n\n\tlet wbout = XLSX.write(wb, {\n\t\tbookType: bookType,\n\t\tbookSST: false,\n\t\ttype: \"binary\"\n\t});\n\tsaveAs(\n\t\tnew Blob([s2ab(wbout)], {\n\t\t\ttype: \"application/octet-stream\"\n\t\t}),\n\t\t`${filename}.${bookType}`\n\t);\n}\n\n// export function readFile(file) {\n// return new Promise((resolve) => {\n// let reader = new FileReader();\n// reader.readAsBinaryString(file);\n// reader.onload = (ev) => {\n// let dataBinary = ev.target.result;\n// let workBook = XLSX.read(dataBinary, { type: \"binary\", cellDates: true });\n// let workSheet = workBook.Sheets[workBook.SheetNames[0]];\n// const data = XLSX.utils.sheet_to_json(workSheet, {defval:\"\"});\n// resolve(data);\n// };\n// });\n// }\n\nexport function readFile(file) {\n\treturn new Promise(resolve => {\n\t\tlet reader = new FileReader();\n\t\treader.readAsBinaryString(file);\n\t\treader.onload = ev => {\n\t\t\tresolve(ev.target.result);\n\t\t};\n\t});\n}\n\n// 读取excel,返回一维数组,第一行格式:{列名:值,列名:值}\nexport async function readExcel(file) {\n\tlet dataBinary = await readFile(file);\n\tlet workBook = XLSX.read(dataBinary, { type: \"binary\", cellDates: true });\n\tlet workSheet = workBook.Sheets[workBook.SheetNames[0]];\n\tconst data = XLSX.utils.sheet_to_json(workSheet, { defval: \"\" });\n\treturn data;\n}\n\n// 读取excel,返回二维数组,第一行表头,后面行是数据\nexport async function readExcelToArray(file) {\n\tlet dataBinary = await readFile(file);\n\tlet workBook = XLSX.read(dataBinary, { type: \"binary\", cellDates: true });\n\tlet workSheet = workBook.Sheets[workBook.SheetNames[0]];\n\tconst data = XLSX.utils.sheet_to_json(workSheet, { defval: \"\", header: 1 });\n\treturn data;\n}\n\nexport async function saveFile(content, fileName) {\n\tlet file = new Blob([content]);\n\tsaveAs(file, fileName);\n}\n\n// 判断列宽\nfunction getColWidth(list) {\n\t/*设置worksheet每列的最大宽度*/\n\tconst colWidth = list.map(row =>\n\t\trow.map(val => {\n\t\t\t/*先判断是否为null/undefined*/\n\t\t\tif (val == null) {\n\t\t\t\treturn {\n\t\t\t\t\twch: 10\n\t\t\t\t};\n\t\t\t} else if (val.toString().charCodeAt(0) > 255) {\n\t\t\t\t/*再判断是否为中文*/\n\t\t\t\treturn {\n\t\t\t\t\twch: val.toString().length * 2\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\treturn {\n\t\t\t\t\twch: val.toString().length\n\t\t\t\t};\n\t\t\t}\n\t\t})\n\t);\n\t/*以第一行为初始值*/\n\tlet result = colWidth[0];\n\tfor (let i = 1; i < colWidth.length; i++) {\n\t\tfor (let j = 0; j < colWidth[i].length; j++) {\n\t\t\tif (result[j][\"wch\"] < colWidth[i][j][\"wch\"]) {\n\t\t\t\tresult[j][\"wch\"] = colWidth[i][j][\"wch\"];\n\t\t\t}\n\t\t}\n\t}\n\treturn result;\n}\n\n// 设置最大列宽\nfunction setColMaxW(list, ws) {\n\t/*设置worksheet每列的最大宽度*/\n\tconst colWidth = list.map(row =>\n\t\trow.map(val => {\n\t\t\t/*先判断是否为null/undefined*/\n\t\t\t// console.log(val)\n\t\t\tif (val == null) {\n\t\t\t\treturn {\n\t\t\t\t\twch: 10\n\t\t\t\t};\n\t\t\t} else if (val.toString().charCodeAt(0) > 255) {\n\t\t\t\t/*再判断是否为中文*/\n\t\t\t\treturn {\n\t\t\t\t\twch: 20\n\t\t\t\t};\n\t\t\t} else if (val.toString().indexOf(\"<operation\") !== -1) {\n\t\t\t\t/* 判断是否为报文数据*/\n\t\t\t\treturn {\n\t\t\t\t\twch: 30\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\treturn {\n\t\t\t\t\twch: val.toString().length\n\t\t\t\t};\n\t\t\t}\n\t\t})\n\t);\n\t// console.log(colWidth)\n\t/*以第一行为初始值*/\n\tlet result = colWidth[0];\n\tfor (let i = 1; i < colWidth.length; i++) {\n\t\tfor (let j = 0; j < colWidth[i].length; j++) {\n\t\t\tif (result[j][\"wch\"] < colWidth[i][j][\"wch\"]) {\n\t\t\t\tresult[j][\"wch\"] = colWidth[i][j][\"wch\"];\n\t\t\t}\n\t\t}\n\t}\n\t// console.log(result)\n\tresult[0].wch = 20;\n\tresult[4] ? (result[4].wch = 10) : \"\";\n\tws[\"!cols\"] = result;\n}\n\n// 导出excel,且可带单元格注释及样式\nconst englishLetter = [\n\t\"A\",\n\t\"B\",\n\t\"C\",\n\t\"D\",\n\t\"E\",\n\t\"F\",\n\t\"G\",\n\t\"H\",\n\t\"I\",\n\t\"J\",\n\t\"K\",\n\t\"L\",\n\t\"M\",\n\t\"N\",\n\t\"O\",\n\t\"P\",\n\t\"Q\",\n\t\"R\",\n\t\"S\",\n\t\"T\",\n\t\"U\",\n\t\"V\",\n\t\"W\",\n\t\"X\",\n\t\"Y\",\n\t\"X\"\n];\nexport function export_excel_style({ header, data, filename, merges = [], autoWidth = true, excelWidth = true } = {}) {\n\t// 创建一个工作簿\n\tconst workBook = XLSX.utils.book_new();\n\tdata = [...data];\n\tdata.unshift(header.map(item => item.label));\n\t// 创建工作表 worksheet\n\tconst workSheet = sheet_from_array_of_arrays(data);\n\tif (merges.length > 0) {\n\t\tif (!workSheet[\"!merges\"]) workSheet[\"!merges\"] = [];\n\t\tmerges.forEach(item => {\n\t\t\tworkSheet[\"!merges\"].push(XLSX.utils.decode_range(item));\n\t\t});\n\t}\n\tif (autoWidth) workSheet[\"!cols\"] = getColWidth(data);\n\tif (excelWidth) setColMaxW(data, workSheet);\n\theader.forEach((head, index) => {\n\t\tlet cell = workSheet[`${englishLetter[index]}1`];\n\t\t// cell.s = { font:{ bold: true } };\n\t\tif (cell && head.note) {\n\t\t\tif (!cell.c) cell.c = [];\n\t\t\tcell.c.hidden = true;\n\t\t\tcell.c.push({ a: head.label, t: head.note });\n\t\t}\n\t});\n\t// 将工作表放入工作簿中\n\tXLSX.utils.book_append_sheet(workBook, workSheet, \"Sheet1\");\n\t// 生成数据保存\n\tXLSXStyle.writeFile(workBook, `${filename}.xlsx`, { bookType: \"xlsx\" });\n}\n\n// 验证文件格式\nexport function checkFileType(file, fileType) {\n\tlet index = file.name.lastIndexOf(\".\");\n\tlet ext = file.name.substr(index);\n\tlet extList = fileType instanceof Array ? fileType : [fileType];\n\tif (fileType === \"Excel\") {\n\t\textList = [\".xls\", \".xlsx\", \".csv\"];\n\t}\n\tif (!extList.includes(ext)) {\n\t\treturn `请上传${extList.join(\"或\") || \"指定格式\"}文件!`;\n\t}\n\treturn \"\";\n}\n\n// 解析文件并判断文件类型\nexport async function parseFile(file, config) {\n\tlet typeErrorMsg = checkFileType(file, config.fileType);\n\tif (typeErrorMsg) return { code: 0, message: typeErrorMsg };\n\tif (config.fileType === \"Excel\") {\n\t\tlet data = await readExcelToArray(file);\n\t\treturn { code: 200, data };\n\t}\n\tlet dataBinary = await readFile(file);\n\treturn { code: 200, data: dataBinary };\n}\n\n// 导出多Sheet Excel\nexport async function exportMultiSheetExcel(fileName, list) {\n\tconst wb = XLSX.utils.book_new();\n\n\t// 使用 Promise 包装异步操作\n\tconst generateSheetAsync = async section => {\n\t\treturn new Promise(resolve => {\n\t\t\tsetTimeout(() => {\n\t\t\t\tconst ws = XLSX.utils.json_to_sheet(section.data);\n\t\t\t\tXLSX.utils.book_append_sheet(wb, ws, section.sheetName.replace(/[\\\\/:*?\\[\\]]/g, \"-\"));\n\t\t\t\tresolve(true);\n\t\t\t}, 0);\n\t\t});\n\t};\n\n\t// 使用 for...of 循环和 await 处理异步操作\n\tfor (const section of list) {\n\t\tawait generateSheetAsync(section);\n\t}\n\n\tconst excelBuffer = XLSX.write(wb, { bookType: \"xlsx\", type: \"array\" });\n\tconst data = new Blob([excelBuffer], { type: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\" });\n\tsaveAs(data, fileName);\n}\n\nexport const exportToExcel = ({ header, tableData, fileName }: any) => {\n\t// 1. 获取表头(columns)并处理为 Excel 中的第一行\n\tconst tHeader = header.map(col => col.label); // 获取每一列的 label 作为表头\n\t// 2. 获取表格数据(data)\n\tconst data = tableData.map(row => {\n\t\treturn header.map(col => row[col.prop]); // 按照表头的顺序排列每行数据\n\t});\n\t// 3. 将表头和数据合并\n\tconst finalData = [tHeader, ...data]; // 把表头和数据组合成一个数组\n\t// 4. 创建工作表(sheet)\n\tconst ws = XLSX.utils.aoa_to_sheet(finalData); // 使用 aoa_to_sheet 转换为工作表\n\tconst wb = XLSX.utils.book_new(); // 创建工作簿\n\tXLSX.utils.book_append_sheet(wb, ws, \"Sheet1\"); // 添加工作表\n\n\t// 5. 导出 Excel 文件\n\tXLSX.writeFile(wb, `${fileName}.xlsx`); // 下载 Excel 文件\n};\n","<!--\n * @Author: WangXin\n * @Date: 2024-01-04 16:35:08\n * @LastEditors: WangXin\n * @LastEditTime: 2025-06-06 15:03:46\n * @FilePath: /yxuse/packages/components/YxTable/index.vue\n * @Description: \n * \n * Copyright (c) 2024 by YuXing, All Rights Reserved. \n-->\n<script setup lang=\"tsx\">\nimport {\n\tref,\n\tonMounted,\n\tonBeforeMount,\n\tnextTick,\n\tuseSlots,\n\tuseAttrs,\n\twithModifiers,\n\twatch,\n\tresolveComponent,\n\tdefineOptions\n} from \"vue\";\nimport type { FormItemRule } from \"element-plus\";\nimport type { TableColumn, YxTableProps, ColumnsConfig } from \"./type.ts\";\nimport { exportToExcel } from \"@packages/utils/excel\";\nimport Sortable from \"sortablejs\";\nconst props = defineProps<YxTableProps>();\nconst slots = useSlots();\nconst attrs = useAttrs();\nconst tableRef = ref();\nconst tableFormRef = ref();\nconst columns = ref<TableColumn[]>([]);\n/**是否为编辑表单,且需要进行表格校验 */\nconst isFormTable = ref(false);\nconst formTableRules = ref<{ [key: string]: FormItemRule[] }>({});\nconst emit = defineEmits<{\n\t(e: \"operate-handle\", type: string, data: object, index: number): void;\n\t(e: \"sort-end\", oldIndex: number, newIndex: number): void;\n\t(e: \"update-page\", type: string, value: number): void;\n}>();\nonMounted(() => {\n\tnextTick(() => {\n\t\tstartSort();\n\t});\n});\nwatch(\n\t() => props.columns,\n\t() => {\n\t\tinitTable();\n\t}\n);\nonBeforeMount(async () => {\n\tawait initTable();\n});\nconst initTable = async () => {\n\tcolumns.value = typeof props.columns === \"function\" ? await props.columns() : props.columns;\n\tcolumns.value.forEach((col: TableColumn) => {\n\t\tif (col.required || col.rules?.length) {\n\t\t\tisFormTable.value = true;\n\t\t}\n\t\tif (col?.renderType && [\"select\", \"cascader\"].includes(col?.renderType) && col?.config?.loadOptions) {\n\t\t\tloadOptions(col.config);\n\t\t}\n\t});\n\tif (isFormTable.value) {\n\t\tgetRules();\n\t}\n};\n/**远程加载下拉数据 */\nconst loadOptions = async (config: any) => {\n\tif (config?.options && config?.options.length === 0 && config?.loadOptions && typeof config?.loadOptions === \"function\") {\n\t\tconfig.options = await config?.loadOptions();\n\t}\n};\nconst startSort = () => {\n\tif (!props.sort) return;\n\tconst sortDom = tableRef.value?.$el?.querySelector(\".el-table__body tbody\");\n\tSortable.create(sortDom, {\n\t\tanimation: 200,\n\t\t// group: \"el-table__row table-row\",\n\t\tsort: true,\n\t\thandle: props.sortHandle ? `.${props.sortHandle}` : null,\n\t\tonEnd: ({ oldIndex, newIndex }: { oldIndex: number; newIndex: number }) => {\n\t\t\temit(\"sort-end\", oldIndex, newIndex);\n\t\t}\n\t});\n};\n/***渲染动态组件 */\nconst dynamicComponent = (column: TableColumn, { $index, row }: any) => {\n\tconst { renderType, event = {}, prop, label, config = {}, required, rules } = column;\n\tif (!prop || !renderType) return null;\n\tconst Component = resolveComponent(\"el-\" + renderType) as any;\n\tconst { options = [], ...restConfig } = config;\n\t// 渲染子组件(如 select 的 options)\n\tconst renderChildComponent = () => {\n\t\tif (!options || options.length === 0) return null;\n\t\tif (renderType === \"select\") {\n\t\t\treturn options.map((item: any) => <el-option label={item.label} value={item.value} key={item.value} />);\n\t\t}\n\t\tif (renderType === \"radio-group\") {\n\t\t\treturn options.map((item: any) => (\n\t\t\t\t<el-radio label={item.value} key={item.value}>\n\t\t\t\t\t{item.label}\n\t\t\t\t</el-radio>\n\t\t\t));\n\t\t}\n\t\treturn null;\n\t};\n\t// 单独处理 cascader\n\tif (renderType === \"cascader\") {\n\t\treturn <el-cascader v-model={row[prop]} placeholder={`请选择${label}`} options={options} {...event} {...restConfig} />;\n\t}\n\t// 通用组件渲染\n\tconst isSelect = [\"select\", \"cascader\"].includes(renderType);\n\t//是否为编辑表格必填项\n\tconst isFormCell = required || rules?.length;\n\tconst modelValue = row[prop];\n\tconst updateModelValue = (val: any) => {\n\t\t//处理配置是数值类型\n\t\trow[prop] = config?.type === \"number\" ? Number(val) : val;\n\t};\n\tconst component = (\n\t\t<Component\n\t\t\tmodelValue={modelValue}\n\t\t\tonUpdate:modelValue={updateModelValue}\n\t\t\tplaceholder={`请${isSelect ? \"选择\" : \"输入\"}${label}`}\n\t\t\t{...event}\n\t\t\t{...restConfig}\n\t\t>\n\t\t\t{renderChildComponent()}\n\t\t</Component>\n\t);\n\tif (!isFormCell) return component;\n\t//编辑表格\n\treturn renderForm(prop, $index, component);\n};\nconst renderForm = (prop: any, index: number, component: any) => {\n\treturn (\n\t\t<el-form-item prop={\"tableData.\" + index + \".\" + prop} rules={formTableRules.value[prop]}>\n\t\t\t{component}\n\t\t</el-form-item>\n\t);\n};\n/**初始化规则 */\nconst getRules = () => {\n\tconst rules: { [key: string]: FormItemRule[] } = {};\n\tif (!isFormTable.value) return;\n\tconst handleRule = (item: TableColumn) => {\n\t\tif (!item.prop) return;\n\t\tconst isSelect = item?.renderType && [\"select\", \"cascader\"].includes(item?.renderType);\n\t\tconst defaultRule = { required: true, message: `${item.label ?? \"该字段\"}不能为空`, trigger: isSelect ? \"change\" : \"blur\" };\n\t\tif (item.required) {\n\t\t\trules[item.prop] = [defaultRule];\n\t\t}\n\t\tif (item.rules && item.rules.length > 0) {\n\t\t\trules[item.prop] = [...(rules[item?.prop] || []), ...item.rules];\n\t\t}\n\t};\n\tcolumns.value\n\t\t.filter(cell => (cell?.renderType || cell?.render) && (cell?.required || cell?.rules))\n\t\t.forEach((form: any) => {\n\t\t\tform.children?.forEach(handleRule); // 处理子项\n\t\t\thandleRule(form); // 处理自身\n\t\t});\n\tformTableRules.value = rules;\n\tconsole.log(\"rules\", formTableRules.value);\n};\n/**编辑表格校验 */\nconst tableFormValidate = async (): Promise<boolean> => {\n\tif (!isFormTable.value) return Promise.resolve(true);\n\tif (!tableFormRef.value) return Promise.resolve(false);\n\treturn await tableFormRef.value.validate(() => Promise.resolve());\n};\nconst render = (props: YxTableProps) => {\n\tconst { rowKey, tableData, pageInfo } = props;\n\t//动态插槽\n\tconst columnSlots = (cell: TableColumn, scope: any) => cell.slotName && slots[cell.slotName]?.(scope);\n\t//处理列;\n\tconst renderColumn = (columns: TableColumn[]) => {\n\t\treturn columns\n\t\t\t.filter(cell => !cell.show || cell.show(cell))\n\t\t\t.map((cell: TableColumn) => {\n\t\t\t\tconst { children, ...cellConf } = cell;\n\t\t\t\treturn (\n\t\t\t\t\t<el-table-column {...cellConf}>\n\t\t\t\t\t\t{{\n\t\t\t\t\t\t\tdefault: (scope: any) => {\n\t\t\t\t\t\t\t\t//先处理操作栏\n\t\t\t\t\t\t\t\tif (cell?.renderType === \"operate\") return renderOperate(cell, scope);\n\t\t\t\t\t\t\t\t//处理动态渲染的组件,绑定动态row\n\t\t\t\t\t\t\t\tif (cell?.renderType && cell?.renderType !== \"operate\") {\n\t\t\t\t\t\t\t\t\treturn dynamicComponent(cell, scope);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t//处理自定义渲染函数,判断是否为表单组件\n\t\t\t\t\t\t\t\tif (cell?.render) {\n\t\t\t\t\t\t\t\t\tconst renderResult = cell.render(scope.row, scope.$index, cell);\n\t\t\t\t\t\t\t\t\t//是否为编辑表单\n\t\t\t\t\t\t\t\t\tconst needsValidation = cell.required || cell.rules;\n\t\t\t\t\t\t\t\t\t//是否为组件节点\n\t\t\t\t\t\t\t\t\tconst isFragment = [\"symbol\", \"object\"].includes(typeof renderResult?.type);\n\t\t\t\t\t\t\t\t\t// 如果为表单节点且需要校验,进行form-item包裹\n\t\t\t\t\t\t\t\t\tif (needsValidation && isFragment) {\n\t\t\t\t\t\t\t\t\t\treturn renderForm(cell.prop, scope.$index, renderResult);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\treturn renderResult;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t//处理多级表头\n\t\t\t\t\t\t\t\tif (children && children?.length > 0) return renderColumn(children);\n\t\t\t\t\t\t\t\t//处理自定义插槽\n\t\t\t\t\t\t\t\treturn cell?.slotName && columnSlots(cell, scope);\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\theader: (scope: any) => {\n\t\t\t\t\t\t\t\t//添加必填标识\n\t\t\t\t\t\t\t\tif (cell?.required) {\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<span class=\"flex items-center gap-5 required\">\n\t\t\t\t\t\t\t\t\t\t\t{/* <span class=\"text-[var(--color-error-100)]\">* </span> */}\n\t\t\t\t\t\t\t\t\t\t\t{scope?.column?.label ?? \"\"}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t//处理自定义渲染函数\n\t\t\t\t\t\t\t\tif (cell?.headerRender) return cell?.headerRender(scope.row);\n\t\t\t\t\t\t\t\t//处理表头自定义插槽\n\t\t\t\t\t\t\t\tif (cell?.headerSlotName) return slots[cell?.headerSlotName]?.(scope);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t</el-table-column>\n\t\t\t\t);\n\t\t\t});\n\t};\n\t//操作栏;\n\t// const renderOperate = (cell: TableColumn, scope: any) => {\n\t// \treturn (\n\t// \t\t<div class={`flex justify-center items-center cursor-pointer gap-10 ${cell.config?.className ?? \"\"}`}>\n\t// \t\t\t{cell.operate\n\t// \t\t\t\t?.filter(op => !op.show || op.show(scope.row))\n\t// \t\t\t\t.map(op => {\n\t// \t\t\t\t\tif (op?.render) return op.render(scope.row, scope.$index);\n\t// \t\t\t\t\treturn (\n\t// \t\t\t\t\t\t<span\n\t// \t\t\t\t\t\t\tonClick={withModifiers(() => {\n\t// \t\t\t\t\t\t\t\top?.onClick && op?.onClick(scope.row);\n\t// \t\t\t\t\t\t\t\temit(\"operate-handle\", op.key, scope.row, scope.$index);\n\t// \t\t\t\t\t\t\t}, [\"stop\"])}\n\t// \t\t\t\t\t\t\tclass={`table-handle whitespace-nowrap ${op?.className ?? \"\"}`}\n\t// \t\t\t\t\t\t>\n\t// \t\t\t\t\t\t\t{op.label}\n\t// \t\t\t\t\t\t</span>\n\t// \t\t\t\t\t);\n\t// \t\t\t\t})}\n\t// \t\t</div>\n\t// \t);\n\t// };\n\tconst renderOperate = (cell: TableColumn, scope: any) => {\n\t\treturn (\n\t\t\t<div class={`flex justify-center items-center cursor-pointer gap-10 ${cell.config?.className ?? \"\"}`}>\n\t\t\t\t{cell.operate\n\t\t\t\t\t?.filter(op => !op.show || op.show(scope.row))\n\t\t\t\t\t.map(op => {\n\t\t\t\t\t\tif (op?.render) return op.render(scope.row, scope.$index);\n\t\t\t\t\t\tconst disabled = typeof op?.disabled === \"function\" ? op.disabled(scope.row, scope.$index) : op?.disabled ?? false;\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tonClick={withModifiers(() => {\n\t\t\t\t\t\t\t\t\tif (!disabled) {\n\t\t\t\t\t\t\t\t\t\top?.onClick && op?.onClick(scope.row);\n\t\t\t\t\t\t\t\t\t\temit(\"operate-handle\", op.key, scope.row, scope.$index);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}, [\"stop\"])}\n\t\t\t\t\t\t\t\tclass={`table-handle whitespace-nowrap ${op?.className ?? \"\"} ${disabled ? \"table-handle-disabled\" : \"\"}`}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{op.label}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t);\n\t\t\t\t\t})}\n\t\t\t</div>\n\t\t);\n\t};\n\t//分页\n\tconst pagination = () => {\n\t\tif (!pageInfo) return null;\n\t\tconst handleSizeChange = (e: number) => {\n\t\t\temit(\"update-page\", \"pageSize\", e);\n\t\t};\n\t\tconst handleCurrentChange = (e: number) => {\n\t\t\temit(\"update-page\", \"pageIndex\", e);\n\t\t};\n\t\treturn (\n\t\t\t<div class=\"pagination-wrap\">\n\t\t\t\t<el-pagination\n\t\t\t\t\tv-model:currentPage={pageInfo.pageIndex}\n\t\t\t\t\tv-model:pageSize={pageInfo.pageSize}\n\t\t\t\t\tsmall={false}\n\t\t\t\t\tdisabled={false}\n\t\t\t\t\tpage-sizes={[10, 20, 50, 100]}\n\t\t\t\t\tlayout={pageInfo?.layout ? pageInfo?.layout : \"total,sizes,prev, pager, next\"}\n\t\t\t\t\tbackground={false}\n\t\t\t\t\ttotal={pageInfo.total}\n\t\t\t\t\tonSizeChange={handleSizeChange}\n\t\t\t\t\tonCurrentChange={handleCurrentChange}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t);\n\t};\n\tif (!columns.value) return;\n\treturn (\n\t\t<>\n\t\t\t{isFormTable.value ? (\n\t\t\t\t<el-form model={props} ref={tableFormRef}>\n\t\t\t\t\t{renderTable()}\n\t\t\t\t</el-form>\n\t\t\t) : (\n\t\t\t\trenderTable()\n\t\t\t)}\n\t\t\t{pagination()}\n\t\t</>\n\t);\n\t/**渲染表格 */\n\tfunction renderTable() {\n\t\treturn (\n\t\t\t<el-table ref={tableRef} {...attrs} row-key={rowKey} data={tableData}>\n\t\t\t\t{renderColumn(columns.value)}\n\t\t\t</el-table>\n\t\t);\n\t}\n};\nconst exportDataToExcel = (fileName?: string) => {\n\tconst header = columns.value.filter(cell => cell.prop);\n\tconst tableData = props.tableData;\n\texportToExcel({ header, tableData, fileName: fileName || Date.now() });\n};\n/** 更新列 */\nconst updateColumns = async (newColumns: ColumnsConfig) => {\n\tif (!columns.value) return;\n\tcolumns.value = typeof newColumns === \"function\" ? await newColumns() : newColumns;\n};\ndefineExpose({\n\ttableRef,\n\texportDataToExcel,\n\tupdateColumns,\n\ttableFormValidate\n});\ndefineOptions({\n\tname: \"YxTable\",\n\tinheritAttrs: false\n});\n</script>\n\n<template>\n\t<component :is=\"render(props)\" />\n</template>\n\n<style scoped lang=\"scss\"></style>\n","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 1024 1024\"\n}\n\nexport function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", _hoisted_1, _cache[0] || (_cache[0] = [\n _createElementVNode(\"path\", {\n fill: \"currentColor\",\n d: \"M512 64a448 448 0 1 1 0 896 448 448 0 0 1 0-896m23.744 191.488c-52.096 0-92.928 14.784-123.2 44.352-30.976 29.568-45.76 70.4-45.76 122.496h80.256c0-29.568 5.632-52.8 17.6-68.992 13.376-19.712 35.2-28.864 66.176-28.864 23.936 0 42.944 6.336 56.32 19.712 12.672 13.376 19.712 31.68 19.712 54.912 0 17.6-6.336 34.496-19.008 49.984l-8.448 9.856c-45.76 40.832-73.216 70.4-82.368 89.408-9.856 19.008-14.08 42.24-14.08 68.992v9.856h80.96v-9.856c0-16.896 3.52-31.68 10.56-45.76 6.336-12.672 15.488-24.64 28.16-35.2 33.792-29.568 54.208-48.576 60.544-55.616 16.896-22.528 26.048-51.392 26.048-86.592q0-64.416-42.24-101.376c-28.16-25.344-65.472-37.312-111.232-37.312m-12.672 406.208a54.27 54.27 0 0 0-38.72 14.784 49.4 49.4 0 0 0-15.488 38.016c0 15.488 4.928 28.16 15.488 38.016A54.85 54.85 0 0 0 523.072 768c15.488 0 28.16-4.928 38.72-14.784a51.52 51.52 0 0 0 16.192-38.72 51.97 51.97 0 0 0-15.488-38.016 55.94 55.94 0 0 0-39.424-14.784\"\n }, null, -1)\n ])))\n}\nexport default { render: render }","<!--\n * @Author: WangXin\n * @Date: 2023-06-08 10:10:13\n * @LastEditors: WangXin\n * @LastEditTime: 2025-06-06 14:58:42\n * @FilePath: /yxuse/packages/components/YxForm/index.vue\n * @Description: \n * \n * Copyright (c) 2023 by YuXing, All Rights Reserved. \n-->\n<script setup lang=\"tsx\">\nimport { ref, useAttrs, useSlots, resolveComponent, watch, onBeforeMount, onUnmounted } from \"vue\";\nimport type { FormInstance, FormItemRule } from \"element-plus\";\nimport type { YxFormProps, FormItem, FormStyle } from \"./type\";\nimport Question from \"./icon/question.svg?component\";\nconst formData = ref<{ [key: string]: any }>({});\nconst formRules = ref<{ [key: string]: FormItemRule[] }>({});\nconst formColumn = ref<FormItem[]>([]);\nconst attrs = useAttrs();\nconst props = withDefaults(defineProps<YxFormProps>(), {\n\tformLayout: \"horizontal\",\n\tformStyle: () => ({\n\t\trow: 3,\n\t\tgap: \"15px\",\n\t\tlabelWidth: \"100px\",\n\t\talignItems: \"start\"\n\t})\n});\nconst isOptionsComponent = (type?: string): any => type && [\"select\", \"cascader\"].includes(type);\n//初始化表单data\nconst initForm = async () => {\n\tconst { formList, formParams } = props as YxFormProps;\n\t// 获取表单配置\n\tformColumn.value = typeof formList === \"function\" ? await formList() : formList;\n\tif (!Array.isArray(formColumn.value) || formColumn.value.length === 0) {\n\t\tconsole.warn(\"请配置表单项\");\n\t\treturn;\n\t}\n\t// 初始化表单数据\n\tconst initialData: Record<string, any> = {};\n\t// 填充默认值并加载选项(递归处理嵌套)\n\tconst fillFormData = (item: any) => {\n\t\tif (item.prop && !(item.prop in initialData)) {\n\t\t\tinitialData[item.prop] = undefined;\n\t\t}\n\t\tif (isOptionsComponent(item?.renderType)) {\n\t\t\tloadOptions(item); // 异步加载选项数据\n\t\t}\n\t\tif (Array.isArray(item.children)) {\n\t\t\titem.children.forEach(fillFormData);\n\t\t}\n\t\t//如果有配置关联的选项\n\t\thandleLinkOptions(item);\n\t};\n\tformColumn.value.forEach(item => fillFormData(item));\n\t// 编辑模式下回填数据\n\tif (formParams && Object.keys(formParams).length > 0) {\n\t\tif (hasLoadOptions()) {\n\t\t\tfor (const item of formColumn.value) {\n\t\t\t\tif (!item.prop) continue;\n\t\t\t\tconst isAsyncOption = item.config?.loadOptions && typeof item.config.loadOptions === \"function\";\n\t\t\t\t// 如果不是需要跳过赋值的字段,就赋值\n\t\t\t\tif (!(isAsyncOption && formParams[item.prop] !== undefined)) {\n\t\t\t\t\tformData.value[item.prop] = formParams[item.prop];\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t//兼容老版本回写formParams数据\n\t\t\tformData.value = formParams;\n\t\t}\n\t} else {\n\t\tconsole.log(\"initialData\", initialData);\n\t\tformData.value = initialData;\n\t}\n\tconsole.log(\"formData\", formData.value);\n};\n/**处理关联选项的逻辑 */\nconst handleLinkOptions = (item: any) => {\n\tif (!item.config?.linkOptions || item?._linkedHandled) return;\n\tconst linkOptions = item.config.linkOptions;\n\tconst originOnChange = item.event?.onChange;\n\tconst newOnChange = async (e: any) => {\n\t\tconsole.log(\"执行事件\", e);\n\t\t// 执行你自己的逻辑\n\t\tconst updateForm: FormItem = formColumn.value.find((form: any) => form?.prop === linkOptions) as any;\n\t\t//没有自定义事件,不做处理\n\t\tif (!updateForm || !updateForm?.config?.loadOptions) return;\n\t\tconst options = await updateForm.config.loadOptions(e);\n\t\t//更新options\n\t\tupdateForm.config.options = options;\n\t\t// 调用原始事件\n\t\tif (typeof originOnChange === \"function\") {\n\t\t\toriginOnChange(e);\n\t\t}\n\t};\n\t// 保证 event 是对象\n\titem.event = {\n\t\t...item.event,\n\t\tonChange: newOnChange\n\t};\n\t//添加处理标识\n\titem._linkedHandled = true;\n};\n/**表单配置中是否有loadOptions兼容老版本formParams回写数据 */\nconst hasLoadOptions = () => {\n\treturn formColumn.value.some(item => item.config?.loadOptions && typeof item.config.loadOptions === \"function\");\n};\n/**远程加载下拉数据 */\nconst loadOptions = async ({ config, prop }: FormItem) => {\n\t//不自动加载选项\n\tif (!config || config.notAutoLoadOptions) return;\n\tconst { loadOptions, options } = config;\n\tif (!options || typeof loadOptions !== \"function\") return;\n\tconst { formParams } = props as YxFormProps;\n\t//回写联级表单\n\tconst parentProp = formColumn.value.find((item: any) => item?.config?.linkOptions === prop)?.prop;\n\tconst parentValue = parentProp ? formParams?.[parentProp] : undefined;\n\ttry {\n\t\tconfig.options = await loadOptions(parentValue);\n\t\t// 回填下拉框数据\n\t\tif (prop && formParams?.[prop]) {\n\t\t\tformData.value[prop] = formParams[prop];\n\t\t}\n\t} catch (err) {\n\t\tconsole.error(`加载选项失败: ${prop}`, err);\n\t}\n};\n//监听form配置更新后,则立即初始化form\nwatch(\n\t() => props.formList,\n\tformList => {\n\t\tif (formList.length > 0) {\n\t\t\tconsole.log(\"监听到了,formlist\", formList);\n\t\t\tinitForm();\n\t\t\tgetRules();\n\t\t}\n\t}\n);\n//监听默认参数变化后,重置form\nwatch(\n\t() => props.formParams,\n\tformParams => {\n\t\tif (formParams) {\n\t\t\tconsole.log(\"监听到了,formlist\");\n\t\t\tinitForm();\n\t\t}\n\t}\n);\n\n/**初始化规则 */\nconst getRules = () => {\n\tconst rules: { [key: string]: FormItemRule[] } = {};\n\tif (!formColumn.value?.length) return;\n\tconst handleRule = (item: FormItem) => {\n\t\tif (!item.prop) return;\n\t\tconst isSelect = item?.renderType && [\"select\", \"cascader\"].includes(item?.renderType);\n\t\tconst defaultRule = { required: true, message: `${item.label ?? \"该字段\"}不能为空`, trigger: isSelect ? \"change\" : \"blur\" };\n\t\tif (item.required) {\n\t\t\trules[item.prop] = [defaultRule];\n\t\t}\n\t\tif (item.rules && item.rules.length > 0) {\n\t\t\trules[item.prop] = [...(rules[item?.prop] || []), ...item.rules];\n\t\t}\n\t};\n\tformColumn.value.forEach((form: any) => {\n\t\tform.children?.forEach(handleRule); // 处理子项\n\t\thandleRule(form); // 处理自身\n\t});\n\tformRules.value = rules;\n\tconsole.log(\"rules\", rules);\n};\n\nonBeforeMount(async () => {\n\tif (props.formList) {\n\t\tawait initForm();\n\t\tgetRules();\n\t}\n});\nonUnmounted(() => {\n\t// formRef?.value && formRef?.value.resetFields();\n});\nconst formRef = ref<FormInstance>();\nconst getFormStyle = () => {\n\tconst { formStyle } = props;\n\tconst { row, gap, ...style } = formStyle as FormStyle;\n\treturn {\n\t\t\"grid-template-columns\": `repeat(${row}, 1fr)`,\n\t\t\"grid-gap\": gap,\n\t\t...style\n\t};\n};\n//分组样式\nconst getGroupStyle = (groupStyle: FormStyle) => {\n\tif (!groupStyle) return {};\n\tconst { row, gap, ...style } = groupStyle;\n\treturn {\n\t\t\"grid-template-columns\": `repeat(${row}, 1fr)`,\n\t\t\"grid-gap\": gap,\n\t\t...style\n\t};\n};\n/**动态渲染组件 */\nconst dynamicComponent = ({ renderType, event, prop, label, config }: FormItem) => {\n\tif (!prop) return;\n\tconst { options, ...conf } = config || {};\n\tif (renderType === \"cascader\")\n\t\treturn (\n\t\t\t<el-cascader\n\t\t\t\t{...event}\n\t\t\t\t{...conf}\n\t\t\t\toptions={options}\n\t\t\t\tv-model={formData.value[prop]}\n\t\t\t\tplaceholder={`请选择${label}`}\n\t\t\t></el-cascader>\n\t\t);\n\tconst Component = resolveComponent(\"el-\" + renderType) as any;\n\tconst renderChildComponent = () => {\n\t\tif (renderType === \"select\" && config?.options) {\n\t\t\treturn config?.options.map((item: any) => <el-option label={item.label} value={item.value} />);\n\t\t} else if (renderType === \"radio-group\" && config?.options) {\n\t\t\treturn config?.options.map((item: any) => <el-radio label={item.label} value={item.value} />);\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t};\n\tconst isSelect = renderType && [\"select\", \"cascader\"].includes(renderType);\n\treturn (\n\t\t<Component {...event} placeholder={`请${isSelect ? \"选择\" : \"输入\"}${label}`} {...conf} v-model={formData.value[prop]}>\n\t\t\t{renderChildComponent()}\n\t\t</Component>\n\t);\n};\nconst render = (props: YxFormProps) => {\n\tconst { formStyle, formLayout } = props;\n\tif (!formColumn.value?.length) return;\n\tconst slots = useSlots();\n\tconsole.log(\"slots\", slots);\n\t//动态插槽\n\tconst formItemSlots = (form: FormItem) => form.slotName && slots[form.slotName]?.(formData.value);\n\tconst renderFormItem = (formList: any[]) => {\n\t\tconst renderForm = (form: FormItem) => {\n\t\t\tconst { className, ...formProps } = form;\n\t\t\treturn (\n\t\t\t\t<el-form-item\n\t\t\t\t\tclass={`${formLayout === \"vertical\" ? \"flex flex-col \" : \"\"} ${formStyle?.formItemClassName ?? \"\"} ${className ?? \"\"} ${\n\t\t\t\t\t\t!form.label ? \"no-label-item\" : \"\"\n\t\t\t\t\t}`}\n\t\t\t\t\t{...formProps}\n\t\t\t\t\tprop={form.prop}\n\t\t\t\t\tlabelWidth={formStyle?.labelWidth}\n\t\t\t\t\tkey={form.prop}\n\t\t\t\t>\n\t\t\t\t\t{{\n\t\t\t\t\t\tdefault: () => {\n\t\t\t\t\t\t\tif (form?.render) return form?.render(formData.value);\n\t\t\t\t\t\t\tif (form.renderType) return dynamicComponent(form);\n\t\t\t\t\t\t\treturn form?.slotName && formItemSlots(form);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tlabel: () =>\n\t\t\t\t\t\t\tform.label ? (\n\t\t\t\t\t\t\t\t<div class={`flex items-center gap-5 ${form.labelClassName ?? \"\"}`}>\n\t\t\t\t\t\t\t\t\t{form.label}\n\t\t\t\t\t\t\t\t\t{form.promptConf ? (\n\t\t\t\t\t\t\t\t\t\t<el-tooltip {...form.promptConf?.tooltipConf}>\n\t\t\t\t\t\t\t\t\t\t\t<el-icon size={form.promptConf?.size ?? 15} color={form.promptConf?.color}>\n\t\t\t\t\t\t\t\t\t\t\t\t<Question />\n\t\t\t\t\t\t\t\t\t\t\t</el-icon>\n\t\t\t\t\t\t\t\t\t\t</el-tooltip>\n\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\"\"\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t) : null\n\t\t\t\t\t}}\n\t\t\t\t</el-form-item>\n\t\t\t);\n\t\t};\n\t\t//处理分组的情况\n\t\treturn formList\n\t\t\t.filter(form => !form.show || form.show(formData.value))\n\t\t\t.map((form: FormItem) => {\n\t\t\t\tif (form.children && form.children.length > 0) {\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<div class={`flex flex-col ${form.groupWrapClassName ?? \"\"}`} style={{ ...form?.groupWrapStyle }}>\n\t\t\t\t\t\t\t<div class={form.groupTitleClassName ?? \"\"} style={{ ...form?.groupTitleStyle }}>\n\t\t\t\t\t\t\t\t{form.groupName}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class={`grid ${form.groupClassName ?? \"\"}`} style={{ ...getGroupStyle(form?.groupStyle ?? {}) }}>\n\t\t\t\t\t\t\t\t{form.children.filter(form => !form.show || form.show(formData.value)).map(form => renderForm(form))}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\treturn renderForm(form);\n\t\t\t\t}\n\t\t\t});\n\t};\n\treturn (\n\t\t<>\n\t\t\t<el-form\n\t\t\t\tscroll-to-error\n\t\t\t\tmodel={formData.value}\n\t\t\t\trules={formRules.value}\n\t\t\t\tclass=\"grid\"\n\t\t\t\tref={formRef}\n\t\t\t\tvalidate-on-rule-change={false}\n\t\t\t\t{...attrs}\n\t\t\t\tstyle={{ ...getFormStyle() }}\n\t\t\t>\n\t\t\t\t{renderFormItem(formColumn.value)}\n\t\t\t</el-form>\n\t\t</>\n\t);\n};\n//表单验证\nconst formValidate = async (): Promise<boolean> => {\n\tif (!formRef.value) return Promise.resolve(false);\n\treturn await formRef.value.validate(() => Promise.resolve());\n};\ndefineExpose({\n\tformData,\n\tformValidate,\n\tformRef\n});\ndefineOptions({\n\tname: \"YxForm\"\n});\n</script>\n<template>\n\t<component :is=\"render(props)\" />\n</template>\n<style scoped lang=\"scss\">\n.no-label-item :deep() .el-form-item__label {\n\tpadding-right: 0;\n\theight: 0;\n\tline-height: 0;\n}\n</style>\n","/*\n * @Author: WangXin\n * @Date: 2023-12-06 17:21:49\n * @LastEditors: WangXin\n * @LastEditTime: 2023-12-08 10:35:59\n * @FilePath: \\yxUse\\packages\\utils\\common\\update.ts\n * @Description:\n *\n * Copyright (c) 2023 by YuXing, All Rights Reserved.\n */\nimport { Update } from \"@packages/components\";\nimport { createApp } from \"vue\";\nlet versionKey, versionJsonUrl, _timer, curVersion, updateApp, timeGap;\n//每5分钟请求一次\nexport const monitorUpdate = (systemName, gap = 300) => {\n\ttimeGap = gap;\n\ttimedExecution(systemName);\n};\nconst timedExecution = systemName => {\n\t_timer = setTimeout(() => {\n\t\tgetVersion(systemName);\n\t\t_timer && clearTimeout(_timer);\n\t\ttimedExecution(systemName);\n\t\t// localStorage.removeItem(versionKey + \"delayTime\");\n\t}, timeGap * 1000);\n};\nconst getVersion = async (systemName: string) => {\n\tversionKey = `${systemName}_version`;\n\tconst systemPre = window.location.pathname.split(\"/\")[1] || \"ttc\";\n\tconsole.log(versionKey, systemPre);\n\t// versionJsonUrl = `/${systemPre}/${systemName}/version.json`;\n\tversionJsonUrl = \"/version.json\";\n\tconst oldVersion = localStorage.getItem(versionKey) || \"\";\n\tconst data = await fetch(versionJsonUrl, { cache: \"no-cache\" });\n\tconst { version, message, isNotice } = await data.json();\n\t// 没有历史版本则给缓存注入版本\n\tif (!oldVersion) {\n\t\tlocalStorage.setItem(versionKey, version);\n\t}\n\t//如果新版本与用户当前版本不一致,则提醒用户有版本更新\n\n\tif (oldVersion !== version) {\n\t\tif (isNotice) {\n\t\t\t//通知用户\n\t\t\tconsole.log(\"监测到有新版本\", version);\n\t\t\tnoticeUser(message);\n\t\t}\n\t\tcurVersion = version;\n\t}\n};\n//立即更新\nexport const updateSysVersion = () => {\n\tlocalStorage.setItem(versionKey, curVersion);\n\twindow.location.reload(true);\n};\n//暂不更新,加入延迟时间1小时\nexport const delayUpdateSysVersion = () => {\n\t//隐藏弹窗\n\tupdateApp.unmount();\n\tdocument.body.removeChild(document.querySelector(\"#update\"));\n\tlocalStorage.setItem(versionKey, curVersion);\n};\nconst noticeUser = message => {\n\tif (!document.querySelector(\"#update\")) {\n\t\tconst div = document.createElement(\"div\");\n\t\tdiv.setAttribute(\"id\", \"update\");\n\t\tdiv.style.position = \"absolute\";\n\t\tdiv.style.width = \"100%\";\n\t\tdiv.style.height = \"100%\";\n\t\tdiv.style.top = \"0\";\n\t\tdiv.style.left = \"0\";\n\t\tdocument.body.appendChild(div);\n\t\tupdateApp = createApp(Update, message);\n\t\tupdateApp.mount(\"#update\");\n\t}\n};\n","<script setup lang=\"ts\">\nimport { ref, reactive, defineProps } from \"vue\";\nimport { updateSysVersion, delayUpdateSysVersion } from \"@packages/utils/common/update\";\n// const props =\ninterface UpdateProps {\n\ttitle: String;\n\tdescription: String;\n\tcontent: Object;\n\ttime: String;\n}\n\nconst props = defineProps<UpdateProps>();\nconsole.log(props);\n</script>\n<template>\n\t<div class=\"update-wrap flex items-center justify-center\">\n\t\t<div class=\"relative update-content\">\n\t\t\t<div class=\"flex items-center justify-center\">{{ props?.title }}</div>\n\t\t\t<div class=\"flex flex-col gap-5 mt-10\">\n\t\t\t\t<div class=\"update-title\">{{ props?.description }}</div>\n\t\t\t\t<div class=\"update-item px-20\" v-for=\"(item, key) in props?.content\">\n\t\t\t\t\t<span>{{ key }}:</span> <span>{{ item }}</span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"text-end\">{{ props.time }} 软件专业部</div>\n\t\t\t\t<div class=\"flex justify-end items-center mt-10\">\n\t\t\t\t\t<el-button plain @click=\"delayUpdateSysVersion\">暂不更新</el-button>\n\t\t\t\t\t<el-button @click=\"updateSysVersion\">立即更新</el-button>\n\t\t\t\t</div>\n\t\t\t\t<span class=\"tips mt-10\"\n\t\t\t\t\t>提示: 选择立即更新后,会立即刷新页面更新系统,当前页面缓存数据会消失选择暂不更新后,请稍后自行刷新页面更新系统。</span\n\t\t\t\t>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n<style scoped lang=\"scss\">\n.update-wrap {\n\tposition: absolute;\n\twidth: 100%;\n\theight: 100%;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbottom: 0;\n\tbackground: var(--dialog-overlay-background);\n\tz-index: 9999;\n\tcolor: var(--dialog-header-text-color);\n\tfont-family: YX-TEXT;\n\t.update-content {\n\t\twidth: 30%;\n\t\theight: fit-content;\n\t\tbackground: var(--dialog-background);\n\t\tborder-radius: var(--border-radius-medium);\n\t\tpadding: 20px 20px 10px 20px;\n\t\tbox-sizing: border-box;\n\t\t.tips {\n\t\t\tfont-size: 12px;\n\t\t}\n\t}\n}\n</style>\n","<!--\n * @Author: WangXin\n * @Date: 2024-04-02 20:01:00\n * @LastEditors: WangXin\n * @LastEditTime: 2024-04-11 15:11:58\n * @FilePath: /yxuse/packages/components/YxIcon/index.vue\n * @Description: \n * \n * Copyright (c) 2024 by YuXing, All Rights Reserved. \n-->\n<template>\n\t<i class=\"yx-icon\" :style=\"[{ '--color': color, 'font-size': size + 'px' }]\">\n\t\t<slot />\n\t</i>\n</template>\n\n<script>\n// import { version, createApp } from \"vue\";\n// console.log(this.$options);\nexport default {\n\tprops: {\n\t\tcolor: {\n\t\t\ttype: String,\n\t\t\tdefault: \"inherit\"\n\t\t},\n\t\tsize: {\n\t\t\ttype: String,\n\t\t\tdefault: \"16\"\n\t\t}\n\t}\n};\n</script>\n\n<style scoped>\n.yx-icon {\n\t--color: inherit;\n\tposition: relative;\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: 1em;\n\theight: 1em;\n\tline-height: 1em;\n\tcolor: var(--color);\n\tfill: currentColor;\n}\n</style>\n","<!--\r\n * @Author: WangXin\r\n * @Date: 2024-03-20 09:40:21\r\n * @LastEditors: WangXin\r\n * @LastEditTime: 2025-05-22 09:26:11\r\n * @FilePath: /yxuse/packages/components/YxUpload/index.vue\r\n * @Description: \r\n * \r\n * Copyright (c) 2024 by YuXing, All Rights Reserved. \r\n-->\r\n<script setup lang=\"tsx\">\r\nimport { ref, useAttrs, useSlots } from \"vue\";\r\nimport type { UploadProps, UploadRawFile, UploadUserFile, UploadInstance } from \"element-plus\";\r\nimport { genFileId } from \"element-plus\";\r\nimport type { YxUploadProps } from \"./type\";\r\nimport { assets } from \"@packages/api\";\r\nconst attrs = useAttrs();\r\nconst slots = useSlots();\r\nconst fileList = ref<UploadUserFile[]>([]);\r\nconst props = defineProps<YxUploadProps>();\r\nlet uploadFileList: UploadUserFile[] = [];\r\nconst fileObsUrl = ref(\"\");\r\nconst upload = ref<UploadInstance>();\r\nconst emit = defineEmits<{\r\n\t(e: \"update:fileObsUrl\", value: string): void;\r\n\t(e: \"getFile\", value: any): void;\r\n}>();\r\nconst uploadFile = async (file: any) => {\r\n\tif (props?.customUpload) {\r\n\t\treturn props?.customUpload(file);\r\n\t}\r\n\tconst fromData = new FormData();\r\n\tfromData.append(\"file\", file);\r\n\tconst { data } = await (props?.uploadResourceApi ? props?.uploadResourceApi(fromData) : assets.uploadResourceApi(fromData));\r\n\tfileObsUrl.value = data.fileUrl;\r\n\temit(\"update:fileObsUrl\", fileObsUrl.value);\r\n};\r\nconst onExceed: UploadProps[\"onExceed\"] = async files => {\r\n\tupload.value!.clearFiles();\r\n\tconst file = files[0] as UploadRawFile;\r\n\tfile.uid = genFileId();\r\n\tupload.value!.handleStart(file);\r\n};\r\nconst onChange = async (file: UploadUserFile, uploadFiles: UploadUserFile[]) => {\r\n\tuploadFileList = uploadFiles;\r\n\tif (attrs?.limit && attrs?.limit === 1) {\r\n\t\tawait uploadFile(uploadFileList[0]?.raw);\r\n\t} else {\r\n\t\tawait uploadFile(uploadFileList);\r\n\t}\r\n};\r\n/**多文件使用 getFileList*/\r\nconst getFileList = () => uploadFileList;\r\ndefineExpose({ upload, getFileList });\r\nconst render = (props: YxUploadProps) => {\r\n\tconst defaultTrigger = () => {\r\n\t\treturn <el-button>{props.triggerText ?? \"上传文件\"}</el-button>;\r\n\t};\r\n\treturn (\r\n\t\t<>\r\n\t\t\t<el-upload\r\n\t\t\t\tref={upload}\r\n\t\t\t\tclass=\"w-full h-full\"\r\n\t\t\t\thttp-request={uploadFile}\r\n\t\t\t\tfile-list={fileList.value}\r\n\t\t\t\t{...attrs}\r\n\t\t\t\ton-exceed={onExceed}\r\n\t\t\t\ton-change={onChange}\r\n\t\t\t\tauto-upload={false}\r\n\t\t\t>\r\n\t\t\t\t{{\r\n\t\t\t\t\ttrigger: () => {\r\n\t\t\t\t\t\treturn props?.triggerRender\r\n\t\t\t\t\t\t\t? props?.triggerRender(fileObsUrl.value)\r\n\t\t\t\t\t\t\t: slots[\"trigger\"]\r\n\t\t\t\t\t\t\t? slots[\"trigger\"]()\r\n\t\t\t\t\t\t\t: defaultTrigger();\r\n\t\t\t\t\t},\r\n\t\t\t\t\ttip: () => {\r\n\t\t\t\t\t\treturn <div class=\"el-upload__tip\">{props?.uploadTips}</div>;\r\n\t\t\t\t\t}\r\n\t\t\t\t}}\r\n\t\t\t</el-upload>\r\n\t\t</>\r\n\t);\r\n};\r\n</script>\r\n<template>\r\n\t<component :model-value=\"fileObsUrl\" :is=\"render(props)\" />\r\n</template>\r\n<style scoped lang=\"scss\"></style>\r\n","<!--\n * @Author: WangXin\n * @Date: 2025-05-08 14:48:05\n * @LastEditors: WangXin\n * @LastEditTime: 2025-05-12 10:02:39\n * @FilePath: /yxuse/packages/components/LogoTitle/index.vue\n * @Description: \n * \n * Copyright (c) ${2024} by YuXing, All Rights Reserved. \n-->\n<script lang=\"ts\">\nimport { auth } from \"@packages/api\";\nimport type { SystemConfig } from \"./type\";\nexport default {\n\tname: \"LogoTitle\",\n\tprops: {\n\t\tshowLogo: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true\n\t\t},\n\t\tshowTitle: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false\n\t\t},\n\t\tlogoCanJump: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true\n\t\t}\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tcustomConfig: {\n\t\t\t\ticonStyle: {\n\t\t\t\t\twidth: \"116px\",\n\t\t\t\t\theight: \"20px\"\n\t\t\t\t}\n\t\t\t} as SystemConfig\n\t\t};\n\t},\n\tasync created() {\n\t\ttry {\n\t\t\tconst data = await auth.getUserConfig();\n\t\t\tthis.customConfig = {\n\t\t\t\t...this.customConfig,\n\t\t\t\t...data\n\t\t\t};\n\t\t} catch (e) {\n\t\t\tconsole.error(\"获取用户配置失败\", e);\n\t\t}\n\t},\n\tmethods: {\n\t\tlogoJumpHandle() {\n\t\t\tif (this.customConfig?.logoCanJump === false) return;\n\t\t\tauth.jumpToHome();\n\t\t}\n\t}\n};\n</script>\n\n<template>\n\t<div\n\t\tclass=\"flex items-center gap-x-10 logo-wrap\"\n\t\t:class=\"{ 'cursor-pointer': customConfig?.logoCanJump !== false }\"\n\t\t@click=\"logoJumpHandle\"\n\t>\n\t\t<div\n\t\t\tv-if=\"showLogo && customConfig?.icon\"\n\t\t\t:style=\"customConfig.iconStyle\"\n\t\t\tclass=\"yx-icon theme-icon\"\n\t\t\tv-html=\"customConfig.icon\"\n\t\t/>\n\t\t<div\n\t\t\t:style=\"customConfig.titleStyle\"\n\t\t\tv-if=\"showTitle && customConfig?.title\"\n\t\t\tclass=\"text-xl text-[var(--text-color-title)] title\"\n\t\t>\n\t\t\t{{ customConfig?.title }}\n\t\t</div>\n\t</div>\n</template>\n\n<style scoped>\n.logo-wrap {\n\tline-height: 1;\n}\n.yx-icon :deep() svg {\n\tvertical-align: middle;\n}\n</style>\n","/*\n * @Author: WangXin\n * @Date: 2025-05-08 14:48:05\n * @LastEditors: WangXin\n * @LastEditTime: 2025-05-08 18:01:08\n * @FilePath: /yxuse/packages/components/LogoTitle/index.ts\n * @Description:\n *\n * Copyright (c) ${2024} by YuXing, All Rights Reserved.\n */\nexport { default as LogoTitle } from \"./index.vue\";\nimport { version, createApp } from \"vue\";\nimport type { LogoTitleProps } from \"./type\";\nimport LogoTitle from \"./index.vue\";\nexport class LogoTitleRender {\n\tconstructor(props: LogoTitleProps, domId: string = \"system-logo-title\") {\n\t\tthis.render(props, domId);\n\t}\n\tget vueVersion(): \"2\" | \"3\" {\n\t\treturn version[0] as `${\"2\" | \"3\"}`;\n\t}\n\trender(props: LogoTitleProps, domId: string) {\n\t\tif (this.vueVersion === \"3\") {\n\t\t\tcreateApp(LogoTitle, props).mount(`#${domId}`);\n\t\t} else {\n\t\t\tconst Vue = require(\"vue\");\n\t\t\treturn new Vue({ render: h => h(LogoTitle, { props }) }).$mount(`#${domId}`);\n\t\t}\n\t}\n}\n"],"names":["submit","XLSX.utils","XLSX.writeFile","_isSlot","s","Object","prototype","toString","call","_isVNode","props","__props","slots","useSlots","attrs","useAttrs","tableRef","ref","tableFormRef","columns","isFormTable","formTableRules","emit","__emit","onMounted","nextTick","startSort","watch","initTable","onBeforeMount","value","forEach","col","required","rules","length","renderType","includes","config","loadOptions","getRules","options","sort","sortDom","$el","querySelector","Sortable","create","animation","handle","sortHandle","onEnd","oldIndex","newIndex","dynamicComponent","column","$index","row","_slot","event","prop","label","Component","resolveComponent","restConfig","renderChildComponent","map","item","_createVNode","_resolveComponent","default","_mergeProps","$event","isSelect","isFormCell","modelValue","updateModelValue","val","type","Number","component","renderForm","index","handleRule","defaultRule","message","trigger","filter","cell","render","form","children","tableFormValidate","Promise","resolve","validate","_slot2","rowKey","tableData","pageInfo","columnSlots","scope","slotName","renderColumn","show","cellConf","renderOperate","renderResult","needsValidation","isFragment","header","headerRender","headerSlotName","className","operate","op","disabled","withModifiers","onClick","key","pagination","handleSizeChange","e","handleCurrentChange","pageIndex","pageSize","layout","total","_Fragment","renderTable","_slot3","exportDataToExcel","fileName","exportToExcel","Date","now","updateColumns","newColumns","__expose","_hoisted_1","_openBlock","_createElementBlock","_createElementVNode","formData","formRules","formColumn","isOptionsComponent","initForm","formList","formParams","Array","isArray","initialData","fillFormData","undefined","handleLinkOptions","keys","hasLoadOptions","isAsyncOption","linkOptions","_linkedHandled","originOnChange","onChange","newOnChange","updateForm","find","some","notAutoLoadOptions","parentProp","parentValue","err","onUnmounted","formRef","getFormStyle","formStyle","gap","style","getGroupStyle","groupStyle","conf","formLayout","formItemSlots","renderFormItem","formProps","formItemClassName","labelWidth","labelClassName","promptConf","tooltipConf","size","color","Question","groupWrapClassName","groupWrapStyle","groupTitleClassName","groupTitleStyle","groupName","groupClassName","formValidate","_sfc_main","_normalizeStyle","_renderSlot","fileList","uploadFileList","fileObsUrl","upload","uploadFile","file","customUpload","fromData","FormData","append","data","uploadResourceApi","assets","fileUrl","onExceed","files","clearFiles","uid","genFileId","handleStart","uploadFiles","limit","raw","getFileList","defaultTrigger","triggerText","triggerRender","tip","uploadTips","auth.getUserConfig","auth.jumpToHome","_normalizeClass","_createCommentVNode","_toDisplayString"],"mappings":"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"}