feat(mock): 开发环境下启用 mock 数据

- 在 package.json 中添加 mockjs 依赖
- 新增 chatModes.json 文件,定义聊天模式配置
- 修改 main.js,引入 mock 模块
- 新增 mock 目录,实现模拟数据接口
- 更新 store/chat.js,调整聊天模式数据
- 在 vite.config.js 中添加 mock 环境变量
This commit is contained in:
Lexcubia 2025-04-24 17:57:59 +08:00
parent 80defc98d8
commit 5269716d84
11 changed files with 184 additions and 8 deletions

View File

@ -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",

View File

@ -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.5TCVT燃动版购买价格约15万用于日常通勤及周末短途出行。\n**投保信息**在其他保司购买交强险及商业险三者险、车损险、不计免赔险、车上人员责任险还有2个月到期。无事故记录仅有两次违章停车记录。张女士注重性价比和服务质量希望保险的保障全面、价格合理、服务贴心。",
"chatBackground": "现在你将扮演坐席专员,与系统扮演的客户针对报价后的各类异议开展对练,着重训练处理\"报价后异议\"的能力。按照\"保全保足\"原则给出险种推荐方案。"
}
}

View File

@ -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}`
}
})
}
}
export function getChatModes() {
return httpRequest({
url: '/api/v1/chat-modes',
method: 'POST',
})
}

View File

@ -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)

18
src/mock/index.js Normal file
View File

@ -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

8
src/mock/modules/chat.js Normal file
View File

@ -0,0 +1,8 @@
export default function (Mock) {
// 获取聊天模式配置
Mock.mock(/\/api\/chat\/modes/, 'get', {
'code': 200,
'message': 'success',
'data': '/data/chatModes.json'
})
}

55
src/mock/modules/user.js Normal file
View File

@ -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'
})
}

View File

@ -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

View File

@ -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

View File

@ -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)
}
}
})

View File

@ -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"