Commit 4c5dbe03 authored by huangjie122's avatar huangjie122

Merge branch 'master' of http://47.105.106.177:66/root/sup-server

parents f82abb44 b9b3cefe
......@@ -14949,29 +14949,6 @@
"webpack-merge": "^5.7.3",
"webpack-virtual-modules": "^0.4.2",
"whatwg-fetch": "^3.6.2"
},
"dependencies": {
"@vue/vue-loader-v15": {
"version": "npm:vue-loader@15.10.0",
"resolved": "https://registry.npmmirror.com/vue-loader/-/vue-loader-15.10.0.tgz",
"integrity": "sha512-VU6tuO8eKajrFeBzMssFUP9SvakEeeSi1BxdTH5o3+1yUyrldp8IERkSdXlMI2t4kxF2sqYUDsQY+WJBxzBmZg==",
"dev": true,
"requires": {
"@vue/component-compiler-utils": "^3.1.0",
"hash-sum": "^1.0.2",
"loader-utils": "^1.1.0",
"vue-hot-reload-api": "^2.3.0",
"vue-style-loader": "^4.1.0"
},
"dependencies": {
"hash-sum": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/hash-sum/-/hash-sum-1.0.2.tgz",
"integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==",
"dev": true
}
}
}
}
},
"@vue/cli-shared-utils": {
......@@ -15121,6 +15098,27 @@
}
}
},
"@vue/vue-loader-v15": {
"version": "npm:vue-loader@15.10.0",
"resolved": "https://registry.npmmirror.com/vue-loader/-/vue-loader-15.10.0.tgz",
"integrity": "sha512-VU6tuO8eKajrFeBzMssFUP9SvakEeeSi1BxdTH5o3+1yUyrldp8IERkSdXlMI2t4kxF2sqYUDsQY+WJBxzBmZg==",
"dev": true,
"requires": {
"@vue/component-compiler-utils": "^3.1.0",
"hash-sum": "^1.0.2",
"loader-utils": "^1.1.0",
"vue-hot-reload-api": "^2.3.0",
"vue-style-loader": "^4.1.0"
},
"dependencies": {
"hash-sum": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/hash-sum/-/hash-sum-1.0.2.tgz",
"integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==",
"dev": true
}
}
},
"@vue/web-component-wrapper": {
"version": "1.3.0",
"resolved": "https://registry.npmmirror.com/@vue/web-component-wrapper/-/web-component-wrapper-1.3.0.tgz",
......@@ -15465,6 +15463,11 @@
"babel-runtime": "6.x"
}
},
"asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz",
"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
},
"at-least-node": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/at-least-node/-/at-least-node-1.0.0.tgz",
......@@ -15485,6 +15488,16 @@
"postcss-value-parser": "^4.2.0"
}
},
"axios": {
"version": "1.1.3",
"resolved": "https://registry.npmmirror.com/axios/-/axios-1.1.3.tgz",
"integrity": "sha512-00tXVRwKx/FZr/IDVFt4C+f9FYairX517WoGCL6dpOntqLkZofjhu43F/Xl44UOpqa+9sLFDrG/XAnFsUYgkDA==",
"requires": {
"follow-redirects": "^1.15.0",
"form-data": "^4.0.0",
"proxy-from-env": "^1.1.0"
}
},
"babel-helper-vue-jsx-merge-props": {
"version": "2.0.3",
"resolved": "https://registry.npmmirror.com/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-2.0.3.tgz",
......@@ -16439,6 +16452,14 @@
"integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==",
"dev": true
},
"combined-stream": {
"version": "1.0.8",
"resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz",
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
"requires": {
"delayed-stream": "~1.0.0"
}
},
"commander": {
"version": "8.3.0",
"resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz",
......@@ -17201,6 +17222,11 @@
"object-keys": "^1.1.1"
}
},
"delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="
},
"depd": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/depd/-/depd-2.0.0.tgz",
......@@ -17932,8 +17958,17 @@
"follow-redirects": {
"version": "1.15.2",
"resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.2.tgz",
"integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==",
"dev": true
"integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA=="
},
"form-data": {
"version": "4.0.0",
"resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.0.tgz",
"integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
"requires": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.8",
"mime-types": "^2.1.12"
}
},
"forwarded": {
"version": "0.2.0",
......@@ -19675,14 +19710,12 @@
"mime-db": {
"version": "1.52.0",
"resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz",
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
"dev": true
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
},
"mime-types": {
"version": "2.1.35",
"resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz",
"integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
"dev": true,
"requires": {
"mime-db": "1.52.0"
}
......@@ -20948,6 +20981,11 @@
}
}
},
"proxy-from-env": {
"version": "1.1.0",
"resolved": "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
"integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
},
"pseudomap": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/pseudomap/-/pseudomap-1.0.2.tgz",
......
......@@ -8,6 +8,7 @@
"build": "vue-cli-service build --production"
},
"dependencies": {
"axios": "^1.1.3",
"core-js": "^3.8.3",
"element-ui": "^2.15.10",
"vue": "^2.6.14",
......
import network from "@/utils/network";
export const loginApi = (data) => network({
url: "",
method: "post",
data
});
export const loginOutApi = () => network({
url: "",
method: "post",
});
export const getUserInfoApi = () => network({
url: "",
method: "post"
});
import Vue from 'vue'
import VueRouter from 'vue-router'
import Vue from 'vue';
import VueRouter from 'vue-router';
Vue.use(VueRouter)
Vue.use(VueRouter);
const routes = [
]
];
const router = new VueRouter({
mode: 'history',
base: process.env.BASE_URL,
routes:[
routes: [
{
path:'/',
path: '/',
redirect: '/login',
},
{
path:'/login',
path: '/login',
// redirect: '/login',
name:'login',
name: 'login',
component: () => import('@/login'),
meta: {
title: "登录页",
needToken: false
}
},
]
})
});
export default router
export default router;
import router from './index';
import store from '@/store/index';
import {
Message
} from 'element-ui';
import {
getToken
} from '@/utils/auth';
// 路由前置守卫
router.beforeEach((to, from, next) => {
to.meta?.title && (document.title = to.meta.title);
// 从cookie中获取token
if (getToken()) {
/**
* 判断前往的path是否为登录页
* 是重定向
* 否则根据用户基本信息 获取当前状态
*/
// 跳转拉取用户基本信息
if (!store.state.user.userInfo?.userId) {
store.dispatch("user/getUserInfo").then(() => {
next();
})
.catch(err => {
Message.error(err.msg || "获取用户信息失败!");
store.dispatch('user/loginOut').finally(() => {
location.href = '/login';
});
});
} else {
next();
}
} else {
/**
* 判断当前前往页面是否需要token
* 不匹配 以及 未带token重定向到登录页
*/
if (to.meta?.needToken === false) {
next();
} else {
next({
path: "/login"
});
}
}
});
\ No newline at end of file
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
import Vue from 'vue';
import Vuex from 'vuex';
import userModule from "./modules/user-module";
Vue.use(Vuex);
export default new Vuex.Store({
state: {
},
getters: {
},
mutations: {
},
actions: {
},
modules: {
user: userModule
}
})
});
import { loginApi, getUserInfoApi, loginOutApi } from "@/api/login";
import { getToken, setToken, removeToken } from "@/utils/auth";
const state = {
token: getToken(),
userInfo: {}
};
const mutations = {
SET_TOKEN(state, params) {
state.token = params;
},
SET_USER_INFO(state, params) {
state.userInfo = params;
}
};
const actions = {
/**
* 用户登录
* @param {Object} payload 参数
* @param {Function} commit 提交同步处理数据
*/
userLogin(payload, { commit }) {
return new Promise((resolve, reject) => {
// 登录api调用
loginApi(payload).then(res => {
// 获取token
commit("SET_TOKEN", res.data);
setToken(res.data);
resolve(res);
}).catch(err => {
console.log(err);
reject(err);
});
});
},
/**
* 根据token 获取用户信息
* @param {Object} payload 参数
* @param {Function} commit 提交同步处理数据
*/
getUserInfo(payload, { commit }) {
return new Promise((resolve, reject) => {
// 用户信息api调用
getUserInfoApi().then(res => {
// 获取token
commit("SET_USER_INFO", res.data);
resolve(res);
}).catch(err => {
console.log(err);
removeToken();
reject(err);
});
});
},
/**
* 退出登录
*/
loginOut() {
return new Promise((resolve, reject) => {
// 退出登录api调用
loginOutApi().then(res => {
// 获取token
commit("SET_TOKEN", "");
removeToken();
resolve(res);
}).catch(err => {
console.log(err);
removeToken();
reject(err);
});
});
}
};
const getters = {
};
export default {
namespaced: true,
state,
mutations,
actions,
getters
};
\ No newline at end of file
const getToken = () => {
try {
return localStorage.getItem("userToken");
} catch (error) {
}
};
const setToken = (token) => {
try {
if (token) {
localStorage.setItem("userToken", toekn);
}
} catch (error) {
console.log(error);
}
};
const removeToken = () => {
try {
localStorage.removeItem("userToken");
} catch (error) {
console.log(error);
}
};
export {
getToken,
setToken,
removeToken
};
\ No newline at end of file
import axios from "axios";
import { Notification, MessageBox, Message } from 'element-ui';
import { getToken } from '@/utils/auth';
import qs from 'qs';
import store from '@/store/index';
axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8';
axios.defaults.withCredentials = false;
// 创建axios实例
const service = axios.create({
// axios中请求配置有baseURL选项,表示请求URL公共部分
baseURL: process.env.VUE_APP_BASE_API,
// 超时
timeout: 15000
});
// request拦截器
service.interceptors.request.use(config => {
if (config.method === 'post' && config.headers['Content-Type'] == 'application/x-www-form-urlencoded;charset=UTF-8') {
config.data = qs.stringify(config.data);
}
// 是否需要设置 token
const isToken = (config.headers || {}).isToken === false;
if (getToken() && !isToken) {
config.headers['Authorization'] = getToken(); // 让每个请求携带自定义token 请根据实际情况自行修改
}
// get请求映射params参数
if (config.method === 'get' && config.params) {
let url = config.url + '?';
for (const propName of Object.keys(config.params)) {
const value = config.params[propName];
var part = encodeURIComponent(propName) + "=";
if (value !== null && typeof (value) !== "undefined") {
if (typeof value === 'object') {
for (const key of Object.keys(value)) {
if (value[key] !== null && typeof (value[key]) !== 'undefined') {
let params = propName + '[' + key + ']';
let subPart = encodeURIComponent(params) + '=';
url += subPart + encodeURIComponent(value[key]) + '&';
}
}
} else {
url += part + encodeURIComponent(value) + "&";
}
}
}
url = url.slice(0, -1);
config.params = {};
config.url = url;
}
return config;
}, error => {
return Promise.reject(error);
});
// 响应拦截器
service.interceptors.response.use(res => {
// 未设置状态码则默认成功状态
const code = res.data.code || 200;
// 获取错误信息
const msg = res.data.msg;
if (code === 401) {
MessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', {
confirmButtonText: '重新登录',
cancelButtonText: '取消',
type: 'warning'
}
).then(() => {
store.dispatch('user/loginOut').finally(() => {
location.href = '/login';
});
}).catch(() => { });
return Promise.reject('无效的会话,或者会话已过期,请重新登录。');
} else if (code === 500) {
Message({
message: msg,
type: 'error'
});
return Promise.reject(msg);
} else if (code !== 200) {
Notification.error({
title: msg
});
return Promise.reject(res.data);
} else {
return res.data;
}
},
error => {
let { message } = error;
if (message == "Network Error") {
message = "后端接口连接异常";
}
else if (message.includes("timeout")) {
message = "系统接口请求超时";
}
else if (message.includes("Request failed with status code")) {
message = "系统接口" + message.substr(message.length - 3) + "异常";
}
Message({
message: message,
type: 'error',
duration: 5 * 1000
});
return Promise.reject(error);
}
);
export default service;
\ No newline at end of file
......@@ -10,7 +10,7 @@ module.exports = defineConfig({
publicPath: process.env.BASE_URL,
assetsDir: "static",
outputDir: process.env.VUE_APP_OUT_PUT_DIR || 'dist',
productionSourceMap: isPro,
productionSourceMap: !isPro,
configureWebpack: config => {
config.output.path = path.resolve(__dirname, process.env.VUE_APP_OUT_PUT_DIR);
config.output.filename = "static/js/[name].js";
......@@ -85,23 +85,18 @@ module.exports = defineConfig({
});
},
// 本地代理服务器
// devServer: {
// overlay: {
// warnings: true,
// errors: true
// },
// host: '0.0.0.0',
// port: 6666,
// open: true,
// proxy: {
// [process.env.VUE_APP_BASE_API]: {
// target: ``,
// changeOrigin: true,
// pathRewrite: {
// ['^' + process.env.VUE_APP_BASE_API]: ''
// }
// },
// },
// disableHostCheck: true
// },
devServer: {
host: 'localhost',
port: "8866",
open: true,
proxy: {
[process.env.VUE_APP_BASE_API]: {
target: `http://139.9.157.49:8088`,
changeOrigin: true,
pathRewrite: {
['^' + process.env.VUE_APP_BASE_API]: ''
}
},
},
},
});
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment