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 +414 -25
- package/README.md +6 -23
- package/bin/cli.js +3 -3
- package/package.json +2 -2
- package/public/logo.png +0 -0
- package/src/assets/imgs/logo.png +0 -0
- package/src/assets/imgs/md/console.png +0 -0
- package/src/assets/imgs/md/login.png +0 -0
- package/src/assets/imgs/md/menu.png +0 -0
- package/src/assets/imgs/md/serviceMonitoring.png +0 -0
- package/src/assets/imgs/md/statistics.png +0 -0
- package/src/router/index.js +4 -6
- package/src/views/login.vue +253 -148
- package/src/assets/imgs/md/1.png +0 -0
- package/src/assets/imgs/md/10.png +0 -0
- package/src/assets/imgs/md/11.png +0 -0
- package/src/assets/imgs/md/2.png +0 -0
- package/src/assets/imgs/md/3.png +0 -0
- package/src/assets/imgs/md/4.png +0 -0
- package/src/assets/imgs/md/5.png +0 -0
- package/src/assets/imgs/md/6.png +0 -0
- package/src/assets/imgs/md/7.png +0 -0
- package/src/assets/imgs/md/8.png +0 -0
- package/src/assets/imgs/md/9.png +0 -0
package/README.en.md
CHANGED
|
@@ -1,36 +1,425 @@
|
|
|
1
|
-
|
|
1
|
+
<div align="center">
|
|
2
|
+
<h1>ZAntAdmin</h1>
|
|
3
|
+
<img src="./public/logo.png" alt="ZAntAdmin Logo" width="120">
|
|
4
|
+
</div>
|
|
2
5
|
|
|
3
|
-
|
|
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
|
-
|
|
7
|
-
|
|
8
|
+

|
|
9
|
+

|
|
10
|
+

|
|
11
|
+

|
|
8
12
|
|
|
9
|
-
|
|
13
|
+
[Live Demo](http://106.13.37.129:8123) | [Backend Project](https://gitee.com/zchty/zant-core)
|
|
10
14
|
|
|
11
|
-
|
|
12
|
-
2. xxxx
|
|
13
|
-
3. xxxx
|
|
15
|
+
</div>
|
|
14
16
|
|
|
15
|
-
|
|
17
|
+
## 📋 Table of Contents
|
|
16
18
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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
|
-
|
|
28
|
+
## Introduction
|
|
22
29
|
|
|
23
|
-
|
|
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
|
-
|
|
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
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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/
|
|
37
|
-
<img src="./src/assets/imgs/md/
|
|
38
|
-
<img src="./src/assets/imgs/md/
|
|
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('
|
|
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": "
|
|
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
|
package/src/assets/imgs/logo.png
CHANGED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/src/router/index.js
CHANGED
|
@@ -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
|
-
|
|
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
|
// 如果目标路由在白名单中,直接放行
|
package/src/views/login.vue
CHANGED
|
@@ -1,144 +1,131 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<div class="app">
|
|
3
|
-
<div class="
|
|
4
|
-
<div class="
|
|
5
|
-
<
|
|
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
|
-
<
|
|
8
|
-
<
|
|
9
|
-
<
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
>
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
>
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
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
|
-
|
|
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
|
-
.
|
|
234
|
-
width:
|
|
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
|
-
|
|
237
|
-
background-color: rgba(255, 255, 255, 1);
|
|
238
|
-
padding: 30px;
|
|
239
|
-
border-radius: 20px;
|
|
300
|
+
object-fit: contain;
|
|
240
301
|
}
|
|
241
302
|
|
|
242
|
-
.
|
|
243
|
-
margin-bottom:
|
|
244
|
-
text-align:
|
|
303
|
+
.description {
|
|
304
|
+
margin-bottom: 20px;
|
|
305
|
+
text-align: center;
|
|
306
|
+
z-index: 10;
|
|
245
307
|
}
|
|
246
308
|
|
|
247
|
-
.
|
|
248
|
-
|
|
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:
|
|
253
|
-
|
|
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:
|
|
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>
|
package/src/assets/imgs/md/1.png
DELETED
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/src/assets/imgs/md/2.png
DELETED
|
Binary file
|
package/src/assets/imgs/md/3.png
DELETED
|
Binary file
|
package/src/assets/imgs/md/4.png
DELETED
|
Binary file
|
package/src/assets/imgs/md/5.png
DELETED
|
Binary file
|
package/src/assets/imgs/md/6.png
DELETED
|
Binary file
|
package/src/assets/imgs/md/7.png
DELETED
|
Binary file
|
package/src/assets/imgs/md/8.png
DELETED
|
Binary file
|
package/src/assets/imgs/md/9.png
DELETED
|
Binary file
|