From f5d43be8fc74a2a82a0647d43dc9a57c906f303b Mon Sep 17 00:00:00 2001 From: wangzenghua <1048523306@qq.com> Date: Mon, 17 Feb 2025 06:43:55 +0000 Subject: [PATCH] =?UTF-8?q?feat:=E6=BA=AF=E6=BA=90=E5=8F=91=E5=B8=831.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main/.env.development | 6 +- main/.env.production | 10 +- main/.env.test | 12 + main/package.json | 1 + main/src/apis/login.js | 40 +- main/src/assets/fonts/demo.css | 539 ++++++++ main/src/assets/fonts/demo_index.html | 1223 +++++++++++++++++ main/src/assets/fonts/iconfont.css | 195 +++ main/src/assets/fonts/iconfont.js | 1 + main/src/assets/fonts/iconfont.json | 324 +++++ main/src/assets/fonts/iconfont.ttf | Bin 0 -> 16608 bytes main/src/assets/fonts/iconfont.woff | Bin 0 -> 11212 bytes main/src/assets/fonts/iconfont.woff2 | Bin 0 -> 9644 bytes main/src/micro/actions.js | 7 +- main/src/micro/app.js | 116 +- main/src/router/index.js | 6 + main/src/styles/global.scss | 9 +- main/src/utils/axios.js | 4 +- main/src/utils/permission.js | 2 +- main/src/views/index.vue | 1 + main/src/views/login/index.vue | 43 +- main/vite.config.js | 24 + sub-admin/.env.production | 4 +- sub-admin/package.json | 2 +- sub-admin/src/utils/auth.js | 15 +- sub-admin/vue.config.js | 40 +- .../.env.development | 3 - .../.env.production | 8 +- .../src/apis/grid.js | 51 + .../src/layouts/component/Avatar/index.vue | 6 +- .../src/plugins/micro.js | 9 +- .../src/router/index.js | 10 +- .../src/router/modules/plantingAndBreeding.js | 2 +- .../src/router/modules/resource-bak.js | 69 + .../src/router/modules/resource.js | 62 +- .../src/utils/permission.js | 4 +- .../src/views/home/index.vue | 2 +- .../src/views/resource/grid/index.vue | 371 +++++ .../src/views/resource/map/index.vue | 6 - .../src/views/trace/breeding/coding/index.vue | 8 +- sub-government-affairs-service/vite.config.js | 28 +- 41 files changed, 3026 insertions(+), 237 deletions(-) create mode 100644 main/.env.test create mode 100644 main/src/assets/fonts/demo.css create mode 100644 main/src/assets/fonts/demo_index.html create mode 100644 main/src/assets/fonts/iconfont.css create mode 100644 main/src/assets/fonts/iconfont.js create mode 100644 main/src/assets/fonts/iconfont.json create mode 100644 main/src/assets/fonts/iconfont.ttf create mode 100644 main/src/assets/fonts/iconfont.woff create mode 100644 main/src/assets/fonts/iconfont.woff2 create mode 100644 sub-government-affairs-service/src/apis/grid.js create mode 100644 sub-government-affairs-service/src/router/modules/resource-bak.js create mode 100644 sub-government-affairs-service/src/views/resource/grid/index.vue delete mode 100644 sub-government-affairs-service/src/views/resource/map/index.vue diff --git a/main/.env.development b/main/.env.development index 108a86e..4d36f5c 100644 --- a/main/.env.development +++ b/main/.env.development @@ -4,11 +4,9 @@ VITE_APP_NAME = 'daimp-front-main' VITE_APP_TITLE = '数字农业产业管理平台' VITE_APP_SUB_OS = '//localhost:9526/sub-operation-service/' VITE_APP_SUB_ADMIN = '//localhost:9527/sub-admin/' -VITE_APP_SUB_GAS = '//localhost:9528/suv-government-affairs-service/' +VITE_APP_SUB_GAS = '//localhost:9528/sub-government-affairs-service/' # 接口 VITE_APP_BASE_API = '/apis' VITE_APP_BASE_URL = 'http://192.168.18.99:8080' VITE_APP_UPLOAD_API = '/uploadApis' -VITE_APP_UPLOAD_URL = 'http://192.168.18.99:9300' -VITE_APP_SYSTEM_API = '/systemApis' -VITE_APP_SYSTEM_URL = 'http://192.168.18.99:99/stage-api' \ No newline at end of file +VITE_APP_UPLOAD_URL = 'http://192.168.18.99:9300' \ No newline at end of file diff --git a/main/.env.production b/main/.env.production index 0e98be6..5aa3ea1 100644 --- a/main/.env.production +++ b/main/.env.production @@ -1,7 +1,11 @@ # 正式环境 VITE_APP_NAME = 'daimp-front-main' VITE_APP_TITLE = '数字农业产业管理平台' -VITE_APP_BASE_API = "" +VITE_APP_SUB_OS = '//192.168.18.99:88/sub-operation-service/' +VITE_APP_SUB_ADMIN = '//192.168.18.99:88/sub-admin/' +VITE_APP_SUB_GAS = '//192.168.18.99:88/sub-government-affairs-service/' +# 接口 +VITE_APP_BASE_API = '/apis' VITE_APP_BASE_URL = '' -VITE_APP_SUB_VUE = '//localhost:9526/sub-vue/' -VITE_APP_SUB_ADMIN = '//localhost:9527/sub-admin/' +VITE_APP_UPLOAD_API = '/uploadApis' +VITE_APP_UPLOAD_URL = '' \ No newline at end of file diff --git a/main/.env.test b/main/.env.test new file mode 100644 index 0000000..c4f70bf --- /dev/null +++ b/main/.env.test @@ -0,0 +1,12 @@ +# 开发环境 +VITE_PORT = 9000 +VITE_APP_NAME = 'daimp-front-main' +VITE_APP_TITLE = '数字农业产业管理平台' +VITE_APP_SUB_OS = '//localhost:8090/sub-operation-service/' +VITE_APP_SUB_ADMIN = '//localhost:8090/sub-admin/' +VITE_APP_SUB_GAS = '//localhost:8090/sub-government-affairs-service/' +# 接口 +VITE_APP_BASE_API = '/apis' +VITE_APP_BASE_URL = '' +VITE_APP_UPLOAD_API = '/uploadApis' +VITE_APP_UPLOAD_URL = '' \ No newline at end of file diff --git a/main/package.json b/main/package.json index ae10afe..f45644c 100644 --- a/main/package.json +++ b/main/package.json @@ -6,6 +6,7 @@ "scripts": { "dev": "vite --mode development", "build": "vite build --mode production", + "test": "vite build --mode test", "preview": "vite preview", "format": "prettier --write 'src/**/*.{vue,ts,tsx,js,jsx,css,less,scss,json,md}'", "eslint": "npx eslint --init", diff --git a/main/src/apis/login.js b/main/src/apis/login.js index 6087c83..d2b6691 100644 --- a/main/src/apis/login.js +++ b/main/src/apis/login.js @@ -14,7 +14,7 @@ export function Login(data) { } // 注册方法 -export function register(data) { +export function Register(data) { return request({ url: '/auth/register', headers: { @@ -26,7 +26,7 @@ export function register(data) { } // 刷新方法 -export function refreshToken() { +export function RefreshToken() { return request({ url: '/auth/refresh', method: 'post', @@ -34,7 +34,7 @@ export function refreshToken() { } // 获取用户详细信息 -export function getInfo() { +export function GetInfo() { return request({ url: '/system/user/getInfo', method: 'get', @@ -42,7 +42,7 @@ export function getInfo() { } // 退出方法 -export function logout() { +export function Logout() { return request({ url: '/auth/logout', method: 'delete', @@ -60,35 +60,3 @@ export function GetCodeImg() { timeout: 20000, }); } - -// /** -// * @Title: 登录 -// */ -// export function Login(data, token) { -// return request('/self/login', { -// method: 'POST', -// data, -// headers: { -// 'Fairies-Captcha-Token': token, -// }, -// }); -// } - -// /** -// * @Title: 登出 -// */ -// export function LogOut() { -// return request('/self/logout', { -// method: 'POST', -// }); -// } - -// /** -// * @Title: 验证码 -// */ -// export function GetCaptcha() { -// return request('/self/captcha', { -// method: 'GET', -// responseType: 'arraybuffer', -// }); -// } diff --git a/main/src/assets/fonts/demo.css b/main/src/assets/fonts/demo.css new file mode 100644 index 0000000..a67054a --- /dev/null +++ b/main/src/assets/fonts/demo.css @@ -0,0 +1,539 @@ +/* Logo 字体 */ +@font-face { + font-family: "iconfont logo"; + src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834'); + src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834#iefix') format('embedded-opentype'), + url('https://at.alicdn.com/t/font_985780_km7mi63cihi.woff?t=1545807318834') format('woff'), + url('https://at.alicdn.com/t/font_985780_km7mi63cihi.ttf?t=1545807318834') format('truetype'), + url('https://at.alicdn.com/t/font_985780_km7mi63cihi.svg?t=1545807318834#iconfont') format('svg'); +} + +.logo { + font-family: "iconfont logo"; + font-size: 160px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +/* tabs */ +.nav-tabs { + position: relative; +} + +.nav-tabs .nav-more { + position: absolute; + right: 0; + bottom: 0; + height: 42px; + line-height: 42px; + color: #666; +} + +#tabs { + border-bottom: 1px solid #eee; +} + +#tabs li { + cursor: pointer; + width: 100px; + height: 40px; + line-height: 40px; + text-align: center; + font-size: 16px; + border-bottom: 2px solid transparent; + position: relative; + z-index: 1; + margin-bottom: -1px; + color: #666; +} + + +#tabs .active { + border-bottom-color: #f00; + color: #222; +} + +.tab-container .content { + display: none; +} + +/* 页面布局 */ +.main { + padding: 30px 100px; + width: 960px; + margin: 0 auto; +} + +.main .logo { + color: #333; + text-align: left; + margin-bottom: 30px; + line-height: 1; + height: 110px; + margin-top: -50px; + overflow: hidden; + *zoom: 1; +} + +.main .logo a { + font-size: 160px; + color: #333; +} + +.helps { + margin-top: 40px; +} + +.helps pre { + padding: 20px; + margin: 10px 0; + border: solid 1px #e7e1cd; + background-color: #fffdef; + overflow: auto; +} + +.icon_lists { + width: 100% !important; + overflow: hidden; + *zoom: 1; +} + +.icon_lists li { + width: 100px; + margin-bottom: 10px; + margin-right: 20px; + text-align: center; + list-style: none !important; + cursor: default; +} + +.icon_lists li .code-name { + line-height: 1.2; +} + +.icon_lists .icon { + display: block; + height: 100px; + line-height: 100px; + font-size: 42px; + margin: 10px auto; + color: #333; + -webkit-transition: font-size 0.25s linear, width 0.25s linear; + -moz-transition: font-size 0.25s linear, width 0.25s linear; + transition: font-size 0.25s linear, width 0.25s linear; +} + +.icon_lists .icon:hover { + font-size: 100px; +} + +.icon_lists .svg-icon { + /* 通过设置 font-size 来改变图标大小 */ + width: 1em; + /* 图标和文字相邻时,垂直对齐 */ + vertical-align: -0.15em; + /* 通过设置 color 来改变 SVG 的颜色/fill */ + fill: currentColor; + /* path 和 stroke 溢出 viewBox 部分在 IE 下会显示 + normalize.css 中也包含这行 */ + overflow: hidden; +} + +.icon_lists li .name, +.icon_lists li .code-name { + color: #666; +} + +/* markdown 样式 */ +.markdown { + color: #666; + font-size: 14px; + line-height: 1.8; +} + +.highlight { + line-height: 1.5; +} + +.markdown img { + vertical-align: middle; + max-width: 100%; +} + +.markdown h1 { + color: #404040; + font-weight: 500; + line-height: 40px; + margin-bottom: 24px; +} + +.markdown h2, +.markdown h3, +.markdown h4, +.markdown h5, +.markdown h6 { + color: #404040; + margin: 1.6em 0 0.6em 0; + font-weight: 500; + clear: both; +} + +.markdown h1 { + font-size: 28px; +} + +.markdown h2 { + font-size: 22px; +} + +.markdown h3 { + font-size: 16px; +} + +.markdown h4 { + font-size: 14px; +} + +.markdown h5 { + font-size: 12px; +} + +.markdown h6 { + font-size: 12px; +} + +.markdown hr { + height: 1px; + border: 0; + background: #e9e9e9; + margin: 16px 0; + clear: both; +} + +.markdown p { + margin: 1em 0; +} + +.markdown>p, +.markdown>blockquote, +.markdown>.highlight, +.markdown>ol, +.markdown>ul { + width: 80%; +} + +.markdown ul>li { + list-style: circle; +} + +.markdown>ul li, +.markdown blockquote ul>li { + margin-left: 20px; + padding-left: 4px; +} + +.markdown>ul li p, +.markdown>ol li p { + margin: 0.6em 0; +} + +.markdown ol>li { + list-style: decimal; +} + +.markdown>ol li, +.markdown blockquote ol>li { + margin-left: 20px; + padding-left: 4px; +} + +.markdown code { + margin: 0 3px; + padding: 0 5px; + background: #eee; + border-radius: 3px; +} + +.markdown strong, +.markdown b { + font-weight: 600; +} + +.markdown>table { + border-collapse: collapse; + border-spacing: 0px; + empty-cells: show; + border: 1px solid #e9e9e9; + width: 95%; + margin-bottom: 24px; +} + +.markdown>table th { + white-space: nowrap; + color: #333; + font-weight: 600; +} + +.markdown>table th, +.markdown>table td { + border: 1px solid #e9e9e9; + padding: 8px 16px; + text-align: left; +} + +.markdown>table th { + background: #F7F7F7; +} + +.markdown blockquote { + font-size: 90%; + color: #999; + border-left: 4px solid #e9e9e9; + padding-left: 0.8em; + margin: 1em 0; +} + +.markdown blockquote p { + margin: 0; +} + +.markdown .anchor { + opacity: 0; + transition: opacity 0.3s ease; + margin-left: 8px; +} + +.markdown .waiting { + color: #ccc; +} + +.markdown h1:hover .anchor, +.markdown h2:hover .anchor, +.markdown h3:hover .anchor, +.markdown h4:hover .anchor, +.markdown h5:hover .anchor, +.markdown h6:hover .anchor { + opacity: 1; + display: inline-block; +} + +.markdown>br, +.markdown>p>br { + clear: both; +} + + +.hljs { + display: block; + background: white; + padding: 0.5em; + color: #333333; + overflow-x: auto; +} + +.hljs-comment, +.hljs-meta { + color: #969896; +} + +.hljs-string, +.hljs-variable, +.hljs-template-variable, +.hljs-strong, +.hljs-emphasis, +.hljs-quote { + color: #df5000; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-type { + color: #a71d5d; +} + +.hljs-literal, +.hljs-symbol, +.hljs-bullet, +.hljs-attribute { + color: #0086b3; +} + +.hljs-section, +.hljs-name { + color: #63a35c; +} + +.hljs-tag { + color: #333333; +} + +.hljs-title, +.hljs-attr, +.hljs-selector-id, +.hljs-selector-class, +.hljs-selector-attr, +.hljs-selector-pseudo { + color: #795da3; +} + +.hljs-addition { + color: #55a532; + background-color: #eaffea; +} + +.hljs-deletion { + color: #bd2c00; + background-color: #ffecec; +} + +.hljs-link { + text-decoration: underline; +} + +/* 代码高亮 */ +/* PrismJS 1.15.0 +https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */ +/** + * prism.js default theme for JavaScript, CSS and HTML + * Based on dabblet (http://dabblet.com) + * @author Lea Verou + */ +code[class*="language-"], +pre[class*="language-"] { + color: black; + background: none; + text-shadow: 0 1px white; + font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; + + -webkit-hyphens: none; + -moz-hyphens: none; + -ms-hyphens: none; + hyphens: none; +} + +pre[class*="language-"]::-moz-selection, +pre[class*="language-"] ::-moz-selection, +code[class*="language-"]::-moz-selection, +code[class*="language-"] ::-moz-selection { + text-shadow: none; + background: #b3d4fc; +} + +pre[class*="language-"]::selection, +pre[class*="language-"] ::selection, +code[class*="language-"]::selection, +code[class*="language-"] ::selection { + text-shadow: none; + background: #b3d4fc; +} + +@media print { + + code[class*="language-"], + pre[class*="language-"] { + text-shadow: none; + } +} + +/* Code blocks */ +pre[class*="language-"] { + padding: 1em; + margin: .5em 0; + overflow: auto; +} + +:not(pre)>code[class*="language-"], +pre[class*="language-"] { + background: #f5f2f0; +} + +/* Inline code */ +:not(pre)>code[class*="language-"] { + padding: .1em; + border-radius: .3em; + white-space: normal; +} + +.token.comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: slategray; +} + +.token.punctuation { + color: #999; +} + +.namespace { + opacity: .7; +} + +.token.property, +.token.tag, +.token.boolean, +.token.number, +.token.constant, +.token.symbol, +.token.deleted { + color: #905; +} + +.token.selector, +.token.attr-name, +.token.string, +.token.char, +.token.builtin, +.token.inserted { + color: #690; +} + +.token.operator, +.token.entity, +.token.url, +.language-css .token.string, +.style .token.string { + color: #9a6e3a; + background: hsla(0, 0%, 100%, .5); +} + +.token.atrule, +.token.attr-value, +.token.keyword { + color: #07a; +} + +.token.function, +.token.class-name { + color: #DD4A68; +} + +.token.regex, +.token.important, +.token.variable { + color: #e90; +} + +.token.important, +.token.bold { + font-weight: bold; +} + +.token.italic { + font-style: italic; +} + +.token.entity { + cursor: help; +} diff --git a/main/src/assets/fonts/demo_index.html b/main/src/assets/fonts/demo_index.html new file mode 100644 index 0000000..24647ea --- /dev/null +++ b/main/src/assets/fonts/demo_index.html @@ -0,0 +1,1223 @@ + + + + + iconfont Demo + + + + + + + + + + + + + +
+

+ + +

+ +
+
+
    + +
  • + +
    销售明细
    +
    &#xe60c;
    +
  • + +
  • + +
    销售明细
    +
    &#xe6be;
    +
  • + +
  • + +
    充值记录
    +
    &#xe614;
    +
  • + +
  • + +
    充值规则
    +
    &#xe628;
    +
  • + +
  • + +
    用户画像
    +
    &#xe783;
    +
  • + +
  • + +
    成就
    +
    &#xe616;
    +
  • + +
  • + +
    我的-段位
    +
    &#xe61a;
    +
  • + +
  • + +
    皮肤
    +
    &#xe790;
    +
  • + +
  • + +
    个人中心-积分商城
    +
    &#xe996;
    +
  • + +
  • + +
    价值投资
    +
    &#xe661;
    +
  • + +
  • + +
    费用统计
    +
    &#xe632;
    +
  • + +
  • + +
    数据报表
    +
    &#xe64e;
    +
  • + +
  • + +
    游戏管理
    +
    &#xe6d0;
    +
  • + +
  • + +
    banner
    +
    &#xe613;
    +
  • + +
  • + +
    核销码核销
    +
    &#xe601;
    +
  • + +
  • + +
    结算管理
    +
    &#xe6b9;
    +
  • + +
  • + +
    退货退款
    +
    &#xe7af;
    +
  • + +
  • + +
    wechat
    +
    &#xe681;
    +
  • + +
  • + +
    alipay
    +
    &#xe61e;
    +
  • + +
  • + +
    会员
    +
    &#xe67f;
    +
  • + +
  • + +
    我的优惠券
    +
    &#xe65a;
    +
  • + +
  • + +
    会员等级
    +
    &#xe7d8;
    +
  • + +
  • + +
    活动
    +
    &#xe67b;
    +
  • + +
  • + +
    门店
    +
    &#xe60a;
    +
  • + +
  • + +
    会员
    +
    &#xe640;
    +
  • + +
  • + +
    会员充值
    +
    &#xe799;
    +
  • + +
  • + +
    营销
    +
    &#xe765;
    +
  • + +
  • + +
    商品规格
    +
    &#xe6d7;
    +
  • + +
  • + +
    商家入驻
    +
    &#xe62b;
    +
  • + +
  • + +
    小店商品库
    +
    &#xe6c6;
    +
  • + +
  • + +
    商家列表
    +
    &#xe64a;
    +
  • + +
  • + +
    订单
    +
    &#xe737;
    +
  • + +
  • + +
    权限
    +
    &#xe612;
    +
  • + +
  • + +
    06商品-线性
    +
    &#xe889;
    +
  • + +
  • + +
    菜单
    +
    &#xe60e;
    +
  • + +
  • + +
    dictionary
    +
    &#xe652;
    +
  • + +
  • + +
    dictionary
    +
    &#xe600;
    +
  • + +
  • + +
    new-role
    +
    &#xe604;
    +
  • + +
  • + +
    327全屏
    +
    &#xe8fa;
    +
  • + +
  • + +
    328退出全屏
    +
    &#xe8fb;
    +
  • + +
  • + +
    表格
    +
    &#xe615;
    +
  • + +
  • + +
    测试
    +
    &#xe610;
    +
  • + +
  • + +
    中英文
    +
    &#xe649;
    +
  • + +
  • + +
    方案列表-默认
    +
    &#xe6ee;
    +
  • + +
  • + +
    文字大小
    +
    &#xe660;
    +
  • + +
+
+

Unicode 引用

+
+ +

Unicode 是字体在网页端最原始的应用方式,特点是:

+
    +
  • 支持按字体的方式去动态调整图标大小,颜色等等。
  • +
  • 默认情况下不支持多色,直接添加多色图标会自动去色。
  • +
+
+

注意:新版 iconfont 支持两种方式引用多色图标:SVG symbol 引用方式和彩色字体图标模式。(使用彩色字体图标需要在「编辑项目」中开启「彩色」选项后并重新生成。)

+
+

Unicode 使用步骤如下:

+

第一步:拷贝项目下面生成的 @font-face

+
@font-face {
+  font-family: 'iconfont';
+  src: url('iconfont.woff2?t=1725879404188') format('woff2'),
+       url('iconfont.woff?t=1725879404188') format('woff'),
+       url('iconfont.ttf?t=1725879404188') format('truetype');
+}
+
+

第二步:定义使用 iconfont 的样式

+
.iconfont {
+  font-family: "iconfont" !important;
+  font-size: 16px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+

第三步:挑选相应图标并获取字体编码,应用于页面

+
+<span class="iconfont">&#x33;</span>
+
+
+

"iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。

+
+
+
+
+
    + +
  • + +
    + 销售明细 +
    +
    .icon-data4 +
    +
  • + +
  • + +
    + 销售明细 +
    +
    .icon-data5 +
    +
  • + +
  • + +
    + 充值记录 +
    +
    .icon-recharge-record +
    +
  • + +
  • + +
    + 充值规则 +
    +
    .icon-recharge-rule +
    +
  • + +
  • + +
    + 用户画像 +
    +
    .icon-user-profile +
    +
  • + +
  • + +
    + 成就 +
    +
    .icon-achieve +
    +
  • + +
  • + +
    + 我的-段位 +
    +
    .icon-activity-level +
    +
  • + +
  • + +
    + 皮肤 +
    +
    .icon-skins +
    +
  • + +
  • + +
    + 个人中心-积分商城 +
    +
    .icon-data1 +
    +
  • + +
  • + +
    + 价值投资 +
    +
    .icon-data2 +
    +
  • + +
  • + +
    + 费用统计 +
    +
    .icon-data3 +
    +
  • + +
  • + +
    + 数据报表 +
    +
    .icon-data +
    +
  • + +
  • + +
    + 游戏管理 +
    +
    .icon-game +
    +
  • + +
  • + +
    + banner +
    +
    .icon-banner +
    +
  • + +
  • + +
    + 核销码核销 +
    +
    .icon-verification +
    +
  • + +
  • + +
    + 结算管理 +
    +
    .icon-balance +
    +
  • + +
  • + +
    + 退货退款 +
    +
    .icon-refund +
    +
  • + +
  • + +
    + wechat +
    +
    .icon-wechat +
    +
  • + +
  • + +
    + alipay +
    +
    .icon-alipay +
    +
  • + +
  • + +
    + 会员 +
    +
    .icon-user +
    +
  • + +
  • + +
    + 我的优惠券 +
    +
    .icon-coupon +
    +
  • + +
  • + +
    + 会员等级 +
    +
    .icon-level +
    +
  • + +
  • + +
    + 活动 +
    +
    .icon-activity +
    +
  • + +
  • + +
    + 门店 +
    +
    .icon-shop +
    +
  • + +
  • + +
    + 会员 +
    +
    .icon-member +
    +
  • + +
  • + +
    + 会员充值 +
    +
    .icon-recharge +
    +
  • + +
  • + +
    + 营销 +
    +
    .icon-marketing +
    +
  • + +
  • + +
    + 商品规格 +
    +
    .icon-goods-sku +
    +
  • + +
  • + +
    + 商家入驻 +
    +
    .icon-store +
    +
  • + +
  • + +
    + 小店商品库 +
    +
    .icon-goods-store +
    +
  • + +
  • + +
    + 商家列表 +
    +
    .icon-storer +
    +
  • + +
  • + +
    + 订单 +
    +
    .icon-order +
    +
  • + +
  • + +
    + 权限 +
    +
    .icon-permission +
    +
  • + +
  • + +
    + 06商品-线性 +
    +
    .icon-goods +
    +
  • + +
  • + +
    + 菜单 +
    +
    .icon-menu +
    +
  • + +
  • + +
    + dictionary +
    +
    .icon-dict-type +
    +
  • + +
  • + +
    + dictionary +
    +
    .icon-dictionary +
    +
  • + +
  • + +
    + new-role +
    +
    .icon-role +
    +
  • + +
  • + +
    + 327全屏 +
    +
    .icon-fullscreen +
    +
  • + +
  • + +
    + 328退出全屏 +
    +
    .icon-exit-fullscreen +
    +
  • + +
  • + +
    + 表格 +
    +
    .icon-table +
    +
  • + +
  • + +
    + 测试 +
    +
    .icon-test +
    +
  • + +
  • + +
    + 中英文 +
    +
    .icon-lang +
    +
  • + +
  • + +
    + 方案列表-默认 +
    +
    .icon-demo +
    +
  • + +
  • + +
    + 文字大小 +
    +
    .icon-size +
    +
  • + +
+
+

font-class 引用

+
+ +

font-class 是 Unicode 使用方式的一种变种,主要是解决 Unicode 书写不直观,语意不明确的问题。

+

与 Unicode 使用方式相比,具有如下特点:

+
    +
  • 相比于 Unicode 语意明确,书写更直观。可以很容易分辨这个 icon 是什么。
  • +
  • 因为使用 class 来定义图标,所以当要替换图标时,只需要修改 class 里面的 Unicode 引用。
  • +
+

使用步骤如下:

+

第一步:引入项目下面生成的 fontclass 代码:

+
<link rel="stylesheet" href="./iconfont.css">
+
+

第二步:挑选相应图标并获取类名,应用于页面:

+
<span class="iconfont icon-xxx"></span>
+
+
+

" + iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。

+
+
+
+
+
    + +
  • + +
    销售明细
    +
    #icon-data4
    +
  • + +
  • + +
    销售明细
    +
    #icon-data5
    +
  • + +
  • + +
    充值记录
    +
    #icon-recharge-record
    +
  • + +
  • + +
    充值规则
    +
    #icon-recharge-rule
    +
  • + +
  • + +
    用户画像
    +
    #icon-user-profile
    +
  • + +
  • + +
    成就
    +
    #icon-achieve
    +
  • + +
  • + +
    我的-段位
    +
    #icon-activity-level
    +
  • + +
  • + +
    皮肤
    +
    #icon-skins
    +
  • + +
  • + +
    个人中心-积分商城
    +
    #icon-data1
    +
  • + +
  • + +
    价值投资
    +
    #icon-data2
    +
  • + +
  • + +
    费用统计
    +
    #icon-data3
    +
  • + +
  • + +
    数据报表
    +
    #icon-data
    +
  • + +
  • + +
    游戏管理
    +
    #icon-game
    +
  • + +
  • + +
    banner
    +
    #icon-banner
    +
  • + +
  • + +
    核销码核销
    +
    #icon-verification
    +
  • + +
  • + +
    结算管理
    +
    #icon-balance
    +
  • + +
  • + +
    退货退款
    +
    #icon-refund
    +
  • + +
  • + +
    wechat
    +
    #icon-wechat
    +
  • + +
  • + +
    alipay
    +
    #icon-alipay
    +
  • + +
  • + +
    会员
    +
    #icon-user
    +
  • + +
  • + +
    我的优惠券
    +
    #icon-coupon
    +
  • + +
  • + +
    会员等级
    +
    #icon-level
    +
  • + +
  • + +
    活动
    +
    #icon-activity
    +
  • + +
  • + +
    门店
    +
    #icon-shop
    +
  • + +
  • + +
    会员
    +
    #icon-member
    +
  • + +
  • + +
    会员充值
    +
    #icon-recharge
    +
  • + +
  • + +
    营销
    +
    #icon-marketing
    +
  • + +
  • + +
    商品规格
    +
    #icon-goods-sku
    +
  • + +
  • + +
    商家入驻
    +
    #icon-store
    +
  • + +
  • + +
    小店商品库
    +
    #icon-goods-store
    +
  • + +
  • + +
    商家列表
    +
    #icon-storer
    +
  • + +
  • + +
    订单
    +
    #icon-order
    +
  • + +
  • + +
    权限
    +
    #icon-permission
    +
  • + +
  • + +
    06商品-线性
    +
    #icon-goods
    +
  • + +
  • + +
    菜单
    +
    #icon-menu
    +
  • + +
  • + +
    dictionary
    +
    #icon-dict-type
    +
  • + +
  • + +
    dictionary
    +
    #icon-dictionary
    +
  • + +
  • + +
    new-role
    +
    #icon-role
    +
  • + +
  • + +
    327全屏
    +
    #icon-fullscreen
    +
  • + +
  • + +
    328退出全屏
    +
    #icon-exit-fullscreen
    +
  • + +
  • + +
    表格
    +
    #icon-table
    +
  • + +
  • + +
    测试
    +
    #icon-test
    +
  • + +
  • + +
    中英文
    +
    #icon-lang
    +
  • + +
  • + +
    方案列表-默认
    +
    #icon-demo
    +
  • + +
  • + +
    文字大小
    +
    #icon-size
    +
  • + +
+
+

Symbol 引用

+
+ +

这是一种全新的使用方式,应该说这才是未来的主流,也是平台目前推荐的用法。相关介绍可以参考这篇文章 + 这种用法其实是做了一个 SVG 的集合,与另外两种相比具有如下特点:

+
    +
  • 支持多色图标了,不再受单色限制。
  • +
  • 通过一些技巧,支持像字体那样,通过 font-size, color 来调整样式。
  • +
  • 兼容性较差,支持 IE9+,及现代浏览器。
  • +
  • 浏览器渲染 SVG 的性能一般,还不如 png。
  • +
+

使用步骤如下:

+

第一步:引入项目下面生成的 symbol 代码:

+
<script src="./iconfont.js"></script>
+
+

第二步:加入通用 CSS 代码(引入一次就行):

+
<style>
+.icon {
+  width: 1em;
+  height: 1em;
+  vertical-align: -0.15em;
+  fill: currentColor;
+  overflow: hidden;
+}
+</style>
+
+

第三步:挑选相应图标并获取类名,应用于页面:

+
<svg class="icon" aria-hidden="true">
+  <use xlink:href="#icon-xxx"></use>
+</svg>
+
+
+
+ +
+
+ + + diff --git a/main/src/assets/fonts/iconfont.css b/main/src/assets/fonts/iconfont.css new file mode 100644 index 0000000..e618efa --- /dev/null +++ b/main/src/assets/fonts/iconfont.css @@ -0,0 +1,195 @@ +@font-face { + font-family: "iconfont"; /* Project id 4425172 */ + src: url('iconfont.woff2?t=1725879404188') format('woff2'), + url('iconfont.woff?t=1725879404188') format('woff'), + url('iconfont.ttf?t=1725879404188') format('truetype'); +} + +.iconfont { + font-family: "iconfont" !important; + font-size: 16px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-data4:before { + content: "\e60c"; +} + +.icon-data5:before { + content: "\e6be"; +} + +.icon-recharge-record:before { + content: "\e614"; +} + +.icon-recharge-rule:before { + content: "\e628"; +} + +.icon-user-profile:before { + content: "\e783"; +} + +.icon-achieve:before { + content: "\e616"; +} + +.icon-activity-level:before { + content: "\e61a"; +} + +.icon-skins:before { + content: "\e790"; +} + +.icon-data1:before { + content: "\e996"; +} + +.icon-data2:before { + content: "\e661"; +} + +.icon-data3:before { + content: "\e632"; +} + +.icon-data:before { + content: "\e64e"; +} + +.icon-game:before { + content: "\e6d0"; +} + +.icon-banner:before { + content: "\e613"; +} + +.icon-verification:before { + content: "\e601"; +} + +.icon-balance:before { + content: "\e6b9"; +} + +.icon-refund:before { + content: "\e7af"; +} + +.icon-wechat:before { + content: "\e681"; +} + +.icon-alipay:before { + content: "\e61e"; +} + +.icon-user:before { + content: "\e67f"; +} + +.icon-coupon:before { + content: "\e65a"; +} + +.icon-level:before { + content: "\e7d8"; +} + +.icon-activity:before { + content: "\e67b"; +} + +.icon-shop:before { + content: "\e60a"; +} + +.icon-member:before { + content: "\e640"; +} + +.icon-recharge:before { + content: "\e799"; +} + +.icon-marketing:before { + content: "\e765"; +} + +.icon-goods-sku:before { + content: "\e6d7"; +} + +.icon-store:before { + content: "\e62b"; +} + +.icon-goods-store:before { + content: "\e6c6"; +} + +.icon-storer:before { + content: "\e64a"; +} + +.icon-order:before { + content: "\e737"; +} + +.icon-permission:before { + content: "\e612"; +} + +.icon-goods:before { + content: "\e889"; +} + +.icon-menu:before { + content: "\e60e"; +} + +.icon-dict-type:before { + content: "\e652"; +} + +.icon-dictionary:before { + content: "\e600"; +} + +.icon-role:before { + content: "\e604"; +} + +.icon-fullscreen:before { + content: "\e8fa"; +} + +.icon-exit-fullscreen:before { + content: "\e8fb"; +} + +.icon-table:before { + content: "\e615"; +} + +.icon-test:before { + content: "\e610"; +} + +.icon-lang:before { + content: "\e649"; +} + +.icon-demo:before { + content: "\e6ee"; +} + +.icon-size:before { + content: "\e660"; +} + diff --git a/main/src/assets/fonts/iconfont.js b/main/src/assets/fonts/iconfont.js new file mode 100644 index 0000000..0c8b2d7 --- /dev/null +++ b/main/src/assets/fonts/iconfont.js @@ -0,0 +1 @@ +window._iconfont_svg_string_4425172='',(h=>{var c=(l=(l=document.getElementsByTagName("script"))[l.length-1]).getAttribute("data-injectcss"),l=l.getAttribute("data-disable-injectsvg");if(!l){var a,t,v,o,i,z=function(c,l){l.parentNode.insertBefore(c,l)};if(c&&!h.__iconfont__svg__cssinject__){h.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(c){console&&console.log(c)}}a=function(){var c,l=document.createElement("div");l.innerHTML=h._iconfont_svg_string_4425172,(l=l.getElementsByTagName("svg")[0])&&(l.setAttribute("aria-hidden","true"),l.style.position="absolute",l.style.width=0,l.style.height=0,l.style.overflow="hidden",l=l,(c=document.body).firstChild?z(l,c.firstChild):c.appendChild(l))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(a,0):(t=function(){document.removeEventListener("DOMContentLoaded",t,!1),a()},document.addEventListener("DOMContentLoaded",t,!1)):document.attachEvent&&(v=a,o=h.document,i=!1,s(),o.onreadystatechange=function(){"complete"==o.readyState&&(o.onreadystatechange=null,m())})}function m(){i||(i=!0,v())}function s(){try{o.documentElement.doScroll("left")}catch(c){return void setTimeout(s,50)}m()}})(window); \ No newline at end of file diff --git a/main/src/assets/fonts/iconfont.json b/main/src/assets/fonts/iconfont.json new file mode 100644 index 0000000..93b8c53 --- /dev/null +++ b/main/src/assets/fonts/iconfont.json @@ -0,0 +1,324 @@ +{ + "id": "4425172", + "name": "sub-vue", + "font_family": "iconfont", + "css_prefix_text": "icon-", + "description": "react/vue项目后台管理平台", + "glyphs": [ + { + "icon_id": "1218184", + "name": "销售明细", + "font_class": "data4", + "unicode": "e60c", + "unicode_decimal": 58892 + }, + { + "icon_id": "2230090", + "name": "销售明细", + "font_class": "data5", + "unicode": "e6be", + "unicode_decimal": 59070 + }, + { + "icon_id": "6882983", + "name": "充值记录", + "font_class": "recharge-record", + "unicode": "e614", + "unicode_decimal": 58900 + }, + { + "icon_id": "34611004", + "name": "充值规则", + "font_class": "recharge-rule", + "unicode": "e628", + "unicode_decimal": 58920 + }, + { + "icon_id": "15562252", + "name": "用户画像", + "font_class": "user-profile", + "unicode": "e783", + "unicode_decimal": 59267 + }, + { + "icon_id": "18747445", + "name": "成就", + "font_class": "achieve", + "unicode": "e616", + "unicode_decimal": 58902 + }, + { + "icon_id": "33848542", + "name": "我的-段位", + "font_class": "activity-level", + "unicode": "e61a", + "unicode_decimal": 58906 + }, + { + "icon_id": "20406821", + "name": "皮肤", + "font_class": "skins", + "unicode": "e790", + "unicode_decimal": 59280 + }, + { + "icon_id": "2214847", + "name": "个人中心-积分商城", + "font_class": "data1", + "unicode": "e996", + "unicode_decimal": 59798 + }, + { + "icon_id": "14233304", + "name": "价值投资", + "font_class": "data2", + "unicode": "e661", + "unicode_decimal": 58977 + }, + { + "icon_id": "23059951", + "name": "费用统计", + "font_class": "data3", + "unicode": "e632", + "unicode_decimal": 58930 + }, + { + "icon_id": "2199049", + "name": "数据报表", + "font_class": "data", + "unicode": "e64e", + "unicode_decimal": 58958 + }, + { + "icon_id": "36257316", + "name": "游戏管理", + "font_class": "game", + "unicode": "e6d0", + "unicode_decimal": 59088 + }, + { + "icon_id": "11913396", + "name": "banner", + "font_class": "banner", + "unicode": "e613", + "unicode_decimal": 58899 + }, + { + "icon_id": "35264323", + "name": "核销码核销", + "font_class": "verification", + "unicode": "e601", + "unicode_decimal": 58881 + }, + { + "icon_id": "6514128", + "name": "结算管理", + "font_class": "balance", + "unicode": "e6b9", + "unicode_decimal": 59065 + }, + { + "icon_id": "12025983", + "name": "退货退款", + "font_class": "refund", + "unicode": "e7af", + "unicode_decimal": 59311 + }, + { + "icon_id": "1207908", + "name": "wechat", + "font_class": "wechat", + "unicode": "e681", + "unicode_decimal": 59009 + }, + { + "icon_id": "27188513", + "name": "alipay", + "font_class": "alipay", + "unicode": "e61e", + "unicode_decimal": 58910 + }, + { + "icon_id": "11111017", + "name": "会员", + "font_class": "user", + "unicode": "e67f", + "unicode_decimal": 59007 + }, + { + "icon_id": "630079", + "name": "我的优惠券", + "font_class": "coupon", + "unicode": "e65a", + "unicode_decimal": 58970 + }, + { + "icon_id": "2046370", + "name": "会员等级", + "font_class": "level", + "unicode": "e7d8", + "unicode_decimal": 59352 + }, + { + "icon_id": "2569868", + "name": "活动", + "font_class": "activity", + "unicode": "e67b", + "unicode_decimal": 59003 + }, + { + "icon_id": "2681698", + "name": "门店", + "font_class": "shop", + "unicode": "e60a", + "unicode_decimal": 58890 + }, + { + "icon_id": "2811147", + "name": "会员", + "font_class": "member", + "unicode": "e640", + "unicode_decimal": 58944 + }, + { + "icon_id": "4560182", + "name": "会员充值", + "font_class": "recharge", + "unicode": "e799", + "unicode_decimal": 59289 + }, + { + "icon_id": "5880283", + "name": "营销", + "font_class": "marketing", + "unicode": "e765", + "unicode_decimal": 59237 + }, + { + "icon_id": "6982618", + "name": "商品规格", + "font_class": "goods-sku", + "unicode": "e6d7", + "unicode_decimal": 59095 + }, + { + "icon_id": "7307041", + "name": "商家入驻", + "font_class": "store", + "unicode": "e62b", + "unicode_decimal": 58923 + }, + { + "icon_id": "11639867", + "name": "小店商品库", + "font_class": "goods-store", + "unicode": "e6c6", + "unicode_decimal": 59078 + }, + { + "icon_id": "13872198", + "name": "商家列表", + "font_class": "storer", + "unicode": "e64a", + "unicode_decimal": 58954 + }, + { + "icon_id": "577335", + "name": "订单", + "font_class": "order", + "unicode": "e737", + "unicode_decimal": 59191 + }, + { + "icon_id": "736503", + "name": "权限", + "font_class": "permission", + "unicode": "e612", + "unicode_decimal": 58898 + }, + { + "icon_id": "1727271", + "name": "06商品-线性", + "font_class": "goods", + "unicode": "e889", + "unicode_decimal": 59529 + }, + { + "icon_id": "7587933", + "name": "菜单", + "font_class": "menu", + "unicode": "e60e", + "unicode_decimal": 58894 + }, + { + "icon_id": "12758820", + "name": "dictionary", + "font_class": "dict-type", + "unicode": "e652", + "unicode_decimal": 58962 + }, + { + "icon_id": "13768112", + "name": "dictionary", + "font_class": "dictionary", + "unicode": "e600", + "unicode_decimal": 58880 + }, + { + "icon_id": "37734141", + "name": "new-role", + "font_class": "role", + "unicode": "e604", + "unicode_decimal": 58884 + }, + { + "icon_id": "1727563", + "name": "327全屏", + "font_class": "fullscreen", + "unicode": "e8fa", + "unicode_decimal": 59642 + }, + { + "icon_id": "1727566", + "name": "328退出全屏", + "font_class": "exit-fullscreen", + "unicode": "e8fb", + "unicode_decimal": 59643 + }, + { + "icon_id": "11641852", + "name": "表格", + "font_class": "table", + "unicode": "e615", + "unicode_decimal": 58901 + }, + { + "icon_id": "20104468", + "name": "测试", + "font_class": "test", + "unicode": "e610", + "unicode_decimal": 58896 + }, + { + "icon_id": "26686335", + "name": "中英文", + "font_class": "lang", + "unicode": "e649", + "unicode_decimal": 58953 + }, + { + "icon_id": "30012547", + "name": "方案列表-默认", + "font_class": "demo", + "unicode": "e6ee", + "unicode_decimal": 59118 + }, + { + "icon_id": "37702310", + "name": "文字大小", + "font_class": "size", + "unicode": "e660", + "unicode_decimal": 58976 + } + ] +} diff --git a/main/src/assets/fonts/iconfont.ttf b/main/src/assets/fonts/iconfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..cdae45d24d8235cdd01c3cfbd21c76f7d2ded0ab GIT binary patch literal 16608 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 literal 0 HcmV?d00001 diff --git a/main/src/micro/actions.js b/main/src/micro/actions.js index 6ece597..256275d 100644 --- a/main/src/micro/actions.js +++ b/main/src/micro/actions.js @@ -1,11 +1,10 @@ import { initGlobalState } from 'qiankun'; import { reactive } from 'vue'; -const initialState = reactive({ +export const initialState = reactive({ token: null, - user: { - name: 'admin', - }, + user: {}, + roles: [], menus: [], auths: [], }); diff --git a/main/src/micro/app.js b/main/src/micro/app.js index 109f7ae..83958c2 100644 --- a/main/src/micro/app.js +++ b/main/src/micro/app.js @@ -3,77 +3,79 @@ import actions from './actions'; const { VITE_APP_SUB_OS, VITE_APP_SUB_ADMIN, VITE_APP_SUB_GAS } = import.meta.env; export const leftApps = [ - // { - // name: 'sub-operation-service', - // entry: VITE_APP_SUB_OS, - // activeRule: '/sub-operation-service/', - // title: '运营服务', - // icon: 'images/platform/icon-home.png', - // }, - // { - // name: 'sub-admin', - // entry: VITE_APP_SUB_ADMIN, - // activeRule: '/sub-admin/', - // title: '管理后台', - // icon: 'images/platform/icon-admin.png', - // }, - // { - // name: 'sub-app', - // entry: VITE_APP_SUB_ADMIN, - // activeRule: '/sub-app/', - // title: 'APP', - // icon: 'images/platform/icon-app.png', - // }, - // { - // name: 'sub-screen', - // entry: VITE_APP_SUB_ADMIN, - // activeRule: '/sub-screen/', - // title: '数据大屏', - // icon: 'images/platform/icon-screen.png', - // }, + { + name: 'sub-operation-service', + entry: VITE_APP_SUB_OS, + activeRule: '/sub-operation-service', + title: '运营服务', + icon: 'images/platform/icon-home.png', + }, + { + name: 'sub-admin', + entry: VITE_APP_SUB_ADMIN, + activeRule: '/sub-admin', + title: '管理后台', + icon: 'images/platform/icon-admin.png', + }, + { + name: 'sub-app', + entry: VITE_APP_SUB_ADMIN, + activeRule: '/sub-app', + title: 'APP', + icon: 'images/platform/icon-app.png', + }, + { + name: 'sub-screen', + entry: VITE_APP_SUB_ADMIN, + activeRule: '/sub-screen', + title: '数据大屏', + icon: 'images/platform/icon-screen.png', + }, ]; export const rightApps = [ { name: 'sub-government-affairs-service', entry: VITE_APP_SUB_GAS, - activeRule: '/sub-government-affairs-service/', + activeRule: '/sub-government-affairs-service', title: '政务服务', icon: 'images/platform/icon-home.png', }, - // { - // name: 'sub-government-admin', - // entry: VITE_APP_SUB_ADMIN, - // activeRule: '/sub-government-admin/', - // title: '管理后台', - // icon: 'images/platform/icon-admin.png', - // }, - // { - // name: 'sub-government-app', - // entry: VITE_APP_SUB_ADMIN, - // activeRule: '/sub-government-app/', - // title: 'APP', - // icon: 'images/platform/icon-app.png', - // }, - // { - // name: 'sub-government-screen', - // entry: VITE_APP_SUB_ADMIN, - // activeRule: '/sub-government-screen/', - // title: '数据大屏', - // icon: 'images/platform/icon-screen.png', - // }, + { + name: 'sub-government-admin', + entry: VITE_APP_SUB_ADMIN, + activeRule: '/sub-government-admin', + title: '管理后台', + icon: 'images/platform/icon-admin.png', + }, + { + name: 'sub-government-app', + entry: VITE_APP_SUB_ADMIN, + activeRule: '/sub-government-app', + title: 'APP', + icon: 'images/platform/icon-app.png', + }, + { + name: 'sub-government-screen', + entry: VITE_APP_SUB_ADMIN, + activeRule: '/sub-government-screen/', + title: '数据大屏', + icon: 'images/platform/icon-screen.png', + }, ]; export const defaultApps = [ - // { - // name: 'sub-admin', - // entry: VITE_APP_SUB_ADMIN, - // activeRule: '/sub-admin/', - // title: '后台管理系统', - // }, + { + name: 'sub-government-affairs-service', + entry: VITE_APP_SUB_GAS, + activeRule: '/sub-government-affairs-service', + title: '政务服务', + icon: 'images/platform/icon-home.png', + }, ]; -export const microApps = [...defaultApps, ...leftApps, ...rightApps]; +// export const microApps = [...defaultApps, ...leftApps, ...rightApps]; +export const microApps = [...defaultApps]; const apps = microApps.map((item) => { return { diff --git a/main/src/router/index.js b/main/src/router/index.js index 0ec93ba..00bc19a 100644 --- a/main/src/router/index.js +++ b/main/src/router/index.js @@ -27,6 +27,12 @@ export const constantRoutes = [ }, ], }, + // { + // path: '/sub-government-affairs-service/:pathMatch(.*)', + // name: 'sub-government-affairs-service', + // component: Layout, + // redirect: '/sub-government-affairs-service/home', + // }, ]; const router = createRouter({ diff --git a/main/src/styles/global.scss b/main/src/styles/global.scss index a74e175..3533878 100644 --- a/main/src/styles/global.scss +++ b/main/src/styles/global.scss @@ -1,6 +1,6 @@ // color $legacy-ie: 10; -$color-primary: #b10304; +$color-primary: #20a0ff; $color-success: #13ce66; $color-warning: #f7ba2a; $color-danger: #ff4949; @@ -20,7 +20,7 @@ $color-gray: #d3dce6; $color-gray-light: #e5e9f2; $color-gray-lighter: #eff2f7; $color-333: #333333; -$color-666: #333333; +$color-666: #666666; $color-999: #999999; $color-border-gray: #d1dbe5; $color-input-border: #dcdfe6; @@ -51,6 +51,11 @@ $color-types: ( #ff6d6d, #e64242, ), + gray: ( + $color-999, + #999999, + #9d9d9d, + ), ); @import 'utils/utils'; diff --git a/main/src/utils/axios.js b/main/src/utils/axios.js index 4268d50..1726b8b 100644 --- a/main/src/utils/axios.js +++ b/main/src/utils/axios.js @@ -3,7 +3,7 @@ * @Author: zenghua.wang * @Date: 2022-02-23 21:12:37 * @LastEditors: zenghua.wang - * @LastEditTime: 2025-02-13 14:46:34 + * @LastEditTime: 2025-02-17 09:55:20 */ import axios from 'axios'; import { ElNotification } from 'element-plus'; @@ -32,7 +32,7 @@ const errorHandler = async (error) => { switch (response.status) { case 401: case 403: - UserStore.logout(); + // UserStore.logout(); router.push('/login'); break; default: diff --git a/main/src/utils/permission.js b/main/src/utils/permission.js index fedd747..0b1d55c 100644 --- a/main/src/utils/permission.js +++ b/main/src/utils/permission.js @@ -24,7 +24,7 @@ router.beforeEach(async (to, from, next) => { const userStore = useUserStore(); const hasToken = userStore.hasToken(); - + console.log('main', hasToken); if (hasToken) { if (to.path === '/login') { next({ path: '/' }); diff --git a/main/src/views/index.vue b/main/src/views/index.vue index f903c5f..b0399ab 100644 --- a/main/src/views/index.vue +++ b/main/src/views/index.vue @@ -41,6 +41,7 @@ const gotoPage = (row) => { // curentApp, // }); // console.log('===', actions.getGlobalState('user')); + if (row.name !== 'sub-government-affairs-service') return; window.history.pushState({}, row.name, row.activeRule); }; diff --git a/main/src/views/login/index.vue b/main/src/views/login/index.vue index 8222173..a11cc1a 100644 --- a/main/src/views/login/index.vue +++ b/main/src/views/login/index.vue @@ -47,9 +47,9 @@ diff --git a/sub-government-affairs-service/src/views/resource/grid/index.vue b/sub-government-affairs-service/src/views/resource/grid/index.vue new file mode 100644 index 0000000..07d340c --- /dev/null +++ b/sub-government-affairs-service/src/views/resource/grid/index.vue @@ -0,0 +1,371 @@ + + diff --git a/sub-government-affairs-service/src/views/resource/map/index.vue b/sub-government-affairs-service/src/views/resource/map/index.vue deleted file mode 100644 index d498e93..0000000 --- a/sub-government-affairs-service/src/views/resource/map/index.vue +++ /dev/null @@ -1,6 +0,0 @@ - - diff --git a/sub-government-affairs-service/src/views/trace/breeding/coding/index.vue b/sub-government-affairs-service/src/views/trace/breeding/coding/index.vue index 9a7cda9..7da002a 100644 --- a/sub-government-affairs-service/src/views/trace/breeding/coding/index.vue +++ b/sub-government-affairs-service/src/views/trace/breeding/coding/index.vue @@ -62,7 +62,7 @@ import { GetEntityList, AddEntity, UpdateEntity, DeleteEntity, ImportEntity, Exp import CustomInfo from './info.vue'; import CustomQualityAdd from '../quality/form.vue'; -const { VITE_APP_SYSTEM_API } = import.meta.env; +const { VITE_APP_BASE_API } = import.meta.env; const app = useApp(); const UserStore = useUserStore(); const crudRef = ref(null); @@ -117,7 +117,7 @@ const state = reactive({ label: 'dictLabel', value: 'dictValue', }, - dicUrl: `${VITE_APP_SYSTEM_API}/system/dict/data/list?pageNum=1&pageSize=20&dictType=sys_product_type`, + dicUrl: `${VITE_APP_BASE_API}/system/dict/data/list?pageNum=1&pageSize=20&dictType=sys_product_type`, dicHeaders: { authorization: UserStore.token, }, @@ -146,7 +146,7 @@ const state = reactive({ label: 'dictLabel', value: 'dictValue', }, - dicUrl: `${VITE_APP_SYSTEM_API}/system/dict/data/list?pageNum=1&pageSize=20&dictType=sys_unit_type`, + dicUrl: `${VITE_APP_BASE_API}/system/dict/data/list?pageNum=1&pageSize=20&dictType=sys_unit_type`, dicHeaders: { authorization: UserStore.token, }, @@ -257,7 +257,7 @@ const state = reactive({ value: 'areaCode', children: 'areaChildVOS', }, - dicUrl: `${VITE_APP_SYSTEM_API}/system/area/region?areaCode=530000`, + dicUrl: `${VITE_APP_BASE_API}/system/area/region?areaCode=530000`, dicHeaders: { authorization: UserStore.token, }, diff --git a/sub-government-affairs-service/vite.config.js b/sub-government-affairs-service/vite.config.js index e09e110..39091db 100644 --- a/sub-government-affairs-service/vite.config.js +++ b/sub-government-affairs-service/vite.config.js @@ -3,7 +3,7 @@ * @Author: zenghua.wang * @Date: 2022-09-18 21:24:29 * @LastEditors: zenghua.wang - * @LastEditTime: 2025-02-13 15:47:00 + * @LastEditTime: 2025-02-17 10:58:12 */ import { defineConfig, loadEnv } from 'vite'; @@ -34,11 +34,35 @@ export default defineConfig(({ command, mode }) => { VITE_APP_SYSTEM_URL, } = loadEnv(mode, process.cwd()); const config = { - base: './', + base: '/sub-government-affairs-service/', build: { target: 'ESNext', outDir: 'dist', minify: 'terser', + // terserOptions: { + // compress: { + // drop_console: true, + // drop_debugger: true, + // pure_funcs: ['console.log'], + // }, + // output: { + // comments: true, + // }, + // }, + // reportCompressedSize: false, + // chunkSizeWarningLimit: 2000, + // rollupOptions: { + // output: { + // manualChunks(id) { + // if (id.includes('node_modules')) { + // return id.toString().split('node_modules/')[1].split('/')[1].toString(); + // } + // }, + // chunkFileNames: 'assets/js/[name]-[hash].js', + // entryFileNames: 'assets/js/[name]-[hash].js', + // assetFileNames: 'assets/[ext]/[name]-[hash].[ext]', + // }, + // }, }, server: { host: '0.0.0.0',