sdJZx~I$^zLXeWv1P(ntFLWSU0P`Z
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
diff --git a/main/src/assets/fonts/iconfont.woff2 b/main/src/assets/fonts/iconfont.woff2
deleted file mode 100644
index 90756070cd156c3b195fd02069340c040c498148..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 12320
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
GPXGX*;of`z
diff --git a/main/src/assets/svgs/tree.svg b/main/src/assets/svgs/tree.svg
deleted file mode 100644
index dd4b7dd..0000000
--- a/main/src/assets/svgs/tree.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/main/src/assets/svgs/wechat.svg b/main/src/assets/svgs/wechat.svg
deleted file mode 100644
index c586e55..0000000
--- a/main/src/assets/svgs/wechat.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/main/src/components/custom-import-excel/index.vue b/main/src/components/custom-import-excel/index.vue
index 3d86bea..7abd779 100644
--- a/main/src/components/custom-import-excel/index.vue
+++ b/main/src/components/custom-import-excel/index.vue
@@ -35,7 +35,7 @@ const props = defineProps({
default: '提示:导入前请先下载模板填写信息,然后再导入!',
},
templateUrl: {
- type: String,
+ type: [String, URL],
default: '',
},
// options: {
diff --git a/main/src/config/index.js b/main/src/config/index.js
index 0e4f584..3ecdd74 100644
--- a/main/src/config/index.js
+++ b/main/src/config/index.js
@@ -7,4 +7,16 @@ export const GenKey = (key, prefix = `${VITE_APP_NAME}_`) => {
export const CONSTANTS = {
PREFIX: `${VITE_APP_NAME}_`,
PRIMARY: '#409eff',
+ // 密钥对生成 http://web.chacuo.net/netrsakeypair
+ JS_PUBLICKEY:
+ 'MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKoR8mX0rGKLqzcWmOzbfj64K8ZIgOdH\n' + 'nzkXSOVOZbFu/TJhZ7rFAN+eaGkl3C4buccQd/EjEsj9ir7ijT7h96MCAwEAAQ==',
+ JS_PRIVATEKEY:
+ 'MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAqhHyZfSsYourNxaY\n' +
+ '7Nt+PrgrxkiA50efORdI5U5lsW79MmFnusUA355oaSXcLhu5xxB38SMSyP2KvuKN\n' +
+ 'PuH3owIDAQABAkAfoiLyL+Z4lf4Myxk6xUDgLaWGximj20CUf+5BKKnlrK+Ed8gA\n' +
+ 'kM0HqoTt2UZwA5E2MzS4EI2gjfQhz5X28uqxAiEA3wNFxfrCZlSZHb0gn2zDpWow\n' +
+ 'cSxQAgiCstxGUoOqlW8CIQDDOerGKH5OmCJ4Z21v+F25WaHYPxCFMvwxpcw99Ecv\n' +
+ 'DQIgIdhDTIqD2jfYjPTY8Jj3EDGPbH2HHuffvflECt3Ek60CIQCFRlCkHpi7hthh\n' +
+ 'YhovyloRYsM+IS9h/0BzlEAuO0ktMQIgSPT3aFAgJYwKpqRYKlLDVcflZFCKY7u3\n' +
+ 'UP8iWi1Qw0Y=',
};
diff --git a/main/src/main.js b/main/src/main.js
index eaa2e9c..9105699 100644
--- a/main/src/main.js
+++ b/main/src/main.js
@@ -4,7 +4,7 @@ import App from './App.vue';
import router from './router';
import pinia from './store';
import ElementPlus from 'element-plus';
-// import 'element-plus/dist/index.css';
+import 'element-plus/dist/index.css';
import { registerGlobalMicroApps } from './micro';
import { registerElIcons } from './plugins/icon';
import './utils/permission';
diff --git a/main/src/micro/actions.js b/main/src/micro/actions.js
index 752c940..6ece597 100644
--- a/main/src/micro/actions.js
+++ b/main/src/micro/actions.js
@@ -2,6 +2,7 @@ import { initGlobalState } from 'qiankun';
import { reactive } from 'vue';
const initialState = reactive({
+ token: null,
user: {
name: 'admin',
},
diff --git a/main/src/micro/app.js b/main/src/micro/app.js
index 287eb5d..109f7ae 100644
--- a/main/src/micro/app.js
+++ b/main/src/micro/app.js
@@ -10,13 +10,13 @@ export const leftApps = [
// 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-admin',
+ // entry: VITE_APP_SUB_ADMIN,
+ // activeRule: '/sub-admin/',
+ // title: '管理后台',
+ // icon: 'images/platform/icon-admin.png',
+ // },
// {
// name: 'sub-app',
// entry: VITE_APP_SUB_ADMIN,
@@ -81,7 +81,7 @@ const apps = microApps.map((item) => {
container: '#app',
props: {
routerBase: item.activeRule,
- getGlobalState: actions.getGlobalState,
+ globalState: actions.getGlobalState(),
},
};
});
diff --git a/main/src/store/modules/setting.js b/main/src/store/modules/setting.js
index b12e32d..35aef83 100644
--- a/main/src/store/modules/setting.js
+++ b/main/src/store/modules/setting.js
@@ -1,64 +1,12 @@
import { defineStore } from 'pinia';
-import { CONSTANTS } from '@/config';
export const useSettingStore = defineStore({
id: 'settingStore',
state: () => ({
- // menu 是否收缩
- isCollapse: true,
- //
- withoutAnimation: false,
- device: 'desktop',
- // 刷新当前页
isReload: true,
- // 主题设置
- themeConfig: {
- // 显示设置
- showSetting: false,
- // 菜单展示模式 默认 vertical horizontal / vertical /columns
- mode: 'vertical',
- // tagsView 是否展示 默认展示
- showTag: true,
- // 页脚
- footer: true,
- // 深色模式 切换暗黑模式
- isDark: false,
- // 显示侧边栏Logo
- showLogo: true,
- // 主题颜色
- primary: CONSTANTS.PRIMARY,
- // element组件大小
- globalComSize: 'default',
- // 是否只保持一个子菜单的展开
- uniqueOpened: true,
- // 固定header
- fixedHeader: true,
- // 灰色模式
- gray: false,
- // 色弱模式
- weak: false,
- },
}),
getters: {},
actions: {
- // 设置主题
- setThemeConfig({ key, val }) {
- this.themeConfig[key] = val;
- },
- // 切换 Collapse
- setCollapse(value) {
- this.isCollapse = value;
- this.withoutAnimation = false;
- },
- // 关闭侧边栏
- closeSideBar({ withoutAnimation }) {
- this.isCollapse = false;
- this.withoutAnimation = withoutAnimation;
- },
- toggleDevice(device) {
- this.device = device;
- },
- // 刷新
setReload() {
this.isReload = false;
setTimeout(() => {
diff --git a/main/src/store/modules/tagsView.js b/main/src/store/modules/tagsView.js
deleted file mode 100644
index 627c84a..0000000
--- a/main/src/store/modules/tagsView.js
+++ /dev/null
@@ -1,104 +0,0 @@
-import { defineStore } from 'pinia';
-import router from '@/router';
-
-export const useTagsViewStore = defineStore({
- id: 'tagsViewStore',
- state: () => ({
- activeTabsValue: '/home',
- visitedViews: [],
- cachedViews: [],
- }),
- getters: {},
- actions: {
- setTabsMenuValue(val) {
- this.activeTabsValue = val;
- },
- addView(view) {
- this.addVisitedView(view);
- },
- removeView(routes) {
- return new Promise((resolve) => {
- this.visitedViews = this.visitedViews.filter((item) => !routes.includes(item.path));
- resolve(null);
- });
- },
- addVisitedView(view) {
- this.setTabsMenuValue(view.path);
- if (this.visitedViews.some((v) => v.path === view.path)) return;
-
- this.visitedViews.push(
- Object.assign({}, view, {
- title: view.meta.title || 'no-name',
- })
- );
- if (view.meta.keepAlive) {
- this.cachedViews.push(view.name);
- }
- },
- delView(activeTabPath) {
- return new Promise((resolve) => {
- this.delVisitedView(activeTabPath);
- this.delCachedView(activeTabPath);
- resolve({
- visitedViews: [...this.visitedViews],
- cachedViews: [...this.cachedViews],
- });
- });
- },
- toLastView(activeTabPath) {
- const index = this.visitedViews.findIndex((item) => item.path === activeTabPath);
- const nextTab = this.visitedViews[index + 1] || this.visitedViews[index - 1];
- if (!nextTab) return;
- router.push(nextTab.path);
- this.addVisitedView(nextTab);
- },
- delVisitedView(path) {
- return new Promise((resolve) => {
- this.visitedViews = this.visitedViews.filter((v) => {
- return v.path !== path || v.meta.affix;
- });
- this.cachedViews = this.cachedViews.filter((v) => {
- return v.path !== path || v.meta.affix;
- });
- resolve([...this.visitedViews]);
- });
- },
- delCachedView(view) {
- return new Promise((resolve) => {
- const index = this.cachedViews.indexOf(view.name);
- index > -1 && this.cachedViews.splice(index, 1);
- resolve([...this.cachedViews]);
- });
- },
- clearVisitedView() {
- this.delAllViews();
- },
- delAllViews() {
- return new Promise((resolve) => {
- this.visitedViews = this.visitedViews.filter((v) => v.meta.affix);
- this.cachedViews = this.visitedViews.filter((v) => v.meta.affix);
- resolve([...this.visitedViews]);
- });
- },
- delOtherViews(path) {
- this.visitedViews = this.visitedViews.filter((item) => {
- return item.path === path || item.meta.affix;
- });
- this.cachedViews = this.visitedViews.filter((item) => {
- return item.path === path || item.meta.affix;
- });
- },
- goHome() {
- this.activeTabsValue = '/home';
- router.push({ path: '/home' });
- },
- updateVisitedView(view) {
- for (let v of this.visitedViews) {
- if (v.path === view.path) {
- v = Object.assign(v, view);
- break;
- }
- }
- },
- },
-});
diff --git a/main/src/store/modules/user.js b/main/src/store/modules/user.js
index 8e96ab0..0f1d48e 100644
--- a/main/src/store/modules/user.js
+++ b/main/src/store/modules/user.js
@@ -3,7 +3,7 @@ import { GenKey } from '@/config';
import { isEmpty, encode, decode } from '@/utils';
export const useUserStore = defineStore({
- id: GenKey('USER_STATE'),
+ id: GenKey('user_store'),
state: () => ({
token: null,
userInfo: {},
@@ -52,14 +52,14 @@ export const useUserStore = defineStore({
this.currentOrg = null;
this.orgList = [];
this.menus = [];
- localStorage.removeItem(GenKey('USER_STATE'));
+ localStorage.removeItem(GenKey('user_store'));
},
clear() {
- localStorage.removeItem(GenKey('USER_STATE'));
+ localStorage.removeItem(GenKey('user_store'));
},
},
persist: {
- key: GenKey('USER_STATE'),
+ key: GenKey('user_store'),
storage: window.localStorage,
},
});
diff --git a/main/src/styles/common/base.scss b/main/src/styles/common/base.scss
index 0873dda..366b369 100644
--- a/main/src/styles/common/base.scss
+++ b/main/src/styles/common/base.scss
@@ -77,7 +77,8 @@ body {
width: 100%;
height: 100%;
font-size: 12px;
- font-family: 'Source Han Sans CN, Source Han Sans CN-Regular', 'Helvetica Neue', Helvetica, Arial, 'PingFang SC', 'Hiragino Sans GB', 'Heiti SC', 'Microsoft YaHei', 'WenQuanYi Micro Hei', sans-serif;
+ font-family: 'Source Han Sans CN, Source Han Sans CN-Regular', 'Helvetica Neue', Helvetica, Arial, 'PingFang SC', 'Hiragino Sans GB', 'Heiti SC',
+ 'Microsoft YaHei', 'WenQuanYi Micro Hei', sans-serif;
color: #323232;
// background: #000;
diff --git a/main/src/styles/global.scss b/main/src/styles/global.scss
index 42cb957..a74e175 100644
--- a/main/src/styles/global.scss
+++ b/main/src/styles/global.scss
@@ -29,28 +29,28 @@ $color-types: (
primary: (
$color-primary,
#4db3ff,
- #1d90e6
+ #1d90e6,
),
info: (
$color-info,
#73ccff,
- #48ace6
+ #48ace6,
),
success: (
$color-success,
#42d885,
- #11b95c
+ #11b95c,
),
warning: (
$color-warning,
#f9c855,
- #dea726
+ #dea726,
),
danger: (
$color-danger,
#ff6d6d,
- #e64242
- )
+ #e64242,
+ ),
);
-@import "utils/utils";
+@import 'utils/utils';
diff --git a/main/src/utils/axios.js b/main/src/utils/axios.js
index 5a3f787..4268d50 100644
--- a/main/src/utils/axios.js
+++ b/main/src/utils/axios.js
@@ -2,12 +2,13 @@
* @Descripttion:
* @Author: zenghua.wang
* @Date: 2022-02-23 21:12:37
- * @LastEditors: wzh 1048523306@qq.com
- * @LastEditTime: 2024-12-18 15:10:48
+ * @LastEditors: zenghua.wang
+ * @LastEditTime: 2025-02-13 14:46:34
*/
import axios from 'axios';
import { ElNotification } from 'element-plus';
import router from '@/router';
+import { isEmpty } from '@/utils';
import { useUserStore } from '@/store/modules/user';
const { VITE_APP_BASE_API, VITE_APP_UPLOAD_API } = import.meta.env;
@@ -45,14 +46,10 @@ const errorHandler = async (error) => {
*/
publicAxios.interceptors.request.use(async (config) => {
const UserStore = useUserStore();
- config.baseURL = config?.isUpload ? VITE_APP_UPLOAD_API : config?.isLocal ? '' : VITE_APP_BASE_API;
if (UserStore.hasToken()) {
- config.headers['fairies-auth-token'] = UserStore.token;
+ config.headers['authorization'] = config.headers['authorization'] ?? UserStore.token;
config.headers['cache-control'] = 'no-cache';
config.headers.Pragma = 'no-cache';
- if (config?.isUpload) {
- config.headers['Content-Type'] = config.uploadType;
- }
}
if (config.method === 'POST' || config.method === 'DELETE') {
config.headers.Accept = 'application/json';
@@ -89,6 +86,11 @@ publicAxios.interceptors.response.use((response) => {
if (config?.responseType) {
return response;
}
+ const token = response?.headers['authorization'];
+ if (!isEmpty(token)) {
+ const UserStore = useUserStore();
+ UserStore.setToken(token);
+ }
const result = formatResult(response);
if (result) {
return result;
diff --git a/main/src/utils/echarts.js b/main/src/utils/echarts.js
index 9b40020..72ceb57 100644
--- a/main/src/utils/echarts.js
+++ b/main/src/utils/echarts.js
@@ -19,9 +19,7 @@ import {
GraphicComponent,
} from 'echarts/components';
-// TODO 如果想换成SVG渲染,就导出SVGRenderer,
-// 并且放到 echarts.use 里,注释掉 CanvasRenderer
-import { /*SVGRenderer*/ CanvasRenderer } from 'echarts/renderers';
+import { CanvasRenderer } from 'echarts/renderers';
echarts.use([
LegendComponent,
@@ -36,7 +34,6 @@ echarts.use([
PieChart,
MapChart,
RadarChart,
- // TODO 因为要兼容Online图表自适应打印,所以改成 CanvasRenderer,可能会模糊
CanvasRenderer,
PictorialBarChart,
RadarComponent,
diff --git a/main/src/utils/index.js b/main/src/utils/index.js
index 912d447..510ab02 100644
--- a/main/src/utils/index.js
+++ b/main/src/utils/index.js
@@ -3,44 +3,13 @@
* @Author: zenghua.wang
* @Date: 2022-02-23 21:12:37
* @LastEditors: zenghua.wang
- * @LastEditTime: 2025-02-10 14:47:12
+ * @LastEditTime: 2025-02-13 11:28:46
*/
import lodash from 'lodash';
-import dayjs from 'dayjs';
import { Base64 } from 'js-base64';
+import JSEncrypt from 'jsencrypt/bin/jsencrypt.min';
+import { CONSTANTS } from '@/config';
-/**
- * @Title 防抖:指在一定时间内,多次触发同一个事件,只执行最后一次操作
- * @param {*} fn
- * @param {*} delay
- * @returns
- */
-export function debounce(fn, delay) {
- let timer = null;
- return function (...args) {
- clearTimeout(timer);
- timer = setTimeout(() => {
- fn.apply(this, args);
- }, delay);
- };
-}
-/**
- * @Title 节流:指在一定时间内,多次触发同一个事件,只执行第一次操作
- * @param {*} fn
- * @param {*} delay
- * @returns
- */
-export function throttle(fn, delay) {
- let timer = null;
- return function (...args) {
- if (!timer) {
- timer = setTimeout(() => {
- fn.apply(this, args);
- timer = null;
- }, delay);
- }
- };
-}
/**
* @Title 判断是否 empty,返回ture
* @param {*} val:null 'null' undefined 'undefined' 0 '0' "" 返回true
@@ -79,78 +48,6 @@ export const setPx = (val) => {
}
return val;
};
-/**
- * @Tilte 设置属性默认值
- * @param {*} options
- * @param {*} prop
- * @param {*} defaultVal
- * @returns
- */
-export const setDefaultOption = (options, prop, defaultVal) => {
- return options[prop] === undefined ? defaultVal : options.prop;
-};
-/**
- * @Title 设置字典值
- * @param {*} columns
- * @param {*} key
- * @param {*} data
- * @returns
- */
-export const setDicData = (columns, key, data = []) => {
- if (isEmpty(data)) return;
- const len = columns.length;
- for (let i = 0; i < len; i++) {
- if (columns[i]?.prop === key) {
- columns[i]['dicData'] = data;
- break;
- }
- }
-};
-/**
- * @Title 求字段lable
- * @param {*} tree
- * @returns
- */
-export const setDicLabel = (dicData, value) => {
- let label = value;
- if (isEmpty(dicData)) return label;
- const len = dicData.length;
- for (let i = 0; i < len; i++) {
- if (dicData[i]?.value === value) {
- label = dicData[i].label;
- break;
- }
- }
- return label;
-};
-/**
- * @Title 数组交集
- * @param {*} arr1
- * @param {*} arr2
- * @returns
- */
-export const intersectionArray = (arr1 = [], arr2 = []) => {
- return arr1.filter((item) => arr2.includes(item));
-};
-/**
- * @Title 数组并集
- * @param {*} arr1
- * @param {*} arr2
- * @returns
- */
-export const unionArray = (arr1 = [], arr2 = []) => {
- return Array.from(new Set([...arr1, ...arr2]));
-};
-/**
- * @Title 数组差集
- * @param {*} arr1
- * @param {*} arr2
- * @returns
- */
-export const differenceArray = (arr1 = [], arr2 = []) => {
- const s = new Set(arr2);
- return arr1.filter((x) => !s.has(x));
-};
/**
* @Title 加密
* @param {*} n
@@ -195,6 +92,29 @@ export const decode = (e, flag = false) => {
}
return e;
};
+
+/**
+ * @Title 加密
+ * @param {*} txt
+ * @returns
+ */
+export const encrypt = (txt) => {
+ const encryptor = new JSEncrypt();
+ encryptor.setPublicKey(CONSTANTS.JS_PUBLICKEY); // 设置公钥
+ return encryptor.encrypt(txt); // 对数据进行加密
+};
+
+/**
+ * @Title 解密
+ * @param {*} txt
+ * @returns
+ */
+export const decrypt = (txt) => {
+ const encryptor = new JSEncrypt();
+ encryptor.setPrivateKey(CONSTANTS.JS_PRIVATEKEY); // 设置私钥
+ return encryptor.decrypt(txt); // 对数据进行解密
+};
+
/**
* @Title 图片转base64
* @param {*} file
@@ -293,166 +213,3 @@ export const obj2Param = (json) => {
export const getAssetsFile = (url) => {
return new URL(`../assets/${url}`, import.meta.url);
};
-/**
- * @Title: 下载文件
- * @param {void} url:
- * @param {void} fileName:
- * @param {void} fileType:
- * @return {void}
- */
-export const downloadFile = async (url, fileName, fileType) => {
- let blob = null;
- try {
- switch (fileType) {
- case 'image': {
- const img = new Image();
- img.crossOrigin = 'Anonymous';
- img.src = url;
- await new Promise((resolve, reject) => {
- img.onload = resolve;
- img.onerror = reject;
- });
- const canvas = document.createElement('canvas');
- canvas.width = img.width;
- canvas.height = img.height;
- const ctx = canvas.getContext('2d');
- ctx.drawImage(img, 0, 0);
- blob = await new Promise((resolve) => {
- canvas.toBlob(resolve, 'image/jpeg');
- });
- break;
- }
- case 'blob': {
- blob = new Blob([url]);
- break;
- }
- }
- if ('download' in document.createElement('a')) {
- const elink = document.createElement('a');
- elink.download = fileName;
- elink.style.display = 'none';
- elink.href = blob ? URL.createObjectURL(blob) : url;
- document.body.appendChild(elink);
- elink.click();
- blob && URL.revokeObjectURL(elink.href);
- document.body.removeChild(elink);
- } else {
- navigator.msSaveBlob(blob, fileName);
- }
- } catch (error) {
- console.error('下载出错:', error);
- }
-};
-/**
- * @Title 模拟休眠
- * @param {*} duration
- * @returns
- */
-export const sleep = (duration = 0) =>
- new Promise((resolve) => {
- setTimeout(resolve, duration);
- });
-/**
- * @Title 创建id
- * @param {*} prefix
- * @returns
- */
-export const createId = (prefix) => {
- const val = Date.now() + Math.ceil(Math.random() * 99999);
- return isEmpty(prefix) ? val : prefix + '-' + val;
-};
-/**
- * @Title 生成数据
- * @param {*} duration
- * @returns
- */
-export const mockData = (item = {}, len = 1) => {
- const list = [];
- for (let i = 0; i < len; i++) {
- let temp = { ...item, id: createId() };
- list.push(temp);
- }
- return list;
-};
-/**
- * @Title 日期格式化
- * @param {*} date
- * @param {*} format
- * @returns
- */
-export const dateFormat = (datetime, formater = 'YYYY-MM-DD hh:mm:ss') => {
- if (datetime instanceof Date || datetime) {
- return dayjs(datetime).format(formater);
- } else {
- return null;
- }
-};
-/**
- * @Title 字符串转日期
- * @param {*} str
- * @returns
- */
-export const toDate = (str) => {
- return !isEmpty(str) ? dayjs(str) : dayjs();
-};
-/**
- * @Title 字符串转日期
- * @param {*} str
- * @returns
- */
-export const getDate = (num, type, formater = 'YYYY-MM-DD', start = true) => {
- const date = dayjs().subtract(num, type);
- return start ? date.startOf(type).format(formater) : date.endOf(type).format(formater);
-};
-/**
- * @Title: 获取时间差
- * @param start
- * @param end
- * @param type
- * @returns
- */
-export const getDiffTime = (start, end, type) => {
- const startTime = dayjs(start);
- const endTime = dayjs(end);
- const duration = endTime.diff(startTime);
- let diff = 0;
- switch (type) {
- case 'DD': {
- diff = duration / (1000 * 60 * 60 * 24);
- break;
- }
- case 'HH': {
- diff = duration / (1000 * 60 * 60);
- break;
- }
- case 'mm': {
- diff = duration / (1000 * 60);
- break;
- }
- }
- return Math.round(diff);
-};
-/**
- * @Title: 开始日期
- * @param last
- * @param type
- * @param formater
- * @returns
- */
-export const startDate = (num, type = 'month', formater = 'YYYY-MM-DD HH:mm:ss') => {
- if (num === 'now') return dayjs().format(formater);
- if (typeof num === 'string') return dayjs(num).startOf(type).format(formater);
- return num === 0 ? dayjs().startOf(type).format(formater) : dayjs().subtract(num, type).startOf(type).format(formater);
-};
-/**
- * @Title: 结束日期
- * @param num
- * @param type
- * @param formater
- * @returns
- */
-export const endDate = (num = 0, type = 'month', formater = 'YYYY-MM-DD HH:mm:ss') => {
- if (num === 'now') return dayjs().format(formater);
- if (typeof num === 'string') return dayjs(num).endOf(type).format(formater);
- return num === 0 ? dayjs().endOf(type).format(formater) : dayjs().subtract(num, type).endOf(type).format(formater);
-};
diff --git a/main/src/utils/permission.js b/main/src/utils/permission.js
index 8501768..fedd747 100644
--- a/main/src/utils/permission.js
+++ b/main/src/utils/permission.js
@@ -23,7 +23,7 @@ router.beforeEach(async (to, from, next) => {
}
const userStore = useUserStore();
- const hasToken = true; //userStore.hasToken();
+ const hasToken = userStore.hasToken();
if (hasToken) {
if (to.path === '/login') {
@@ -36,7 +36,6 @@ router.beforeEach(async (to, from, next) => {
accessRoutes.forEach((item) => router.addRoute(item));
next({ ...to, replace: true });
} else {
- // 子应用跳转回主应用时判断#app是否还有渲染的子应用,如若没有则重新渲染主应用
if (from.path.includes('/sub') && !to.path.includes('/sub')) {
window.location.reload();
return;
diff --git a/main/src/utils/validate.js b/main/src/utils/validate.js
index a437688..d2413e2 100644
--- a/main/src/utils/validate.js
+++ b/main/src/utils/validate.js
@@ -1,3 +1,11 @@
+/**
+ * @Description:
+ * @Author: zenghua.wang
+ * @Date: 2022-01-26 21:55:58
+ * @LastEditors: zenghua.wang
+ * @LastEditTime: 2024-04-14 11:03:08
+ */
+
/**
* 路径匹配器
* @param {string} pattern
diff --git a/main/src/views/index.vue b/main/src/views/index.vue
index 5977d02..f903c5f 100644
--- a/main/src/views/index.vue
+++ b/main/src/views/index.vue
@@ -40,7 +40,7 @@ const gotoPage = (row) => {
// actions.setGlobalState({
// curentApp,
// });
- console.log('===', actions.getGlobalState('user'));
+ // console.log('===', actions.getGlobalState('user'));
window.history.pushState({}, row.name, row.activeRule);
};
@@ -50,8 +50,7 @@ const gotoPage = (row) => {
height: 100%;
background-image: url('@/assets/images/platform/bg.png');
background-size: cover;
- background-repeat: no-repeat;
- background-position: center;
+ // background-position: center;
&-title {
width: 1200px;
diff --git a/main/src/views/login/index.vue b/main/src/views/login/index.vue
index 87e5468..8222173 100644
--- a/main/src/views/login/index.vue
+++ b/main/src/views/login/index.vue
@@ -1,5 +1,206 @@
- 登录
+
+
+ 数字农业产业管理平台
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
![]()
+
+
+ 记住密码
+
+
+ 登 录
+ 登 录 中...
+
+
+
+
+
+
+
-
+
+
diff --git a/main/yarn.lock b/main/yarn.lock
index c4f81d6..7cefbf8 100644
--- a/main/yarn.lock
+++ b/main/yarn.lock
@@ -3862,6 +3862,11 @@ js-yaml@^4.1.0:
dependencies:
argparse "^2.0.1"
+jsencrypt@^3.3.2:
+ version "3.3.2"
+ resolved "https://registry.npmmirror.com/jsencrypt/-/jsencrypt-3.3.2.tgz#b0f1a2278810c7ba1cb8957af11195354622df7c"
+ integrity sha512-arQR1R1ESGdAxY7ZheWr12wCaF2yF47v5qpB76TtV64H1pyGudk9Hvw8Y9tb/FiTIaaTRUyaSnm5T/Y53Ghm/A==
+
jsesc@^3.0.2:
version "3.1.0"
resolved "https://registry.npmmirror.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d"
diff --git a/sub-admin/src/views/login.vue b/sub-admin/src/views/login.vue
index e339322..80dfaf1 100644
--- a/sub-admin/src/views/login.vue
+++ b/sub-admin/src/views/login.vue
@@ -12,12 +12,12 @@
-
+
-
![]()
+
记住密码
@@ -26,15 +26,15 @@
登 录
登 录 中...
-