Files
yunke/yunkes/src/router/index.ts
T
浅念 0df53c6b1a fix: wechat account scrape (form-data+dates) + frontend staff page
Backend (scrape_wechat_accounts):
- Send wxUser/list as form-urlencoded (not JSON) with the REQUIRED filters
  isOnJob / departmentId / startdate / enddate + empty userId/salesname/
  weChatNickName, matching the live request (empty fails with code -90000).
- scrape_wechat_accounts now takes department_id (the company-root dept id)
  plus optional start/end defaulting to a recent 7-day UTC window.
- paginate_by_page gains a form=True mode (data= + form content-type).
- Orchestrator sync_wechat_accounts resolves the root dept from the
  Department table (or accepts one) and skips with a warning when unknown.
- seed_accounts.py resolves the root via scrape_departments.

Frontend (yunkes):
- Add StaffList.vue (/staff) with is_on_job filter + pagination.
- Add /staff route and a 员工 nav item between 客户 and 群.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-01 17:11:17 +08:00

83 lines
2.2 KiB
TypeScript

import { createRouter, createWebHistory, type RouteRecordRaw } from 'vue-router'
// `/` redirects to `/customers`. Chat timeline params are path segments so the
// URL is shareable + survives refresh:
// /chat/:channel/:ownerId/:talkerId (1:1 DM)
// /group/:channel/:ownerId/:roomId (group chat — same component, room_id)
const routes: RouteRecordRaw[] = [
{
path: '/',
redirect: { name: 'customers' },
},
{
path: '/customers',
name: 'customers',
component: () => import('@/views/CustomerList.vue'),
meta: { title: '客户列表' },
},
{
path: '/staff',
name: 'staff',
component: () => import('@/views/StaffList.vue'),
meta: { title: '员工列表' },
},
{
path: '/groups',
name: 'groups',
component: () => import('@/views/GroupList.vue'),
meta: { title: '群列表' },
},
{
path: '/calls',
name: 'calls',
component: () => import('@/views/CallList.vue'),
meta: { title: '通话记录' },
},
{
path: '/sms',
name: 'sms',
component: () => import('@/views/SmsList.vue'),
meta: { title: '短信记录' },
},
{
path: '/sync',
name: 'sync',
component: () => import('@/views/SyncStatus.vue'),
meta: { title: '同步状态' },
},
{
path: '/chat/:channel/:ownerId/:talkerId',
name: 'chat',
component: () => import('@/views/ChatTimeline.vue'),
props: true,
meta: { title: '聊天记录' },
},
{
// Group chat timeline — same component, but with a `roomId` prop so it
// issues a room_id query instead of a talker_id query.
path: '/group/:channel/:ownerId/:roomId',
name: 'group-chat',
component: () => import('@/views/ChatTimeline.vue'),
props: true,
meta: { title: '群聊记录' },
},
{
// Anything else → back to the list.
path: '/:pathMatch(.*)*',
redirect: { name: 'customers' },
},
]
export const router = createRouter({
history: createWebHistory(),
routes,
scrollBehavior() {
return { top: 0 }
},
})
router.afterEach((to) => {
const title = (to.meta.title as string | undefined) ?? ''
document.title = title ? `${title} · 云客数据镜像` : '云客数据镜像'
})