Browse Source

✨ feat(admin): 添加客户关系管理功能模块

- 在菜单中添加客户关系管理主菜单及子菜单(客户管理、销售机会、跟进记录)
- 添加对应的路由配置指向新页面组件
- 在数据源配置中注册新实体类(Customer, Opportunity, FollowUp)
- 为新菜单项添加相应权限控制和图标
yourname 4 months ago
parent
commit
5f7c0298db
3 changed files with 52 additions and 1 deletions
  1. 30 0
      src/client/admin/menu.tsx
  2. 18 0
      src/client/admin/routes.tsx
  3. 4 1
      src/server/data-source.ts

+ 30 - 0
src/client/admin/menu.tsx

@@ -7,6 +7,9 @@ import {
   DashboardOutlined,
   TeamOutlined,
   InfoCircleOutlined,
+  CustomerServiceOutlined,
+  DollarOutlined,
+  CalendarOutlined
 } from '@ant-design/icons';
 
 export interface MenuItem {
@@ -85,6 +88,33 @@ export const useMenu = () => {
       path: '/admin/users',
       permission: 'user:manage'
     },
+    {
+      key: 'crm',
+      label: '客户关系管理',
+      icon: <CustomerServiceOutlined />,
+      children: [
+        {
+          key: 'customers',
+          label: '客户管理',
+          path: '/admin/customers',
+          permission: 'customer:manage'
+        },
+        {
+          key: 'opportunities',
+          label: '销售机会',
+          icon: <DollarOutlined />,
+          path: '/admin/opportunities',
+          permission: 'opportunity:manage'
+        },
+        {
+          key: 'follow-ups',
+          label: '跟进记录',
+          icon: <CalendarOutlined />,
+          path: '/admin/follow-ups',
+          permission: 'followUp:manage'
+        }
+      ]
+    }
   ];
 
   // 用户菜单项

+ 18 - 0
src/client/admin/routes.tsx

@@ -6,6 +6,9 @@ import { ErrorPage } from './components/ErrorPage';
 import { NotFoundPage } from './components/NotFoundPage';
 import { DashboardPage } from './pages/Dashboard';
 import { UsersPage } from './pages/Users';
+import { CustomersPage } from './pages/Customers';
+import { OpportunitiesPage } from './pages/Opportunities';
+import { FollowUpsPage } from './pages/FollowUps';
 import { LoginPage } from './pages/Login';
 
 export const router = createBrowserRouter([
@@ -39,6 +42,21 @@ export const router = createBrowserRouter([
         element: <UsersPage />,
         errorElement: <ErrorPage />
       },
+      {
+        path: 'customers',
+        element: <CustomersPage />,
+        errorElement: <ErrorPage />
+      },
+      {
+        path: 'opportunities',
+        element: <OpportunitiesPage />,
+        errorElement: <ErrorPage />
+      },
+      {
+        path: 'follow-ups',
+        element: <FollowUpsPage />,
+        errorElement: <ErrorPage />
+      },
       {
         path: '*',
         element: <NotFoundPage />,

+ 4 - 1
src/server/data-source.ts

@@ -5,6 +5,9 @@ import process from 'node:process'
 // 实体类导入
 import { UserEntity as User } from "./modules/users/user.entity"
 import { Role } from "./modules/users/role.entity"
+import { Customer } from "./modules/customers/customer.entity"
+import { Opportunity } from "./modules/opportunities/opportunity.entity"
+import { FollowUp } from "./modules/follow-ups/follow-up.entity"
 
 export const AppDataSource = new DataSource({
   type: "mysql",
@@ -14,7 +17,7 @@ export const AppDataSource = new DataSource({
   password: process.env.DB_PASSWORD || "",
   database: process.env.DB_DATABASE || "d8dai",
   entities: [
-    User, Role
+    User, Role, Customer, Opportunity, FollowUp
   ],
   migrations: [],
   synchronize: process.env.DB_SYNCHRONIZE !== "false",