合并代码

This commit is contained in:
szz
2025-08-11 09:40:54 +08:00
parent b91560ccbe
commit 50e205e776
9 changed files with 2279 additions and 100 deletions

View File

@@ -1,3 +1,3 @@
# 开发环境配置
VITE_API_BASE_URL=/api
VITE_UPLOAD_BASE_URL=http://localhost:3001/api/upload
VITE_UPLOAD_BASE_URL=http://localhost:3000/api/upload

78
package-lock.json generated
View File

@@ -10,12 +10,14 @@
"dependencies": {
"@element-plus/icons-vue": "^2.3.1",
"axios": "^1.6.2",
"echarts": "^5.6.0",
"element-plus": "^2.4.4",
"nprogress": "^0.2.0",
"pinia": "^2.1.7",
"swiper": "^8.4.7",
"vue": "^3.3.11",
"vue-awesome-swiper": "^5.0.1",
"vue-echarts": "^7.0.3",
"vue-router": "^4.2.5"
},
"devDependencies": {
@@ -1453,6 +1455,22 @@
"node": ">= 0.4"
}
},
"node_modules/echarts": {
"version": "5.6.0",
"resolved": "https://registry.npmjs.org/echarts/-/echarts-5.6.0.tgz",
"integrity": "sha512-oTbVTsXfKuEhxftHqL5xprgLoc0k7uScAwtryCgWF6hPYFLRwOUHiFmHGCBKP5NPFNkDVopOieyUqYGH8Fa3kA==",
"license": "Apache-2.0",
"dependencies": {
"tslib": "2.3.0",
"zrender": "5.6.1"
}
},
"node_modules/echarts/node_modules/tslib": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz",
"integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==",
"license": "0BSD"
},
"node_modules/element-plus": {
"version": "2.10.3",
"resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.10.3.tgz",
@@ -2620,6 +2638,51 @@
}
}
},
"node_modules/vue-echarts": {
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/vue-echarts/-/vue-echarts-7.0.3.tgz",
"integrity": "sha512-/jSxNwOsw5+dYAUcwSfkLwKPuzTQ0Cepz1LxCOpj2QcHrrmUa/Ql0eQqMmc1rTPQVrh2JQ29n2dhq75ZcHvRDw==",
"license": "MIT",
"dependencies": {
"vue-demi": "^0.13.11"
},
"peerDependencies": {
"@vue/runtime-core": "^3.0.0",
"echarts": "^5.5.1",
"vue": "^2.7.0 || ^3.1.1"
},
"peerDependenciesMeta": {
"@vue/runtime-core": {
"optional": true
}
}
},
"node_modules/vue-echarts/node_modules/vue-demi": {
"version": "0.13.11",
"resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.13.11.tgz",
"integrity": "sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==",
"hasInstallScript": true,
"license": "MIT",
"bin": {
"vue-demi-fix": "bin/vue-demi-fix.js",
"vue-demi-switch": "bin/vue-demi-switch.js"
},
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/antfu"
},
"peerDependencies": {
"@vue/composition-api": "^1.0.0-rc.1",
"vue": "^3.0.0-0 || ^2.6.0"
},
"peerDependenciesMeta": {
"@vue/composition-api": {
"optional": true
}
}
},
"node_modules/vue-router": {
"version": "4.5.1",
"resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.5.1.tgz",
@@ -2634,6 +2697,21 @@
"peerDependencies": {
"vue": "^3.2.0"
}
},
"node_modules/zrender": {
"version": "5.6.1",
"resolved": "https://registry.npmjs.org/zrender/-/zrender-5.6.1.tgz",
"integrity": "sha512-OFXkDJKcrlx5su2XbzJvj/34Q3m6PvyCZkVPHGYpcCJ52ek4U/ymZyfuV1nKE23AyBJ51E/6Yr0mhZ7xGTO4ag==",
"license": "BSD-3-Clause",
"dependencies": {
"tslib": "2.3.0"
}
},
"node_modules/zrender/node_modules/tslib": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz",
"integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==",
"license": "0BSD"
}
}
}

View File

@@ -11,12 +11,14 @@
"dependencies": {
"@element-plus/icons-vue": "^2.3.1",
"axios": "^1.6.2",
"echarts": "^5.6.0",
"element-plus": "^2.4.4",
"nprogress": "^0.2.0",
"pinia": "^2.1.7",
"swiper": "^8.4.7",
"vue": "^3.3.11",
"vue-awesome-swiper": "^5.0.1",
"vue-echarts": "^7.0.3",
"vue-router": "^4.2.5"
},
"devDependencies": {

View File

@@ -198,7 +198,19 @@ const routes = [
name: 'AgentDashboard',
component: () => import('@/views/AgentDashboard.vue'),
meta: {
title: '代理后台'
title: '代理后台',
requiresAuth: true,
isAgent: true
}
},
{
path: '/agent/withdrawals',
name: 'AgentWithdrawals',
component: () => import('@/views/AgentWithdrawals.vue'),
meta: {
title: '佣金提现',
requiresAuth: true,
isAgent: true
}
},
{
@@ -252,6 +264,21 @@ router.beforeEach(async (to, from, next) => {
// 检查是否需要认证
if (to.meta.requiresAuth) {
// 检查是否是代理页面
if (to.meta.isAgent) {
// 代理页面认证逻辑
const agentInfo = localStorage.getItem('agentInfo')
const agentToken = localStorage.getItem('token')
if (!agentInfo || !agentToken) {
next({
path: '/agent/login',
query: { redirect: to.fullPath }
})
return
}
} else {
// 普通用户页面认证逻辑
if (!userStore.isAuthenticated) {
// 尝试从本地存储恢复登录状态
await userStore.checkAuth()
@@ -265,6 +292,7 @@ router.beforeEach(async (to, from, next) => {
}
}
}
}
// 如果已登录用户访问登录/注册页面,重定向到转账管理(改成了主页)
if (to.meta.hideForAuth && userStore.isAuthenticated) {

View File

@@ -64,11 +64,20 @@ api.interceptors.response.use(
switch (status) {
case 401:
// 未授权清除token并跳转到登录页
// 未授权清除token并根据当前路由跳转到相应的登录页
localStorage.removeItem('token')
localStorage.removeItem('agentInfo') // 清除代理信息
delete api.defaults.headers.common['Authorization']
// 判断当前是否在代理相关页面
const currentPath = router.currentRoute.value.path
if (currentPath.startsWith('/agent')) {
router.push('/agent/login')
ElMessage.error('代理登录已过期,请重新登录')
} else {
router.push({ name: 'Login' })
ElMessage.error('登录已过期,请重新登录')
}
break
case 403:

File diff suppressed because it is too large Load Diff

View File

@@ -243,8 +243,9 @@ const handleLogin = async () => {
const { data } = await api.post('/agents/login', loginForm)
if (data.success) {
// 保存代理信息到localStorage
// 保存代理信息和token到localStorage
localStorage.setItem('agentInfo', JSON.stringify(data.data))
localStorage.setItem('token', data.data.token)
ElMessage.success('登录成功')
router.push('/agent/dashboard')
}

File diff suppressed because it is too large Load Diff

View File

@@ -14,11 +14,11 @@ export default defineConfig({
port: 5173,
proxy: {
'/api': {
target: 'http://114.55.111.44:3001',
target: 'http://localhost:3000',
changeOrigin: true
},
'/uploads': {
target: 'http://114.55.111.44:3001',
target: 'http://localhost:3000',
changeOrigin: true
}
}