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

feat:打通用户信息

parent 219e9ed3
......@@ -10,6 +10,7 @@
"dependencies": {
"@ant-design/icons-vue": "^6.1.0",
"ant-design-vue": "^3.2.0",
"axios": "^1.13.2",
"dayjs": "^1.11.0",
"echarts": "^6.0.0",
"event-source-polyfill": "^1.0.31",
......@@ -671,6 +672,48 @@
"integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==",
"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": {
"version": "1.0.20",
"resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz",
......@@ -713,6 +756,15 @@
"integrity": "sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==",
"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": {
"version": "1.12.4",
"resolved": "https://registry.npmjs.org/dom-align/-/dom-align-1.12.4.tgz",
......@@ -725,6 +777,20 @@
"integrity": "sha512-bvVTQe1lfaUr1oFzZX80ce9KLDlZ3iU+XGNE/bz9HnGdklTieqsbmsLHe+rT2XWqopvL0PckkYqN7ksmm5pe3w==",
"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": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/echarts/-/echarts-6.0.0.tgz",
......@@ -761,6 +827,51 @@
"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": {
"version": "0.18.20",
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz",
......@@ -811,6 +922,42 @@
"integrity": "sha512-4IJSItgS/41IxN5UVAVuAyczwZF7ZIEsM1XAoUzIHA6A+xzusEZUutdXz2Nr+MQPLxfTiCvqE79/C8HT8fKFvA==",
"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": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
......@@ -826,6 +973,64 @@
"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": {
"version": "4.2.11",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
......@@ -834,6 +1039,45 @@
"license": "ISC",
"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": {
"version": "0.6.3",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
......@@ -959,6 +1203,15 @@
"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": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
......@@ -973,6 +1226,27 @@
"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": {
"version": "3.3.11",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
......@@ -1070,6 +1344,12 @@
"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": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
......
......@@ -9,17 +9,18 @@
"preview": "vite preview"
},
"dependencies": {
"vue": "^3.3.0",
"vue-router": "^4.2.0",
"@ant-design/icons-vue": "^6.1.0",
"echarts": "^6.0.0",
"ant-design-vue": "^3.2.0",
"axios": "^1.13.2",
"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": {
"@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 App from './App.vue'
import router from './router'
import { setRouter } from './utils/router-manager'
const app = createApp(App)
app.use(router)
// 设置全局路由实例
setRouter(router)
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'
const routes = [
......@@ -20,7 +20,7 @@ const routes = [
]
const router = createRouter({
history: createWebHistory('/ai/'), // 添加基础路径
history: createWebHashHistory('/ai/'), // 使用Hash模式
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 {
constructor() {
this.appId = 'YOUR_WECHAT_APPID' // 替换为你的微信公众号AppID
this.isWeChat = this.checkWeChatBrowser()
this.isConfigured = this.appId !== 'YOUR_WECHAT_APPID'
this.corpId = 'ww88c20288b24a8e33' // 企业微信CorpID
this.agentId = '1000002' // 应用AgentId
}
// 检查是否为微信浏览器
checkWeChatBrowser() {
// 检查是否为企业微信浏览器
checkWeChatWorkBrowser() {
const ua = navigator.userAgent.toLowerCase()
return ua.indexOf('micromessenger') !== -1
return ua.indexOf('wxwork') !== -1
}
// 简化的静默登录
async silentLogin() {
// 如果未配置appId,使用模拟登录
if (!this.isConfigured) {
console.log('使用模拟静默登录')
return this.mockLogin()
}
// 如果是微信浏览器,执行真实静默登录
if (this.isWeChat) {
return this.realWeChatLogin()
}
// 非微信浏览器,使用模拟登录
console.log('非微信浏览器,使用模拟登录')
return this.mockLogin()
// 从URL参数获取code
getCodeFromURL() {
const urlParams = new URLSearchParams(window.location.search)
return urlParams.get('code')
}
// 真实微信静默登录
realWeChatLogin() {
return new Promise((resolve, reject) => {
// 检查URL中是否已有授权code
const urlParams = new URLSearchParams(window.location.search)
const code = urlParams.get('code')
if (code) {
// 已有code,直接获取用户信息
this.getUserInfo(code).then(resolve).catch(reject)
} else {
// 重定向到微信授权页面进行静默授权
this.redirectToWeChat()
// 企业微信静默登录 - 核心方法
async silentLogin() {
try {
// 直接从URL获取code
const code = this.getCodeFromURL()
if (!code) {
console.error('未找到code参数,请确保在企业微信内部应用中访问')
return {
isLoggedIn: false,
message: '未找到code参数,请确保在企业微信内部应用中访问'
}
}
})
}
// 重定向到微信授权页面
redirectToWeChat() {
const redirectUri = encodeURIComponent(window.location.origin + window.location.pathname)
const scope = 'snsapi_base' // 静默授权,不弹出授权页面
const state = 'STATE_' + Date.now()
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`
window.location.href = authUrl
// 获取用户信息
const userInfo = await this.getUserInfo(code)
return {
isLoggedIn: true,
code: code,
userInfo: userInfo
}
} catch (error) {
console.error('登录失败:', error.message)
return {
isLoggedIn: false,
message: error.message || '登录失败'
}
}
}
// 获取用户信息(简化版)
// 获取用户信息 - 使用axios
async getUserInfo(code) {
try {
// 这里需要调用后端接口来获取用户信息
// 微信不允许前端直接调用获取用户信息的接口
const response = await fetch('/api/wechat/userinfo', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ code })
const response = await post('/pedService/wxcp/auth', {
authCode: code
})
if (!response.ok) {
throw new Error('获取用户信息失败')
}
const userInfo = await response.json()
// 保存用户信息到本地存储
localStorage.setItem('wechat_user', JSON.stringify(userInfo))
const result = response.data
return {
isLoggedIn: true,
userInfo: userInfo,
message: '微信静默登录成功'
if (result.code === 0) {
// 保存用户信息
localStorage.setItem('wechat_user', JSON.stringify(result.data))
return result.data
} else {
throw new Error(result.message || '获取用户信息失败')
}
} catch (error) {
console.error('获取用户信息失败:', error)
throw new Error('登录失败,请重试')
throw new Error(`获取用户信息失败: ${error.message}`)
}
}
// 模拟登录(用于开发和测试)
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() {
const userData = localStorage.getItem('wechat_user')
if (userData) {
try {
const userInfo = JSON.parse(userData)
return {
isLoggedIn: true,
userInfo: userInfo
userInfo: JSON.parse(userData)
}
} catch (error) {
console.error('解析用户数据失败:', error)
localStorage.removeItem('wechat_user')
}
}
return { isLoggedIn: false }
}
......@@ -136,7 +92,7 @@ class WeChatLogin {
localStorage.removeItem('wechat_user')
}
// 获取当前用户信息
// 获取当前用户
getCurrentUser() {
const status = this.checkLoginStatus()
return status.isLoggedIn ? status.userInfo : null
......
......@@ -17,21 +17,22 @@
const apiBaseUrl = '/pedapi';
// 获取token
const userToken = '65c76a8b38f350bd1849d41d3185c3eb';
const userInfo = localStorage.getItem('wechat_user')
const {extMap = {}} = JSON.parse(userInfo || '{}')
const userToken = extMap.sessionId;
// 添加APP_CODE配置
const appCode = 'ped.pc';
const appCode = 'ped.qywx';
const chatParams = {
appId: '83b2664019a945d0a438abe6339758d8',
stage: 'wechat-demo',
};
const dialogSessionId = '20251028143404893-00045166';
// const dialogSessionId = '';
// const dialogSessionId = '20251028143404893-00045166';
const dialogSessionId = '';
const detailData = ref({
title: '国械小智',
});
</script>
<style scoped>
......
......@@ -5,7 +5,6 @@
<div class="spinner"></div>
<p>正在静默登录中...</p>
</div>
<div v-else-if="error" class="error">
<p class="error-text">{{ error }}</p>
<button @click="retryLogin" class="retry-btn">重试登录</button>
......@@ -35,12 +34,9 @@ export default {
if (result.isLoggedIn) {
// 登录成功,跳转到首页
setTimeout(() => {
router.replace('/')
}, 500)
router.replace('/')
}
} catch (err) {
console.error('登录失败:', err)
error.value = err.message || '登录失败,请重试'
loading.value = false
}
......
......@@ -81,12 +81,13 @@
<script setup lang="ts">
import { EventSourcePolyfill } from 'event-source-polyfill';
import { ref, nextTick, onMounted, onBeforeUnmount } from 'vue';
import { SendOutlined, UserOutlined } from '@ant-design/icons-vue';
import { ref, reactive, computed, onMounted, onBeforeUnmount, nextTick, watch } from 'vue';
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 ChartComponent from './ChartComponent.vue'; // 导入独立的图表组件
import { tableTemplate } from './tableTemplate'; // 导入表格模板工具
// 组件属性
const props = withDefaults(
......@@ -303,20 +304,18 @@ const sendMessage = async () => {
} else {
// 默认的API调用逻辑
console.log('默认API调用逻辑', dialogSessionId);
const response = await fetch(`${props.apiBaseUrl}/aiService/ask/app/${props.params?.appId}`, {
method: 'POST',
const response = await post(`${props.apiBaseUrl}/aiService/ask/app/${props.params?.appId}`, {
question: message,
...props.params,
}, {
headers: {
'Content-Type': 'application/json',
Token: props.token || '',
'x-session-id': props.token || '',
'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) {
loading.value = false;
}
......@@ -365,19 +364,21 @@ const processSSEMessage = (
case 3: // 图表数据
if (updatedResponse) {
const { rows } = messageContent;
// 表格数据处理
updatedResponse.contentBlocks.push({
content: contentTemplates.table(rows),
hasThinkBox: false,
thinkContent: '',
thinkBoxExpanded: false,
});
// 图表数据处理
updatedResponse.contentBlocks.push({
content: '', // 图表内容由组件处理,这里留空
content: '',
hasThinkBox: false,
thinkContent: '',
thinkBoxExpanded: false,
chartData: messageContent, // 添加图表数据
chartType: 3, // 使用object类型
chartType: 3,
});
}
break;
......@@ -504,7 +505,7 @@ const reconnectSSE = (newDialogSessionId: string) => {
// 添加重连间隔控制,避免频繁重连
const reconnectTimeout = setTimeout(() => {
initSSE();
// 重连完成后重置标志
// 重连完成后重置标志
setTimeout(() => {
isReconnecting.value = false;
}, 2000); // 延长重连间隔
......@@ -755,14 +756,15 @@ const getChatRecord = async (dialogSessionId: string) => {
messages.value = [...recordList];
}
} else {
const response = await fetch(`${props.apiBaseUrl}/aiService/ask/list/chat/${dialogSessionId}`, {
const response = await post(`${props.apiBaseUrl}/aiService/ask/list/chat/${dialogSessionId}`, {}, {
headers: {
Token: props.token || '',
'x-session-id': props.token || '',
'x-app-code': props.appCode || '',
},
}
});
const data = await response.json();
const data = response.data;
if (data.code === 0) {
const recordList = processHistoryData(data.data || []);
messages.value = [...recordList];
......
This diff is collapsed.
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import { resolve } from 'path';
export default defineConfig({
base: '/ai/', // 添加基础路径前缀
plugins: [vue()],
server: {
host: '0.0.0.0',
port: 3000,
proxy: {
// 添加history fallback配置
historyApiFallback: {
rewrites: [
{ from: /^\/ai\/.*$/, to: '/ai/index.html' }
]
},
proxy: {
'/pedapi': {
target: 'http://peddev.cmic.com.cn',
changeOrigin: true, // 解决跨域问题
......@@ -33,6 +40,24 @@ export default defineConfig({
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({
resolve: {
alias: {
'@': 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