hikvision-web 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.html ADDED
@@ -0,0 +1,12 @@
1
+ <!DOCTYPE html>
2
+ <html lang="zh-CN">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>海康威视平台管理</title>
7
+ </head>
8
+ <body>
9
+ <div id="root"></div>
10
+ <script type="module" src="/src/main.tsx"></script>
11
+ </body>
12
+ </html>
package/package.json ADDED
@@ -0,0 +1,27 @@
1
+ {
2
+ "name": "hikvision-web",
3
+ "version": "1.0.0",
4
+ "description": "Hikvision Manager Web Management Interface",
5
+ "type": "module",
6
+ "scripts": {
7
+ "dev": "vite --host 0.0.0.0 --port ${WEB_PORT:-3030}",
8
+ "build": "tsc && vite build",
9
+ "preview": "vite preview"
10
+ },
11
+ "dependencies": {
12
+ "@ant-design/icons": "^6.2.3",
13
+ "antd": "^6.4.3",
14
+ "axios": "^1.16.1",
15
+ "react": "^18.2.0",
16
+ "react-dom": "^18.2.0",
17
+ "react-router-dom": "^7.15.1",
18
+ "zustand": "^5.0.13"
19
+ },
20
+ "devDependencies": {
21
+ "@types/react": "^18.2.43",
22
+ "@types/react-dom": "^18.2.17",
23
+ "@vitejs/plugin-react": "^4.2.1",
24
+ "typescript": "^5.3.3",
25
+ "vite": "^5.0.8"
26
+ }
27
+ }
package/src/App.css ADDED
@@ -0,0 +1,48 @@
1
+ .logo {
2
+ height: 64px;
3
+ display: flex;
4
+ align-items: center;
5
+ justify-content: center;
6
+ background: rgba(255, 255, 255, 0.1);
7
+ }
8
+
9
+ .logo h2 {
10
+ color: #fff;
11
+ margin: 0;
12
+ font-size: 16px;
13
+ }
14
+
15
+ .header-content {
16
+ height: 100%;
17
+ display: flex;
18
+ align-items: center;
19
+ padding: 0 24px;
20
+ }
21
+
22
+ .header-content h3 {
23
+ margin: 0;
24
+ font-size: 18px;
25
+ color: #333;
26
+ }
27
+
28
+ .page-title {
29
+ margin-bottom: 16px;
30
+ }
31
+
32
+ .page-title h2 {
33
+ margin: 0;
34
+ color: #333;
35
+ }
36
+
37
+ .ant-table-wrapper .ant-table {
38
+ background: #fff;
39
+ border-radius: 8px;
40
+ }
41
+
42
+ .ant-card {
43
+ border-radius: 8px;
44
+ }
45
+
46
+ .ant-form-item-label > label {
47
+ font-weight: 500;
48
+ }
@@ -0,0 +1,48 @@
1
+ .logo {
2
+ height: 64px;
3
+ display: flex;
4
+ align-items: center;
5
+ justify-content: center;
6
+ background: rgba(255, 255, 255, 0.1);
7
+ }
8
+
9
+ .logo h2 {
10
+ color: #fff;
11
+ margin: 0;
12
+ font-size: 16px;
13
+ }
14
+
15
+ .header-content {
16
+ height: 100%;
17
+ display: flex;
18
+ align-items: center;
19
+ padding: 0 24px;
20
+ }
21
+
22
+ .header-content h3 {
23
+ margin: 0;
24
+ font-size: 18px;
25
+ color: #333;
26
+ }
27
+
28
+ .page-title {
29
+ margin-bottom: 16px;
30
+ }
31
+
32
+ .page-title h2 {
33
+ margin: 0;
34
+ color: #333;
35
+ }
36
+
37
+ .ant-table-wrapper .ant-table {
38
+ background: #fff;
39
+ border-radius: 8px;
40
+ }
41
+
42
+ .ant-card {
43
+ border-radius: 8px;
44
+ }
45
+
46
+ .ant-form-item-label > label {
47
+ font-weight: 500;
48
+ }
package/src/App.tsx ADDED
@@ -0,0 +1,157 @@
1
+ import { BrowserRouter, Routes, Route, Navigate, useNavigate } from 'react-router-dom';
2
+ import { Layout, Menu } from 'antd';
3
+ import {
4
+ DashboardOutlined,
5
+ TeamOutlined,
6
+ CarOutlined,
7
+ IdcardOutlined,
8
+ FolderOutlined,
9
+ LinkOutlined,
10
+ SyncOutlined,
11
+ SettingOutlined,
12
+ ApartmentOutlined,
13
+ } from '@ant-design/icons';
14
+ import PersonList from './pages/PersonList';
15
+ import PersonTreePage from './pages/PersonTreePage';
16
+ import PersonDetail from './pages/PersonDetail';
17
+ import PersonForm from './pages/PersonForm';
18
+ import VehicleList from './pages/VehicleList';
19
+ import VehicleForm from './pages/VehicleForm';
20
+ import CardList from './pages/CardList';
21
+ import CardForm from './pages/CardForm';
22
+ import GroupPage from './pages/GroupPage';
23
+ import BindingPage from './pages/BindingPage';
24
+ import SyncPage from './pages/SyncPage';
25
+ import SystemPage from './pages/SystemPage';
26
+ import DashboardPage from './pages/DashboardPage';
27
+ import OrgPage from './pages/OrgPage';
28
+ import OrgTreePage from './pages/OrgTreePage';
29
+ import './App.css';
30
+
31
+ const { Header, Sider, Content } = Layout;
32
+
33
+ const menuItems = [
34
+ {
35
+ key: '/dashboard',
36
+ icon: <DashboardOutlined />,
37
+ label: '系统概览',
38
+ },
39
+ {
40
+ key: '/org',
41
+ icon: <ApartmentOutlined />,
42
+ label: '组织架构',
43
+ children: [
44
+ { key: '/org', label: '列表视图' },
45
+ { key: '/org-tree', label: '树形视图' },
46
+ ],
47
+ },
48
+ {
49
+ key: '/person',
50
+ icon: <TeamOutlined />,
51
+ label: '人员管理',
52
+ children: [
53
+ { key: '/person', label: '列表视图' },
54
+ { key: '/person-tree', label: '树状视图' },
55
+ { key: '/person/add', label: '添加人员' },
56
+ ],
57
+ },
58
+ {
59
+ key: '/vehicle',
60
+ icon: <CarOutlined />,
61
+ label: '车辆管理',
62
+ children: [
63
+ { key: '/vehicle', label: '车辆列表' },
64
+ { key: '/vehicle/add', label: '添加车辆' },
65
+ ],
66
+ },
67
+ {
68
+ key: '/card',
69
+ icon: <IdcardOutlined />,
70
+ label: '卡片管理',
71
+ children: [
72
+ { key: '/card', label: '卡片列表' },
73
+ { key: '/card/add', label: '添加卡片' },
74
+ ],
75
+ },
76
+ {
77
+ key: '/group',
78
+ icon: <FolderOutlined />,
79
+ label: '车辆群组',
80
+ children: [{ key: '/group', label: '分组列表' }],
81
+ },
82
+ {
83
+ key: '/binding',
84
+ icon: <LinkOutlined />,
85
+ label: '绑定关系',
86
+ children: [{ key: '/binding', label: '绑定管理' }],
87
+ },
88
+ {
89
+ key: '/sync',
90
+ icon: <SyncOutlined />,
91
+ label: '数据同步',
92
+ children: [{ key: '/sync', label: '同步管理' }],
93
+ },
94
+ {
95
+ key: '/system',
96
+ icon: <SettingOutlined />,
97
+ label: '系统设置',
98
+ children: [{ key: '/system', label: '系统配置' }],
99
+ },
100
+ ];
101
+
102
+ function MenuWithNavigate() {
103
+ const navigate = useNavigate();
104
+ return (
105
+ <Menu
106
+ theme="dark"
107
+ mode="inline"
108
+ items={menuItems}
109
+ defaultSelectedKeys={['/person']}
110
+ onClick={({ key }) => navigate(key)}
111
+ />
112
+ );
113
+ }
114
+
115
+ export default function App() {
116
+ return (
117
+ <BrowserRouter>
118
+ <Layout style={{ minHeight: '100vh' }}>
119
+ <Sider width={220}>
120
+ <div className="logo">
121
+ <h2>海康平台管理</h2>
122
+ </div>
123
+ <MenuWithNavigate />
124
+ </Sider>
125
+ <Layout>
126
+ <Header style={{ background: '#fff', padding: 0 }}>
127
+ <div className="header-content">
128
+ <h3>海康威视 Artemis 平台管理系统</h3>
129
+ </div>
130
+ </Header>
131
+ <Content style={{ padding: '24px', background: '#f0f2f5' }}>
132
+ <Routes>
133
+ <Route path="/" element={<Navigate to="/person" replace />} />
134
+ <Route path="/dashboard" element={<DashboardPage />} />
135
+ <Route path="/org" element={<OrgPage />} />
136
+ <Route path="/org-tree" element={<OrgTreePage />} />
137
+ <Route path="/person" element={<PersonList />} />
138
+ <Route path="/person-tree" element={<PersonTreePage />} />
139
+ <Route path="/person/detail/:personId" element={<PersonDetail />} />
140
+ <Route path="/person/add" element={<PersonForm />} />
141
+ <Route path="/person/edit/:personId" element={<PersonForm />} />
142
+ <Route path="/vehicle" element={<VehicleList />} />
143
+ <Route path="/vehicle/add" element={<VehicleForm />} />
144
+ <Route path="/vehicle/edit/:vehicleId" element={<VehicleForm />} />
145
+ <Route path="/card" element={<CardList />} />
146
+ <Route path="/card/add" element={<CardForm />} />
147
+ <Route path="/group" element={<GroupPage />} />
148
+ <Route path="/binding" element={<BindingPage />} />
149
+ <Route path="/sync" element={<SyncPage />} />
150
+ <Route path="/system" element={<SystemPage />} />
151
+ </Routes>
152
+ </Content>
153
+ </Layout>
154
+ </Layout>
155
+ </BrowserRouter>
156
+ );
157
+ }
@@ -0,0 +1,132 @@
1
+ import { BrowserRouter, Routes, Route, Navigate, useNavigate } from 'react-router-dom';
2
+ import { Layout, Menu } from 'antd';
3
+ import {
4
+ TeamOutlined,
5
+ CarOutlined,
6
+ IdcardOutlined,
7
+ FolderOutlined,
8
+ LinkOutlined,
9
+ SyncOutlined,
10
+ SettingOutlined,
11
+ } from '@ant-design/icons';
12
+ import PersonList from './pages/PersonList';
13
+ import PersonDetail from './pages/PersonDetail';
14
+ import PersonForm from './pages/PersonForm';
15
+ import VehicleList from './pages/VehicleList';
16
+ import VehicleForm from './pages/VehicleForm';
17
+ import CardList from './pages/CardList';
18
+ import CardForm from './pages/CardForm';
19
+ import GroupPage from './pages/GroupPage';
20
+ import BindingPage from './pages/BindingPage';
21
+ import SyncPage from './pages/SyncPage';
22
+ import SystemPage from './pages/SystemPage';
23
+ import './App.css';
24
+
25
+ const { Header, Sider, Content } = Layout;
26
+
27
+ const menuItems = [
28
+ {
29
+ key: '/person',
30
+ icon: <TeamOutlined />,
31
+ label: '人员管理',
32
+ children: [
33
+ { key: '/person', label: '人员列表' },
34
+ { key: '/person/add', label: '添加人员' },
35
+ ],
36
+ },
37
+ {
38
+ key: '/vehicle',
39
+ icon: <CarOutlined />,
40
+ label: '车辆管理',
41
+ children: [
42
+ { key: '/vehicle', label: '车辆列表' },
43
+ { key: '/vehicle/add', label: '添加车辆' },
44
+ ],
45
+ },
46
+ {
47
+ key: '/card',
48
+ icon: <IdcardOutlined />,
49
+ label: '卡片管理',
50
+ children: [
51
+ { key: '/card', label: '卡片列表' },
52
+ { key: '/card/add', label: '添加卡片' },
53
+ ],
54
+ },
55
+ {
56
+ key: '/group',
57
+ icon: <FolderOutlined />,
58
+ label: '分组管理',
59
+ children: [{ key: '/group', label: '分组列表' }],
60
+ },
61
+ {
62
+ key: '/binding',
63
+ icon: <LinkOutlined />,
64
+ label: '绑定关系',
65
+ children: [{ key: '/binding', label: '绑定管理' }],
66
+ },
67
+ {
68
+ key: '/sync',
69
+ icon: <SyncOutlined />,
70
+ label: '数据同步',
71
+ children: [{ key: '/sync', label: '同步管理' }],
72
+ },
73
+ {
74
+ key: '/system',
75
+ icon: <SettingOutlined />,
76
+ label: '系统设置',
77
+ children: [{ key: '/system', label: '系统配置' }],
78
+ },
79
+ ];
80
+
81
+ function MenuWithNavigate() {
82
+ const navigate = useNavigate();
83
+ return (
84
+ <Menu
85
+ theme="dark"
86
+ mode="inline"
87
+ items={menuItems}
88
+ defaultSelectedKeys={['/person']}
89
+ onClick={({ key }) => navigate(key)}
90
+ />
91
+ );
92
+ }
93
+
94
+ export default function App() {
95
+ return (
96
+ <BrowserRouter>
97
+ <Layout style={{ minHeight: '100vh' }}>
98
+ <Sider width={220}>
99
+ <div className="logo">
100
+ <h2>海康平台管理</h2>
101
+ </div>
102
+ <MenuWithNavigate />
103
+ </Sider>
104
+ <Layout>
105
+ <Header style={{ background: '#fff', padding: 0 }}>
106
+ <div className="header-content">
107
+ <h3>海康威视 Artemis 平台管理系统</h3>
108
+ </div>
109
+ </Header>
110
+ <Content style={{ padding: '24px', background: '#f0f2f5' }}>
111
+ <Routes>
112
+ <Route path="/" element={<Navigate to="/person" replace />} />
113
+ <Route path="/person" element={<PersonList />} />
114
+ <Route path="/person/detail/:personId" element={<PersonDetail />} />
115
+ <Route path="/person/add" element={<PersonForm />} />
116
+ <Route path="/person/edit/:personId" element={<PersonForm />} />
117
+ <Route path="/vehicle" element={<VehicleList />} />
118
+ <Route path="/vehicle/add" element={<VehicleForm />} />
119
+ <Route path="/vehicle/edit/:vehicleId" element={<VehicleForm />} />
120
+ <Route path="/card" element={<CardList />} />
121
+ <Route path="/card/add" element={<CardForm />} />
122
+ <Route path="/group" element={<GroupPage />} />
123
+ <Route path="/binding" element={<BindingPage />} />
124
+ <Route path="/sync" element={<SyncPage />} />
125
+ <Route path="/system" element={<SystemPage />} />
126
+ </Routes>
127
+ </Content>
128
+ </Layout>
129
+ </Layout>
130
+ </BrowserRouter>
131
+ );
132
+ }
package/src/index.css ADDED
@@ -0,0 +1,39 @@
1
+ * {
2
+ margin: 0;
3
+ padding: 0;
4
+ box-sizing: border-box;
5
+ }
6
+
7
+ body {
8
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
9
+ -webkit-font-smoothing: antialiased;
10
+ -moz-osx-font-smoothing: grayscale;
11
+ }
12
+
13
+ #root {
14
+ min-height: 100vh;
15
+ }
16
+
17
+ /* 表格样式优化 */
18
+ .ant-table-thead > tr > th {
19
+ background: #fafafa;
20
+ font-weight: 600;
21
+ }
22
+
23
+ .ant-table-tbody > tr:hover > td {
24
+ background: #f5f5f5;
25
+ }
26
+
27
+ /* 表单样式优化 */
28
+ .ant-form-item {
29
+ margin-bottom: 24px;
30
+ }
31
+
32
+ /* 按钮样式优化 */
33
+ .ant-btn-primary {
34
+ background: #1677ff;
35
+ }
36
+
37
+ .ant-btn-primary:hover {
38
+ background: #4096ff;
39
+ }
package/src/main.tsx ADDED
@@ -0,0 +1,14 @@
1
+ import React from 'react';
2
+ import ReactDOM from 'react-dom/client';
3
+ import { ConfigProvider } from 'antd';
4
+ import zhCN from 'antd/locale/zh_CN';
5
+ import App from './App';
6
+ import './index.css';
7
+
8
+ ReactDOM.createRoot(document.getElementById('root')!).render(
9
+ <React.StrictMode>
10
+ <ConfigProvider locale={zhCN}>
11
+ <App />
12
+ </ConfigProvider>
13
+ </React.StrictMode>
14
+ );