qaz hai 19 horas
pai
achega
f15bbd7233

+ 3 - 1
.env.development

@@ -11,4 +11,6 @@ VITE_API_URL = 'http://192.168.100.179:8086'
 VITE_API_WX_URL='https://api.weixin.qq.com/'
 VITE_API_URL_MINLONG='http://117.185.80.170:7861'
 # 是否启用按钮权限
-VITE_PM_ENABLED = true
+VITE_PM_ENABLED = true
+# 阿里 iconfont 外链:留空或 VITE_ICONFONT_CDN_URLS= 表示不加载外网 CSS,仅用 main.ts 中本地 /@/assets/iconfont
+# VITE_ICONFONT_CDN_URLS=

+ 4 - 0
.env.production

@@ -12,3 +12,7 @@ VITE_API_URL_MINLONG='https://aiserver.qicai321.com'
 
 # 是否启用按钮权限
 VITE_PM_ENABLED = true
+
+# 阿里 iconfont:设为空则打包后不再请求 at.alicdn.com,仅用 main.ts 中本地 src/assets/iconfont
+# 若仍需外链补充图标,改为逗号分隔的完整 CSS 地址
+VITE_ICONFONT_CDN_URLS=

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
dist/assets/StatusCards.DtPwGmzy.css


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
dist/assets/index.BDd1dntk.css


+ 0 - 1
dist/assets/index.CRpjK02N.css

@@ -1 +0,0 @@
-.avatar-uploader .el-upload{border:1px dashed #d9d9d9;border-radius:6px;cursor:pointer;position:relative;overflow:hidden}.avatar-uploader .el-upload:hover{border-color:#409eff}.avatar-uploader-icon{font-size:28px;color:#8c939d;width:178px;height:178px;line-height:178px;text-align:center}.avatar{width:178px;height:178px;display:block}.device-code-input{padding:8px 12px;font-size:14px;border:1px solid #dcdfe6;border-radius:4px;outline:none;resize:vertical;transition:all .3s;font-family:Microsoft YaHei,sans-serif;line-height:1.5}.device-code-input:focus{border-color:#409eff;box-shadow:0 0 0 2px #409eff33}.device-code-input:disabled{background-color:#f5f7fa;cursor:not-allowed}

+ 0 - 1
dist/assets/index.Cdt3_Xys.css

@@ -1 +0,0 @@
-.header-bar[data-v-0fae40de]{display:flex;align-items:center;justify-content:center;gap:20px;margin:16px auto;width:-moz-fit-content;width:fit-content}.week-display[data-v-0fae40de]{font-size:16px;font-weight:700;padding:0 12px;min-width:80px;text-align:center}[data-v-0fae40de] .el-button.is-circle{width:36px;height:36px;padding:0}[data-v-0fae40de] .el-button .el-icon{font-size:18px}.schedule-table[data-v-0fae40de] .el-table__cell{padding-top:12px;padding-bottom:12px;font-size:14px}.schedule-table[data-v-0fae40de] .el-table__header .cell{font-size:15px}

+ 0 - 1
dist/assets/index.DOdMWO4v.css

@@ -1 +0,0 @@
-@charset "UTF-8";.icon-selector-popper{padding:0!important}.icon-selector-popper .icon-selector-warp{height:260px;overflow:hidden;position:relative}.icon-selector-popper .icon-selector-warp .icon-selector-warp-title{position:absolute;height:40px;line-height:40px;left:15px}.icon-selector-popper .icon-selector-warp .el-tabs__header{display:flex;justify-content:flex-end;padding:0 15px;border-bottom:1px solid var(--el-border-color-light);margin:0!important}.icon-selector-popper .icon-selector-warp .el-tabs__header .el-tabs__nav-wrap:after{height:0!important}.icon-selector-popper .icon-selector-warp .el-tabs__header .el-tabs__nav-wrap .el-tabs__item{padding:0 5px!important}.menu-form-com[data-v-c0a230ad]{margin:10px;overflow-y:auto}.menu-form-com .menu-form-alert[data-v-c0a230ad]{color:#fff;line-height:24px;padding:8px 16px;margin-bottom:20px;border-radius:4px;background-color:var(--el-color-primary)}.menu-form-com .menu-form-btns[data-v-c0a230ad]{padding-bottom:10px;box-sizing:border-box}

+ 0 - 1
dist/assets/index.IsRKbtUd.css

@@ -1 +0,0 @@
-.home-container[data-v-b1622538]{padding:20px;min-height:100vh;box-sizing:border-box}.home-row[data-v-b1622538]{margin-bottom:10px}@media (max-width: 768px){.home-row[data-v-b1622538],.home-row[data-v-b1622538] .el-col{margin-bottom:15px}}.home-col-table[data-v-b1622538]{display:flex;flex-wrap:wrap;gap:15px}@media (max-width: 576px){.home-container[data-v-b1622538]{padding:10px}.home-row[data-v-b1622538]{margin-bottom:10px}}@media (min-width: 577px) and (max-width: 768px){.home-container[data-v-b1622538]{padding:15px}}@media (min-width: 1920px){.home-container[data-v-b1622538]{max-width:1920px;margin:0 auto}}

+ 0 - 1
dist/assets/list.CbvnQeqe.css

@@ -1 +0,0 @@
-.icon-selector-warp-row[data-v-2e4b32ad]{height:230px;overflow:hidden}.icon-selector-warp-row .el-row[data-v-2e4b32ad]{padding:15px}.icon-selector-warp-row .el-scrollbar__bar.is-horizontal[data-v-2e4b32ad]{display:none}.icon-selector-warp-row .icon-selector-warp-item[data-v-2e4b32ad]{display:flex;justify-content:center;align-items:center;border:1px solid var(--el-border-color);border-radius:5px;margin-bottom:10px;height:30px}.icon-selector-warp-row .icon-selector-warp-item i[data-v-2e4b32ad]{font-size:20px;color:var(--el-text-color-regular)}.icon-selector-warp-row .icon-selector-warp-item[data-v-2e4b32ad]:hover{cursor:pointer;background-color:var(--el-color-primary-light-9);border:1px solid var(--el-color-primary-light-5)}.icon-selector-warp-row .icon-selector-warp-item:hover i[data-v-2e4b32ad]{color:var(--el-color-primary)}.icon-selector-warp-row .icon-selector-active[data-v-2e4b32ad]{background-color:var(--el-color-primary-light-9);border:1px solid var(--el-color-primary-light-5)}.icon-selector-warp-row .icon-selector-active i[data-v-2e4b32ad]{color:var(--el-color-primary)}

+ 2 - 2
dist/index.html

@@ -11,9 +11,9 @@
 		<link rel="icon" href="/assets/facivon.BnFzlJG6.ico" />
 		<title>设备借还系统</title>
 		<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css" rel="stylesheet">
-		<script type="module" crossorigin src="/assets/index.Bp0VaCKQ.js"></script>
+		<script type="module" crossorigin src="/assets/index.BBSvAdh_.js"></script>
 		<link rel="modulepreload" crossorigin href="/assets/vue.ClL-MbRM.js">
-		<link rel="stylesheet" crossorigin href="/assets/index.BZnPnkqX.css">
+		<link rel="stylesheet" crossorigin href="/assets/index.CoS9XZ9g.css">
 	</head>
 	<body>
     <div id="app"></div>


+ 1 - 1
dist/version-build

@@ -1 +1 @@
-3.0.4.1776076622887
+3.0.4.1776940461905

+ 24 - 0
docs/iconfont/sync.md

@@ -0,0 +1,24 @@
+# 本地 iconfont 与菜单图标对齐
+
+菜单里 `icon` 字段形如 `iconfont icon-xxx`,历史上由 **两套** 阿里 iconfont 项目叠加(先 2298093,再 3882322;同名类以 3882322 为准)。
+
+## 同步方式
+
+在项目根目录执行:
+
+```bash
+npm run iconfont:sync
+```
+
+脚本会:
+
+1. 拉取两套官方 CDN 的 CSS,合并类名与 `content`;
+2. 下载对应 `woff2` / `ttf` 到 `src/assets/iconfont/`;
+3. 重写 `iconfont.css`(双 `@font-face`,每条规则指定字体源)与 `iconfont.json`(供 `e-icon-picker`、图标选择器兜底列表)。
+
+内网无法访问 `at.alicdn.com` 时,需在能联网环境执行一次,将生成文件提交仓库。
+
+## 后续维护
+
+- 若在 iconfont.cn 增删图标:在 **两个项目分别更新** 或 **合并为一个项目** 后,改脚本中的 CDN 地址再执行 `iconfont:sync`。
+- 菜单里 `iconfont icon-icon-` 为数据侧非常规类名,与字体包中 `.icon-icon-` 一致;更稳妥的做法是在后台改成常规 `icon-` 前缀类名。

+ 1 - 0
package.json

@@ -4,6 +4,7 @@
   "description": "前端采用基于 vue3 + CompositionAPI + typescript + vite + element plus",
   "license": "MIT",
   "scripts": {
+    "iconfont:sync": "node scripts/merge-iconfont-from-cdn.mjs",
     "dev": "vite --force",
     "build": "vite build",
     "build:local": "vite build --mode local_prod",

+ 187 - 0
scripts/merge-iconfont-from-cdn.mjs

@@ -0,0 +1,187 @@
+/**
+ * 从两套 iconfont CDN CSS(与 setIconfont 历史配置一致)合并类名与 unicode,
+ * 生成 iconfont.json + 双字体 iconfont.css,并下载 woff2/ttf 到 src/assets/iconfont。
+ * 规则顺序:2298093 为基础,3882322 覆盖同名类(与页面先插 229 再插 388 时一致)。
+ *
+ * 使用:node scripts/merge-iconfont-from-cdn.mjs
+ */
+import fs from 'node:fs';
+import path from 'node:path';
+import https from 'node:https';
+import { fileURLToPath } from 'node:url';
+
+const __dirname = path.dirname(fileURLToPath(import.meta.url));
+const root = path.resolve(__dirname, '..');
+const outDir = path.join(root, 'src', 'assets', 'iconfont');
+
+const URL_229_CSS = 'https://at.alicdn.com/t/font_2298093_y6u00apwst.css';
+const URL_388_CSS = 'https://at.alicdn.com/t/c/font_3882322_9ah7y8m9175.css';
+
+const FONT_FILES = [
+	{ url: 'https://at.alicdn.com/t/font_2298093_y6u00apwst.woff2?t=1627014681704', name: 'font-2298093.woff2' },
+	{ url: 'https://at.alicdn.com/t/font_2298093_y6u00apwst.ttf?t=1627014681704', name: 'font-2298093.ttf' },
+	{ url: 'https://at.alicdn.com/t/c/font_3882322_9ah7y8m9175.woff2?t=1676037377315', name: 'font-3882322.woff2' },
+	{ url: 'https://at.alicdn.com/t/c/font_3882322_9ah7y8m9175.ttf?t=1676037377315', name: 'font-3882322.ttf' },
+];
+
+function fetchText(url) {
+	return new Promise((resolve, reject) => {
+		https
+			.get(url, (res) => {
+				if (res.statusCode === 301 || res.statusCode === 302) {
+					fetchText(res.headers.location).then(resolve).catch(reject);
+					return;
+				}
+				if (res.statusCode !== 200) {
+					reject(new Error(`GET ${url} ${res.statusCode}`));
+					return;
+				}
+				const chunks = [];
+				res.on('data', (c) => chunks.push(c));
+				res.on('end', () => resolve(Buffer.concat(chunks).toString('utf8')));
+			})
+			.on('error', reject);
+	});
+}
+
+function downloadFile(url, dest) {
+	return new Promise((resolve, reject) => {
+		const file = fs.createWriteStream(dest);
+		https
+			.get(url, (res) => {
+				if (res.statusCode === 301 || res.statusCode === 302) {
+					file.close();
+					fs.unlink(dest, () => {});
+					downloadFile(res.headers.location, dest).then(resolve).catch(reject);
+					return;
+				}
+				if (res.statusCode !== 200) {
+					file.close();
+					fs.unlink(dest, () => {});
+					reject(new Error(`GET ${url} ${res.statusCode}`));
+					return;
+				}
+				res.pipe(file);
+				file.on('finish', () => file.close(resolve));
+			})
+			.on('error', (e) => {
+				file.close();
+				fs.unlink(dest, () => {});
+				reject(e);
+			});
+	});
+}
+
+/** @returns {Map<string, string>} className (e.g. icon-foo) -> hex 如 e670(无反斜杠) */
+function parseIconRules(css) {
+	const map = new Map();
+	const re = /\.(icon-[a-zA-Z0-9_-]+):before\s*\{[^}]*?content:\s*"([^"]+)"/g;
+	let m;
+	while ((m = re.exec(css))) {
+		let hex = m[2].replace(/^\\+/, '');
+		map.set(m[1], hex);
+	}
+	return map;
+}
+
+/** 合并:388 覆盖 229 */
+function mergeMaps(base229, overlay388) {
+	const unicode = new Map(base229);
+	const source = new Map();
+	for (const k of base229.keys()) source.set(k, '2298093');
+	for (const [k, v] of overlay388) {
+		unicode.set(k, v);
+		source.set(k, '3882322');
+	}
+	return { unicode, source };
+}
+
+function buildCss({ unicode, source }) {
+	const lines = [
+		'/* 由 scripts/merge-iconfont-from-cdn.mjs 生成;双字体与历史双 CDN 叠加顺序一致(388 覆盖同名类) */',
+		'@font-face {',
+		'  font-family: "iconfont-2298093";',
+		"  src: url('./font-2298093.woff2') format('woff2'),",
+		"       url('./font-2298093.ttf') format('truetype');",
+		'}',
+		'@font-face {',
+		'  font-family: "iconfont-3882322";',
+		"  src: url('./font-3882322.woff2') format('woff2'),",
+		"       url('./font-3882322.ttf') format('truetype');",
+		'}',
+		'.iconfont {',
+		'  font-size: 16px;',
+		'  font-style: normal;',
+		'  -webkit-font-smoothing: antialiased;',
+		'  -moz-osx-font-smoothing: grayscale;',
+		'}',
+		'',
+	];
+	const sorted = [...unicode.entries()].sort((a, b) => a[0].localeCompare(b[0]));
+	for (const [cls, hex] of sorted) {
+		const fam = source.get(cls) === '3882322' ? 'iconfont-3882322' : 'iconfont-2298093';
+		const short = cls.replace(/^icon-/, '');
+		lines.push(`.${cls}:before {`);
+		lines.push(`  font-family: "${fam}" !important;`);
+		lines.push(`  content: "\\${hex}";`);
+		lines.push('}');
+		lines.push('');
+	}
+	return lines.join('\n');
+}
+
+function buildJson({ unicode, source }) {
+	const glyphs = [...unicode.entries()]
+		.sort((a, b) => a[0].localeCompare(b[0]))
+		.map(([cls, hex], idx) => {
+			const font_class = cls.replace(/^icon-/, '');
+			const dec = parseInt(hex, 16);
+			return {
+				icon_id: String(100000 + idx),
+				name: font_class,
+				font_class,
+				unicode: hex,
+				unicode_decimal: dec,
+				_source_project: source.get(cls),
+			};
+		});
+	// e-icon-picker / 后端若校验字段,去掉非标准字段
+	for (const g of glyphs) delete g._source_project;
+
+	return {
+		id: 'merged-2298093-3882322',
+		name: 'dvadmin3-merged',
+		font_family: 'iconfont',
+		css_prefix_text: 'icon-',
+		description: '合并自 iconfont 项目 2298093 + 3882322,与菜单 icon 字段一致',
+		glyphs,
+	};
+}
+
+async function main() {
+	fs.mkdirSync(outDir, { recursive: true });
+	console.log('Fetching CSS…');
+	const [css229, css388] = await Promise.all([fetchText(URL_229_CSS), fetchText(URL_388_CSS)]);
+	const map229 = parseIconRules(css229);
+	const map388 = parseIconRules(css388);
+	const merged = mergeMaps(map229, map388);
+	console.log(`Icons: 2298093=${map229.size}, 3882322=${map388.size}, merged=${merged.unicode.size}`);
+
+	console.log('Downloading font files…');
+	for (const f of FONT_FILES) {
+		const dest = path.join(outDir, f.name);
+		await downloadFile(f.url, dest);
+		console.log('  saved', f.name);
+	}
+
+	const cssOut = buildCss(merged);
+	const jsonOut = buildJson(merged);
+	fs.writeFileSync(path.join(outDir, 'iconfont.css'), cssOut, 'utf8');
+	fs.writeFileSync(path.join(outDir, 'iconfont.json'), JSON.stringify(jsonOut, null, 2), 'utf8');
+	console.log('Wrote iconfont.css, iconfont.json');
+}
+
+main().catch((e) => {
+	console.error(e);
+	process.exit(1);
+});

BIN=BIN
src/assets/iconfont/font-2298093.ttf


BIN=BIN
src/assets/iconfont/font-2298093.woff2


BIN=BIN
dist/assets/iconfont.CV5FmyBR.ttf → src/assets/iconfont/font-3882322.ttf


BIN=BIN
src/assets/iconfont/font-3882322.woff2


+ 540 - 18
src/assets/iconfont/iconfont.css

@@ -1,55 +1,577 @@
+/* 由 scripts/merge-iconfont-from-cdn.mjs 生成;双字体与历史双 CDN 叠加顺序一致(388 覆盖同名类) */
 @font-face {
-  font-family: "iconfont"; /* Project id 3882322 */
-  src: url('iconfont.woff2?t=1676892176164') format('woff2'),
-       url('iconfont.woff?t=1676892176164') format('woff'),
-       url('iconfont.ttf?t=1676892176164') format('truetype');
+  font-family: "iconfont-2298093";
+  src: url('./font-2298093.woff2') format('woff2'),
+       url('./font-2298093.ttf') format('truetype');
+}
+@font-face {
+  font-family: "iconfont-3882322";
+  src: url('./font-3882322.woff2') format('woff2'),
+       url('./font-3882322.ttf') format('truetype');
 }
-
 .iconfont {
-  font-family: "iconfont" !important;
   font-size: 16px;
   font-style: normal;
   -webkit-font-smoothing: antialiased;
   -moz-osx-font-smoothing: grayscale;
 }
 
-.icon-xiaoxizhongxin:before {
-  content: "\e665";
+.icon--chaifenhang:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e6d1";
 }
 
-.icon-xitongshezhi:before {
-  content: "\e7ba";
+.icon--chaifenlie:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e6d0";
+}
+
+.icon-0_round_solid:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e655";
+}
+
+.icon-1_round_solid:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e650";
+}
+
+.icon-15tupianyulan:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e624";
+}
+
+.icon-2_round_solid:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e654";
+}
+
+.icon-3_round_solid:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e656";
+}
+
+.icon-30xuanzhongyuanxingfill:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e677";
+}
+
+.icon-4_round_solid:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e657";
+}
+
+.icon-5_round_solid:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e651";
+}
+
+.icon-6_round_solid:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e64e";
+}
+
+.icon-7_round_solid:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e64d";
+}
+
+.icon-728bianjiqi_zitidaxiao:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e660";
+}
+
+.icon-8_round_solid:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e658";
+}
+
+.icon-9_round_solid:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e64f";
+}
+
+.icon-AIshiyanshi:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e609";
+}
+
+.icon-Area:before {
+  font-family: "iconfont-3882322" !important;
+  content: "\eaa2";
+}
+
+.icon-barcode-qr:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e61e";
+}
+
+.icon-biaodan:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e61d";
+}
+
+.icon-bolangneng:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e745";
+}
+
+.icon-bolangnengshiyanchang:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e746";
+}
+
+.icon-caidan:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e652";
+}
+
+.icon-caijian:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e611";
+}
+
+.icon-caozuo-wailian:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e711";
 }
 
 .icon-caozuorizhi:before {
+  font-family: "iconfont-3882322" !important;
   content: "\e611";
 }
 
+.icon-chazhaobiaodanliebiao:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e76a";
+}
+
+.icon-configure:before {
+  font-family: "iconfont-3882322" !important;
+  content: "\e733";
+}
+
+.icon-crew_feature:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e602";
+}
+
+.icon-dayin:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e612";
+}
+
+.icon-dian:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e608";
+}
+
+.icon-dianhua:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e615";
+}
+
+.icon-diannao:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e618";
+}
+
+.icon-diannao-shuju:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e63e";
+}
+
+.icon-diannao1:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e622";
+}
+
+.icon-diannao101:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e670";
+}
+
+.icon-diannaobangong:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e647";
+}
+
+.icon-dict:before {
+  font-family: "iconfont-3882322" !important;
+  content: "\e626";
+}
+
+.icon-diqiu:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e689";
+}
+
+.icon-diqiu1:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e631";
+}
+
+.icon-ditu:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e8bc";
+}
+
+.icon-dongtai:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e659";
+}
+
+.icon-fangkuang:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e642";
+}
+
+.icon-file:before {
+  font-family: "iconfont-3882322" !important;
+  content: "\e671";
+}
+
+.icon-font-size:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\eaef";
+}
+
+.icon-fuhao-yingwen:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e714";
+}
+
+.icon-fuhao-zhongwen:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e712";
+}
+
+.icon-fullscreen:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e623";
+}
+
+.icon-fuwenben:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e7e4";
+}
+
+.icon-fuwenbenkuang:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e66f";
+}
+
+.icon-fuzhiyemian:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e772";
+}
+
+.icon-gerenzhongxin:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e60d";
+}
+
+.icon-gongju:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e62d";
+}
+
+.icon-gouxuan-weixuanzhong-xianxingfangkuang:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e77b";
+}
+
 .icon-guanlidenglurizhi:before {
+  font-family: "iconfont-3882322" !important;
   content: "\ea45";
 }
 
+.icon-huanjingxingqiu:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e617";
+}
+
+.icon-ico:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e646";
+}
+
+.icon-ico_shuju:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e6ff";
+}
+
+.icon-icon-:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e620";
+}
+
+.icon-jiliandongxuanzeqi:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e616";
+}
+
+.icon-jinridaiban:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e60f";
+}
+
+.icon-juxingkaobei:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e7a5";
+}
+
+.icon-LoggedinPC:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e604";
+}
+
+.icon-neiqianshujuchucun:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e62f";
+}
+
+.icon-putong:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e603";
+}
+
+.icon-quanxian:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e610";
+}
+
+.icon-radio-off-full:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\ea6b";
+}
+
 .icon-rizhi:before {
+  font-family: "iconfont-3882322" !important;
   content: "\e60c";
 }
 
+.icon-shangchuan:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e663";
+}
+
+.icon-shenqingkaiban:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e639";
+}
+
+.icon-shibai:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e60b";
+}
+
+.icon-shidu:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e60a";
+}
+
+.icon-shixinyuan:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e669";
+}
+
+.icon-shoujidiannao:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e62e";
+}
+
+.icon-shouye:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e653";
+}
+
+.icon-shouye_dongtaihui:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e606";
+}
+
+.icon-shuju:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e613";
+}
+
+.icon-shuju1:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e60e";
+}
+
+.icon-shuxing:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e67a";
+}
+
+.icon-shuxingtu:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e685";
+}
+
+.icon-siweidaotu:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e614";
+}
+
+.icon-skin:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e636";
+}
+
+.icon-step:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e601";
+}
+
 .icon-system:before {
+  font-family: "iconfont-3882322" !important;
   content: "\e684";
 }
 
-.icon-Area:before {
-  content: "\eaa2";
+.icon-tongzhi:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e600";
 }
 
-.icon-file:before {
-  content: "\e671";
+.icon-tongzhi1:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e63a";
 }
 
-.icon-dict:before {
-  content: "\e626";
+.icon-tongzhi2:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e649";
 }
 
-.icon-configure:before {
-  content: "\e733";
+.icon-tongzhi3:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e648";
+}
+
+.icon-tongzhi4:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e60c";
+}
+
+.icon-tuichuquanping:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e641";
+}
+
+.icon-tuodong:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e6a8";
+}
+
+.icon-tupianyulan:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e67e";
+}
+
+.icon-webicon318:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e6a9";
+}
+
+.icon-wendu:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e686";
+}
+
+.icon-wenducanshu-05:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e634";
+}
+
+.icon-xianshimima:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e63c";
+}
+
+.icon-xiaoxizhongxin:before {
+  font-family: "iconfont-3882322" !important;
+  content: "\e665";
+}
+
+.icon-xingqiu:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e65c";
+}
+
+.icon-xitongshezhi:before {
+  font-family: "iconfont-3882322" !important;
+  content: "\e7ba";
+}
+
+.icon-xuanzeqi:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e635";
+}
+
+.icon-yangan:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e67d";
+}
+
+.icon-yincangmima:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e63d";
+}
+
+.icon-zaosheng:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e61c";
+}
+
+.icon-zhongduancanshu:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e63b";
+}
+
+.icon-zhongduancanshuchaxun:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e638";
+}
+
+.icon-zhongyingwen:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e605";
 }
 
+.icon-zhongyingwen1:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e7a3";
+}
+
+.icon-zhongyingwenqiehuan:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e611";
+}
+
+.icon-zhongyingwenyuyan:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e609";
+}
+
+.icon-zhongyingzhuanhuan:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e6a2";
+}
+
+.icon-zidingyibuju:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e637";
+}
+
+.icon-ziti:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e7b1";
+}
+
+.icon-zujian:before {
+  font-family: "iconfont-2298093" !important;
+  content: "\e85e";
+}

+ 755 - 41
src/assets/iconfont/iconfont.json

@@ -1,79 +1,793 @@
 {
-  "id": "3882322",
-  "name": "dvadmin3",
+  "id": "merged-2298093-3882322",
+  "name": "dvadmin3-merged",
   "font_family": "iconfont",
   "css_prefix_text": "icon-",
-  "description": "dvadmin3前端项目icon",
+  "description": "合并自 iconfont 项目 2298093 + 3882322,与菜单 icon 字段一致",
   "glyphs": [
     {
-      "icon_id": "630252",
-      "name": "消息中心",
-      "font_class": "xiaoxizhongxin",
-      "unicode": "e665",
-      "unicode_decimal": 58981
+      "icon_id": "100000",
+      "name": "-chaifenhang",
+      "font_class": "-chaifenhang",
+      "unicode": "e6d1",
+      "unicode_decimal": 59089
     },
     {
-      "icon_id": "10465939",
-      "name": "系统设置",
-      "font_class": "xitongshezhi",
-      "unicode": "e7ba",
-      "unicode_decimal": 59322
+      "icon_id": "100001",
+      "name": "-chaifenlie",
+      "font_class": "-chaifenlie",
+      "unicode": "e6d0",
+      "unicode_decimal": 59088
+    },
+    {
+      "icon_id": "100002",
+      "name": "0_round_solid",
+      "font_class": "0_round_solid",
+      "unicode": "e655",
+      "unicode_decimal": 58965
+    },
+    {
+      "icon_id": "100003",
+      "name": "1_round_solid",
+      "font_class": "1_round_solid",
+      "unicode": "e650",
+      "unicode_decimal": 58960
+    },
+    {
+      "icon_id": "100004",
+      "name": "15tupianyulan",
+      "font_class": "15tupianyulan",
+      "unicode": "e624",
+      "unicode_decimal": 58916
+    },
+    {
+      "icon_id": "100005",
+      "name": "2_round_solid",
+      "font_class": "2_round_solid",
+      "unicode": "e654",
+      "unicode_decimal": 58964
+    },
+    {
+      "icon_id": "100006",
+      "name": "3_round_solid",
+      "font_class": "3_round_solid",
+      "unicode": "e656",
+      "unicode_decimal": 58966
+    },
+    {
+      "icon_id": "100007",
+      "name": "30xuanzhongyuanxingfill",
+      "font_class": "30xuanzhongyuanxingfill",
+      "unicode": "e677",
+      "unicode_decimal": 58999
+    },
+    {
+      "icon_id": "100008",
+      "name": "4_round_solid",
+      "font_class": "4_round_solid",
+      "unicode": "e657",
+      "unicode_decimal": 58967
+    },
+    {
+      "icon_id": "100009",
+      "name": "5_round_solid",
+      "font_class": "5_round_solid",
+      "unicode": "e651",
+      "unicode_decimal": 58961
+    },
+    {
+      "icon_id": "100010",
+      "name": "6_round_solid",
+      "font_class": "6_round_solid",
+      "unicode": "e64e",
+      "unicode_decimal": 58958
+    },
+    {
+      "icon_id": "100011",
+      "name": "7_round_solid",
+      "font_class": "7_round_solid",
+      "unicode": "e64d",
+      "unicode_decimal": 58957
+    },
+    {
+      "icon_id": "100012",
+      "name": "728bianjiqi_zitidaxiao",
+      "font_class": "728bianjiqi_zitidaxiao",
+      "unicode": "e660",
+      "unicode_decimal": 58976
+    },
+    {
+      "icon_id": "100013",
+      "name": "8_round_solid",
+      "font_class": "8_round_solid",
+      "unicode": "e658",
+      "unicode_decimal": 58968
+    },
+    {
+      "icon_id": "100014",
+      "name": "9_round_solid",
+      "font_class": "9_round_solid",
+      "unicode": "e64f",
+      "unicode_decimal": 58959
     },
     {
-      "icon_id": "13952258",
-      "name": "操作日志",
+      "icon_id": "100015",
+      "name": "AIshiyanshi",
+      "font_class": "AIshiyanshi",
+      "unicode": "e609",
+      "unicode_decimal": 58889
+    },
+    {
+      "icon_id": "100016",
+      "name": "Area",
+      "font_class": "Area",
+      "unicode": "eaa2",
+      "unicode_decimal": 60066
+    },
+    {
+      "icon_id": "100017",
+      "name": "barcode-qr",
+      "font_class": "barcode-qr",
+      "unicode": "e61e",
+      "unicode_decimal": 58910
+    },
+    {
+      "icon_id": "100018",
+      "name": "biaodan",
+      "font_class": "biaodan",
+      "unicode": "e61d",
+      "unicode_decimal": 58909
+    },
+    {
+      "icon_id": "100019",
+      "name": "bolangneng",
+      "font_class": "bolangneng",
+      "unicode": "e745",
+      "unicode_decimal": 59205
+    },
+    {
+      "icon_id": "100020",
+      "name": "bolangnengshiyanchang",
+      "font_class": "bolangnengshiyanchang",
+      "unicode": "e746",
+      "unicode_decimal": 59206
+    },
+    {
+      "icon_id": "100021",
+      "name": "caidan",
+      "font_class": "caidan",
+      "unicode": "e652",
+      "unicode_decimal": 58962
+    },
+    {
+      "icon_id": "100022",
+      "name": "caijian",
+      "font_class": "caijian",
+      "unicode": "e611",
+      "unicode_decimal": 58897
+    },
+    {
+      "icon_id": "100023",
+      "name": "caozuo-wailian",
+      "font_class": "caozuo-wailian",
+      "unicode": "e711",
+      "unicode_decimal": 59153
+    },
+    {
+      "icon_id": "100024",
+      "name": "caozuorizhi",
       "font_class": "caozuorizhi",
       "unicode": "e611",
       "unicode_decimal": 58897
     },
     {
-      "icon_id": "26876046",
-      "name": "管理登录日志",
+      "icon_id": "100025",
+      "name": "chazhaobiaodanliebiao",
+      "font_class": "chazhaobiaodanliebiao",
+      "unicode": "e76a",
+      "unicode_decimal": 59242
+    },
+    {
+      "icon_id": "100026",
+      "name": "configure",
+      "font_class": "configure",
+      "unicode": "e733",
+      "unicode_decimal": 59187
+    },
+    {
+      "icon_id": "100027",
+      "name": "crew_feature",
+      "font_class": "crew_feature",
+      "unicode": "e602",
+      "unicode_decimal": 58882
+    },
+    {
+      "icon_id": "100028",
+      "name": "dayin",
+      "font_class": "dayin",
+      "unicode": "e612",
+      "unicode_decimal": 58898
+    },
+    {
+      "icon_id": "100029",
+      "name": "dian",
+      "font_class": "dian",
+      "unicode": "e608",
+      "unicode_decimal": 58888
+    },
+    {
+      "icon_id": "100030",
+      "name": "dianhua",
+      "font_class": "dianhua",
+      "unicode": "e615",
+      "unicode_decimal": 58901
+    },
+    {
+      "icon_id": "100031",
+      "name": "diannao",
+      "font_class": "diannao",
+      "unicode": "e618",
+      "unicode_decimal": 58904
+    },
+    {
+      "icon_id": "100032",
+      "name": "diannao-shuju",
+      "font_class": "diannao-shuju",
+      "unicode": "e63e",
+      "unicode_decimal": 58942
+    },
+    {
+      "icon_id": "100033",
+      "name": "diannao1",
+      "font_class": "diannao1",
+      "unicode": "e622",
+      "unicode_decimal": 58914
+    },
+    {
+      "icon_id": "100034",
+      "name": "diannao101",
+      "font_class": "diannao101",
+      "unicode": "e670",
+      "unicode_decimal": 58992
+    },
+    {
+      "icon_id": "100035",
+      "name": "diannaobangong",
+      "font_class": "diannaobangong",
+      "unicode": "e647",
+      "unicode_decimal": 58951
+    },
+    {
+      "icon_id": "100036",
+      "name": "dict",
+      "font_class": "dict",
+      "unicode": "e626",
+      "unicode_decimal": 58918
+    },
+    {
+      "icon_id": "100037",
+      "name": "diqiu",
+      "font_class": "diqiu",
+      "unicode": "e689",
+      "unicode_decimal": 59017
+    },
+    {
+      "icon_id": "100038",
+      "name": "diqiu1",
+      "font_class": "diqiu1",
+      "unicode": "e631",
+      "unicode_decimal": 58929
+    },
+    {
+      "icon_id": "100039",
+      "name": "ditu",
+      "font_class": "ditu",
+      "unicode": "e8bc",
+      "unicode_decimal": 59580
+    },
+    {
+      "icon_id": "100040",
+      "name": "dongtai",
+      "font_class": "dongtai",
+      "unicode": "e659",
+      "unicode_decimal": 58969
+    },
+    {
+      "icon_id": "100041",
+      "name": "fangkuang",
+      "font_class": "fangkuang",
+      "unicode": "e642",
+      "unicode_decimal": 58946
+    },
+    {
+      "icon_id": "100042",
+      "name": "file",
+      "font_class": "file",
+      "unicode": "e671",
+      "unicode_decimal": 58993
+    },
+    {
+      "icon_id": "100043",
+      "name": "font-size",
+      "font_class": "font-size",
+      "unicode": "eaef",
+      "unicode_decimal": 60143
+    },
+    {
+      "icon_id": "100044",
+      "name": "fuhao-yingwen",
+      "font_class": "fuhao-yingwen",
+      "unicode": "e714",
+      "unicode_decimal": 59156
+    },
+    {
+      "icon_id": "100045",
+      "name": "fuhao-zhongwen",
+      "font_class": "fuhao-zhongwen",
+      "unicode": "e712",
+      "unicode_decimal": 59154
+    },
+    {
+      "icon_id": "100046",
+      "name": "fullscreen",
+      "font_class": "fullscreen",
+      "unicode": "e623",
+      "unicode_decimal": 58915
+    },
+    {
+      "icon_id": "100047",
+      "name": "fuwenben",
+      "font_class": "fuwenben",
+      "unicode": "e7e4",
+      "unicode_decimal": 59364
+    },
+    {
+      "icon_id": "100048",
+      "name": "fuwenbenkuang",
+      "font_class": "fuwenbenkuang",
+      "unicode": "e66f",
+      "unicode_decimal": 58991
+    },
+    {
+      "icon_id": "100049",
+      "name": "fuzhiyemian",
+      "font_class": "fuzhiyemian",
+      "unicode": "e772",
+      "unicode_decimal": 59250
+    },
+    {
+      "icon_id": "100050",
+      "name": "gerenzhongxin",
+      "font_class": "gerenzhongxin",
+      "unicode": "e60d",
+      "unicode_decimal": 58893
+    },
+    {
+      "icon_id": "100051",
+      "name": "gongju",
+      "font_class": "gongju",
+      "unicode": "e62d",
+      "unicode_decimal": 58925
+    },
+    {
+      "icon_id": "100052",
+      "name": "gouxuan-weixuanzhong-xianxingfangkuang",
+      "font_class": "gouxuan-weixuanzhong-xianxingfangkuang",
+      "unicode": "e77b",
+      "unicode_decimal": 59259
+    },
+    {
+      "icon_id": "100053",
+      "name": "guanlidenglurizhi",
       "font_class": "guanlidenglurizhi",
       "unicode": "ea45",
       "unicode_decimal": 59973
     },
     {
-      "icon_id": "4520330",
-      "name": "日志",
+      "icon_id": "100054",
+      "name": "huanjingxingqiu",
+      "font_class": "huanjingxingqiu",
+      "unicode": "e617",
+      "unicode_decimal": 58903
+    },
+    {
+      "icon_id": "100055",
+      "name": "ico",
+      "font_class": "ico",
+      "unicode": "e646",
+      "unicode_decimal": 58950
+    },
+    {
+      "icon_id": "100056",
+      "name": "ico_shuju",
+      "font_class": "ico_shuju",
+      "unicode": "e6ff",
+      "unicode_decimal": 59135
+    },
+    {
+      "icon_id": "100057",
+      "name": "icon-",
+      "font_class": "icon-",
+      "unicode": "e620",
+      "unicode_decimal": 58912
+    },
+    {
+      "icon_id": "100058",
+      "name": "jiliandongxuanzeqi",
+      "font_class": "jiliandongxuanzeqi",
+      "unicode": "e616",
+      "unicode_decimal": 58902
+    },
+    {
+      "icon_id": "100059",
+      "name": "jinridaiban",
+      "font_class": "jinridaiban",
+      "unicode": "e60f",
+      "unicode_decimal": 58895
+    },
+    {
+      "icon_id": "100060",
+      "name": "juxingkaobei",
+      "font_class": "juxingkaobei",
+      "unicode": "e7a5",
+      "unicode_decimal": 59301
+    },
+    {
+      "icon_id": "100061",
+      "name": "LoggedinPC",
+      "font_class": "LoggedinPC",
+      "unicode": "e604",
+      "unicode_decimal": 58884
+    },
+    {
+      "icon_id": "100062",
+      "name": "neiqianshujuchucun",
+      "font_class": "neiqianshujuchucun",
+      "unicode": "e62f",
+      "unicode_decimal": 58927
+    },
+    {
+      "icon_id": "100063",
+      "name": "putong",
+      "font_class": "putong",
+      "unicode": "e603",
+      "unicode_decimal": 58883
+    },
+    {
+      "icon_id": "100064",
+      "name": "quanxian",
+      "font_class": "quanxian",
+      "unicode": "e610",
+      "unicode_decimal": 58896
+    },
+    {
+      "icon_id": "100065",
+      "name": "radio-off-full",
+      "font_class": "radio-off-full",
+      "unicode": "ea6b",
+      "unicode_decimal": 60011
+    },
+    {
+      "icon_id": "100066",
+      "name": "rizhi",
       "font_class": "rizhi",
       "unicode": "e60c",
       "unicode_decimal": 58892
     },
     {
-      "icon_id": "11686866",
+      "icon_id": "100067",
+      "name": "shangchuan",
+      "font_class": "shangchuan",
+      "unicode": "e663",
+      "unicode_decimal": 58979
+    },
+    {
+      "icon_id": "100068",
+      "name": "shenqingkaiban",
+      "font_class": "shenqingkaiban",
+      "unicode": "e639",
+      "unicode_decimal": 58937
+    },
+    {
+      "icon_id": "100069",
+      "name": "shibai",
+      "font_class": "shibai",
+      "unicode": "e60b",
+      "unicode_decimal": 58891
+    },
+    {
+      "icon_id": "100070",
+      "name": "shidu",
+      "font_class": "shidu",
+      "unicode": "e60a",
+      "unicode_decimal": 58890
+    },
+    {
+      "icon_id": "100071",
+      "name": "shixinyuan",
+      "font_class": "shixinyuan",
+      "unicode": "e669",
+      "unicode_decimal": 58985
+    },
+    {
+      "icon_id": "100072",
+      "name": "shoujidiannao",
+      "font_class": "shoujidiannao",
+      "unicode": "e62e",
+      "unicode_decimal": 58926
+    },
+    {
+      "icon_id": "100073",
+      "name": "shouye",
+      "font_class": "shouye",
+      "unicode": "e653",
+      "unicode_decimal": 58963
+    },
+    {
+      "icon_id": "100074",
+      "name": "shouye_dongtaihui",
+      "font_class": "shouye_dongtaihui",
+      "unicode": "e606",
+      "unicode_decimal": 58886
+    },
+    {
+      "icon_id": "100075",
+      "name": "shuju",
+      "font_class": "shuju",
+      "unicode": "e613",
+      "unicode_decimal": 58899
+    },
+    {
+      "icon_id": "100076",
+      "name": "shuju1",
+      "font_class": "shuju1",
+      "unicode": "e60e",
+      "unicode_decimal": 58894
+    },
+    {
+      "icon_id": "100077",
+      "name": "shuxing",
+      "font_class": "shuxing",
+      "unicode": "e67a",
+      "unicode_decimal": 59002
+    },
+    {
+      "icon_id": "100078",
+      "name": "shuxingtu",
+      "font_class": "shuxingtu",
+      "unicode": "e685",
+      "unicode_decimal": 59013
+    },
+    {
+      "icon_id": "100079",
+      "name": "siweidaotu",
+      "font_class": "siweidaotu",
+      "unicode": "e614",
+      "unicode_decimal": 58900
+    },
+    {
+      "icon_id": "100080",
+      "name": "skin",
+      "font_class": "skin",
+      "unicode": "e636",
+      "unicode_decimal": 58934
+    },
+    {
+      "icon_id": "100081",
+      "name": "step",
+      "font_class": "step",
+      "unicode": "e601",
+      "unicode_decimal": 58881
+    },
+    {
+      "icon_id": "100082",
       "name": "system",
       "font_class": "system",
       "unicode": "e684",
       "unicode_decimal": 59012
     },
     {
-      "icon_id": "12004865",
-      "name": "Area",
-      "font_class": "Area",
-      "unicode": "eaa2",
-      "unicode_decimal": 60066
+      "icon_id": "100083",
+      "name": "tongzhi",
+      "font_class": "tongzhi",
+      "unicode": "e600",
+      "unicode_decimal": 58880
     },
     {
-      "icon_id": "15838480",
-      "name": "file",
-      "font_class": "file",
-      "unicode": "e671",
-      "unicode_decimal": 58993
+      "icon_id": "100084",
+      "name": "tongzhi1",
+      "font_class": "tongzhi1",
+      "unicode": "e63a",
+      "unicode_decimal": 58938
     },
     {
-      "icon_id": "16880980",
-      "name": "dict",
-      "font_class": "dict",
-      "unicode": "e626",
-      "unicode_decimal": 58918
+      "icon_id": "100085",
+      "name": "tongzhi2",
+      "font_class": "tongzhi2",
+      "unicode": "e649",
+      "unicode_decimal": 58953
     },
     {
-      "icon_id": "32434794",
-      "name": "configure",
-      "font_class": "configure",
-      "unicode": "e733",
-      "unicode_decimal": 59187
+      "icon_id": "100086",
+      "name": "tongzhi3",
+      "font_class": "tongzhi3",
+      "unicode": "e648",
+      "unicode_decimal": 58952
+    },
+    {
+      "icon_id": "100087",
+      "name": "tongzhi4",
+      "font_class": "tongzhi4",
+      "unicode": "e60c",
+      "unicode_decimal": 58892
+    },
+    {
+      "icon_id": "100088",
+      "name": "tuichuquanping",
+      "font_class": "tuichuquanping",
+      "unicode": "e641",
+      "unicode_decimal": 58945
+    },
+    {
+      "icon_id": "100089",
+      "name": "tuodong",
+      "font_class": "tuodong",
+      "unicode": "e6a8",
+      "unicode_decimal": 59048
+    },
+    {
+      "icon_id": "100090",
+      "name": "tupianyulan",
+      "font_class": "tupianyulan",
+      "unicode": "e67e",
+      "unicode_decimal": 59006
+    },
+    {
+      "icon_id": "100091",
+      "name": "webicon318",
+      "font_class": "webicon318",
+      "unicode": "e6a9",
+      "unicode_decimal": 59049
+    },
+    {
+      "icon_id": "100092",
+      "name": "wendu",
+      "font_class": "wendu",
+      "unicode": "e686",
+      "unicode_decimal": 59014
+    },
+    {
+      "icon_id": "100093",
+      "name": "wenducanshu-05",
+      "font_class": "wenducanshu-05",
+      "unicode": "e634",
+      "unicode_decimal": 58932
+    },
+    {
+      "icon_id": "100094",
+      "name": "xianshimima",
+      "font_class": "xianshimima",
+      "unicode": "e63c",
+      "unicode_decimal": 58940
+    },
+    {
+      "icon_id": "100095",
+      "name": "xiaoxizhongxin",
+      "font_class": "xiaoxizhongxin",
+      "unicode": "e665",
+      "unicode_decimal": 58981
+    },
+    {
+      "icon_id": "100096",
+      "name": "xingqiu",
+      "font_class": "xingqiu",
+      "unicode": "e65c",
+      "unicode_decimal": 58972
+    },
+    {
+      "icon_id": "100097",
+      "name": "xitongshezhi",
+      "font_class": "xitongshezhi",
+      "unicode": "e7ba",
+      "unicode_decimal": 59322
+    },
+    {
+      "icon_id": "100098",
+      "name": "xuanzeqi",
+      "font_class": "xuanzeqi",
+      "unicode": "e635",
+      "unicode_decimal": 58933
+    },
+    {
+      "icon_id": "100099",
+      "name": "yangan",
+      "font_class": "yangan",
+      "unicode": "e67d",
+      "unicode_decimal": 59005
+    },
+    {
+      "icon_id": "100100",
+      "name": "yincangmima",
+      "font_class": "yincangmima",
+      "unicode": "e63d",
+      "unicode_decimal": 58941
+    },
+    {
+      "icon_id": "100101",
+      "name": "zaosheng",
+      "font_class": "zaosheng",
+      "unicode": "e61c",
+      "unicode_decimal": 58908
+    },
+    {
+      "icon_id": "100102",
+      "name": "zhongduancanshu",
+      "font_class": "zhongduancanshu",
+      "unicode": "e63b",
+      "unicode_decimal": 58939
+    },
+    {
+      "icon_id": "100103",
+      "name": "zhongduancanshuchaxun",
+      "font_class": "zhongduancanshuchaxun",
+      "unicode": "e638",
+      "unicode_decimal": 58936
+    },
+    {
+      "icon_id": "100104",
+      "name": "zhongyingwen",
+      "font_class": "zhongyingwen",
+      "unicode": "e605",
+      "unicode_decimal": 58885
+    },
+    {
+      "icon_id": "100105",
+      "name": "zhongyingwen1",
+      "font_class": "zhongyingwen1",
+      "unicode": "e7a3",
+      "unicode_decimal": 59299
+    },
+    {
+      "icon_id": "100106",
+      "name": "zhongyingwenqiehuan",
+      "font_class": "zhongyingwenqiehuan",
+      "unicode": "e611",
+      "unicode_decimal": 58897
+    },
+    {
+      "icon_id": "100107",
+      "name": "zhongyingwenyuyan",
+      "font_class": "zhongyingwenyuyan",
+      "unicode": "e609",
+      "unicode_decimal": 58889
+    },
+    {
+      "icon_id": "100108",
+      "name": "zhongyingzhuanhuan",
+      "font_class": "zhongyingzhuanhuan",
+      "unicode": "e6a2",
+      "unicode_decimal": 59042
+    },
+    {
+      "icon_id": "100109",
+      "name": "zidingyibuju",
+      "font_class": "zidingyibuju",
+      "unicode": "e637",
+      "unicode_decimal": 58935
+    },
+    {
+      "icon_id": "100110",
+      "name": "ziti",
+      "font_class": "ziti",
+      "unicode": "e7b1",
+      "unicode_decimal": 59313
+    },
+    {
+      "icon_id": "100111",
+      "name": "zujian",
+      "font_class": "zujian",
+      "unicode": "e85e",
+      "unicode_decimal": 59486
     }
   ]
-}
+}

+ 49 - 16
src/utils/getStyleSheets.ts

@@ -1,29 +1,62 @@
 import { nextTick } from 'vue';
 import * as svg from '@element-plus/icons-vue';
 
-// 获取阿里字体图标
+function isIconfontStylesheetHref(href: string): boolean {
+	if (!href) return false;
+	const h = href.toLowerCase();
+	return h.includes('at.alicdn.com') || h.includes('iconfont.css') || h.includes('/iconfont/') || h.includes('\\iconfont\\');
+}
+
+async function iconClassListFromLocalIconfontJson(): Promise<string[]> {
+	const mod: { default?: { css_prefix_text?: string; glyphs?: { font_class: string }[] }; css_prefix_text?: string; glyphs?: { font_class: string }[] } =
+		await import('/@/assets/iconfont/iconfont.json');
+	const data = mod.default ?? mod;
+	const prefix = data.css_prefix_text ?? 'icon-';
+	const glyphs = data.glyphs ?? [];
+	return glyphs.map((g) => `${prefix}${g.font_class}`);
+}
+
+// 获取阿里字体图标(CDN 或本地打包的 iconfont.css;解析失败时用 iconfont.json 兜底,便于纯内网)
 const getAlicdnIconfont = () => {
-	return new Promise((resolve, reject) => {
-		nextTick(() => {
-			const styles: any = document.styleSheets;
-			let sheetsList = [];
-			let sheetsIconList = [];
+	return new Promise<string[]>((resolve, reject) => {
+		nextTick(async () => {
+			const styles = document.styleSheets as unknown as CSSStyleSheet[];
+			const sheetsList: CSSStyleSheet[] = [];
 			for (let i = 0; i < styles.length; i++) {
-				if (styles[i].href && styles[i].href.indexOf('at.alicdn.com') > -1) {
-					sheetsList.push(styles[i]);
-				}
+				const sheet = styles[i];
+				const href = sheet.href || '';
+				if (isIconfontStylesheetHref(href)) sheetsList.push(sheet);
 			}
+			const sheetsIconList: string[] = [];
 			for (let i = 0; i < sheetsList.length; i++) {
-				for (let j = 0; j < sheetsList[i].cssRules.length; j++) {
-					if (sheetsList[i].cssRules[j].selectorText && sheetsList[i].cssRules[j].selectorText.indexOf('.icon-') > -1) {
-						sheetsIconList.push(
-							`${sheetsList[i].cssRules[j].selectorText.substring(1, sheetsList[i].cssRules[j].selectorText.length).replace(/\:\:before/gi, '')}`
-						);
+				const rules = safeReadCssRules(sheetsList[i]);
+				if (!rules) continue;
+				try {
+					for (let j = 0; j < rules.length; j++) {
+						const rule = rules[j] as CSSStyleRule;
+						const sel = rule.selectorText;
+						if (sel && sel.indexOf('.icon-') > -1) {
+							sheetsIconList.push(`${sel.substring(1, sel.length).replace(/\:\:before/gi, '')}`);
+						}
 					}
+				} catch {
+					continue;
 				}
 			}
-			if (sheetsIconList.length > 0) resolve(sheetsIconList);
-			else reject('未获取到值,请刷新重试');
+			if (sheetsIconList.length > 0) {
+				resolve(sheetsIconList);
+				return;
+			}
+			try {
+				const fromJson = await iconClassListFromLocalIconfontJson();
+				if (fromJson.length > 0) {
+					resolve(fromJson);
+					return;
+				}
+			} catch {
+				// ignore
+			}
+			reject('未获取到值,请刷新重试');
 		});
 	});
 };

+ 15 - 6
src/utils/setIconfont.ts

@@ -1,9 +1,18 @@
-// 字体图标 url
-const cssCdnUrlList: Array<string> = [
-	'//at.alicdn.com/t/font_2298093_y6u00apwst.css',
-	'//at.alicdn.com/t/c/font_3882322_9ah7y8m9175.css', //dvadmin3项目用icon
-	//'//netdna.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css'
-];
+/**
+ * 阿里 iconfont 外链 CSS。纯内网/离线:在 .env 中设置 VITE_ICONFONT_CDN_URLS=(空)即可不请求外网;
+ * 未配置该项时保持原默认 CDN 列表(与历史行为一致)。
+ */
+const rawCdn = import.meta.env.VITE_ICONFONT_CDN_URLS as string | undefined;
+const cssCdnUrlList: Array<string> =
+	rawCdn !== undefined
+		? String(rawCdn)
+				.split(',')
+				.map((s) => s.trim())
+				.filter(Boolean)
+		: [
+				'//at.alicdn.com/t/font_2298093_y6u00apwst.css',
+				'//at.alicdn.com/t/c/font_3882322_9ah7y8m9175.css',
+			];
 // 第三方 js url
 const jsCdnUrlList: Array<string> = [];
 

+ 63 - 8
src/views/system/device/crud.tsx

@@ -10,7 +10,7 @@ import { successMessage } from '/@/utils/message';
 import { dictionary } from '/@/utils/dictionary';
 import { APIResponseData } from '../columns/types';
 import { computed, h,defineComponent, ref, onMounted, watch  } from 'vue';
-import { ElTable, ElTableColumn, ElLoading } from 'element-plus';
+import { ElTable, ElTableColumn, ElLoading, ElTooltip } from 'element-plus';
 import { nextTick } from 'vue';
 import XEUtils from 'xe-utils';
 
@@ -189,7 +189,14 @@ const DeviceStatistics = defineComponent({
   
 export const createCrudOptions = function ({ crudExpose }: CreateCrudOptionsProps): CreateCrudOptionsRet {
 	const pageRequest = async (query: UserPageQuery) => {
-		return await api.GetList(query);
+		const q = { ...query } as Record<string, unknown>;
+		// 搜索「空闲」时同时传 has_available,供后端按可用库存筛选
+		if (q.has_borrowed === 0) {
+			q.has_available = true;
+		} else {
+			delete q.has_available;
+		}
+		return await api.GetList(q as UserPageQuery);
 	};
 	const editRequest = async ({ form, row }: EditReq) => {
 		form.id = row.id;
@@ -353,7 +360,21 @@ export const createCrudOptions = function ({ crudExpose }: CreateCrudOptionsProp
 						rules: [{ required: true, message: '' }],
 					},
 				},
-				
+				has_borrowed:{
+					title: '借用状态',
+					type: 'dict-switch',
+					search: { show: true },
+					column: { show: false },
+					form: { show: false,
+						component: { placeholder: '请选择借用状态' },
+						rules: [{ required: false, message: '请选择借用状态' }],
+					},
+					dict: dict({
+						data:[
+							{ label: '在借', value: 1 },
+							{ label: '空闲', value: 0 },
+						]}),
+				},
 				category_name: {
 					title: '设备分类',
 					search: { show: true },
@@ -423,12 +444,17 @@ export const createCrudOptions = function ({ crudExpose }: CreateCrudOptionsProp
 							show: true,
 							minWidth: 130,
 							formatter: ({ row }) => {
-								const isBorrowed = row.inventory.borrowed_quantity > 0;
-								const isMaintenance = row.inventory.maintenance_quantity > 0 && row.inventory.maintenance_quantity === row.inventory.total_quantity;
-								const isDamaged = row.inventory.damaged_quantity > 0 &&  row.inventory.total_quantity==row.inventory.damaged_quantity;
+								const inv = row.inventory || {};
+								const t = Number(inv.total_quantity) || 0;
+								const b = Number(inv.borrowed_quantity) || 0;
+								const m = Number(inv.maintenance_quantity) || 0;
+								const d = Number(inv.damaged_quantity) || 0;
+								const idleQty = Math.max(0, t - b - m - d);
+								const isBorrowed = b > 0;
+								const isMaintenance = m > 0 && m === t;
+								const isDamaged = d > 0 && t === d;
 								
 								let label, color;
-								console.log(isDamaged);
 								if (isDamaged) {
 									label = '报废';
 									color = '#F56C6C';
@@ -442,7 +468,7 @@ export const createCrudOptions = function ({ crudExpose }: CreateCrudOptionsProp
 									label = row.total_quantity === 0 ? '在借' : '空闲';
 									color = '#4CAF50';
 								}
-								return h(
+								const badge = h(
 									'span',
 									{
 										style: {
@@ -453,10 +479,37 @@ export const createCrudOptions = function ({ crudExpose }: CreateCrudOptionsProp
 										backgroundColor: color,
 										color: 'white',
 										fontWeight: 'bold',
+										cursor: 'default',
 										}
 									},
 									label
 									);
+								return h(
+									ElTooltip,
+									{ placement: 'top', showAfter: 200 },
+									{
+										default: () => badge,
+										content: () =>
+											h(
+												'div',
+												{
+													style: {
+														display: 'grid',
+														gridTemplateColumns: '1fr 1fr',
+														gap: '4px 16px',
+														lineHeight: '1.6',
+														whiteSpace: 'nowrap',
+													},
+												},
+												[
+													h('div', `在借:${b}`),
+													h('div', `空闲:${idleQty}`),
+													h('div', `维修:${m}`),
+													h('div', `报废:${d}`),
+												]
+											),
+									}
+									);
 							},
 							filters: [
 								{ text: "空闲", value: "idle" },
@@ -644,6 +697,7 @@ export const createCrudOptions = function ({ crudExpose }: CreateCrudOptionsProp
 					}
 
 				}, */
+				
 				department: {
 					title: '所属部门',
 					search: { show: false },
@@ -992,6 +1046,7 @@ export const createCrudOptions = function ({ crudExpose }: CreateCrudOptionsProp
 							}
 						}
 					},
+				
 					maintain: {
 						show: true,
 						label: "保养记录",

Algúns arquivos non se mostraron porque demasiados arquivos cambiaron neste cambio