Commit 684caa69 authored by 水玉婷's avatar 水玉婷
Browse files

feat:打通用户信息

parent 219e9ed3
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
"dependencies": { "dependencies": {
"@ant-design/icons-vue": "^6.1.0", "@ant-design/icons-vue": "^6.1.0",
"ant-design-vue": "^3.2.0", "ant-design-vue": "^3.2.0",
"axios": "^1.13.2",
"dayjs": "^1.11.0", "dayjs": "^1.11.0",
"echarts": "^6.0.0", "echarts": "^6.0.0",
"event-source-polyfill": "^1.0.31", "event-source-polyfill": "^1.0.31",
...@@ -671,6 +672,48 @@ ...@@ -671,6 +672,48 @@
"integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==", "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
"license": "MIT"
},
"node_modules/axios": {
"version": "1.13.2",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz",
"integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==",
"license": "MIT",
"dependencies": {
"follow-redirects": "^1.15.6",
"form-data": "^4.0.4",
"proxy-from-env": "^1.1.0"
}
},
"node_modules/call-bind-apply-helpers": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
"integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
"license": "MIT",
"dependencies": {
"es-errors": "^1.3.0",
"function-bind": "^1.1.2"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/combined-stream": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
"license": "MIT",
"dependencies": {
"delayed-stream": "~1.0.0"
},
"engines": {
"node": ">= 0.8"
}
},
"node_modules/compute-scroll-into-view": { "node_modules/compute-scroll-into-view": {
"version": "1.0.20", "version": "1.0.20",
"resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz", "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz",
...@@ -713,6 +756,15 @@ ...@@ -713,6 +756,15 @@
"integrity": "sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==", "integrity": "sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
"license": "MIT",
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/dom-align": { "node_modules/dom-align": {
"version": "1.12.4", "version": "1.12.4",
"resolved": "https://registry.npmjs.org/dom-align/-/dom-align-1.12.4.tgz", "resolved": "https://registry.npmjs.org/dom-align/-/dom-align-1.12.4.tgz",
...@@ -725,6 +777,20 @@ ...@@ -725,6 +777,20 @@
"integrity": "sha512-bvVTQe1lfaUr1oFzZX80ce9KLDlZ3iU+XGNE/bz9HnGdklTieqsbmsLHe+rT2XWqopvL0PckkYqN7ksmm5pe3w==", "integrity": "sha512-bvVTQe1lfaUr1oFzZX80ce9KLDlZ3iU+XGNE/bz9HnGdklTieqsbmsLHe+rT2XWqopvL0PckkYqN7ksmm5pe3w==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/dunder-proto": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
"integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
"license": "MIT",
"dependencies": {
"call-bind-apply-helpers": "^1.0.1",
"es-errors": "^1.3.0",
"gopd": "^1.2.0"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/echarts": { "node_modules/echarts": {
"version": "6.0.0", "version": "6.0.0",
"resolved": "https://registry.npmjs.org/echarts/-/echarts-6.0.0.tgz", "resolved": "https://registry.npmjs.org/echarts/-/echarts-6.0.0.tgz",
...@@ -761,6 +827,51 @@ ...@@ -761,6 +827,51 @@
"errno": "cli.js" "errno": "cli.js"
} }
}, },
"node_modules/es-define-property": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
"integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
"license": "MIT",
"engines": {
"node": ">= 0.4"
}
},
"node_modules/es-errors": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
"integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
"license": "MIT",
"engines": {
"node": ">= 0.4"
}
},
"node_modules/es-object-atoms": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
"integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
"license": "MIT",
"dependencies": {
"es-errors": "^1.3.0"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/es-set-tostringtag": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
"integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
"license": "MIT",
"dependencies": {
"es-errors": "^1.3.0",
"get-intrinsic": "^1.2.6",
"has-tostringtag": "^1.0.2",
"hasown": "^2.0.2"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/esbuild": { "node_modules/esbuild": {
"version": "0.18.20", "version": "0.18.20",
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz",
...@@ -811,6 +922,42 @@ ...@@ -811,6 +922,42 @@
"integrity": "sha512-4IJSItgS/41IxN5UVAVuAyczwZF7ZIEsM1XAoUzIHA6A+xzusEZUutdXz2Nr+MQPLxfTiCvqE79/C8HT8fKFvA==", "integrity": "sha512-4IJSItgS/41IxN5UVAVuAyczwZF7ZIEsM1XAoUzIHA6A+xzusEZUutdXz2Nr+MQPLxfTiCvqE79/C8HT8fKFvA==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/follow-redirects": {
"version": "1.15.11",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz",
"integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==",
"funding": [
{
"type": "individual",
"url": "https://github.com/sponsors/RubenVerborgh"
}
],
"license": "MIT",
"engines": {
"node": ">=4.0"
},
"peerDependenciesMeta": {
"debug": {
"optional": true
}
}
},
"node_modules/form-data": {
"version": "4.0.5",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz",
"integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==",
"license": "MIT",
"dependencies": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.8",
"es-set-tostringtag": "^2.1.0",
"hasown": "^2.0.2",
"mime-types": "^2.1.12"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/fsevents": { "node_modules/fsevents": {
"version": "2.3.3", "version": "2.3.3",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
...@@ -826,6 +973,64 @@ ...@@ -826,6 +973,64 @@
"node": "^8.16.0 || ^10.6.0 || >=11.0.0" "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
} }
}, },
"node_modules/function-bind": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
"integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/get-intrinsic": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
"integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
"license": "MIT",
"dependencies": {
"call-bind-apply-helpers": "^1.0.2",
"es-define-property": "^1.0.1",
"es-errors": "^1.3.0",
"es-object-atoms": "^1.1.1",
"function-bind": "^1.1.2",
"get-proto": "^1.0.1",
"gopd": "^1.2.0",
"has-symbols": "^1.1.0",
"hasown": "^2.0.2",
"math-intrinsics": "^1.1.0"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/get-proto": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
"integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
"license": "MIT",
"dependencies": {
"dunder-proto": "^1.0.1",
"es-object-atoms": "^1.0.0"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/gopd": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
"integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
"license": "MIT",
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/graceful-fs": { "node_modules/graceful-fs": {
"version": "4.2.11", "version": "4.2.11",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
...@@ -834,6 +1039,45 @@ ...@@ -834,6 +1039,45 @@
"license": "ISC", "license": "ISC",
"optional": true "optional": true
}, },
"node_modules/has-symbols": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
"integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
"license": "MIT",
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/has-tostringtag": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
"integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
"license": "MIT",
"dependencies": {
"has-symbols": "^1.0.3"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/hasown": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
"integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
"license": "MIT",
"dependencies": {
"function-bind": "^1.1.2"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/iconv-lite": { "node_modules/iconv-lite": {
"version": "0.6.3", "version": "0.6.3",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
...@@ -959,6 +1203,15 @@ ...@@ -959,6 +1203,15 @@
"node": ">=6" "node": ">=6"
} }
}, },
"node_modules/math-intrinsics": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
"integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
"license": "MIT",
"engines": {
"node": ">= 0.4"
}
},
"node_modules/mime": { "node_modules/mime": {
"version": "1.6.0", "version": "1.6.0",
"resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
...@@ -973,6 +1226,27 @@ ...@@ -973,6 +1226,27 @@
"node": ">=4" "node": ">=4"
} }
}, },
"node_modules/mime-db": {
"version": "1.52.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
"license": "MIT",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/mime-types": {
"version": "2.1.35",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
"integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
"license": "MIT",
"dependencies": {
"mime-db": "1.52.0"
},
"engines": {
"node": ">= 0.6"
}
},
"node_modules/nanoid": { "node_modules/nanoid": {
"version": "3.3.11", "version": "3.3.11",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
...@@ -1070,6 +1344,12 @@ ...@@ -1070,6 +1344,12 @@
"node": "^10 || ^12 || >=14" "node": "^10 || ^12 || >=14"
} }
}, },
"node_modules/proxy-from-env": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
"integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
"license": "MIT"
},
"node_modules/prr": { "node_modules/prr": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
......
...@@ -9,17 +9,18 @@ ...@@ -9,17 +9,18 @@
"preview": "vite preview" "preview": "vite preview"
}, },
"dependencies": { "dependencies": {
"vue": "^3.3.0",
"vue-router": "^4.2.0",
"@ant-design/icons-vue": "^6.1.0", "@ant-design/icons-vue": "^6.1.0",
"echarts": "^6.0.0",
"ant-design-vue": "^3.2.0", "ant-design-vue": "^3.2.0",
"axios": "^1.13.2",
"dayjs": "^1.11.0", "dayjs": "^1.11.0",
"event-source-polyfill": "^1.0.31" "echarts": "^6.0.0",
"event-source-polyfill": "^1.0.31",
"vue": "^3.3.0",
"vue-router": "^4.2.0"
}, },
"devDependencies": { "devDependencies": {
"@vitejs/plugin-vue": "^4.2.0", "@vitejs/plugin-vue": "^4.2.0",
"vite": "^4.3.0", "less": "^4.4.2",
"less": "^4.4.2" "vite": "^4.3.0"
} }
} }
\ No newline at end of file
import { createApp } from 'vue' import { createApp } from 'vue'
import App from './App.vue' import App from './App.vue'
import router from './router' import router from './router'
import { setRouter } from './utils/router-manager'
const app = createApp(App) const app = createApp(App)
app.use(router) app.use(router)
// 设置全局路由实例
setRouter(router)
app.mount('#app') app.mount('#app')
\ No newline at end of file
import { createRouter, createWebHistory } from 'vue-router' import { createRouter, createWebHashHistory } from 'vue-router' // 改为Hash模式
import wechat from '../utils/wechat' import wechat from '../utils/wechat'
const routes = [ const routes = [
...@@ -20,7 +20,7 @@ const routes = [ ...@@ -20,7 +20,7 @@ const routes = [
] ]
const router = createRouter({ const router = createRouter({
history: createWebHistory('/ai/'), // 添加基础路径 history: createWebHashHistory('/ai/'), // 使用Hash模式
routes routes
}) })
......
import axios from 'axios'
// 创建axios实例
const instance = axios.create({
baseURL: '/',
timeout: 10000,
headers: {
'Content-Type': 'application/json'
}
})
// 请求拦截器 - 添加认证信息
instance.interceptors.request.use(
(config) => {
// 从localStorage获取用户信息
const userData = localStorage.getItem('wechat_user')
const { extMap = {} } = JSON.parse(userData || '{}')
const userToken = extMap.sessionId;
if (userToken) {
try {
config.headers['x-session-id'] = userToken || ''
} catch (error) {
console.warn('解析用户信息失败', error)
}
}
return config
},
(error) => {
return Promise.reject(error)
}
)
import { navigateToLogin } from './router-manager'
// 响应拦截器 - 处理401错误
instance.interceptors.response.use(
(response) => {
return response
},
(error) => {
if (error.response) {
const { status } = error.response
// 处理401未授权错误
if (status === 401) {
// 清除本地存储的用户信息
localStorage.removeItem('wechat_user')
// 使用全局路由管理器跳转
navigateToLogin()
return Promise.reject(new Error('未授权访问,请重新登录'))
}
// 其他错误处理
console.error(`请求失败: ${status}`, error.response.data)
} else if (error.request) {
console.error('网络错误,请求未发送成功', error)
} else {
console.error('请求配置错误', error.message)
}
return Promise.reject(error)
}
)
// 导出get和post方法
export const get = (url, config = {}) => instance.get(url, config)
export const post = (url, data = {}, config = {}) => instance.post(url, data, config)
// 导出实例(可选)
export default instance
\ No newline at end of file
// 全局路由管理器
let routerInstance = null
export const setRouter = (router) => {
routerInstance = router
}
export const getRouter = () => {
return routerInstance
}
export const navigateToLogin = () => {
if (routerInstance) {
routerInstance.push('/login')
} else {
// 备用方案:使用hash跳转
if (window.location.hash) {
window.location.hash = '/login'
} else {
window.location.pathname = '/login'
}
}
}
\ No newline at end of file
// 简化的微信静默登录工具类 // 引入axios
import { post } from './axios.js'
// 企业微信登录工具类 - 简化版本(直接从URL获取code)
class WeChatLogin { class WeChatLogin {
constructor() { constructor() {
this.appId = 'YOUR_WECHAT_APPID' // 替换为你的微信公众号AppID this.corpId = 'ww88c20288b24a8e33' // 企业微信CorpID
this.isWeChat = this.checkWeChatBrowser() this.agentId = '1000002' // 应用AgentId
this.isConfigured = this.appId !== 'YOUR_WECHAT_APPID'
} }
// 检查是否为微信浏览器 // 检查是否为企业微信浏览器
checkWeChatBrowser() { checkWeChatWorkBrowser() {
const ua = navigator.userAgent.toLowerCase() const ua = navigator.userAgent.toLowerCase()
return ua.indexOf('micromessenger') !== -1 return ua.indexOf('wxwork') !== -1
} }
// 简化的静默登录 // 从URL参数获取code
async silentLogin() { getCodeFromURL() {
// 如果未配置appId,使用模拟登录 const urlParams = new URLSearchParams(window.location.search)
if (!this.isConfigured) { return urlParams.get('code')
console.log('使用模拟静默登录')
return this.mockLogin()
}
// 如果是微信浏览器,执行真实静默登录
if (this.isWeChat) {
return this.realWeChatLogin()
}
// 非微信浏览器,使用模拟登录
console.log('非微信浏览器,使用模拟登录')
return this.mockLogin()
} }
// 真实微信静默登录 // 企业微信静默登录 - 核心方法
realWeChatLogin() { async silentLogin() {
return new Promise((resolve, reject) => { try {
// 检查URL中是否已有授权code // 直接从URL获取code
const urlParams = new URLSearchParams(window.location.search) const code = this.getCodeFromURL()
const code = urlParams.get('code') if (!code) {
console.error('未找到code参数,请确保在企业微信内部应用中访问')
if (code) { return {
// 已有code,直接获取用户信息 isLoggedIn: false,
this.getUserInfo(code).then(resolve).catch(reject) message: '未找到code参数,请确保在企业微信内部应用中访问'
} else { }
// 重定向到微信授权页面进行静默授权
this.redirectToWeChat()
} }
})
}
// 重定向到微信授权页面 // 获取用户信息
redirectToWeChat() { const userInfo = await this.getUserInfo(code)
const redirectUri = encodeURIComponent(window.location.origin + window.location.pathname)
const scope = 'snsapi_base' // 静默授权,不弹出授权页面 return {
const state = 'STATE_' + Date.now() isLoggedIn: true,
code: code,
const authUrl = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${this.appId}&redirect_uri=${redirectUri}&response_type=code&scope=${scope}&state=${state}#wechat_redirect` userInfo: userInfo
}
window.location.href = authUrl } catch (error) {
console.error('登录失败:', error.message)
return {
isLoggedIn: false,
message: error.message || '登录失败'
}
}
} }
// 获取用户信息(简化版) // 获取用户信息 - 使用axios
async getUserInfo(code) { async getUserInfo(code) {
try { try {
// 这里需要调用后端接口来获取用户信息 const response = await post('/pedService/wxcp/auth', {
// 微信不允许前端直接调用获取用户信息的接口 authCode: code
const response = await fetch('/api/wechat/userinfo', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ code })
}) })
if (!response.ok) { const result = response.data
throw new Error('获取用户信息失败')
}
const userInfo = await response.json()
// 保存用户信息到本地存储
localStorage.setItem('wechat_user', JSON.stringify(userInfo))
return { if (result.code === 0) {
isLoggedIn: true, // 保存用户信息
userInfo: userInfo, localStorage.setItem('wechat_user', JSON.stringify(result.data))
message: '微信静默登录成功' return result.data
} else {
throw new Error(result.message || '获取用户信息失败')
} }
} catch (error) { } catch (error) {
console.error('获取用户信息失败:', error) throw new Error(`获取用户信息失败: ${error.message}`)
throw new Error('登录失败,请重试')
} }
} }
// 模拟登录(用于开发和测试)
mockLogin() {
return new Promise((resolve) => {
setTimeout(() => {
const mockUser = {
openid: 'mock_openid_' + Date.now(),
nickname: '测试用户',
headimgurl: '',
isMock: true
}
localStorage.setItem('wechat_user', JSON.stringify(mockUser))
resolve({
isLoggedIn: true,
userInfo: mockUser,
message: '模拟登录成功'
})
}, 1000) // 模拟网络延迟
})
}
// 检查登录状态 // 检查登录状态
checkLoginStatus() { checkLoginStatus() {
const userData = localStorage.getItem('wechat_user') const userData = localStorage.getItem('wechat_user')
if (userData) { if (userData) {
try { try {
const userInfo = JSON.parse(userData)
return { return {
isLoggedIn: true, isLoggedIn: true,
userInfo: userInfo userInfo: JSON.parse(userData)
} }
} catch (error) { } catch (error) {
console.error('解析用户数据失败:', error) localStorage.removeItem('wechat_user')
} }
} }
return { isLoggedIn: false } return { isLoggedIn: false }
} }
...@@ -136,7 +92,7 @@ class WeChatLogin { ...@@ -136,7 +92,7 @@ class WeChatLogin {
localStorage.removeItem('wechat_user') localStorage.removeItem('wechat_user')
} }
// 获取当前用户信息 // 获取当前用户
getCurrentUser() { getCurrentUser() {
const status = this.checkLoginStatus() const status = this.checkLoginStatus()
return status.isLoggedIn ? status.userInfo : null return status.isLoggedIn ? status.userInfo : null
......
...@@ -17,21 +17,22 @@ ...@@ -17,21 +17,22 @@
const apiBaseUrl = '/pedapi'; const apiBaseUrl = '/pedapi';
// 获取token // 获取token
const userToken = '65c76a8b38f350bd1849d41d3185c3eb'; const userInfo = localStorage.getItem('wechat_user')
const {extMap = {}} = JSON.parse(userInfo || '{}')
const userToken = extMap.sessionId;
// 添加APP_CODE配置 // 添加APP_CODE配置
const appCode = 'ped.pc'; const appCode = 'ped.qywx';
const chatParams = { const chatParams = {
appId: '83b2664019a945d0a438abe6339758d8', appId: '83b2664019a945d0a438abe6339758d8',
stage: 'wechat-demo', stage: 'wechat-demo',
}; };
const dialogSessionId = '20251028143404893-00045166'; // const dialogSessionId = '20251028143404893-00045166';
// const dialogSessionId = ''; const dialogSessionId = '';
const detailData = ref({ const detailData = ref({
title: '国械小智', title: '国械小智',
}); });
</script> </script>
<style scoped> <style scoped>
......
...@@ -5,7 +5,6 @@ ...@@ -5,7 +5,6 @@
<div class="spinner"></div> <div class="spinner"></div>
<p>正在静默登录中...</p> <p>正在静默登录中...</p>
</div> </div>
<div v-else-if="error" class="error"> <div v-else-if="error" class="error">
<p class="error-text">{{ error }}</p> <p class="error-text">{{ error }}</p>
<button @click="retryLogin" class="retry-btn">重试登录</button> <button @click="retryLogin" class="retry-btn">重试登录</button>
...@@ -35,12 +34,9 @@ export default { ...@@ -35,12 +34,9 @@ export default {
if (result.isLoggedIn) { if (result.isLoggedIn) {
// 登录成功,跳转到首页 // 登录成功,跳转到首页
setTimeout(() => { router.replace('/')
router.replace('/')
}, 500)
} }
} catch (err) { } catch (err) {
console.error('登录失败:', err)
error.value = err.message || '登录失败,请重试' error.value = err.message || '登录失败,请重试'
loading.value = false loading.value = false
} }
......
...@@ -81,12 +81,13 @@ ...@@ -81,12 +81,13 @@
<script setup lang="ts"> <script setup lang="ts">
import { EventSourcePolyfill } from 'event-source-polyfill'; import { EventSourcePolyfill } from 'event-source-polyfill';
import { ref, nextTick, onMounted, onBeforeUnmount } from 'vue'; import { ref, reactive, computed, onMounted, onBeforeUnmount, nextTick, watch } from 'vue';
import { SendOutlined, UserOutlined } from '@ant-design/icons-vue';
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import { post } from '@/utils/axios.js'; // 导入axios的post方法
import tableTemplate from './tableTemplate';
import { SendOutlined, UserOutlined } from '@ant-design/icons-vue';
import defaultAvatar from '@/assets/logo.png'; import defaultAvatar from '@/assets/logo.png';
import ChartComponent from './ChartComponent.vue'; // 导入独立的图表组件 import ChartComponent from './ChartComponent.vue'; // 导入独立的图表组件
import { tableTemplate } from './tableTemplate'; // 导入表格模板工具
// 组件属性 // 组件属性
const props = withDefaults( const props = withDefaults(
...@@ -303,20 +304,18 @@ const sendMessage = async () => { ...@@ -303,20 +304,18 @@ const sendMessage = async () => {
} else { } else {
// 默认的API调用逻辑 // 默认的API调用逻辑
console.log('默认API调用逻辑', dialogSessionId); console.log('默认API调用逻辑', dialogSessionId);
const response = await fetch(`${props.apiBaseUrl}/aiService/ask/app/${props.params?.appId}`, { const response = await post(`${props.apiBaseUrl}/aiService/ask/app/${props.params?.appId}`, {
method: 'POST', question: message,
...props.params,
}, {
headers: { headers: {
'Content-Type': 'application/json',
Token: props.token || '', Token: props.token || '',
'x-session-id': props.token || '', 'x-session-id': props.token || '',
'x-app-code': props.appCode || '', 'x-app-code': props.appCode || '',
}, }
body: JSON.stringify({
question: message,
...props.params,
}),
}); });
const data = await response.json();
const data = response.data;
if (data.code === 0) { if (data.code === 0) {
loading.value = false; loading.value = false;
} }
...@@ -365,19 +364,21 @@ const processSSEMessage = ( ...@@ -365,19 +364,21 @@ const processSSEMessage = (
case 3: // 图表数据 case 3: // 图表数据
if (updatedResponse) { if (updatedResponse) {
const { rows } = messageContent; const { rows } = messageContent;
// 表格数据处理
updatedResponse.contentBlocks.push({ updatedResponse.contentBlocks.push({
content: contentTemplates.table(rows), content: contentTemplates.table(rows),
hasThinkBox: false, hasThinkBox: false,
thinkContent: '', thinkContent: '',
thinkBoxExpanded: false, thinkBoxExpanded: false,
}); });
// 图表数据处理
updatedResponse.contentBlocks.push({ updatedResponse.contentBlocks.push({
content: '', // 图表内容由组件处理,这里留空 content: '',
hasThinkBox: false, hasThinkBox: false,
thinkContent: '', thinkContent: '',
thinkBoxExpanded: false, thinkBoxExpanded: false,
chartData: messageContent, // 添加图表数据 chartData: messageContent, // 添加图表数据
chartType: 3, // 使用object类型 chartType: 3,
}); });
} }
break; break;
...@@ -504,7 +505,7 @@ const reconnectSSE = (newDialogSessionId: string) => { ...@@ -504,7 +505,7 @@ const reconnectSSE = (newDialogSessionId: string) => {
// 添加重连间隔控制,避免频繁重连 // 添加重连间隔控制,避免频繁重连
const reconnectTimeout = setTimeout(() => { const reconnectTimeout = setTimeout(() => {
initSSE(); initSSE();
// 重连完成后重置标志 // 重连完成后重置标志
setTimeout(() => { setTimeout(() => {
isReconnecting.value = false; isReconnecting.value = false;
}, 2000); // 延长重连间隔 }, 2000); // 延长重连间隔
...@@ -755,14 +756,15 @@ const getChatRecord = async (dialogSessionId: string) => { ...@@ -755,14 +756,15 @@ const getChatRecord = async (dialogSessionId: string) => {
messages.value = [...recordList]; messages.value = [...recordList];
} }
} else { } else {
const response = await fetch(`${props.apiBaseUrl}/aiService/ask/list/chat/${dialogSessionId}`, { const response = await post(`${props.apiBaseUrl}/aiService/ask/list/chat/${dialogSessionId}`, {}, {
headers: { headers: {
Token: props.token || '', Token: props.token || '',
'x-session-id': props.token || '', 'x-session-id': props.token || '',
'x-app-code': props.appCode || '', 'x-app-code': props.appCode || '',
}, }
}); });
const data = await response.json();
const data = response.data;
if (data.code === 0) { if (data.code === 0) {
const recordList = processHistoryData(data.data || []); const recordList = processHistoryData(data.data || []);
messages.value = [...recordList]; messages.value = [...recordList];
......
This diff is collapsed.
import { defineConfig } from 'vite' import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue' import vue from '@vitejs/plugin-vue'
import { resolve } from 'path'; import { resolve } from 'path';
export default defineConfig({ export default defineConfig({
base: '/ai/', // 添加基础路径前缀 base: '/ai/', // 添加基础路径前缀
plugins: [vue()], plugins: [vue()],
server: { server: {
host: '0.0.0.0', host: '0.0.0.0',
port: 3000, port: 3000,
proxy: { // 添加history fallback配置
historyApiFallback: {
rewrites: [
{ from: /^\/ai\/.*$/, to: '/ai/index.html' }
]
},
proxy: {
'/pedapi': { '/pedapi': {
target: 'http://peddev.cmic.com.cn', target: 'http://peddev.cmic.com.cn',
changeOrigin: true, // 解决跨域问题 changeOrigin: true, // 解决跨域问题
...@@ -33,6 +40,24 @@ export default defineConfig({ ...@@ -33,6 +40,24 @@ export default defineConfig({
console.log('发送请求到:', options.target); console.log('发送请求到:', options.target);
}); });
} }
},
// 修复pedService代理配置
'/pedService': {
target: 'http://10.17.86.37:8630',
changeOrigin: true, // 解决跨域问题
secure: false, // 允许不安全的SSL连接
rewrite: (path) => path.replace(/^\/pedService/, '/pedService'), // 保留前缀
configure: (proxy, options) => {
proxy.on('error', (err, req, res) => {
console.log('pedService代理错误:', err);
});
proxy.on('proxyReq', (proxyReq, req, res) => {
console.log('pedService发送请求到本地服务:', options.target + req.url);
});
proxy.on('proxyRes', (proxyRes, req, res) => {
console.log('pedService收到响应,状态码:', proxyRes.statusCode);
});
}
} }
}, },
}, },
...@@ -44,7 +69,7 @@ export default defineConfig({ ...@@ -44,7 +69,7 @@ export default defineConfig({
resolve: { resolve: {
alias: { alias: {
'@': resolve(__dirname, 'src'), '@': resolve(__dirname, 'src'),
'echarts': 'echarts/dist/echarts.esm.js' // 添加这一行 'echarts': 'echarts/dist/echarts.esm.js'
} }
}, },
}) })
\ No newline at end of file
Supports Markdown
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