diff --git a/package.json b/package.json index e38523b..4fd473b 100644 --- a/package.json +++ b/package.json @@ -48,10 +48,11 @@ "vue-router": "^4.5.0" }, "devDependencies": { - "@vitejs/plugin-vue": "^5.0.4", "@types/node": "^20.11.19", + "@vitejs/plugin-vue": "^5.0.4", "@vue/compiler-sfc": "^3.4.21", "autoprefixer": "^10.4.17", + "mockjs": "^1.1.0", "postcss": "^8.4.35", "postcss-import": "^16.0.1", "postcss-preset-env": "^9.3.0", diff --git a/public/data/chatModes.json b/public/data/chatModes.json new file mode 100644 index 0000000..70f5104 --- /dev/null +++ b/public/data/chatModes.json @@ -0,0 +1,23 @@ +{ + "training": { + "name": "寿险代理人AI陪练", + "icon": "👨‍💼", + "token": "app-88ae2GN49aUyNO6qGg7tbTfX", + "background": "# 客户信息\n### **基础背景与性格设定** \n**姓名**:刘勇 \n**年龄**:34 岁 \n**职业**:腾讯员工 \n**家庭**:妻子为全职太太,女儿 9 岁,双方父母健在 \n**性格**:冷静、理性、务实,偏好客观数据和逻辑分析,对保险持观望态度,防备心较强 \n**近期状态**: \n- 体检显示中度脂肪肝,担心投保问题 \n- 已为全家配置百万医疗险,妻子有重疾险,但认为保障不足 (保费 50W)\n- 对理财型保险收益不认可,但对补充重疾险有潜在需求 ", + "chatBackground": "通过尚先生介绍,你和他的老同学在他的家里首次面谈。他的家中布置简洁,茶几上摆放着一套茶具。" + }, + "quote_objection": { + "name": "报价中异议", + "icon": "💬", + "token": "app-ur2Altw2LHR6niX8Q1S7Cn41", + "background": "# 客户信息\n### **基础背景与性格设定** \n**姓名**: 王大牛\n**年龄**: 40岁\n**职业**: 私营企业主\n**车牌号**: 闽C12345\n**车辆信息**:拥有一辆行驶4年的大众途观L,购买价格约25万,主要用于商务出行及家庭使用。\n**投保信息**:在其他保司购买交强险及商业险(三者险、车损险),还有1个月到期。有过一次轻微追尾事故,已通过保司处理。王先生对成本控制非常敏感,但也能意识到保险的重要性。他希望得到保障全面、价格合理的产品和优质的服务。", + "chatBackground": "现在你将扮演坐席专员,与系统扮演的客户针对报价中的各类异议开展对练,着重训练处理\"报价中异议\"的能力。按照\"保全保足\"原则给出险种推荐方案。" + }, + "post_quote_objection": { + "name": "报价后异议", + "icon": "💰", + "token": "app-Yiccl0JoXs2QF2lkHxO6f822", + "background": "# 客户信息\n### **基础背景与性格设定** \n**姓名**: 张灵女士\n**年龄**: 32岁\n**职业**: 公司行政主管\n**车牌号**: 粤B56789\n**车辆信息**:拥有一辆行驶4年多的本田思域,1.5T,CVT燃动版,购买价格约15万,用于日常通勤及周末短途出行。\n**投保信息**:在其他保司购买交强险及商业险(三者险、车损险、不计免赔险、车上人员责任险),还有2个月到期。无事故记录,仅有两次违章停车记录。张女士注重性价比和服务质量,希望保险的保障全面、价格合理、服务贴心。", + "chatBackground": "现在你将扮演坐席专员,与系统扮演的客户针对报价后的各类异议开展对练,着重训练处理\"报价后异议\"的能力。按照\"保全保足\"原则给出险种推荐方案。" + } +} \ No newline at end of file diff --git a/src/api/chat.js b/src/api/chat.js index 711b431..c02014d 100644 --- a/src/api/chat.js +++ b/src/api/chat.js @@ -1,4 +1,4 @@ -import { sseRequest } from '@/utils/request' +import { sseRequest, httpRequest } from '@/utils/request' export function sendMessage(data, token) { return sseRequest({ @@ -8,4 +8,11 @@ export function sendMessage(data, token) { 'Authorization': `Bearer ${token}` } }) -} \ No newline at end of file +} + +export function getChatModes() { + return httpRequest({ + url: '/api/v1/chat-modes', + method: 'POST', + }) +} diff --git a/src/main.js b/src/main.js index d057e47..3a5aee9 100644 --- a/src/main.js +++ b/src/main.js @@ -13,6 +13,11 @@ import { setTheme } from '@/styles/theme'; // Import setTheme import ElementPlus from 'element-plus' import zhCn from 'element-plus/dist/locale/zh-cn.mjs' +// 在开发环境下引入mock +// if (import.meta.env.VITE_APP_MOCK === 'true') { + import('@/mock') +// } + const pinia = createPinia(); pinia.use(piniaPluginPersistedstate) diff --git a/src/mock/index.js b/src/mock/index.js new file mode 100644 index 0000000..0454a06 --- /dev/null +++ b/src/mock/index.js @@ -0,0 +1,18 @@ +import Mock from 'mockjs' + +// 设置延迟时间 +Mock.setup({ + timeout: '200-600' +}) + +// 自动导入所有mock文件 +const modules = import.meta.glob('./modules/*.js', { eager: true }) + +// 注册所有mock模块 +Object.values(modules).forEach(module => { + if (module.default) { + module.default(Mock) + } +}) + +export default Mock \ No newline at end of file diff --git a/src/mock/modules/chat.js b/src/mock/modules/chat.js new file mode 100644 index 0000000..9642565 --- /dev/null +++ b/src/mock/modules/chat.js @@ -0,0 +1,8 @@ +export default function (Mock) { + // 获取聊天模式配置 + Mock.mock(/\/api\/chat\/modes/, 'get', { + 'code': 200, + 'message': 'success', + 'data': '/data/chatModes.json' + }) +} \ No newline at end of file diff --git a/src/mock/modules/user.js b/src/mock/modules/user.js new file mode 100644 index 0000000..9fd043b --- /dev/null +++ b/src/mock/modules/user.js @@ -0,0 +1,55 @@ +export default function (Mock) { + // 用户列表 + Mock.mock(/\/api\/users/, 'get', { + 'code': 200, + 'message': 'success', + 'data|10': [{ + 'id|+1': 1, + 'name': '@cname', + 'age|18-60': 1, + 'gender|1': ['男', '女'], + 'email': '@email', + 'phone': /^1[3-9]\d{9}$/, + 'address': '@county(true)', + 'createTime': '@datetime' + }] + }) + + // 用户详情 + Mock.mock(/\/api\/users\/\d+/, 'get', { + 'code': 200, + 'message': 'success', + 'data': { + 'id|+1': 1, + 'name': '@cname', + 'age|18-60': 1, + 'gender|1': ['男', '女'], + 'email': '@email', + 'phone': /^1[3-9]\d{9}$/, + 'address': '@county(true)', + 'createTime': '@datetime' + } + }) + + // 创建用户 + Mock.mock(/\/api\/users/, 'post', { + 'code': 200, + 'message': 'success', + 'data': { + 'id': '@id', + 'createTime': '@datetime' + } + }) + + // 更新用户 + Mock.mock(/\/api\/users\/\d+/, 'put', { + 'code': 200, + 'message': 'success' + }) + + // 删除用户 + Mock.mock(/\/api\/users\/\d+/, 'delete', { + 'code': 200, + 'message': 'success' + }) +} \ No newline at end of file diff --git a/src/store/chat.js b/src/store/chat.js index 0f17895..b7e8fc2 100644 --- a/src/store/chat.js +++ b/src/store/chat.js @@ -8,7 +8,7 @@ const chatModes = { token: 'app-88ae2GN49aUyNO6qGg7tbTfX', background: `# 客户信息 ### **基础背景与性格设定** -**姓名**:张伟 +**姓名**:刘勇 **年龄**:34 岁 **职业**:腾讯员工 **家庭**:妻子为全职太太,女儿 9 岁,双方父母健在 @@ -17,7 +17,7 @@ const chatModes = { - 体检显示中度脂肪肝,担心投保问题 - 已为全家配置百万医疗险,妻子有重疾险,但认为保障不足 (保费 50W) - 对理财型保险收益不认可,但对补充重疾险有潜在需求 `, - chatBackground: '通过顾先生介绍,你和他的老同学在他的家里首次面谈。他的家中布置简洁,茶几上摆放着一套茶具。', + chatBackground: '通过尚先生介绍,你和他的老同学在他的家里首次面谈。他的家中布置简洁,茶几上摆放着一套茶具。', }, quote_objection: { name: '报价中异议', @@ -25,7 +25,7 @@ const chatModes = { token: 'app-ur2Altw2LHR6niX8Q1S7Cn41', background: `# 客户信息 ### **基础背景与性格设定** -**姓名**: 王力 +**姓名**: 王大牛 **年龄**: 40岁 **职业**: 私营企业主 **车牌号**: 闽C12345 @@ -39,7 +39,7 @@ const chatModes = { token: 'app-Yiccl0JoXs2QF2lkHxO6f822', background: `# 客户信息 ### **基础背景与性格设定** -**姓名**: 张琳女士 +**姓名**: 张灵女士 **年龄**: 32岁 **职业**: 公司行政主管 **车牌号**: 粤B56789 diff --git a/src/utils/request.js b/src/utils/request.js index 87d066f..c646730 100644 --- a/src/utils/request.js +++ b/src/utils/request.js @@ -127,4 +127,46 @@ export const sseRequest = (config) => { }) } +// 常规HTTP请求方法 +export const httpRequest = (config) => { + return new Promise((resolve, reject) => { + try { + const { + url, + method = 'GET', + params = {}, + data = {}, + headers = {}, + ...restConfig + } = config + + // 构建请求配置 + const requestConfig = { + url, + method, + params, + data, + headers: { + ...headers, + 'Content-Type': 'application/json' + }, + ...restConfig + } + + // 发送请求 + service(requestConfig) + .then(response => { + resolve(response) + }) + .catch(error => { + console.error('HTTP request failed:', error) + reject(error) + }) + } catch (error) { + console.error('HTTP request setup failed:', error) + reject(error) + } + }) +} + export default service \ No newline at end of file diff --git a/vite.config.js b/vite.config.js index 090cf1d..c108f05 100644 --- a/vite.config.js +++ b/vite.config.js @@ -18,6 +18,9 @@ export default defineConfig(({ command, mode }) => { processEnv[key] = JSON.stringify(env[key]) }) + // 始终启用mock + const isMockEnabled = true + return { plugins: [ vue(), @@ -91,7 +94,9 @@ export default defineConfig(({ command, mode }) => { } }, define: { - 'process.env': processEnv + 'process.env': processEnv, + // 注入mock环境变量 + 'import.meta.env.VITE_APP_MOCK': JSON.stringify(isMockEnabled) } } }) diff --git a/yarn.lock b/yarn.lock index 744bd75..7ffd8c3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1411,6 +1411,11 @@ combined-stream@^1.0.8: dependencies: delayed-stream "~1.0.0" +commander@*: + version "13.1.0" + resolved "https://registry.npmmirror.com/commander/-/commander-13.1.0.tgz#776167db68c78f38dcce1f9b8d7b8b9a488abf46" + integrity sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw== + computeds@^0.0.1: version "0.0.1" resolved "https://registry.npmmirror.com/computeds/-/computeds-0.0.1.tgz#215b08a4ba3e08a11ff6eee5d6d8d7166a97ce2e" @@ -2142,6 +2147,13 @@ mlly@^1.7.4: pkg-types "^1.3.0" ufo "^1.5.4" +mockjs@^1.1.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/mockjs/-/mockjs-1.1.0.tgz#e6a0c378e91906dbaff20911cc0273b3c7d75b06" + integrity sha512-eQsKcWzIaZzEZ07NuEyO4Nw65g0hdWAyurVol1IPl1gahRwY+svqzfgfey8U8dahLwG44d6/RwEzuK52rSa/JQ== + dependencies: + commander "*" + mrmime@^2.0.0: version "2.0.1" resolved "https://registry.npmmirror.com/mrmime/-/mrmime-2.0.1.tgz#bc3e87f7987853a54c9850eeb1f1078cd44adddc"