index.js 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856
  1. import Vue from 'vue'
  2. import Router from 'vue-router'
  3. Vue.use(Router)
  4. /* Layout */
  5. import Layout from '@/layout'
  6. import ParentView from '@/components/ParentView';
  7. import LiveConsole from "@/views/live/liveConsole/index.vue";
  8. /**
  9. * Note: 路由配置项
  10. *
  11. * hidden: true // 当设置 true 的时候该路由不会再侧边栏出现 如401,login等页面,或者如一些编辑页面/edit/1
  12. * alwaysShow: true // 当你一个路由下面的 children 声明的路由大于1个时,自动会变成嵌套的模式--如组件页面
  13. * // 只有一个时,会将那个子路由当做根路由显示在侧边栏--如引导页面
  14. * // 若你想不管路由下面的 children 声明的个数都显示你的根路由
  15. * // 你可以设置 alwaysShow: true,这样它就会忽略之前定义的规则,一直显示根路由
  16. * redirect: noRedirect // 当设置 noRedirect 的时候该路由在面包屑导航中不可被点击
  17. * name:'router-name' // 设定路由的名字,一定要填写不然使用<keep-alive>时会出现各种问题
  18. * query: '{"id": 1, "name": "ry"}' // 访问路由的默认传递参数
  19. * meta : {
  20. noCache: true // 如果设置为true,则不会被 <keep-alive> 缓存(默认 false)
  21. title: 'title' // 设置该路由在侧边栏和面包屑中展示的名字
  22. icon: 'svg-name' // 设置该路由的图标,对应路径src/assets/icons/svg
  23. breadcrumb: false // 如果设置为false,则不会在breadcrumb面包屑中显示
  24. activeMenu: '/system/user' // 当路由设置了该属性,则会高亮相对应的侧边栏。
  25. }
  26. */
  27. // 公共路由
  28. export const constantRoutes = [
  29. {
  30. path: '/redirect',
  31. component: Layout,
  32. hidden: true,
  33. children: [
  34. {
  35. path: '/redirect/:path(.*)',
  36. component: (resolve) => require(['@/views/redirect'], resolve)
  37. }
  38. ]
  39. },
  40. {
  41. path: '/login',
  42. component: (resolve) => require(['@/views/login'], resolve),
  43. hidden: true
  44. },
  45. {
  46. path: '/register',
  47. component: (resolve) => require(['@/views/register'], resolve),
  48. hidden: true
  49. },
  50. {
  51. path: '/set-password',
  52. name: 'SetPassword',
  53. component: () => import('@/views/setPassword.vue'),
  54. hidden: true
  55. },
  56. {
  57. path: '/404',
  58. component: (resolve) => require(['@/views/error/404'], resolve),
  59. hidden: true
  60. },
  61. {
  62. path: '/401',
  63. component: (resolve) => require(['@/views/error/401'], resolve),
  64. hidden: true
  65. },
  66. // /wx 空壳路由已移除(个微管理路由在下方690行正确定义)
  67. {
  68. path: '',
  69. component: Layout,
  70. redirect: 'index',
  71. children: [
  72. {
  73. path: 'index',
  74. component: (resolve) => require(['@/views/index'], resolve),
  75. name: 'Index',
  76. meta: { title: '首页', icon: 'dashboard', affix: true }
  77. }
  78. ]
  79. },
  80. {
  81. path: '/user',
  82. component: Layout,
  83. hidden: true,
  84. redirect: 'noredirect',
  85. children: [
  86. {
  87. path: 'profile',
  88. component: (resolve) => require(['@/views/system/user/profile/index'], resolve),
  89. name: 'Profile',
  90. meta: { title: '个人中心', icon: 'user' }
  91. }
  92. ]
  93. },
  94. {
  95. path: '/system/user-auth',
  96. component: Layout,
  97. hidden: true,
  98. children: [
  99. {
  100. path: 'role/:userId(\\d+)',
  101. component: (resolve) => require(['@/views/system/user/authRole'], resolve),
  102. name: 'AuthRole',
  103. meta: { title: '分配角色', activeMenu: '/system/user'}
  104. }
  105. ]
  106. },
  107. {
  108. path: '/system/role-auth',
  109. component: Layout,
  110. hidden: true,
  111. children: [
  112. {
  113. path: 'user/:roleId(\\d+)',
  114. component: (resolve) => require(['@/views/system/role/authUser'], resolve),
  115. name: 'AuthUser',
  116. meta: { title: '分配用户', activeMenu: '/system/role'}
  117. }
  118. ]
  119. },
  120. {
  121. path: '/system/dict-data',
  122. component: Layout,
  123. hidden: true,
  124. children: [
  125. {
  126. path: 'index/:dictId(\\d+)',
  127. component: (resolve) => require(['@/views/system/dict/data'], resolve),
  128. name: 'Data',
  129. meta: { title: '字典数据', activeMenu: '/system/dict'}
  130. }
  131. ]
  132. },
  133. {
  134. path: '/monitor/job-log',
  135. component: Layout,
  136. hidden: true,
  137. children: [
  138. {
  139. path: 'index',
  140. component: (resolve) => require(['@/views/monitor/job/log'], resolve),
  141. name: 'JobLog',
  142. meta: { title: '调度日志', activeMenu: '/monitor/job'}
  143. }
  144. ]
  145. },
  146. {
  147. path: '/tool/gen-edit',
  148. component: Layout,
  149. hidden: true,
  150. children: [
  151. {
  152. path: 'index',
  153. component: (resolve) => require(['@/views/tool/gen/editTable'], resolve),
  154. name: 'GenEdit',
  155. meta: { title: '修改生成配置', activeMenu: '/tool/gen'}
  156. }
  157. ]
  158. },
  159. {
  160. path: '/watch/deviceInfo/details',
  161. component: Layout,
  162. hidden: true,
  163. children: [
  164. {
  165. path: ':deviceId(\\d+)',
  166. component: (resolve) => require(['@/views/watch/deviceInfo/details'], resolve),
  167. name: 'details',
  168. meta: { title: '设备详情', activeMenu: '/watch/deviceInfo'}
  169. }
  170. ]
  171. },
  172. {
  173. path: '/course/sopTempe',
  174. component: Layout,
  175. hidden: true,
  176. children: [
  177. {
  178. path: 'updateSopTemp/:id/:type(\\d+)', // 确保 :type 的正则匹配数字
  179. component: () => import('@/views/qw/sopTemp/updateSopTemp'),
  180. name: 'updateSopTemp',
  181. meta: { title: '改动SOP模板', activeMenu: '/course/addSopTemp' }
  182. },
  183. {
  184. path: 'updateTemp/:id/:type(\\d+)', // 确保 :type 的正则匹配数字
  185. component: () => import('@/views/qw/sopTemp/updateTemp'),
  186. name: 'updateTemp',
  187. meta: { title: '改动SOP模板', activeMenu: '/course/updateTemp' }
  188. },
  189. {
  190. path: 'updateAiChatTemp/:id/:type(\\d+)',
  191. component: () => import('@/views/qw/sopTemp/updateAiChatTemp'),
  192. name: 'updateAiChatTempCourse',
  193. meta: { title: '改动SOP模板', activeMenu: '/course/addSopTemp' }
  194. },
  195. {
  196. path: 'courseFinishTemp/:parentId',
  197. component: (resolve) => require(['@/views/course/courseFinishTemp/index'], resolve),
  198. name: 'courseFinishTempCourse',
  199. meta: { title: '模板详情', activeMenu: '/course'}
  200. }
  201. ]
  202. },
  203. {
  204. path: '/fastGpt/fastGptDataset/Collection',
  205. component: Layout,
  206. hidden: true,
  207. children: [
  208. {
  209. path: 'fastGptCollection/:datasetId',
  210. component: (resolve) => require(['@/views/fastGpt/fastGptDataset/fastGptCollection'], resolve),
  211. name: 'fastGptCollection',
  212. meta: { title: '知识库的集合', activeMenu: '/fastGpt/fastGptCollection'}
  213. }
  214. ]
  215. },
  216. {
  217. path: '/qw/sopTemp',
  218. component: Layout,
  219. hidden: true,
  220. children: [
  221. {
  222. path: 'addSopTemp/:command',
  223. component: (resolve) => require(['@/views/qw/sopTemp/addSopTemp'], resolve),
  224. name: 'addSopTemp',
  225. meta: { title: '新增SOP模板', activeMenu: '/qw/addSopTemp'}
  226. },
  227. {
  228. path: 'addTemp/:command',
  229. component: (resolve) => require(['@/views/qw/sopTemp/addTemp'], resolve),
  230. name: 'addTemp',
  231. meta: { title: '新增SOP模板', activeMenu: '/qw/addTemp'}
  232. },
  233. {
  234. path: 'addAiChatTemp',
  235. component: (resolve) => require(['@/views/qw/sopTemp/addAiChatTemp'], resolve),
  236. name: 'addAiChatTemp',
  237. meta: { title: '新增AI对话模板', activeMenu: '/qw/addSopTemp'}
  238. },
  239. {
  240. path: 'updateSopTemp/:id/:type(\\d+)',
  241. component: () => import('@/views/qw/sopTemp/updateSopTemp'),
  242. name: 'updateSopTempQw',
  243. meta: { title: '改动SOP模板', activeMenu: '/qw/addSopTemp' }
  244. },
  245. {
  246. path: 'updateTemp/:id/:type(\\d+)',
  247. component: () => import('@/views/qw/sopTemp/updateTemp'),
  248. name: 'updateTempQw',
  249. meta: { title: '改动SOP模板', activeMenu: '/qw/updateTemp' }
  250. },
  251. {
  252. path: 'updateAiChatTemp/:id/:type(\\d+)',
  253. component: () => import('@/views/qw/sopTemp/updateAiChatTemp'),
  254. name: 'updateAiChatTempQw',
  255. meta: { title: '改动SOP模板', activeMenu: '/qw/addSopTemp' }
  256. }
  257. ]
  258. },
  259. {
  260. path: '/qw/sop',
  261. component: Layout,
  262. hidden: true,
  263. children: [
  264. {
  265. path: 'addSop/:corpId/:type(\\d+)',
  266. component: (resolve) => require(['@/views/qw/sop/addSop'], resolve),
  267. name: 'addSop',
  268. meta: { title: '新增SOP任务', activeMenu: '/qw/sop'}
  269. },
  270. {
  271. path: 'addAiChatSop/:corpId',
  272. component: (resolve) => require(['@/views/qw/sop/addAiChatSop'], resolve),
  273. name: 'addAiChatSop',
  274. meta: { title: '新增聊天SOP任务', activeMenu: '/qw/sop'}
  275. },
  276. {
  277. path: 'updateSop/:id/:type',
  278. component: (resolve) => require(['@/views/qw/sop/updateSop.vue'], resolve),
  279. name: 'updateSop',
  280. meta: { title: '修改/查看SOP任务', activeMenu: '/qw/sop'}
  281. },
  282. {
  283. path: 'upAiChatDateSop/:id/:type',
  284. component: (resolve) => require(['@/views/qw/sop/upAiChatDateSop'], resolve),
  285. name: 'upDateAiChatSop',
  286. meta: { title: '修改/查看聊天SOP任务', activeMenu: '/qw/sop'}
  287. }
  288. ]
  289. },
  290. {
  291. path: '/qw/conversion',
  292. component: Layout,
  293. hidden: true,
  294. children: [
  295. {
  296. path: 'courseFinishTemp/:parentId',
  297. component: (resolve) => require(['@/views/course/courseFinishTemp/index'], resolve),
  298. name: 'courseFinishTempConversion',
  299. }
  300. ]
  301. },
  302. {
  303. path: '/fastGpt/fastGptRole1',
  304. component: Layout,
  305. hidden: true,
  306. children: [
  307. {
  308. path: 'updateFastGptRole/:command',
  309. component: (resolve) => require(['@/views/fastGpt/fastGptRole/fastGptRoleUpdate'], resolve),
  310. name: 'updateAiRole',
  311. meta: { title: '修改ai角色', activeMenu: '/fastGpt/fastGptRole'}
  312. }
  313. ]
  314. },
  315. // 已合并到 /course/sopTempe 路由中(删除重复定义)
  316. {
  317. path: '/qw/sopUserLogs',
  318. component: Layout,
  319. hidden: true,
  320. children: [
  321. {
  322. path: 'sopUserLogsSchedule/:id',
  323. component: () => import('@/views/qw/sopUserLogs/sopUserLogsSchedule.vue'),
  324. name: 'sopUserLogsSchedule',
  325. meta: { title: '查看营期', activeMenu: '/qw/sop' }
  326. }
  327. ]
  328. },
  329. // 独立页路由:不嵌套根布局,直接渲染目标组件
  330. {
  331. path: '/live/liveConsole/:liveId',
  332. name: 'LiveConsole',
  333. component: LiveConsole, // 直接渲染目标组件,无侧边栏
  334. meta: {
  335. isIndependentPage: true // 标记为“独立页”
  336. }
  337. },
  338. {
  339. path: '/his/aiWorkflow',
  340. component: () => import('@/layout/index'),
  341. hidden: true,
  342. children: [
  343. {
  344. path: '',
  345. component: () => import('@/views/his/aiWorkflow/index'),
  346. name: 'AiWorkflow',
  347. meta: { title: 'AI工作流', icon: 'workflow' }
  348. },
  349. {
  350. path: 'design',
  351. component: () => import('@/views/his/aiWorkflow/design'),
  352. name: 'AiWorkflowDesign',
  353. meta: { title: '工作流设计', activeMenu: '/his/aiWorkflow' }
  354. },
  355. {
  356. path: 'design/:id',
  357. component: () => import('@/views/his/aiWorkflow/design'),
  358. name: 'AiWorkflowEdit',
  359. meta: { title: '编辑工作流', activeMenu: '/his/aiWorkflow' }
  360. }
  361. ]
  362. },
  363. {
  364. path: '/company/aiWorkflow',
  365. component: Layout,
  366. hidden: true,
  367. children: [
  368. {
  369. path: 'index',
  370. component: () => import('@/views/company/aiWorkflow/index'),
  371. name: 'CompanyAiWorkflow',
  372. meta: { title: 'AI工作流', activeMenu: '/company/aiWorkflow' }
  373. }
  374. ]
  375. },
  376. {
  377. path: '/companyWx/companyWorkflow',
  378. component: () => import('@/layout/index'),
  379. hidden: true,
  380. children: [
  381. {
  382. path: '',
  383. component: () => import('@/views/company/companyWorkflow/index'),
  384. name: 'CompanyWorkflowFull',
  385. meta: { title: 'AI外呼工作流', icon: 'workflow' }
  386. },
  387. {
  388. path: 'myList',
  389. component: () => import('@/views/company/companyWorkflow/myIndex'),
  390. name: 'MyCompanyWorkflow',
  391. meta: { title: '我的工作流', activeMenu: '/companyWx/companyWorkflow' }
  392. },
  393. {
  394. path: 'design',
  395. component: () => import('@/views/company/companyWorkflow/design'),
  396. name: 'CompanyWorkflowDesign',
  397. meta: { title: 'AI外呼工作流设计', activeMenu: '/companyWx/companyWorkflow' }
  398. },
  399. {
  400. path: 'design/:id',
  401. component: () => import('@/views/company/companyWorkflow/design'),
  402. name: 'CompanyWorkflowEdit',
  403. meta: { title: '编辑AI外呼工作流', activeMenu: '/companyWx/companyWorkflow' }
  404. }
  405. ]
  406. },
  407. {
  408. path: '/companyWorkflow/version-preview/:versionId',
  409. component: Layout,
  410. hidden: true,
  411. children: [
  412. {
  413. path: '',
  414. component: () => import('@/views/company/companyWorkflow/design'),
  415. name: 'WorkflowVersionPreview',
  416. meta: { title: '历史版本预览', activeMenu: '/companyWx/companyWorkflow' }
  417. }
  418. ]
  419. },
  420. {
  421. path: '/taskStatistics/wxClient',
  422. component: Layout,
  423. hidden: true,
  424. children: [
  425. {
  426. path: 'index',
  427. component: () => import('@/views/taskStatistics/wxClient/index'),
  428. name: 'WxClientStatistics',
  429. meta: { title: '加微统计', activeMenu: '/taskStatistics/wxClient' }
  430. }
  431. ]
  432. },
  433. {
  434. path: '/taskStatistics/sendMsgLog',
  435. component: Layout,
  436. hidden: true,
  437. children: [
  438. {
  439. path: 'index',
  440. component: () => import('@/views/taskStatistics/sendMsgLog/index'),
  441. name: 'sendMsgLogStatistics',
  442. meta: { title: '短信统计', activeMenu: '/taskStatistics/sendMsgLog' }
  443. }
  444. ]
  445. },
  446. {
  447. path: '/taskStatistics/callLog',
  448. component: Layout,
  449. hidden: true,
  450. children: [
  451. {
  452. path: 'index',
  453. component: () => import('@/views/taskStatistics/callLog/index'),
  454. name: 'callLogStatistics',
  455. meta: { title: '外呼统计', activeMenu: '/taskStatistics/callLog' }
  456. }
  457. ]
  458. },
  459. {
  460. path: '/crm/customer/detail/:customerId',
  461. component: Layout,
  462. hidden: true,
  463. children: [
  464. {
  465. path: '',
  466. component: () => import('@/views/crm/customer/customerDetail.vue'),
  467. name: 'CustomerDetail',
  468. meta: { title: '客户详情', activeMenu: '/crm/customer' }
  469. }
  470. ]
  471. },
  472. {
  473. path: '/wxSop/sopUserLogsWx',
  474. component: Layout,
  475. hidden: true,
  476. children: [
  477. {
  478. path: 'sopUserLogsScheduleWx/:id',
  479. component: () => import('@/views/wx/sopUserLogsWx/sopUserLogsScheduleWx.vue'),
  480. name: 'sopUserLogsScheduleWx',
  481. meta: { title: '个微SOP营期', activeMenu: '/wx/wxSop' }
  482. },
  483. {
  484. path: 'detail',
  485. component: () => import('@/views/wx/sopUserLogsWx/detail.vue'),
  486. name: 'sopUserLogsDetailWx',
  487. meta: { title: '个微SOP营期详情', activeMenu: '/wx/wxSop' }
  488. }
  489. ]
  490. },
  491. {
  492. path: '/wxSop/wxSop',
  493. component: Layout,
  494. hidden: true,
  495. children: [
  496. {
  497. path: 'sopLogsList/:id',
  498. component: () => import('@/views/wx/wxSop/sopLogsList.vue'),
  499. name: 'WxSopLogsList',
  500. meta: { title: '个微SOP执行详情', activeMenu: '/wx/wxSop' }
  501. }
  502. ]
  503. },
  504. {
  505. path: '/companyVoiceRobotic',
  506. component: Layout,
  507. hidden: true,
  508. children: [
  509. {
  510. path: 'myIndex',
  511. component: () => import('@/views/company/companyVoiceRobotic/myIndex.vue'),
  512. name: 'MyCompanyVoiceRobotic',
  513. meta: { title: '我的音色任务', activeMenu: '/companyWx/companyVoiceRobotic' }
  514. }
  515. ]
  516. },
  517. // ======== 龙虾引擎 (Lobster Workflow Engine) ========
  518. {
  519. path: '/lobster',
  520. component: Layout,
  521. redirect: '/lobster/production-workflow',
  522. name: 'Lobster',
  523. meta: { title: '龙虾引擎', icon: 'system' },
  524. children: [
  525. {
  526. path: 'production-workflow',
  527. component: ParentView,
  528. redirect: '/lobster/production-workflow/template',
  529. name: 'ProductionWorkflow',
  530. meta: { title: 'AI生产工作流', icon: 'component' },
  531. children: [
  532. {
  533. // 工作流画布保留路由(编辑入口仍可用),不挂菜单
  534. path: 'canvas',
  535. component: () => import('@/views/lobster/workflow-canvas/index'),
  536. name: 'LobsterCanvas',
  537. meta: { title: '工作流画布', icon: 'chart', hidden: true }
  538. },
  539. {
  540. path: 'template',
  541. component: () => import('@/views/lobster/template/index'),
  542. name: 'LobsterTemplate',
  543. meta: { title: '工作流模板库', icon: 'documentation' }
  544. }
  545. ]
  546. },
  547. {
  548. // AI 生成工作流保留路由(被模板库或画布跳转使用),不挂菜单
  549. path: 'workflow-generate',
  550. component: () => import('@/views/lobster/workflow-generate/index'),
  551. name: 'LobsterGenerate',
  552. meta: { title: 'AI生成工作流', icon: 'build', hidden: true }
  553. },
  554. {
  555. path: 'instance',
  556. component: () => import('@/views/lobster/instance/index'),
  557. name: 'LobsterInstance',
  558. meta: { title: '任务执行(实例监控)', icon: 'monitor' }
  559. },
  560. {
  561. path: 'optimization',
  562. component: () => import('@/views/lobster/optimization/index'),
  563. name: 'LobsterOptimization',
  564. meta: { title: 'AI优化建议', icon: 'eye-open' }
  565. },
  566. {
  567. path: 'prompt',
  568. component: () => import('@/views/lobster/prompt/index'),
  569. name: 'LobsterPrompt',
  570. meta: { title: '提示词管理', icon: 'edit' }
  571. },
  572. {
  573. path: 'sales-corpus',
  574. component: () => import('@/views/lobster/sales-corpus/index'),
  575. name: 'SalesCorpus',
  576. meta: { title: '销冠语料学习', icon: 'star' }
  577. },
  578. {
  579. // 接口注册中心 = 外部工作流(节点中调用的外部 API 注册),统一为「接口注册中心」一处
  580. path: 'api-registry',
  581. component: () => import('@/views/lobster/api-registry/index'),
  582. name: 'LobsterApiRegistry',
  583. meta: { title: '接口注册中心', icon: 'nested' }
  584. },
  585. {
  586. path: 'dead-letter',
  587. component: () => import('@/views/lobster/dead-letter/index'),
  588. name: 'LobsterDeadLetter',
  589. meta: { title: '死信队列', icon: 'bug' }
  590. },
  591. {
  592. path: 'event-audit',
  593. component: () => import('@/views/lobster/event-audit/index'),
  594. name: 'LobsterEventAudit',
  595. meta: { title: '节点审核', icon: 'checkbox' }
  596. },
  597. {
  598. path: 'chat-aggregate',
  599. component: () => import('@/views/lobster/chat-aggregate/index'),
  600. name: 'ChatAggregate',
  601. meta: { title: '聚合聊天', icon: 'message' }
  602. },
  603. {
  604. path: 'channel-plugin',
  605. component: () => import('@/views/lobster/channel-plugin/index'),
  606. name: 'ChannelPlugin',
  607. meta: { title: '渠道插件', icon: 'connection' }
  608. },
  609. {
  610. path: 'chat-test',
  611. component: () => import('@/views/lobster/chat-test/index'),
  612. name: 'LobsterChatTest',
  613. meta: { title: '模拟聊天测试', icon: 'chat-dot-square' }
  614. },
  615. {
  616. path: 'quality-verify',
  617. component: () => import('@/views/lobster/quality-verify/index'),
  618. name: 'LobsterQualityVerify',
  619. meta: { title: '评分准确性验证', icon: 'data-analysis' }
  620. },
  621. {
  622. path: 'test-scenario',
  623. component: () => import('@/views/lobster/test-scenario/index'),
  624. name: 'LobsterTestScenario',
  625. meta: { title: '测试场景管理', icon: 'document-checked' }
  626. },
  627. {
  628. path: 'e2e-history',
  629. component: () => import('@/views/lobster/e2e-history/index'),
  630. name: 'LobsterE2eHistory',
  631. meta: { title: 'E2E运行历史', icon: 'time' }
  632. },
  633. {
  634. path: 'dynamic-impl',
  635. component: () => import('@/views/lobster/dynamic-impl/index'),
  636. name: 'LobsterDynamicImpl',
  637. meta: { title: '动态节点审批', icon: 'connection' }
  638. },
  639. {
  640. path: 'model-route',
  641. component: () => import('@/views/lobster/model-route/index'),
  642. name: 'LobsterModelRoute',
  643. meta: { title: '多模型路由配置', icon: 'guide' }
  644. },
  645. {
  646. path: 'token-stats',
  647. component: () => import('@/views/lobster/token-stats/index'),
  648. name: 'LobsterTokenStats',
  649. meta: { title: 'Token消耗统计', icon: 'coin' }
  650. },
  651. {
  652. path: 'node-detail/:instanceId/:nodeId',
  653. component: () => import('@/views/lobster/node-detail/index'),
  654. name: 'LobsterNodeDetail',
  655. meta: { title: '节点详情', icon: 'document' }
  656. },
  657. {
  658. path: 'profile-config',
  659. component: () => import('@/views/lobster/profile-config/index'),
  660. name: 'LobsterProfileConfig',
  661. meta: { title: '用户画像配置', icon: 'user' }
  662. },
  663. {
  664. path: 'summary-config',
  665. component: () => import('@/views/lobster/summary-config/index'),
  666. name: 'LobsterSummaryConfig',
  667. meta: { title: '摘要生成配置', icon: 'notebook' }
  668. },
  669. {
  670. path: 'dedup-config',
  671. component: () => import('@/views/lobster/dedup-config/index'),
  672. name: 'LobsterDedupConfig',
  673. meta: { title: '消息去重配置', icon: 'filter' }
  674. },
  675. {
  676. path: 'sensitive-words',
  677. component: () => import('@/views/lobster/sensitive-words/index'),
  678. name: 'LobsterSensitiveWords',
  679. meta: { title: '敏感词库', icon: 'warning' }
  680. },
  681. {
  682. path: 'dashboard',
  683. component: () => import('@/views/lobster/dashboard/index'),
  684. name: 'LobsterDashboard',
  685. meta: { title: '引擎看板', icon: 'dashboard' }
  686. },
  687. {
  688. path: 'evolution',
  689. component: () => import('@/views/lobster/evolution/index'),
  690. name: 'LobsterEvolution',
  691. meta: { title: 'AI进化引擎', icon: 'guide' }
  692. },
  693. {
  694. path: 'node-capabilities',
  695. component: () => import('@/views/lobster/node-capabilities/index'),
  696. name: 'LobsterNodeCapabilities',
  697. meta: { title: '节点能力矩阵', icon: 'tree-table' }
  698. },
  699. {
  700. path: 'ab-test',
  701. component: () => import('@/views/lobster/ab-test/index'),
  702. name: 'LobsterAbTest',
  703. meta: { title: 'A/B测试', icon: 'chart' }
  704. },
  705. {
  706. path: 'learning-results',
  707. component: () => import('@/views/lobster/learning-results/index'),
  708. name: 'LobsterLearningResults',
  709. meta: { title: '学习结果', icon: 'education' }
  710. },
  711. {
  712. path: 'pay-manage',
  713. component: () => import('@/views/lobster/pay-manage/index'),
  714. name: 'LobsterPayManage',
  715. meta: { title: '支付管理', icon: 'money' }
  716. },
  717. {
  718. path: 'channel-config',
  719. component: () => import('@/views/lobster/channel-config/index'),
  720. name: 'LobsterChannelConfig',
  721. meta: { title: '渠道配置', icon: 'connection' }
  722. },
  723. {
  724. path: 'integration-test',
  725. component: () => import('@/views/lobster/integration-test/index'),
  726. name: 'LobsterIntegrationTest',
  727. meta: { title: '集成测试', icon: 'bug' }
  728. }
  729. ]
  730. },
  731. // ======== AI聊天质量评分 ========
  732. {
  733. path: '/aiChatQuality',
  734. component: Layout,
  735. name: 'AiChatQuality',
  736. meta: { title: 'AI回复质量评分', icon: 'star' },
  737. redirect: '/aiChatQuality/index',
  738. children: [
  739. {
  740. path: 'index',
  741. component: () => import('@/views/aiChatQuality/index'),
  742. name: 'AiChatQualityIndex',
  743. meta: { title: '质量评分', icon: 'star' }
  744. }
  745. ]
  746. },
  747. // ======== CRM ========
  748. {
  749. path: '/crm',
  750. component: Layout, redirect: '/crm/customer', name: 'Crm',
  751. meta: { title: 'CRM', icon: 'crm' },
  752. children: [
  753. { path: 'customer', component: () => import('@/views/crm/customer/index'), name: 'CrmCustomer', meta: { title: '客户管理' } },
  754. { path: 'event', component: () => import('@/views/crm/event/index'), name: 'CrmEvent', meta: { title: '客户事件' } },
  755. { path: 'msg', component: () => import('@/views/crm/msg/index'), name: 'CrmMsg', meta: { title: '客户消息' } },
  756. { path: 'customerVisit', component: () => import('@/views/crm/customerVisit/index'), name: 'CrmVisit', meta: { title: '客户拜访', hidden: true } }
  757. ]
  758. },
  759. // ======== AI聊天 ========
  760. {
  761. path: '/chat',
  762. component: Layout, redirect: '/chat/chatSession', name: 'Chat',
  763. meta: { title: 'AI聊天', icon: 'message' },
  764. children: [
  765. { path: 'chatSession', component: () => import('@/views/chat/chatSession/index'), name: 'ChatSession', meta: { title: '会话列表' } },
  766. { path: 'chatRole', component: () => import('@/views/chat/chatRole/index'), name: 'ChatRole', meta: { title: 'AI角色' } },
  767. { path: 'chatDataset', component: () => import('@/views/chat/chatDataset/index'), name: 'ChatDataset', meta: { title: '知识库' } }
  768. ]
  769. },
  770. // ======== FastGpt ========
  771. {
  772. path: '/fastGpt',
  773. component: Layout, redirect: '/fastGpt/fastGptRole', name: 'FastGpt',
  774. meta: { title: 'FastGpt', icon: 'server' },
  775. children: [
  776. { path: 'fastGptRole', component: () => import('@/views/fastGpt/fastGptRole/index'), name: 'FastGptRole', meta: { title: '角色管理' } },
  777. { path: 'fastGptDataset', component: () => import('@/views/fastGpt/fastGptDataset/index'), name: 'FastGptData', meta: { title: '数据集', hidden: true } },
  778. { path: 'fastGptUser', component: () => import('@/views/fastGpt/fastGptUser/index'), name: 'FastGptUser', meta: { title: 'AI用户', hidden: true } }
  779. ]
  780. },
  781. // ======== 企业管理 ========
  782. {
  783. path: '/company',
  784. component: Layout, redirect: '/company/companyUser', name: 'Company',
  785. meta: { title: '企业管理', icon: 'people' },
  786. children: [
  787. { path: 'companyUser', component: () => import('@/views/company/companyUser/index'), name: 'CompUser', meta: { title: '员工管理' } },
  788. { path: 'companyRole', component: () => import('@/views/company/companyRole/index'), name: 'CompRole', meta: { title: '角色管理', hidden: true } },
  789. { path: 'companyMenu', component: () => import('@/views/company/companyMenu/index'), name: 'CompMenu', meta: { title: '菜单管理', hidden: true } },
  790. { path: 'companySms', component: () => import('@/views/company/companySms/index'), name: 'CompSms', meta: { title: '短信管理' } },
  791. { path: 'companyRecharge', component: () => import('@/views/company/companyRecharge/index'), name: 'CompRecharge', meta: { title: '充值记录' } },
  792. { path: 'companyMoneyLogs', component: () => import('@/views/company/companyMoneyLogs/index'), name: 'CompMoney', meta: { title: '资金流水', hidden: true } },
  793. { path: 'companyProfit', component: () => import('@/views/company/companyProfit/index'), name: 'CompProfit', meta: { title: '分账记录', hidden: true } },
  794. { path: 'aiWorkflow', component: () => import('@/views/company/aiWorkflow/index'), name: 'CompAiWorkflow', meta: { title: 'AI工作流' } },
  795. { path: 'aiModel', component: () => import('@/views/company/aiModel/index'), name: 'CompAiModel', meta: { title: 'AI模型管理', hidden: true } },
  796. { path: 'workflowLobster', component: () => import('@/views/company/workflowLobster/index'), name: 'CompLobster', meta: { title: '龙虾工作流', hidden: true } }
  797. ]
  798. },
  799. // ======== 企微管理 ========
  800. {
  801. path: '/companyWx',
  802. component: Layout, redirect: '/companyWx/companyWorkflow', name: 'CompanyWx',
  803. meta: { title: '企微管理', icon: 'wechat' },
  804. children: [
  805. { path: 'companyWorkflow', component: () => import('@/views/company/companyWorkflow/index'), name: 'CompWorkflow', meta: { title: 'AI外呼工作流' } }
  806. ]
  807. },
  808. // ======== 个微管理 ========
  809. {
  810. path: '/wx',
  811. component: Layout, redirect: '/wx/wxAccount', name: 'Wx',
  812. meta: { title: '个微管理', icon: 'user' },
  813. children: [
  814. { path: 'wxAccount', component: () => import('@/views/company/wxAccount/index'), name: 'WxAccount', meta: { title: '个微账号' } },
  815. { path: 'wxUser', component: () => import('@/views/company/wxUser/index'), name: 'WxUser', meta: { title: '个微用户', hidden: true } }
  816. ]
  817. },
  818. // ======== 商城管理 ========
  819. {
  820. path: '/store',
  821. component: Layout, redirect: '/store/storeProduct', name: 'Store',
  822. meta: { title: '商城管理', icon: 'shopping' },
  823. children: [
  824. { path: 'storeProduct', component: () => import('@/views/store/storeProduct/index'), name: 'StoreProduct', meta: { title: '商品管理' } },
  825. { path: 'storeOrder', component: () => import('@/views/store/storeOrder/list'), name: 'StoreOrder', meta: { title: '订单管理', hidden: true } },
  826. { path: 'storeCoupon', component: () => import('@/views/store/coupon/index'), name: 'StoreCoupon', meta: { title: '优惠券', hidden: true } },
  827. { path: 'storeAfterSales', component: () => import('@/views/store/storeAfterSales/list'), name: 'StoreAS', meta: { title: '售后', hidden: true } }
  828. ]
  829. },
  830. // ======== 隐藏页路由(CUD/详情页等) ========
  831. // 注意:/crm/customer/detail 已在上方476行定义,/companyWx/companyWorkflow 已在上方383行定义
  832. // 此处不再重复定义,避免路由覆盖问题
  833. ]
  834. export default new Router({
  835. mode: 'history', // 去掉url中的#
  836. scrollBehavior: () => ({ y: 0 }),
  837. routes: constantRoutes
  838. })