diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..c4c4ffc
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+*.zip
diff --git a/client/src/assets/fonts/iconfont/iconfont.css b/client/src/assets/fonts/iconfont/iconfont.css
new file mode 100644
index 0000000..b6e0b35
--- /dev/null
+++ b/client/src/assets/fonts/iconfont/iconfont.css
@@ -0,0 +1,41 @@
+@font-face {
+ font-family: "iconfont"; /* Project id 5232815 */
+ /* Color fonts */
+ src:
+ url('data:application/x-font-woff2;charset=utf-8;base64,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') format('woff2'),
+ url('iconfont.woff?t=1789098374123') format('woff'),
+ url('iconfont.ttf?t=1789098374123') format('truetype');
+}
+
+.iconfont {
+ font-family: "iconfont" !important;
+ font-size: 16px;
+ font-style: normal;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+.xt-jihuabaifang:before {
+ content: "\e6c4";
+}
+
+.xt-xiaochengxu:before {
+ content: "\e61e";
+}
+
+.xt-baifangshenyue:before {
+ content: "\e6c6";
+}
+
+.xt-topology:before {
+ content: "\e67c";
+}
+
+.xt-xiangmukancha:before {
+ content: "\e633";
+}
+
+.xt-xiangmufangan:before {
+ content: "\e738";
+}
+
diff --git a/client/src/assets/fonts/iconfont/iconfont.js b/client/src/assets/fonts/iconfont/iconfont.js
new file mode 100644
index 0000000..164d377
--- /dev/null
+++ b/client/src/assets/fonts/iconfont/iconfont.js
@@ -0,0 +1 @@
+window._iconfont_svg_string_5232815='',(e=>{var t=(c=(c=document.getElementsByTagName("script"))[c.length-1]).getAttribute("data-injectcss"),c=c.getAttribute("data-disable-injectsvg");if(!c){var l,h,a,n,i,o=function(t,c){c.parentNode.insertBefore(t,c)};if(t&&!e.__iconfont__svg__cssinject__){e.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(t){console&&console.log(t)}}l=function(){var t,c=document.createElement("div");c.innerHTML=e._iconfont_svg_string_5232815,(c=c.getElementsByTagName("svg")[0])&&(c.setAttribute("aria-hidden","true"),c.style.position="absolute",c.style.width=0,c.style.height=0,c.style.overflow="hidden",c=c,(t=document.body).firstChild?o(c,t.firstChild):t.appendChild(c))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(l,0):(h=function(){document.removeEventListener("DOMContentLoaded",h,!1),l()},document.addEventListener("DOMContentLoaded",h,!1)):document.attachEvent&&(a=l,n=e.document,i=!1,s(),n.onreadystatechange=function(){"complete"==n.readyState&&(n.onreadystatechange=null,v())})}function v(){i||(i=!0,a())}function s(){try{n.documentElement.doScroll("left")}catch(t){return void setTimeout(s,50)}v()}})(window);
\ No newline at end of file
diff --git a/client/src/assets/fonts/iconfont/iconfont.json b/client/src/assets/fonts/iconfont/iconfont.json
new file mode 100644
index 0000000..82f3ab7
--- /dev/null
+++ b/client/src/assets/fonts/iconfont/iconfont.json
@@ -0,0 +1,51 @@
+{
+ "id": "5232815",
+ "name": "鑫潼智电后台",
+ "font_family": "iconfont",
+ "css_prefix_text": "xt-",
+ "description": "",
+ "glyphs": [
+ {
+ "icon_id": "905033",
+ "name": "客户拜访",
+ "font_class": "jihuabaifang",
+ "unicode": "e6c4",
+ "unicode_decimal": 59076
+ },
+ {
+ "icon_id": "4424124",
+ "name": "小程序",
+ "font_class": "xiaochengxu",
+ "unicode": "e61e",
+ "unicode_decimal": 58910
+ },
+ {
+ "icon_id": "4520265",
+ "name": "拜访审阅",
+ "font_class": "baifangshenyue",
+ "unicode": "e6c6",
+ "unicode_decimal": 59078
+ },
+ {
+ "icon_id": "4922685",
+ "name": "拓扑",
+ "font_class": "topology",
+ "unicode": "e67c",
+ "unicode_decimal": 59004
+ },
+ {
+ "icon_id": "11622405",
+ "name": "项目勘察",
+ "font_class": "xiangmukancha",
+ "unicode": "e633",
+ "unicode_decimal": 58931
+ },
+ {
+ "icon_id": "46034577",
+ "name": "项目方案",
+ "font_class": "xiangmufangan",
+ "unicode": "e738",
+ "unicode_decimal": 59192
+ }
+ ]
+}
diff --git a/client/src/assets/fonts/iconfont/iconfont.ttf b/client/src/assets/fonts/iconfont/iconfont.ttf
new file mode 100644
index 0000000..24d16ad
Binary files /dev/null and b/client/src/assets/fonts/iconfont/iconfont.ttf differ
diff --git a/client/src/assets/fonts/iconfont/iconfont.woff b/client/src/assets/fonts/iconfont/iconfont.woff
new file mode 100644
index 0000000..7c855e7
Binary files /dev/null and b/client/src/assets/fonts/iconfont/iconfont.woff differ
diff --git a/client/src/assets/fonts/iconfont/iconfont.woff2 b/client/src/assets/fonts/iconfont/iconfont.woff2
new file mode 100644
index 0000000..9562545
Binary files /dev/null and b/client/src/assets/fonts/iconfont/iconfont.woff2 differ
diff --git a/client/src/layouts/index.vue b/client/src/layouts/index.vue
index 69299cd..7dd6c7e 100644
--- a/client/src/layouts/index.vue
+++ b/client/src/layouts/index.vue
@@ -140,7 +140,14 @@ const iconMap: Record = {
DashboardOutlined,
}
+// iconfont 图标类名前缀(对应 assets/fonts/iconfont/iconfont.css 的 css_prefix_text)
+const ICONFONT_PREFIX = 'xt-'
+
function resolveIcon(icon?: string | null) {
+ // icon 值形如 xt-xxx 时渲染 iconfont 图标,否则回退到 ant-design 图标
+ if (icon && icon.startsWith(ICONFONT_PREFIX)) {
+ return () => h('i', { class: `iconfont ${icon}` })
+ }
const iconComponent = icon ? iconMap[icon] : undefined
return () => h(iconComponent || MenuOutlined)
}
@@ -194,6 +201,20 @@ const menuItems = computed