diff --git a/npm-dev.service b/npm-dev.service index 5e8db4c..d72ff80 100644 --- a/npm-dev.service +++ b/npm-dev.service @@ -109,6 +109,9 @@ WantedBy=multi-user.target + + + diff --git a/src/api/ai-strategy.js b/src/api/ai-strategy.js new file mode 100644 index 0000000..6cdf428 --- /dev/null +++ b/src/api/ai-strategy.js @@ -0,0 +1,95 @@ +import request from '@/utils/request' + +// 分页查询AI策略列表 +export function fetchList(params) { + return request({ + url: '/aiStrategy/list', + method: 'get', + params: { + current: params.page || 1, + size: params.limit || 20, + keyword: params.keyword, + status: params.status, + category: params.category + } + }) +} + +// 创建AI策略 +export function createStrategy(data) { + return request({ + url: '/aiStrategy/create', + method: 'post', + data + }) +} + +// 更新AI策略 +export function updateStrategy(data) { + return request({ + url: '/aiStrategy/update', + method: 'put', + data + }) +} + +// 删除AI策略 +export function deleteStrategy(id) { + return request({ + url: `/aiStrategy/delete/${id}`, + method: 'delete' + }) +} + +// 获取AI策略详情 +export function getStrategy(id) { + return request({ + url: `/aiStrategy/detail/${id}`, + method: 'get' + }) +} + +// 切换策略状态 +export function toggleStatus(id, status) { + return request({ + url: `/aiStrategy/toggleStatus/${id}`, + method: 'put', + data: { status } + }) +} + +// 批量启用策略 +export function batchEnable(ids) { + return request({ + url: '/aiStrategy/batchEnable', + method: 'put', + data: { ids } + }) +} + +// 批量禁用策略 +export function batchDisable(ids) { + return request({ + url: '/aiStrategy/batchDisable', + method: 'put', + data: { ids } + }) +} + +// 获取策略执行统计 +export function getStrategyStats(params) { + return request({ + url: '/aiStrategy/stats', + method: 'get', + params + }) +} + +// 测试策略 +export function testStrategy(id, testData) { + return request({ + url: `/aiStrategy/test/${id}`, + method: 'post', + data: testData + }) +} diff --git a/src/api/call-quality-inspection.js b/src/api/call-quality-inspection.js new file mode 100644 index 0000000..ebb8794 --- /dev/null +++ b/src/api/call-quality-inspection.js @@ -0,0 +1,48 @@ +import request from '@/utils/request' + +// 分页查询通话质检列表 +export function fetchList(params) { + return request({ + url: '/callQualityInspection/list', + method: 'get', + params: { + current: params.page || 1, + size: params.limit || 20, + keyword: params.keyword + } + }) +} + +// 创建通话质检记录 +export function createRecord(data) { + return request({ + url: '/callQualityInspection/create', + method: 'post', + data + }) +} + +// 更新通话质检记录 +export function updateRecord(data) { + return request({ + url: '/callQualityInspection/update', + method: 'put', + data + }) +} + +// 删除通话质检记录 +export function deleteRecord(id) { + return request({ + url: `/callQualityInspection/delete/${id}`, + method: 'delete' + }) +} + +// 获取通话质检详情 +export function getRecord(id) { + return request({ + url: `/callQualityInspection/detail/${id}`, + method: 'get' + }) +} diff --git a/src/layout/components/Navbar.vue b/src/layout/components/Navbar.vue index 0a92d50..3bada52 100644 --- a/src/layout/components/Navbar.vue +++ b/src/layout/components/Navbar.vue @@ -7,7 +7,7 @@
- + {{ name || 'userName' }}
@@ -44,7 +44,8 @@ export default { computed: { ...mapGetters([ 'sidebar', - 'avatar' + 'avatar', + 'name' ]) }, methods: { @@ -117,12 +118,25 @@ export default { .avatar-wrapper { margin-top: 5px; position: relative; + display: flex; + align-items: center; + cursor: pointer; .user-avatar { - cursor: pointer; width: 40px; height: 40px; border-radius: 10px; + margin-right: 8px; + } + + .user-name { + color: #606266; + font-size: 14px; + margin-right: 8px; + max-width: 100px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; } .el-icon-caret-bottom { diff --git a/src/router/index.js b/src/router/index.js index fb9bd63..f1cf124 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -86,6 +86,18 @@ export const constantRoutes = [ name: 'IntelligentPickup', component: () => import('@/views/sales/intelligent-pickup'), meta: { title: '智能捡漏', icon: 'el-icon-magic-stick' } + }, + { + path: 'call-quality-inspection', + name: 'CallQualityInspection', + component: () => import('@/views/sales/call-quality-inspection'), + meta: { title: '通话质检', icon: 'el-icon-phone' } + }, + { + path: 'ai-strategy', + name: 'AiStrategy', + component: () => import('@/views/sales/ai-strategy'), + meta: { title: 'AI策略', icon: 'el-icon-cpu' } } ] }, @@ -124,12 +136,6 @@ export const constantRoutes = [ name: 'BrandAnalysis', component: () => import('@/views/dealership/brand-analysis'), meta: { title: '品牌分析', icon: 'el-icon-data-analysis' } - }, - { - path: 'customer-profile', - name: 'CustomerProfile', - component: () => import('@/views/dealership/customer-profile'), - meta: { title: '客户画像', icon: 'el-icon-user-solid' } } ] }, @@ -165,6 +171,12 @@ export const constantRoutes = [ name: 'CustomerManagement', component: () => import('@/views/customer/index'), meta: { title: '客户管理', icon: 'el-icon-user' } + }, + { + path: 'customer-profile', + name: 'CustomerProfile', + component: () => import('@/views/dealership/customer-profile'), + meta: { title: '客户画像', icon: 'el-icon-user-solid' } } ] }, diff --git a/src/utils/validate.js b/src/utils/validate.js index 8d962ad..81eabfe 100644 --- a/src/utils/validate.js +++ b/src/utils/validate.js @@ -16,5 +16,11 @@ export function isExternal(path) { */ export function validUsername(str) { const valid_map = ['admin', 'editor'] - return valid_map.indexOf(str.trim()) >= 0 + // 支持原有的用户名 + if (valid_map.indexOf(str.trim()) >= 0) { + return true + } + // 支持手机号格式(11位数字,以1开头) + const phoneRegex = /^1[3-9]\d{9}$/ + return phoneRegex.test(str.trim()) } diff --git a/src/views/login/index.vue b/src/views/login/index.vue index b235680..362f6e1 100644 --- a/src/views/login/index.vue +++ b/src/views/login/index.vue @@ -13,7 +13,7 @@ { if (!validUsername(value)) { - callback(new Error('请输入用户名')) + callback(new Error('请输入正确的手机号或用户名')) } else { callback() } diff --git a/src/views/sales/ai-strategy.vue b/src/views/sales/ai-strategy.vue new file mode 100644 index 0000000..e36daa1 --- /dev/null +++ b/src/views/sales/ai-strategy.vue @@ -0,0 +1,590 @@ + + + + + diff --git a/src/views/sales/call-quality-inspection.vue b/src/views/sales/call-quality-inspection.vue new file mode 100644 index 0000000..6706977 --- /dev/null +++ b/src/views/sales/call-quality-inspection.vue @@ -0,0 +1,485 @@ + + + + +