zant-admin 1.0.4 → 2.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/README.en.md CHANGED
@@ -1,36 +1,425 @@
1
- # zc-ant-vue
1
+ <div align="center">
2
+ <h1>ZAntAdmin</h1>
3
+ <img src="./public/logo.png" alt="ZAntAdmin Logo" width="120">
4
+ </div>
2
5
 
3
- #### Description
4
- {**When you're done, you can delete the content in this README and update the file with details for others getting started with your repository**}
6
+ <div align="center">
5
7
 
6
- #### Software Architecture
7
- Software architecture description
8
+ ![ZAntAdmin](https://img.shields.io/badge/ZAntAdmin-Admin%20Platform-blue.svg)
9
+ ![Vue](https://img.shields.io/badge/Vue-3.5-green.svg)
10
+ ![Ant Design Vue](https://img.shields.io/badge/Ant%20Design%20Vue-4.2.6-red.svg)
11
+ ![License](https://img.shields.io/badge/License-MIT-yellow.svg)
8
12
 
9
- #### Installation
13
+ [Live Demo](http://106.13.37.129:8123) | [Backend Project](https://gitee.com/zchty/zant-core)
10
14
 
11
- 1. xxxx
12
- 2. xxxx
13
- 3. xxxx
15
+ </div>
14
16
 
15
- #### Instructions
17
+ ## 📋 Table of Contents
16
18
 
17
- 1. xxxx
18
- 2. xxxx
19
- 3. xxxx
19
+ - [Introduction](#introduction)
20
+ - [Technical Architecture](#technical-architecture)
21
+ - [Project Structure](#project-structure)
22
+ - [Quick Start](#quick-start)
23
+ - [Core Features](#core-features)
24
+ - [Project Features](#project-features)
25
+ - [Contribution](#contribution)
26
+ - [License](#license)
20
27
 
21
- #### Contribution
28
+ ## Introduction
22
29
 
23
- 1. Fork the repository
24
- 2. Create Feat_xxx branch
25
- 3. Commit your code
26
- 4. Create Pull Request
30
+ ZAntAdmin is a modern frontend management system built with Vue 3.5 + Vite + Ant Design Vue 4.2.6. It adopts the latest frontend technology stack and provides complete user authentication, permission management, dynamic routing, data visualization, and other functions, suitable for the development of enterprise-level management systems.
27
31
 
32
+ ### Preview
28
33
 
29
- #### Gitee Feature
34
+ <div>
35
+ <img src="./src/assets/imgs/md/login.png" alt="Login Page" width="300" style="margin-right: 10px; margin-bottom: 10px; border: 1px solid #d9d9d9; border-radius: 4px;">
36
+ <img src="./src/assets/imgs/md/console.png" alt="Dashboard" width="300" style="margin-right: 10px; margin-bottom: 10px; border: 1px solid #d9d9d9; border-radius: 4px;">
37
+ <img src="./src/assets/imgs/md/serviceMonitoring.png" alt="Service Monitoring" width="300" style="margin-bottom: 10px; border: 1px solid #d9d9d9; border-radius: 4px;">
38
+ <img src="./src/assets/imgs/md/statistics.png" alt="Statistics" width="300" style="margin-right: 10px; margin-bottom: 10px; border: 1px solid #d9d9d9; border-radius: 4px;">
39
+ <img src="./src/assets/imgs/md/menu.png" alt="Menu Management" width="300" style="margin-right: 10px; margin-bottom: 10px; border: 1px solid #d9d9d9; border-radius: 4px;">
40
+ </div>
30
41
 
31
- 1. You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md
32
- 2. Gitee blog [blog.gitee.com](https://blog.gitee.com)
33
- 3. Explore open source project [https://gitee.com/explore](https://gitee.com/explore)
34
- 4. The most valuable open source project [GVP](https://gitee.com/gvp)
35
- 5. The manual of Gitee [https://gitee.com/help](https://gitee.com/help)
36
- 6. The most popular members [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)
42
+ ## Technical Architecture
43
+
44
+ ### Core Framework
45
+ - **Vue 3**: Adopting Composition API and `<script setup>` syntax sugar
46
+ - **Vite**: Modern frontend build tool, providing fast development experience
47
+ - **Vue Router 4**: Routing management, supporting dynamic routing and navigation guards
48
+ - **Pinia**: State management, replacing Vuex, providing a simpler API
49
+
50
+ ### UI Framework
51
+ - **Ant Design Vue 4**: Enterprise-level UI component library
52
+ - **@ant-design/icons-vue**: Ant Design icon library
53
+
54
+ ### Utility Libraries
55
+ - **alova**: Request library, providing powerful request management capabilities
56
+ - **dayjs**: Lightweight date processing library
57
+ - **echarts**: Data visualization chart library
58
+ - **file-saver**: File saving tool
59
+ - **pinia-plugin-persist**: Pinia persistence plugin
60
+
61
+ ### Development Tools
62
+ - **ESLint**: Code quality checking
63
+ - **Prettier**: Code formatting
64
+ - **vite-plugin-clean**: Clean old files during build
65
+
66
+ ## Project Structure
67
+
68
+ ```
69
+ ZAntAdmin/
70
+ ├── public/ # Static resources
71
+ ├── src/
72
+ │ ├── api/ # API interfaces
73
+ │ │ ├── methods/ # Module API methods
74
+ │ │ └── request.js # Request encapsulation
75
+ │ ├── assets/ # Static resources
76
+ │ │ ├── css/ # Style files
77
+ │ │ └── imgs/ # Image resources
78
+ │ ├── components/ # Common components
79
+ │ │ ├── details/ # Detail components
80
+ │ │ ├── edit/ # Edit components
81
+ │ │ └── pages/ # Page components
82
+ │ ├── config/ # Configuration files
83
+ │ ├── directives/ # Custom directives
84
+ │ ├── router/ # Router configuration
85
+ │ ├── stores/ # State management
86
+ │ ├── utils/ # Utility functions
87
+ │ ├── views/ # Page views
88
+ │ ├── App.vue # Root component
89
+ │ └── main.js # Entry file
90
+ ├── .env.development # Development environment variables
91
+ ├── .env.production # Production environment variables
92
+ ├── .env.test # Test environment variables
93
+ ├── eslint.config.js # ESLint configuration
94
+ ├── .prettierrc.json # Prettier configuration
95
+ ├── index.html # HTML template
96
+ ├── package.json # Project dependencies
97
+ └── vite.config.js # Vite configuration
98
+ ```
99
+
100
+ ## Core Features
101
+
102
+ ### 1. User Authentication & Permission Management
103
+ - Token-based user authentication
104
+ - Dynamic permission control
105
+ - Role management
106
+ - Permission directives (`v-permission`)
107
+
108
+ ### 2. Dynamic Routing System
109
+ - Dynamic route loading based on backend menu configuration
110
+ - Route guards for access control
111
+ - Multi-level menu support
112
+ - Route cache control
113
+
114
+ ### 3. Data Management
115
+ - Common CRUD operation encapsulation
116
+ - Form validation
117
+ - Data import/export
118
+ - File upload/download
119
+
120
+ ### 4. System Management
121
+ - User management
122
+ - Role management
123
+ - Menu management
124
+ - Dictionary management
125
+ - System monitoring
126
+ - Log management
127
+
128
+ ### 5. Data Visualization
129
+ - Chart display based on ECharts
130
+ - Statistical analysis pages
131
+ - Data dashboard
132
+
133
+ ## Quick Start
134
+
135
+ ### Requirements
136
+ - Node.js >= 16.0.0 (LTS recommended)
137
+ - npm >= 7.0.0
138
+
139
+ ### Method 1: Using Scaffold (Recommended)
140
+
141
+ ZAnt Admin Scaffold is a quick generation tool for frontend management systems based on Vue 3.5 + Vite + Ant Design Vue. With simple command-line operations, you can quickly create a fully functional management system project.
142
+
143
+ #### Install Scaffold
144
+
145
+ ```bash
146
+ # Install scaffold globally
147
+ npm install -g zant-admin
148
+
149
+ # Or run directly with npx
150
+ npx zant-admin create my-project
151
+ ```
152
+
153
+ #### Create New Project
154
+
155
+ ##### Interactive Creation (Recommended)
156
+ ```bash
157
+ zant-admin create my-project --interactive
158
+ ```
159
+
160
+ The system will guide you through the following configurations:
161
+ - Project description
162
+ - Author name
163
+ - Project template selection
164
+ - Feature selection
165
+ - Skip dependency installation
166
+
167
+ ##### Command Line Arguments
168
+ ```bash
169
+ # Basic creation
170
+ zant-admin create my-project
171
+
172
+ # Specify template and description
173
+ zant-admin create my-project --template basic --description "Basic Management System"
174
+
175
+ # Skip dependency installation
176
+ zant-admin create my-project --skip-install
177
+
178
+ # Disable interactive mode
179
+ zant-admin create my-project --no-interactive
180
+ ```
181
+
182
+ #### Scaffold Commands
183
+
184
+ ##### create Command
185
+ Create a new ZAnt Admin project.
186
+
187
+ **Arguments:**
188
+ - `<project-name>`: Project name (required)
189
+
190
+ **Options:**
191
+ - `-t, --template <template>`: Project template (default: "default")
192
+ - `-d, --description <description>`: Project description
193
+ - `-a, --author <author>`: Author name
194
+ - `--skip-install`: Skip dependency installation
195
+ - `--no-interactive`: Disable interactive mode
196
+
197
+ ##### list-templates Command
198
+ Show available project templates.
199
+
200
+ ```bash
201
+ zant-admin list-templates
202
+ ```
203
+
204
+ ##### View Help
205
+ ```bash
206
+ zant-admin --help
207
+ ```
208
+
209
+ ### Method 2: Manual Installation
210
+
211
+ #### Project Templates
212
+
213
+ ##### Default Template (default)
214
+ - Contains complete management system functions
215
+ - Presets common pages and components
216
+ - Recommended for most projects
217
+
218
+ ##### Basic Template (basic)
219
+ - Contains only core functions
220
+ - Suitable for projects requiring high customization
221
+ - Includes basic pages like login, dashboard, console
222
+
223
+ ##### Full Template (full)
224
+ - Contains all example pages and advanced functions
225
+ - Suitable for learning and reference
226
+ - Includes complete examples like user management, permission management
227
+
228
+ #### Features
229
+
230
+ In interactive mode, you can select the following features:
231
+
232
+ ##### User Management Module
233
+ - User list page
234
+ - User CRUD functions
235
+ - User status management
236
+
237
+ ##### Permission Management Module
238
+ - Role management
239
+ - Permission configuration
240
+ - Access control
241
+
242
+ ##### Data Visualization Charts
243
+ - ECharts integration
244
+ - Data statistics charts
245
+ - Dashboard display
246
+
247
+ ##### File Upload Function
248
+ - Image upload
249
+ - File management
250
+ - Upload progress display
251
+
252
+ ##### Internationalization Support
253
+ - Multi-language switching
254
+ - Chinese/English support
255
+ - Language package management
256
+
257
+ #### Project Structure
258
+
259
+ The generated project has the following structure:
260
+
261
+ ```
262
+ my-project/
263
+ ├── public/ # Static resources
264
+ ├── src/
265
+ │ ├── api/ # API requests
266
+ │ ├── assets/ # Static resources
267
+ │ ├── components/ # Common components
268
+ │ ├── config/ # Configuration files
269
+ │ ├── locales/ # Internationalization files (if selected)
270
+ │ ├── router/ # Router configuration
271
+ │ ├── stores/ # State management
272
+ │ ├── utils/ # Utility functions
273
+ │ ├── views/ # Page views
274
+ │ ├── App.vue # Root component
275
+ │ └── main.js # Entry file
276
+ ├── package.json # Project configuration
277
+ ├── vite.config.js # Vite configuration
278
+ └── README.md # Project documentation
279
+ ```
280
+
281
+ #### Install Dependencies
282
+ ```bash
283
+ npm install
284
+ ```
285
+
286
+ #### Start Development Server
287
+ ```bash
288
+ npm run dev
289
+ ```
290
+
291
+ #### Build for Production
292
+ ```bash
293
+ npm run build
294
+ ```
295
+
296
+ #### Preview Production Build
297
+ ```bash
298
+ npm run preview
299
+ ```
300
+
301
+ # Code Linting & Fixing
302
+ npm run lint
303
+
304
+ # Code Formatting
305
+ npm run format
306
+
307
+ ### Development Standards
308
+
309
+ #### Development Guide
310
+
311
+ ##### Start Development Server
312
+
313
+ ```bash
314
+ cd my-project
315
+ npm install # If dependency installation was skipped
316
+ npm run dev
317
+ ```
318
+
319
+ ##### Build for Production
320
+
321
+ ```bash
322
+ npm run build
323
+ ```
324
+
325
+ ##### Code Linting
326
+
327
+ ```bash
328
+ npm run lint
329
+ ```
330
+
331
+ ##### Code Formatting
332
+
333
+ ```bash
334
+ npm run format
335
+ ```
336
+
337
+ #### Tech Stack
338
+
339
+ - **Vue 3**: Progressive JavaScript Framework
340
+ - **Vite**: Next Generation Frontend Tooling
341
+ - **Ant Design Vue**: Enterprise-class UI Design Language
342
+ - **Pinia**: Vue State Management
343
+ - **Vue Router**: Official Vue Router
344
+ - **ESLint + Prettier**: Code Linting and Formatting
345
+
346
+ #### FAQ
347
+
348
+ ##### Q: Permission error when creating project?
349
+ A: Please ensure you have sufficient permissions to create files in the target directory.
350
+
351
+ ##### Q: Dependency installation failed?
352
+ A: Try using `--skip-install` to skip installation, then manually run `npm install`.
353
+
354
+ ##### Q: How to customize templates?
355
+ A: You can modify template files in the `templates/` directory to customize generated content.
356
+
357
+ ##### Q: Support TypeScript?
358
+ A: Current version mainly supports JavaScript, TypeScript support will be added in future versions.
359
+
360
+ #### Vue Component Standards
361
+ 1. Use Composition API (`<script setup>`) syntax sugar
362
+ 2. Use PascalCase for component naming
363
+ 3. Use `.vue` extension for component files
364
+ 4. Use `scoped` styles to avoid global pollution
365
+
366
+ #### JavaScript Standards
367
+ 1. Use ES6+ syntax
368
+ 2. Use `import/export` for modularization
369
+ 3. Prefer `const`, then `let`, avoid `var`
370
+ 4. Use arrow functions to simplify code
371
+
372
+ #### CSS Standards
373
+ 1. Use kebab-case for CSS class names
374
+ 2. Use `scoped` for component styles to avoid global pollution
375
+
376
+ #### Code Commit Standards
377
+ 1. Follow conventional commit specification
378
+ 2. Ensure ESLint check passes before commit
379
+
380
+ ## Project Features
381
+
382
+ ### 1. Modular Design
383
+ The project adopts a highly modular design, with functional modules independent of each other, facilitating maintenance and expansion.
384
+
385
+ ### 2. Common Component Encapsulation
386
+ Provides rich common components, such as form tables, icon selectors, etc., improving development efficiency.
387
+
388
+ ### 3. Utility Function Library
389
+ Encapsulates common utility functions, such as region tools, form CRUD operations, etc., simplifying business logic development.
390
+
391
+ ### 4. Responsive Design
392
+ Responsive design based on Ant Design Vue, adapting to devices of different screen sizes.
393
+
394
+ ### 5. Internationalization Support
395
+ Reserved internationalization interfaces for future multi-language expansion.
396
+
397
+ ## Deployment
398
+
399
+ ### Environment Configuration
400
+ The project supports multi-environment configuration, managing variables for different environments via `.env` files:
401
+ - `.env.development`: Development environment
402
+ - `.env.test`: Test environment
403
+ - `.env.production`: Production environment
404
+
405
+ ### Build & Deploy
406
+ 1. Run build command: `npm run build`
407
+ 2. Deploy files in `dist` directory to Web server
408
+ 3. Configure server to support SPA routing mode
409
+
410
+ ## Contribution
411
+
412
+ 1. Raise Issues or Suggestions
413
+ - Submit Issue describing the problem or suggestion
414
+ - Provide relevant code snippets or screenshots
415
+
416
+ 2. Participate in Development
417
+ - Fork this project
418
+ - Create feature branch (`git checkout -b feature/AmazingFeature`)
419
+ - Commit changes (`git commit -m 'Add some AmazingFeature'`)
420
+ - Push to branch (`git push origin feature/AmazingFeature`)
421
+ - Submit Pull Request
422
+
423
+ ## License
424
+
425
+ This project is licensed under the MIT License, see the LICENSE file for details.
package/README.md CHANGED
@@ -33,30 +33,13 @@ ZAntAdmin 是一个基于 Vue 3.5 + Vite + Ant Design Vue 4.2.6 构建的现代
33
33
  ### 效果预览
34
34
 
35
35
  <div>
36
- <img src="./src/assets/imgs/md/1.png" alt="登录页面" width="300" style="margin-right: 10px; margin-bottom: 10px; border: 1px solid #d9d9d9; border-radius: 4px;">
37
- <img src="./src/assets/imgs/md/2.png" alt="首页" width="300" style="margin-right: 10px; margin-bottom: 10px; border: 1px solid #d9d9d9; border-radius: 4px;">
38
- <img src="./src/assets/imgs/md/3.png" alt="服务监控" width="300" style="margin-bottom: 10px; border: 1px solid #d9d9d9; border-radius: 4px;">
36
+ <img src="./src/assets/imgs/md/login.png" alt="登录页面" width="300" style="margin-right: 10px; margin-bottom: 10px; border: 1px solid #d9d9d9; border-radius: 4px;">
37
+ <img src="./src/assets/imgs/md/console.png" alt="首页" width="300" style="margin-right: 10px; margin-bottom: 10px; border: 1px solid #d9d9d9; border-radius: 4px;">
38
+ <img src="./src/assets/imgs/md/serviceMonitoring.png" alt="服务监控" width="300" style="margin-bottom: 10px; border: 1px solid #d9d9d9; border-radius: 4px;">
39
+ <img src="./src/assets/imgs/md/statistics.png" alt="统计图" width="300" style="margin-right: 10px; margin-bottom: 10px; border: 1px solid #d9d9d9; border-radius: 4px;">
40
+ <img src="./src/assets/imgs/md/menu.png" alt="菜单管理" width="300" style="margin-right: 10px; margin-bottom: 10px; border: 1px solid #d9d9d9; border-radius: 4px;">
39
41
  </div>
40
42
 
41
- <div>
42
- <img src="./src/assets/imgs/md/4.png" alt="统计图" width="300" style="margin-right: 10px; margin-bottom: 10px; border: 1px solid #d9d9d9; border-radius: 4px;">
43
- <img src="./src/assets/imgs/md/5.png" alt="菜单管理" width="300" style="margin-right: 10px; margin-bottom: 10px; border: 1px solid #d9d9d9; border-radius: 4px;">
44
- <img src="./src/assets/imgs/md/6.png" alt="页面6" width="300" style="margin-bottom: 10px; border: 1px solid #d9d9d9; border-radius: 4px;">
45
- </div>
46
-
47
- <div>
48
- <img src="./src/assets/imgs/md/7.png" alt="页面7" width="300" style="margin-right: 10px; margin-bottom: 10px; border: 1px solid #d9d9d9; border-radius: 4px;">
49
- <img src="./src/assets/imgs/md/8.png" alt="页面8" width="300" style="margin-right: 10px; margin-bottom: 10px; border: 1px solid #d9d9d9; border-radius: 4px;">
50
- <img src="./src/assets/imgs/md/9.png" alt="页面9" width="300" style="margin-bottom: 10px; border: 1px solid #d9d9d9; border-radius: 4px;">
51
- </div>
52
-
53
- <div>
54
- <img src="./src/assets/imgs/md/10.png" alt="页面10" width="300" style="margin-right: 10px; border: 1px solid #d9d9d9; border-radius: 4px;">
55
- <img src="./src/assets/imgs/md/11.png" alt="页面11" width="300" style="border: 1px solid #d9d9d9; border-radius: 4px;">
56
- </div>
57
-
58
-
59
-
60
43
  ## 技术架构
61
44
 
62
45
  ### 核心框架
@@ -156,7 +139,7 @@ ZAntAdmin/
156
139
 
157
140
  ### 方式一:使用脚手架(推荐)
158
141
 
159
- ZAnt Admin 脚手架是一个基于 Vue 3 + Vite + Ant Design Vue 的前端管理系统快速生成工具。通过简单的命令行操作,您可以快速创建功能完整的管理系统项目。
142
+ ZAnt Admin 脚手架是一个基于 Vue 3.5 + Vite + Ant Design Vue 的前端管理系统快速生成工具。通过简单的命令行操作,您可以快速创建功能完整的管理系统项目。
160
143
 
161
144
  #### 安装脚手架
162
145
 
package/bin/cli.js CHANGED
@@ -15,15 +15,15 @@ const program = new Command();
15
15
  // 设置程序信息
16
16
  program
17
17
  .name('zant-admin')
18
- .description('基于 Vue 3 + Vite + Ant Design Vue 的前端管理系统脚手架')
19
- .version('1.0.4');
18
+ .description('基于 Vue 3.5 + Vite + Ant Design Vue 的前端管理系统脚手架')
19
+ .version('2.0.0');
20
20
 
21
21
  // 创建项目命令
22
22
  program
23
23
  .command('create <project-name>')
24
24
  .description('创建一个新的 ZAnt Admin 项目')
25
25
  .option('-t, --template <template>', '选择项目模板', 'default')
26
- .option('-d, --description <description>', '项目描述', '基于 Vue 3 + Vite + Ant Design Vue 的前端管理系统')
26
+ .option('-d, --description <description>', '项目描述', '基于 Vue 3.5 + Vite + Ant Design Vue 的前端管理系统')
27
27
  .option('-a, --author <author>', '作者名称', '')
28
28
  .option('--skip-install', '跳过依赖安装')
29
29
  .option('--no-interactive', '禁用交互式模式')
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "zant-admin",
3
- "version": "1.0.4",
4
- "description": "基于 Vue 3 + Vite + Ant Design Vue 的前端管理系统脚手架",
3
+ "version": "2.0.0",
4
+ "description": "基于 Vue 3.5 + Vite + Ant Design Vue 的前端管理系统脚手架",
5
5
  "main": "bin/cli.js",
6
6
  "bin": {
7
7
  "zant-admin": "./bin/cli.js"
package/public/logo.png CHANGED
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -45,6 +45,7 @@ const routes = [
45
45
  },
46
46
  {
47
47
  path: 'notFound',
48
+ meta: { title: '404 Not Found', cache: true },
48
49
  component: () => import('../views/baiscstatis/notFound.vue'),
49
50
  },
50
51
  ],
@@ -95,7 +96,7 @@ async function loadDynamicRoutes() {
95
96
  const parentRoute = {
96
97
  path: route.path,
97
98
  component: home,
98
- // meta: { title: route.title },
99
+ meta: { title: route.title },
99
100
  // children: [],
100
101
  }
101
102
  const addRoutes = (parentRoute, children) => {
@@ -103,9 +104,8 @@ async function loadDynamicRoutes() {
103
104
  parentRoute.children = children.map(child => {
104
105
  const childRoute = {
105
106
  path: child.path,
106
- meta: { title: child.title },
107
107
  name: child.path.replace(/\//g, '-').substring(1),
108
- meta: { cache: child.cache, fullPath: child.path },
108
+ meta: { title: child.title, cache: child.cache, fullPath: child.path },
109
109
  }
110
110
  if (child.type != 1) {
111
111
  childRoute.component = loadComponent(child.path)
@@ -151,10 +151,8 @@ async function loadDynamicRoutes() {
151
151
 
152
152
  // 全局前置守卫
153
153
  router.beforeEach(async (to, from, next) => {
154
- // document.title = to.meta.title || 'ZCloudVue'
155
- // document.title = 'ZCloudVue'
156
154
  const config = configStore()
157
- document.title = config.projectName
155
+ document.title = to.meta.title ? to.meta.title + ' - ' + config.projectName : config.projectName
158
156
  const user = useUserStore()
159
157
 
160
158
  // 如果目标路由在白名单中,直接放行
@@ -1,144 +1,131 @@
1
1
  <template>
2
2
  <div class="app">
3
- <div class="demo-login">
4
- <div class="tel flex-row">
5
- <img src="@/assets/imgs/logo.png" alt="" width="50px" />ZAntAdmin
3
+ <div class="app-flex-row">
4
+ <div class="app-flex-row-left">
5
+ <div class="logo-wrapper">
6
+ <img src="@/assets/imgs/logo.png" alt="Logo" class="logo-img" />
7
+ <span class="logo-text">Zant Admin</span>
8
+ </div>
9
+ <div class="description">
10
+ <h2>
11
+ <span class="text-white">构建现代化的</span><br />
12
+ <span class="text-gradient">全栈管理系统</span>
13
+ </h2>
14
+ <p>基于 Vue 3.5 + Ant Design Vue 的现代化前端开发框架</p>
15
+ <p>提供开箱即用的高质量组件,助您快速构建专业应用</p>
16
+ </div>
6
17
  </div>
7
- <a-tabs v-model:activeKey="activeKey" centered tabBarGutter="10">
8
- <a-tab-pane key="1" tab="密码登录">
9
- <a-form
10
- :model="formState"
11
- name="normal_login"
12
- class="login-form"
13
- @finish="onFinish"
14
- @finishFailed="onFinishFailed"
15
- >
16
- <a-form-item
17
- name="mobile"
18
- :rules="[{ required: true, message: '手机号码不能为空!' }]"
19
- >
20
- <a-input
21
- v-model:value="formState.mobile"
22
- placeholder="请输入手机号码"
23
- size="large"
24
- >
25
- <template #prefix>
26
- <MobileOutlined class="site-form-item-icon" />
27
- </template>
28
- </a-input>
29
- </a-form-item>
30
- <a-form-item
31
- name="password"
32
- :rules="[{ required: true, message: '密码不能为空!' }]"
33
- >
34
- <a-input-password
35
- v-model:value="formState.password"
36
- placeholder="请输入密码"
37
- size="large"
38
- >
39
- <template #prefix>
40
- <LockOutlined class="site-form-item-icon" />
41
- </template>
42
- </a-input-password>
43
- </a-form-item>
44
- <a-form-item>
45
- <a-form-item name="remember" no-style>
46
- <a-checkbox v-model:checked="formState.remember"
47
- >自动登录</a-checkbox
48
- >
49
- </a-form-item>
50
- <a class="login-form-forgot" href="">忘记密码</a>
51
- </a-form-item>
52
-
53
- <a-form-item>
54
- <a-button
55
- :disabled="disabled"
56
- type="primary"
57
- :loading="loading"
58
- html-type="submit"
59
- size="large"
60
- class="login-form-button"
61
- >
62
- 登录
63
- </a-button>
64
- </a-form-item>
65
- </a-form>
66
- </a-tab-pane>
67
- <a-tab-pane key="2" tab="验证码登录" force-render>
68
- <a-form
69
- :model="formState"
70
- name="normal_login"
71
- class="login-form"
72
- @finish="onFinish"
73
- @finishFailed="onFinishFailed"
74
- >
75
- <a-form-item
76
- name="mobile"
77
- :rules="[{ required: true, message: '手机号码不能为空!' }]"
78
- >
79
- <a-input
80
- v-model:value="formState.mobile"
81
- placeholder="请输入手机号码"
82
- size="large"
83
- >
84
- <template #prefix>
85
- <MobileOutlined class="site-form-item-icon" />
86
- </template>
87
- </a-input>
88
- </a-form-item>
89
- <a-row :gutter="16">
90
- <a-col :span="16">
91
- <a-form-item
92
- name="mobile"
93
- :rules="[{ required: true, message: '验证码不能为空!' }]"
94
- >
95
- <a-input
96
- v-model:value="formState.vercode"
97
- placeholder="请输入验证码"
98
- size="large"
99
- >
18
+ <div class="app-flex-row-right">
19
+ <div class="demo-login">
20
+ <div class="tel">
21
+ 欢迎使用
22
+ </div>
23
+ <a-tabs v-model:activeKey="activeKey" tabBarGutter="10">
24
+ <a-tab-pane key="1" tab="账号密码登录">
25
+ <a-form :model="formState" name="normal_login" class="login-form" @finish="onFinish"
26
+ @finishFailed="onFinishFailed">
27
+ <a-form-item name="mobile" :rules="[{ required: true, message: '手机号码不能为空!' }]">
28
+ <a-input v-model:value="formState.mobile" placeholder="请输入手机号码" size="large">
29
+ <template #prefix>
30
+ <MobileOutlined class="site-form-item-icon" />
31
+ </template>
32
+ </a-input>
33
+ </a-form-item>
34
+ <a-form-item name="password" :rules="[{ required: true, message: '密码不能为空!' }]">
35
+ <a-input-password v-model:value="formState.password" placeholder="请输入密码" size="large">
100
36
  <template #prefix>
101
37
  <LockOutlined class="site-form-item-icon" />
102
38
  </template>
39
+ </a-input-password>
40
+ </a-form-item>
41
+ <a-form-item>
42
+ <a-form-item name="remember" no-style>
43
+ <a-checkbox v-model:checked="formState.remember">自动登录</a-checkbox>
44
+ </a-form-item>
45
+ <a class="login-form-forgot" href="">忘记密码</a>
46
+ </a-form-item>
47
+
48
+ <a-form-item>
49
+ <a-button :disabled="disabled" type="primary" :loading="loading" html-type="submit" size="large"
50
+ class="login-form-button">
51
+ 登录
52
+ </a-button>
53
+ </a-form-item>
54
+ </a-form>
55
+ </a-tab-pane>
56
+ <a-tab-pane key="2" tab="手机号登录" force-render>
57
+ <a-form :model="formState" name="normal_login" class="login-form" @finish="onFinish"
58
+ @finishFailed="onFinishFailed">
59
+ <a-form-item name="mobile" :rules="[{ required: true, message: '手机号码不能为空!' }]">
60
+ <a-input v-model:value="formState.mobile" placeholder="请输入手机号码" size="large">
61
+ <template #prefix>
62
+ <MobileOutlined class="site-form-item-icon" />
63
+ </template>
103
64
  </a-input>
104
65
  </a-form-item>
105
- </a-col>
106
- <a-col :span="8">
107
- <a-button
108
- size="large"
109
- class="login-form-button"
110
- @click="sendSmsCode"
111
- :disabled="smsdisabled"
112
- >
113
- {{ smstext }}
114
- </a-button>
115
- </a-col>
116
- </a-row>
117
- <a-form-item>
118
- <a-form-item name="remember" no-style>
119
- <a-checkbox v-model:checked="formState.remember"
120
- >自动登录</a-checkbox
121
- >
122
- </a-form-item>
123
- <a class="login-form-forgot" href="">忘记密码</a>
124
- </a-form-item>
125
- <a-form-item>
126
- <a-button
127
- :disabled="disabled"
128
- type="primary"
129
- :loading="loading"
130
- html-type="submit"
131
- size="large"
132
- class="login-form-button"
133
- >
134
- 登录
135
- </a-button>
136
- </a-form-item>
137
- </a-form>
138
- </a-tab-pane>
139
- </a-tabs>
66
+ <a-row :gutter="16">
67
+ <a-col :span="16">
68
+ <a-form-item name="mobile" :rules="[{ required: true, message: '验证码不能为空!' }]">
69
+ <a-input v-model:value="formState.vercode" placeholder="请输入验证码" size="large">
70
+ <template #prefix>
71
+ <LockOutlined class="site-form-item-icon" />
72
+ </template>
73
+ </a-input>
74
+ </a-form-item>
75
+ </a-col>
76
+ <a-col :span="8">
77
+ <a-button size="large" class="login-form-button" @click="sendSmsCode" :disabled="smsdisabled">
78
+ {{ smstext }}
79
+ </a-button>
80
+ </a-col>
81
+ </a-row>
82
+ <a-form-item>
83
+ <a-form-item name="remember" no-style>
84
+ <a-checkbox v-model:checked="formState.remember">自动登录</a-checkbox>
85
+ </a-form-item>
86
+ <a class="login-form-forgot" href="">忘记密码</a>
87
+ </a-form-item>
88
+ <a-form-item>
89
+ <a-button :disabled="disabled" type="primary" :loading="loading" html-type="submit" size="large"
90
+ class="login-form-button">
91
+ 登录
92
+ </a-button>
93
+ </a-form-item>
94
+ </a-form>
95
+
96
+ </a-tab-pane>
97
+ </a-tabs>
98
+ <a-divider>其他登录方式</a-divider>
99
+ <div class="text-align-center">
100
+ <a-space size="large">
101
+ <a href="" target="_blank">
102
+ <WechatOutlined style="font-size: 24px; color: #4dbf00;" />
103
+ </a>
104
+
105
+ <a href="" target="_blank">
106
+ <QqOutlined style="font-size: 24px; color: #0099ff;" />
107
+ </a>
108
+
109
+ <a href="" target="_blank">
110
+ <AlipayCircleOutlined style="font-size: 24px; color:#0099ff;" />
111
+ </a>
112
+
113
+ <a href="" target="_blank">
114
+ <TaobaoCircleOutlined style="font-size: 24px; color: #ff6600;" />
115
+ </a>
116
+ <a href="" target="_blank">
117
+ <GithubOutlined style="font-size: 24px; color: #000;" />
118
+ </a>
119
+ </a-space>
120
+
121
+ </div>
122
+
123
+ </div>
124
+ <div class="footer">Copyright © 2025 ZantAdmin</div>
125
+ </div>
126
+
140
127
  </div>
141
- <div class="footer">Copyright © 2025 *********</div>
128
+
142
129
  </div>
143
130
  </template>
144
131
  <script setup>
@@ -148,6 +135,7 @@ import router, { refreshRoutes } from '@/router'
148
135
  import { useUserStore } from '@/stores/user'
149
136
  import { reactive, computed, ref } from 'vue'
150
137
  import { message } from 'ant-design-vue'
138
+ import { MessageOutlined, QqOutlined } from '@ant-design/icons-vue'
151
139
  const formState = reactive({
152
140
  mobile: '123456',
153
141
  password: '123456',
@@ -220,39 +208,154 @@ const sendSmsCode = () => {
220
208
  }, 1000)
221
209
  })
222
210
  }
211
+
212
+ // 微信登录
213
+ const loginWithWechat = () => {
214
+ message.info('微信登录功能开发中,敬请期待')
215
+ // 这里可以添加实际的微信登录逻辑
216
+ // 例如:跳转到微信授权页面或打开微信扫码登录
217
+ }
218
+
219
+ // QQ登录
220
+ const loginWithQQ = () => {
221
+ message.info('QQ登录功能开发中,敬请期待')
222
+ // 这里可以添加实际的QQ登录逻辑
223
+ // 例如:跳转到QQ授权页面或打开QQ扫码登录
224
+ }
223
225
  </script>
224
226
  <style scoped>
225
227
  .app {
226
228
  height: 100vh !important;
229
+ width: 100vw !important;
227
230
  display: flex !important;
228
231
  align-items: center !important;
229
- background-image: url(../assets/imgs/loginbackground.svg);
230
232
  background-size: 100% 100%;
231
233
  }
232
234
 
233
- .demo-login {
234
- width: 400px !important;
235
+ .app-flex-row {
236
+ width: 100%;
237
+ display: flex;
238
+ flex-direction: row;
239
+ justify-content: center;
240
+ align-items: center;
241
+ }
242
+
243
+ .app-flex-row-left {
244
+ width: 65%;
245
+ height: 100vh;
246
+ display: flex;
247
+ flex-direction: column;
248
+ justify-content: center;
249
+ align-items: center;
250
+ background: #0f172a; /* Dark background to match the image */
251
+ position: relative;
252
+ overflow: hidden;
253
+ color: #fff;
254
+ }
255
+
256
+ .app-flex-row-left::before {
257
+ content: '';
258
+ position: absolute;
259
+ top: 0;
260
+ left: 0;
261
+ width: 100%;
262
+ height: 100%;
263
+
264
+ }
265
+
266
+ .logo-wrapper {
267
+ position: absolute;
268
+ top: 40px;
269
+ left: 40px;
270
+ display: flex;
271
+ align-items: center;
272
+ z-index: 10;
273
+ }
274
+
275
+ .logo-img {
276
+ width: 25px;
277
+ height: 25px;
278
+ margin-right: 16px;
279
+ }
280
+
281
+ .logo-text {
282
+ font-size: 20px;
283
+ font-weight: bold;
284
+ letter-spacing: 1px;
285
+ }
286
+
287
+ .illustration-wrapper {
288
+ flex: 1;
289
+ display: flex;
290
+ align-items: center;
291
+ justify-content: center;
292
+ width: 80%;
293
+ max-width: 600px;
294
+ z-index: 10;
295
+ }
296
+
297
+ .illustration-img {
298
+ width: 100%;
235
299
  height: auto;
236
- margin: 0 auto;
237
- background-color: rgba(255, 255, 255, 1);
238
- padding: 30px;
239
- border-radius: 20px;
300
+ object-fit: contain;
240
301
  }
241
302
 
242
- .demo-auto-login {
243
- margin-bottom: 60px;
244
- text-align: left;
303
+ .description {
304
+ margin-bottom: 20px;
305
+ text-align: center;
306
+ z-index: 10;
245
307
  }
246
308
 
247
- .demo-auto-login a {
248
- float: right;
309
+ .description h2 {
310
+ font-size: 64px;
311
+ font-weight: 900;
312
+ margin-bottom: 24px;
313
+ line-height: 1.1;
314
+ letter-spacing: 2px;
315
+ }
316
+
317
+ .text-white {
318
+ color: #ffffff;
319
+ }
320
+
321
+ .text-gradient {
322
+ background: linear-gradient(90deg, #a855f7 0%, #3b82f6 100%);
323
+ -webkit-background-clip: text;
324
+ background-clip: text;
325
+ color: transparent;
326
+ }
327
+
328
+ .description p {
329
+ font-size: 16px;
330
+ opacity: 0.9;
331
+ margin-bottom: 8px;
332
+ color: #e0e7ff;
333
+ }
334
+
335
+ .app-flex-row-right {
336
+ width: 35%;
337
+ height: 100vh;
338
+ display: flex;
339
+ flex-direction: row;
340
+ justify-content: center;
341
+ align-items: center;
342
+ background-color: white;
343
+ position: relative;
344
+ }
345
+
346
+ .demo-login {
347
+ width: 400px !important;
348
+ height: auto;
349
+ margin: 0 auto;
350
+ padding: 30px;
249
351
  }
250
352
 
251
353
  .tel {
252
- font-size: 30px;
253
- text-align: center;
254
- padding: 20px;
354
+ font-size: 24px;
355
+ font-weight: 600;
255
356
  color: rgb(0, 0, 0);
357
+ text-align: left;
358
+ margin-bottom: 30px;
256
359
  }
257
360
 
258
361
  .login-form-forgot {
@@ -262,11 +365,13 @@ const sendSmsCode = () => {
262
365
  .login-form-button {
263
366
  width: 100%;
264
367
  }
368
+
265
369
  .footer {
266
- position: fixed;
370
+ position: absolute;
267
371
  bottom: 20px;
268
372
  left: 0;
269
373
  right: 0;
270
374
  text-align: center;
375
+ color: rgb(100, 100, 100);
271
376
  }
272
377
  </style>
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file