cuiHe 1 неделя назад
Родитель
Сommit
41be128664

+ 0 - 21
LICENSE

@@ -1,21 +0,0 @@
-MIT License
-
-Copyright (c) 2025 1014TaoTao
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.

+ 0 - 397
README.en.md

@@ -1,397 +0,0 @@
-<div align="center">
-     <p align="center">
-          <img src="https://gitee.com/tao__tao/FastDocs/raw/main/src/public/logo.png" width="150" height="150" alt="logo" /> 
-     </p>
-     <h1>FastApiAdmin <img src="https://img.shields.io/badge/Version-v2.0.0-blue" alt="Version"></h1>
-     <h3>Modern Full-Stack Rapid Development Platform</h3>
-     <p>If you like this project, please give it a ⭐️ to show your support!</p>
-     <p align="center">
-          <a href="https://gitee.com/tao__tao/FastapiAdmin.git" target="_blank">
-               <img src="https://gitee.com/tao__tao/FastapiAdmin/badge/star.svg?theme=dark" alt="Gitee Stars">
-          </a>
-          <a href="https://github.com/1014TaoTao/FastapiAdmin.git" target="_blank">
-               <img src="https://img.shields.io/github/stars/1014TaoTao/FastapiAdmin?style=social" alt="GitHub Stars">
-          </a>
-          <a href="https://gitee.com/tao__tao/FastapiAdmin/blob/master/LICENSE" target="_blank">
-               <img src="https://img.shields.io/badge/License-MIT-orange" alt="License">
-          </a>
-          <img src="https://img.shields.io/badge/Python-≥3.10-blue"> 
-          <img src="https://img.shields.io/badge/NodeJS-≥20.0-blue"> 
-          <img src="https://img.shields.io/badge/MySQL-≥8.0-blue"> 
-          <img src="https://img.shields.io/badge/Redis-≥7.0-blue"> 
-          <img src="https://img.shields.io/badge/-HTML5-E34F26?style=flat-square&logo=html5&logoColor=white"/> 
-          <img src="https://img.shields.io/badge/-CSS3-1572B6?style=flat-square&logo=css3"/> 
-          <img src="https://img.shields.io/badge/-JavaScript-563D7C?style=flat-square&logo=bootstrap"/> 
-     </p>
-
-English | [简体中文](./README.md)
-
-</div>
-
-## 📘 Project Introduction
-
-**FastApiAdmin** is a **completely open-source, highly modular, and technologically advanced modern rapid development platform** designed to help developers efficiently build high-quality enterprise-level backend and frontend systems. This project adopts a **frontend-backend separation architecture**, integrating the Python backend framework `FastAPI` and the mainstream frontend framework `Vue3` to achieve unified development across multiple terminals, providing a one-stop out-of-the-box development experience.
-
-> **Design Philosophy**: With modularity and loose coupling at its core, it pursues rich functional modules, simple and easy-to-use interfaces, detailed development documentation, and convenient maintenance methods. By unifying frameworks and components, it reduces the cost of technology selection, follows development specifications and design patterns, builds a powerful code hierarchical model, and comes with comprehensive local language support. It is specifically tailored for team and enterprise development scenarios.
-
-## 🔗 Source Repositories
-
-| Platform | Repository |
-|----------|------------|
-| GitHub | [FastapiAdmin Main](https://github.com/1014TaoTao/FastapiAdmin.git) \| [FastDocs Website](https://github.com/1014TaoTao/FastDocs.git) \| [FastApp Mobile](https://github.com/1014TaoTao/FastApp.git) |
-| Gitee  | [FastapiAdmin Main](https://gitee.com/tao__tao/FastapiAdmin.git) \| [FastDocs Website](https://gitee.com/tao__tao/FastDocs.git) \| [FastApp Mobile](https://gitee.com/tao__tao/FastApp.git) |
-
-## 🎯 Core Advantages
-
-| Advantage | Description |
-| ---- | ---- |
-| 🔥 **Modern Tech Stack** | Built with cutting-edge technologies like FastAPI + Vue3 + TypeScript |
-| ⚡ **High Performance** | Leveraging FastAPI's asynchronous features and Redis caching for optimized response speed |
-| 🔐 **Secure & Reliable** | JWT + OAuth2 authentication mechanism with RBAC permission control model |
-| 🧱 **Modular Design** | Highly decoupled system architecture for easy expansion and maintenance |
-| 🌐 **Full-Stack Support** | Integrated solution for Web + Mobile(H5) + Backend |
-| 🚀 **Rapid Deployment** | One-click Docker deployment for quick production rollout |
-| 📖 **Comprehensive Docs** | Detailed documentation and tutorials to reduce learning curve |
-
-## 📦 Engineering Structure Overview
-
-```sh
-FastapiAdmin
-├─ backend               # Backend project (FastAPI + Python)
-├─ frontend              # Web frontend project (Vue3 + Element Plus)
-├─ fastapp               # Mobile project (UniApp + Wot Design Uni)
-├─ fastdocs              # Documentation project (VitePress)
-├─ devops                # Deployment configurations
-├─ docker-compose.yaml   # Docker orchestration file
-├─ deploy.sh             # One-click deployment script
-├─ LICENSE               # Open source license
-|─ README.en.md          # English documentation
-└─ README.md             # Chinese documentation
-```
-
-## 🛠️ Technology Stack Overview
-
-| Type | Technology Selection | Description |
-|------|----------------------|-------------|
-| **Backend Framework** | FastAPI / Uvicorn / Pydantic 2.0 / Alembic | Modern, high-performance asynchronous framework with mandatory type constraints and data migration capabilities |
-| **ORM** | SQLAlchemy 2.0 | Powerful ORM library |
-| **Scheduled Tasks** | APScheduler | Easily implement scheduled tasks |
-| **Authentication** | PyJWT | Implement JWT authentication |
-| **Frontend Framework** | Vue3 / Vite5 / Pinia / TypeScript | Rapidly develop Vue3 applications |
-| **Web UI** | ElementPlus | Enterprise-level UI component library |
-| **Mobile** | UniApp / Wot Design Uni | Cross-platform mobile application framework |
-| **Database** | MySQL / MongoDB | Support for relational and document databases |
-| **Cache** | Redis | High-performance cache database |
-| **Documentation** | Swagger / Redoc | Automatically generate API documentation |
-| **Deployment** | Docker / Nginx / Docker Compose | Containerized deployment solution |
-
-## 📌 Built-in Functional Modules
-
-| Module | Features | Description |
-|------|------|------|
-| 📊 **Dashboard** | Workbench, Analysis Page | System overview and data analysis |
-| ⚙️ **System Management** | Users, Roles, Menus, Departments, Positions, Dictionaries, Configurations, Announcements | Core system management functions |
-| 👀 **Monitoring** | Online Users, Server Monitoring, Cache Monitoring | System runtime status monitoring |
-| 📋 **Task Management** | Scheduled Tasks | Asynchronous task scheduling management |
-| 📝 **Log Management** | Operation Logs | User behavior auditing |
-| 🧰 **Development Tools** | Code Generation, Form Builder, API Documentation | Tools to enhance development efficiency |
-| 📁 **File Management** | File Storage | Unified file management |
-
-## 🍪 Demo Environment
-
-- 🌐 Official Website: [https://service.fastapiadmin.com](https://service.fastapiadmin.com)
-- 💻 Web Demo: [https://service.fastapiadmin.com/web](https://service.fastapiadmin.com/web)
-- 📱 Mobile: [https://service.fastapiadmin.com/app](https://service.fastapiadmin.com/app)
-- 👤 Login Account: `admin` Password: `123456`
-
-## 🚀 Quick Start
-
-### Environment Requirements
-
-| Type | Technology Stack | Version |
-|------|------------------|---------|
-| Backend | Python | ≥ 3.10 |
-| Backend | FastAPI | 0.109+ |
-| Frontend | Node.js | ≥ 20.0 |
-| Frontend | Vue3 | 3.3+ |
-| Database | MySQL | 8.0+ |
-| Cache | Redis | 7.0+ |
-
-### Get the Code
-
-```bash
-# Clone the repository to your local machine
-git clone https://gitee.com/tao__tao/FastapiAdmin.git
-# Or
-git clone https://github.com/1014TaoTao/FastapiAdmin.git
-```
-
-### Backend Setup
-
-```bash
-# Navigate to the backend directory
-cd backend
-
-# Install dependencies
-pip3 install -r requirements.txt
-
-# Start the backend service: ensure that MySQL and Redis are running
-python main.py run
-# Or specify environment
-python main.py run --env=dev
-
-# Generate migration files
-python main.py revision --env=dev
-# Apply migrations
-python main.py upgrade --env=dev
-```
-
-### Frontend Setup
-
-```bash
-# Navigate to the frontend directory
-cd frontend
-
-# Install dependencies
-pnpm install
-
-# Start the development server
-pnpm run dev
-
-# Build for production
-pnpm run build
-```
-
-### Mobile Setup
-
-```bash
-# Navigate to the mobile directory
-cd fastapp
-
-# Install dependencies
-pnpm install
-
-# Start the H5 development server
-pnpm run dev:h5
-
-# Build for H5 production
-pnpm run build:h5
-```
-
-### Documentation Setup
-
-```bash
-# Navigate to the documentation directory
-cd fastdocs
-
-# Install dependencies
-pnpm install
-
-# Start the documentation development server
-pnpm run docs:dev
-
-# Build documentation for production
-pnpm run docs:build
-```
-
-### Access URLs
-
-- 🏠 Official Website: [http://localhost:5180](http://localhost:5180)
-- 🖥️ Web Interface: [http://localhost:5180/web](http://localhost:5180/web)
-- 📱 Mobile Interface: [http://localhost:5180/app](http://localhost:5180/app)
-
-Default accounts:
-- Admin: `admin` / `123456`
-
-## 🐳 Docker Deployment
-
-```bash
-# Copy the deployment script to the server and grant execution permissions
-chmod +x deploy.sh
-
-# Execute one-click deployment
-./deploy.sh
-
-# Common Docker commands
-# View running containers
-docker compose ps
-
-# View container logs
-docker logs -f <container_name>
-
-# Stop services
-docker compose down
-```
-
-## 🔧 Models
-
-| Module | Screenshot |
-|------------|---------------------------------|
-| Login      | ![Login](https://gitee.com/tao__tao/FastDocs/raw/main/src/public/login.png) |
-| Dashboard  | ![Dashboard](https://gitee.com/tao__tao/FastDocs/raw/main/src/public/dashboard.png) |
-| Analysis   | ![Analysis](https://gitee.com/tao__tao/FastDocs/raw/main/src/public/analysis.png) |
-| Menu       | ![Menu](https://gitee.com/tao__tao/FastDocs/raw/main/src/public/menu.png) |
-| Department | ![Department](https://gitee.com/tao__tao/FastDocs/raw/main/src/public/dept.png) |
-| Position   | ![Position](https://gitee.com/tao__tao/FastDocs/raw/main/src/public/position.png) |
-| Role       | ![Role](https://gitee.com/tao__tao/FastDocs/raw/main/src/public/role.png) |
-| User       | ![User](https://gitee.com/tao__tao/FastDocs/raw/main/src/public/user.png) |
-| Log        | ![Log](https://gitee.com/tao__tao/FastDocs/raw/main/src/public/log.png) |
-| Config     | ![Config](https://gitee.com/tao__tao/FastDocs/raw/main/src/public/config.png) |
-| OnlineUser | ![OnlineUser](https://gitee.com/tao__tao/FastDocs/raw/main/src/public/online.png) |
-| Server     | ![Server](https://gitee.com/tao__tao/FastDocs/raw/main/src/public/service.png) |
-| Cache      | ![Cache](https://gitee.com/tao__tao/FastDocs/raw/main/src/public/cache.png) |
-| Task       | ![Task](https://gitee.com/tao__tao/FastDocs/raw/main/src/public/job.png) |
-| Dict       | ![Dict](https://gitee.com/tao__tao/FastDocs/raw/main/src/public/dict.png) |
-| API Docs   | ![API Docs](https://gitee.com/tao__tao/FastDocs/raw/main/src/public/docs.png) |
-| Theme      | ![Theme](https://gitee.com/tao__tao/FastDocs/raw/main/src/public/theme.png) |
-| Document   | ![Document](https://gitee.com/tao__tao/FastDocs/raw/main/src/public/help.png) |
-| Lock       | ![Lock](https://gitee.com/tao__tao/FastDocs/raw/main/src/public/lock.png) |
-| Form       | ![Form](https://gitee.com/tao__tao/FastDocs/raw/main/src/public/form.png) |
-| Generator  | ![Generator](https://gitee.com/tao__tao/FastDocs/raw/main/src/public/gencode.png) |
-| Workflow   | ![Workflow](https://gitee.com/tao__tao/FastDocs/raw/main/src/public/workflow.png) |
-| File       | ![File](https://gitee.com/tao__tao/FastDocs/raw/main/src/public/file.png) |
-| MyApps    | ![MyApps](https://gitee.com/tao__tao/FastDocs/raw/main/src/public/myapp.png) |
-| Setting  | ![Setting](https://gitee.com/tao__tao/FastDocs/raw/main/src/public/setting.png) |
-| AI       | ![AI](https://gitee.com/tao__tao/FastDocs/raw/main/src/public/ai.png) |
-
-### Mobile
-
-| Module <div style="width:60px"/> | Details | Module <div style="width:60px"/> | Details | Module <div style="width:60px"/> | Details |
-|----------|------|----------|------|----------|------|
-| Login    | ![Mobile Login](https://gitee.com/tao__tao/FastDocs/raw/main/src/public/app_login.png) | Home      | ![Mobile Home](https://gitee.com/tao__tao/FastDocs/raw/main/src/public/app_home.png) | Profile      | ![Mobile Profile](https://gitee.com/tao__tao/FastDocs/raw/main/src/public/app_mine.png) |
-| Personal  | ![Mobile Personal Info](https://gitee.com/tao__tao/FastDocs/raw/main/src/public/app_profile.png) | Settings   | ![Mobile Settings](https://gitee.com/tao__tao/FastDocs/raw/main/src/public/app_setting.png) | Workbench      | ![Mobile Workbench](https://gitee.com/tao__tao/FastDocs/raw/main/src/public/app_work.png) |
-
-## 🛠️ Secondary Development Tutorial
-
-### Backend Part
-
-1. **Write the Entity Class Layer**: Create the ORM model for the demo in `backend/app/api/v1/models/demo/example_model.py` (corresponding to the entity class layer in Spring Boot).
-2. **Write the Data Model Layer**: Create the demo data model in `backend/app/api/v1/schemas/demo/example_schema.py` (corresponding to the DTO layer in Spring Boot).
-3. **Write the Persistence Layer**: Create the demo data layer in `backend/app/api/v1/cruds/demo/example_crud.py` (corresponding to the Mapper or DAO layer in Spring Boot).
-4. **Write the Business Layer**: Create the demo data layer in `backend/app/api/v1/services/demo/example_service.py` (corresponding to the Service layer in Spring Boot).
-5. **Write the Interface Layer**: Create the demo data layer in `backend/app/api/v1/controllers/demo/example_controller.py` (corresponding to the Controller layer in Spring Boot).
-6. **Register Backend Routes**: Register the demo routes in `backend/app/api/v1/urls/demo_url.py`.
-7. **Register Routes to the FastAPI Service**: Register the routes in `backend/plugin/init_app.py`.
-8. **Add the Demo Module to the System Initialization Script**: Add it in `backend/app/scripts/initialize.py` (if necessary, you can configure the demo menu permissions in `backend/app/scripts/data/system_menu.json` and `backend/app/scripts/data/system_role_menus.json` or from the frontend page menu).
-9.  **Add the Demo Module to the Database Migration Script**: Add it in `backend/app/alembic/env.py`.
-
-### Code Generation Tutorial
-
-The code generation module is one of the core features of this project, which can help developers quickly generate complete CRUD code and greatly improve development efficiency. This module is based on the Jinja2 template engine and can generate integrated front-end and back-end functional modules.
-
-#### Code Generation Process
-
-1. **Create or Import Data Tables**:
-   - Method 1: Create a new table directly in the system through the "Create Table" function
-   - Method 2: Import existing database tables into the code generator through the "Import" function
-
-2. **Configure Generation Parameters**:
-   - Basic Configuration:
-     - Table name, table description, entity class name
-   - Generation Configuration:
-     - Generation package path (package_name): e.g., `student`
-     - Generation module name (module_name): e.g., `student`
-     - Generation business name (business_name): e.g., `student`
-     - Generation function name (function_name): e.g., `Student Management`
-     - Code generation method: zip package download or project directory write
-     - Parent menu: Select the menu category to which the generated function belongs
-
-3. **Field Configuration**:
-   - Configure each field:
-     - Field column type, Python type, Python field name
-     - Whether it is a primary key, auto-increment, required
-     - Whether it is an insert field, edit field, list field, query field
-     - Query method (equal, not equal, greater than, less than, range)
-     - Display type (text box, text area, dropdown box, checkbox, radio button, date control)
-     - Dictionary type (for dropdown data source)
-
-4. **Code Preview**:
-   - Preview the code to be generated
-   - Support preview of backend (Python), frontend (Vue/TS), and database (SQL) code
-   - Filter preview content by type
-
-5. **Code Generation**:
-   - Click "Download Code" to generate and download a zip package
-   - Click "Write to Local" to write directly to the project directory
-
-#### Generated File Structure
-
-The code generator will generate a complete front-end and back-end code structure:
-
-**Backend Files**:
-- Controller layer: `backend/app/api/v1/module_{module_name}/{business_name}/controller.py`
-- Service layer: `backend/app/api/v1/module_{module_name}/{business_name}/service.py`
-- Data access layer: `backend/app/api/v1/module_{module_name}/{business_name}/crud.py`
-- Data model layer: `backend/app/api/v1/module_{module_name}/{business_name}/model.py`
-- Data schema layer: `backend/app/api/v1/module_{module_name}/{business_name}/schema.py`
-- Query parameter layer: `backend/app/api/v1/module_{module_name}/{business_name}/param.py`
-
-**Frontend Files**:
-- API interface file: `frontend/src/api/module_{module_name}/{business_name}.ts`
-- Page component file: `frontend/src/views/module_{module_name}/{business_name}/index.vue`
-
-**Database Files**:
-- Menu SQL file: `backend/sql/module_{module_name}/{business_name}_menu.sql`
-
-#### Usage Example
-
-1. Create a new table in the database, such as `sys_student`
-2. Log in to the system and enter the **Code Generation** module
-3. Click "Import" and select the `sys_student` table
-4. Configure generation parameters:
-   - Generation package path: `student`
-   - Generation module name: `student`
-   - Generation business name: `student`
-   - Generation function name: `Student Management`
-   - Parent menu: System Management
-5. Configure field properties (such as setting which fields need to be displayed, queried, edited, etc.)
-6. Click "Preview Code" to view the generated code
-7. Click "Download Code" or "Write to Local" to generate a complete functional module
-8. Restart the service, and the new function module is ready to use
-
-### Frontend Part
-
-1. **Configure the Frontend to Access the Backend Interface Address**: Configure it in `frontend/src/api/demo/example.ts`.
-2. **Write the Frontend Page**: Write it in `frontend/src/views/demo/example/index.vue`.
-
-### Mobile Part
-
-1. **Configure the mobile access address for backend interfaces**: Write the code in `fastapp/src/api`.
-2. **Write mobile pages**: Write the code in `fastapp/src/pages`.
-
-## ℹ️ Help
-
-For more details, please check the [Official Documentation](https://service.fastapiadmin.com)
-
-## 👥 Contributors
-
-<a href="https://github.com/1014TaoTao/FastapiAdmin/graphs/contributors">
-  <img src="https://contrib.rocks/image?repo=1014TaoTao/FastapiAdmin"/>
-</a>
-
-## 🙏 Special Thanks
-
-Thanks to the contributions and support of the following open-source projects:
-
-- [FastAPI](https://fastapi.tiangolo.com/)
-- [Pydantic](https://docs.pydantic.dev/)
-- [SQLAlchemy](https://www.sqlalchemy.org/)
-- [APScheduler](https://github.com/agronholm/apscheduler)
-- [Vue3](https://cn.vuejs.org/)
-- [TypeScript](https://www.typescriptlang.org/)
-- [Vite](https://github.com/vitejs/vite)
-- [Element Plus](https://element-plus.org/)
-- [UniApp](https://uniapp.dcloud.net.cn/)
-- [Wot-Design-UI](https://wot-ui.cn/)
-
-## 🎨 Community
-
-| WeChat QR Code | Group QR Code | WeChat Pay QR Code |
-| --- | --- | --- |
-| ![WeChat QR Code](https://gitee.com/tao__tao/FastDocs/raw/main/src/public/wechat.jpg) | ![Group QR Code](https://gitee.com/tao__tao/FastDocs/raw/main/src/public/group.jpg) | ![WeChat Pay QR Code](https://gitee.com/tao__tao/FastDocs/raw/main/src/public/wechatPay.jpg) |
-
-## ❤️ Support the Project
-
-If you like this project, please give it a ⭐️ Star to show your support! Thank you very much!
-
-[![Stargazers over time](https://starchart.cc/1014TaoTao/FastapiAdmin.svg?variant=adaptive)](https://starchart.cc/1014TaoTao/FastapiAdmin)

+ 0 - 397
README.md

@@ -1,397 +0,0 @@
-<div align="center">
-     <p align="center">
-          <img src="https://gitee.com/tao__tao/FastDocs/raw/main/src/public/logo.png" width="150" height="150" alt="logo" />  
-     </p>
-     <h1>FastApiAdmin <sup style="background-color: #28a745; color: white; padding: 2px 6px; border-radius: 3px; font-size: 0.4em; vertical-align: super; margin-left: 5px;">v2.0.0</h1>
-     <h3>现代化全栈快速开发平台</h3>
-     <p>如果你喜欢这个项目,给个 ⭐️ 支持一下吧!</p>
-     <p align="center">
-          <a href="https://gitee.com/tao__tao/FastapiAdmin.git" target="_blank">
-               <img src="https://gitee.com/tao__tao/FastapiAdmin/badge/star.svg?theme=dark" alt="Gitee Stars">
-          </a>
-          <a href="https://github.com/1014TaoTao/FastapiAdmin.git" target="_blank">
-               <img src="https://img.shields.io/github/stars/1014TaoTao/FastapiAdmin?style=social" alt="GitHub Stars">
-          </a>
-          <a href="https://gitee.com/tao__tao/FastapiAdmin/blob/master/LICENSE" target="_blank">
-               <img src="https://img.shields.io/badge/License-MIT-orange" alt="License">
-          </a>
-          <img src="https://img.shields.io/badge/Python-≥3.10-blue"> 
-          <img src="https://img.shields.io/badge/NodeJS-≥20.0-blue"> 
-          <img src="https://img.shields.io/badge/MySQL-≥8.0-blue"> 
-          <img src="https://img.shields.io/badge/Redis-≥7.0-blue"> 
-          <img src="https://img.shields.io/badge/-HTML5-E34F26?style=flat-square&logo=html5&logoColor=white"/> 
-          <img src="https://img.shields.io/badge/-CSS3-1572B6?style=flat-square&logo=css3"/> 
-          <img src="https://img.shields.io/badge/-JavaScript-563D7C?style=flat-square&logo=bootstrap"/> 
-     </p>
-
-简体中文 | [English](./README.en.md)
-
-</div>
-
-## 📘 项目介绍
-
-**FastApiAdmin** 是一套 **完全开源、高度模块化、技术先进的现代化快速开发平台**,旨在帮助开发者高效搭建高质量的企业级中后台系统。该项目采用 **前后端分离架构**,融合 Python 后端框架 `FastAPI` 和前端主流框架 `Vue3` 实现多端统一开发,提供了一站式开箱即用的开发体验。
-
-> **设计初心**: 以模块化、松耦合为核心,追求丰富的功能模块、简洁易用的接口、详尽的开发文档和便捷的维护方式。通过统一框架和组件,降低技术选型成本,遵循开发规范和设计模式,构建强大的代码分层模型,搭配完善的本地中文化支持,专为团队和企业开发场景量身定制。
-
-## 🔗 源码仓库
-
-| 平台 | 仓库地址 |
-|------|----------|
-| GitHub | [FastapiAdmin主工程](https://github.com/1014TaoTao/FastapiAdmin.git) \| [FastDocs官网](https://github.com/1014TaoTao/FastDocs.git) \| [FastApp移动端](https://github.com/1014TaoTao/FastApp.git) |
-| Gitee  | [FastapiAdmin主工程](https://gitee.com/tao__tao/FastapiAdmin.git) \| [FastDocs官网](https://gitee.com/tao__tao/FastDocs.git) \| [FastApp移动端](https://gitee.com/tao__tao/FastApp.git) |
-
-## 🎯 核心优势
-
-| 优势 | 描述 |
-| ---- | ---- |
-| 🔥 **现代化技术栈** | 基于 FastAPI + Vue3 + TypeScript 等前沿技术构建 |
-| ⚡ **高性能异步** | 利用 FastAPI 异步特性和 Redis 缓存优化响应速度 |
-| 🔐 **安全可靠** | JWT + OAuth2 认证机制,RBAC 权限控制模型 |
-| 🧱 **模块化设计** | 高度解耦的系统架构,便于扩展和维护 |
-| 🌐 **全栈支持** | Web端 + 移动端(H5) + 后端一体化解决方案 |
-| 🚀 **快速部署** | Docker 一键部署,支持生产环境快速上线 |
-| 📖 **完善文档** | 详细的开发文档和教程,降低学习成本 |
-
-## 📦 工程结构概览
-
-```sh
-FastapiAdmin
-├─ backend               # 后端工程 (FastAPI + Python)
-├─ frontend              # Web前端工程 (Vue3 + Element Plus)
-├─ fastapp               # 移动端工程 (UniApp + Wot Design Uni)
-├─ fastdocs              # 官网文档工程 (VitePress)
-├─ devops                # 部署配置
-├─ docker-compose.yaml   # Docker编排文件
-├─ deploy.sh             # 一键部署脚本
-├─ LICENSE               # 开源协议
-|─ README.en.md          # 英文文档
-└─ README.md             # 中文文档
-```
-
-## 🛠️ 技术栈概览
-
-| 类型 | 技术选型 | 描述 |
-|------|----------|------|
-| **后端框架** | FastAPI / Uvicorn / Pydantic 2.0 / Alembic | 现代、高性能的异步框架,强制类型约束,数据迁移 |
-| **ORM** | SQLAlchemy 2.0 | 强大的 ORM 库 |
-| **定时任务** | APScheduler | 轻松实现定时任务 |
-| **权限认证** | PyJWT | 实现 JWT 认证 |
-| **前端框架** | Vue3 / Vite5 / Pinia / TypeScript | 快速开发 Vue3 应用 |
-| **Web UI** | ElementPlus | 企业级 UI 组件库 |
-| **移动端** | UniApp / Wot Design Uni | 跨端移动应用框架 |
-| **数据库** | MySQL / MongoDB | 关系型和文档型数据库支持 |
-| **缓存** | Redis | 高性能缓存数据库 |
-| **文档** | Swagger / Redoc | 自动生成 API 文档 |
-| **部署** | Docker / Nginx / Docker Compose | 容器化部署方案 |
-
-## 📌 内置功能模块
-
-| 模块 | 功能 | 描述 |
-|------|------|------|
-| 📊 **仪表盘** | 工作台、分析页 | 系统概览和数据分析 |
-| ⚙️ **系统管理** | 用户、角色、菜单、部门、岗位、字典、配置、公告 | 核心系统管理功能 |
-| 👀 **监控管理** | 在线用户、服务器监控、缓存监控 | 系统运行状态监控 |
-| 📋 **任务管理** | 定时任务 | 异步任务调度管理 |
-| 📝 **日志管理** | 操作日志 | 用户行为审计 |
-| 🧰 **开发工具** | 代码生成、表单构建、接口文档 | 提升开发效率的工具 |
-| 📁 **文件管理** | 文件存储 | 统一文件管理 |
-
-## 🍪 演示环境
-
-- 🌐 官网地址:[https://service.fastapiadmin.com](https://service.fastapiadmin.com)
-- 💻 Web演示:[https://service.fastapiadmin.com/web](https://service.fastapiadmin.com/web)
-- 📱 移动端:[https://service.fastapiadmin.com/app](https://service.fastapiadmin.com/app)
-- 👤 登录账号:`admin` 密码:`123456`
-
-## 🚀 快速开始
-
-### 环境要求
-
-| 类型 | 技术栈 | 版本 |
-|------|--------|------|
-| 后端 | Python | ≥ 3.10 |
-| 后端 | FastAPI | 0.109+ |
-| 前端 | Node.js | ≥ 20.0 |
-| 前端 | Vue3 | 3.3+ |
-| 数据库 | MySQL | 8.0+ |
-| 缓存 | Redis | 7.0+ |
-
-### 获取代码
-
-```bash
-# 克隆代码到本地
-git clone https://gitee.com/tao__tao/FastapiAdmin.git
-# 或者
-git clone https://github.com/1014TaoTao/FastapiAdmin.git
-```
-
-### 后端启动
-
-```bash
-# 进入后端工程目录
-cd backend
-
-# 安装依赖
-pip3 install -r requirements.txt
-
-# 启动后端服务:启动之前保证mysql中创建好了数据库、redis服务
-python main.py run
-# 或指定环境
-python main.py run --env=dev
-
-# 生成迁移文件
-python main.py revision --env=dev
-# 应用迁移
-python main.py upgrade --env=dev
-```
-
-### 前端启动
-
-```bash
-# 进入前端工程目录
-cd frontend
-
-# 安装依赖
-pnpm install
-
-# 启动开发服务器
-pnpm run dev
-
-# 构建生产版本
-pnpm run build
-```
-
-### 移动端启动
-
-```bash
-# 进入移动端工程目录
-cd fastapp
-
-# 安装依赖
-pnpm install
-
-# 启动H5开发服务器
-pnpm run dev:h5
-
-# 构建H5生产版本
-pnpm run build:h5
-```
-
-### 文档启动
-
-```bash
-# 进入文档工程目录
-cd fastdocs
-
-# 安装依赖
-pnpm install
-
-# 启动文档开发服务器
-pnpm run docs:dev
-
-# 构建文档生产版本
-pnpm run docs:build
-```
-
-### 访问地址
-
-- 🏠 项目官网:[http://localhost:5180](http://localhost:5180)
-- 🖥️ Web端:[http://localhost:5180/web](http://localhost:5180/web)
-- 📱 移动端:[http://localhost:5180/app](http://localhost:5180/app)
-
-默认账号:
-- 管理员:`admin` / `123456`
-
-## 🐳 Docker 部署
-
-```bash
-# 复制部署脚本到服务器并赋予执行权限
-chmod +x deploy.sh
-
-# 执行一键部署
-./deploy.sh
-
-# 常用 Docker 命令
-# 查看运行中的容器
-docker compose ps
-
-# 查看容器日志
-docker logs -f <容器名>
-
-# 停止服务
-docker compose down
-```
-
-## 🔧 模块展示
-
-### web 端
-
-| 模块名 <div style="width:60px"/> | 截图 |
-| ----- | --- |
-| 登录     | ![登录](https://gitee.com/tao__tao/FastDocs/raw/main/src/public/login.png) |
-| 仪表盘   | ![仪表盘](https://gitee.com/tao__tao/FastDocs/raw/main/src/public/dashboard.png) |
-| 分析页   | ![分析页](https://gitee.com/tao__tao/FastDocs/raw/main/src/public/analysis.png) |
-| 菜单管理  | ![菜单管理](https://gitee.com/tao__tao/FastDocs/raw/main/src/public/menu.png) |
-| 部门管理  | ![部门管理](https://gitee.com/tao__tao/FastDocs/raw/main/src/public/dept.png) |
-| 岗位管理  | ![岗位管理](https://gitee.com/tao__tao/FastDocs/raw/main/src/public/position.png) |
-| 角色管理  | ![角色管理](https://gitee.com/tao__tao/FastDocs/raw/main/src/public/role.png) |
-| 用户管理  | ![用户管理](https://gitee.com/tao__tao/FastDocs/raw/main/src/public/user.png) |
-| 日志管理  | ![日志管理](https://gitee.com/tao__tao/FastDocs/raw/main/src/public/log.png) |
-| 配置管理  | ![配置管理](https://gitee.com/tao__tao/FastDocs/raw/main/src/public/config.png) |
-| 在线用户  | ![在线用户](https://gitee.com/tao__tao/FastDocs/raw/main/src/public/online.png) |
-| 服务器监控 | ![服务器监控](https://gitee.com/tao__tao/FastDocs/raw/main/src/public/service.png) |
-| 缓存监控  | ![缓存监控](https://gitee.com/tao__tao/FastDocs/raw/main/src/public/cache.png) |
-| 任务管理  | ![任务管理](https://gitee.com/tao__tao/FastDocs/raw/main/src/public/job.png) |
-| 字典管理  | ![字典管理](https://gitee.com/tao__tao/FastDocs/raw/main/src/public/dict.png) |
-| 接口管理  | ![接口管理](https://gitee.com/tao__tao/FastDocs/raw/main/src/public/docs.png) |
-| 系统主题  | ![系统主题](https://gitee.com/tao__tao/FastDocs/raw/main/src/public/theme.png) |
-| 在线文档  | ![在线文档](https://gitee.com/tao__tao/FastDocs/raw/main/src/public/help.png) |
-| 系统锁屏  | ![系统锁屏](https://gitee.com/tao__tao/FastDocs/raw/main/src/public/lock.png) |
-| 表单构建  | ![表单构建](https://gitee.com/tao__tao/FastDocs/raw/main/src/public/form.png) |
-| 代码生成  | ![代码生成](https://gitee.com/tao__tao/FastDocs/raw/main/src/public/gencode.png) |
-| 流程管理  | ![流程管理](https://gitee.com/tao__tao/FastDocs/raw/main/src/public/workflow.png) |
-| 文件管理  | ![文件管理](https://gitee.com/tao__tao/FastDocs/raw/main/src/public/file.png) |
-| 我的应用  | ![我的应用](https://gitee.com/tao__tao/FastDocs/raw/main/src/public/myapp.png) |
-| 配置中心  | ![配置中心](https://gitee.com/tao__tao/FastDocs/raw/main/src/public/setting.png) |
-| 智能助手  | ![智能助手](https://gitee.com/tao__tao/FastDocs/raw/main/src/public/ai.png) |
-
-### 移动端
-
-| 模块 <div style="width:60px"/> | 详情 | 模块 <div style="width:60px"/> | 详情 | 模块 <div style="width:60px"/> | 详情 |
-|----------|------|----------|------|----------|------|
-| 登录    | ![移动端登录](https://gitee.com/tao__tao/FastDocs/raw/main/src/public/app_login.png) | 首页      | ![移动端首页](https://gitee.com/tao__tao/FastDocs/raw/main/src/public/app_home.png) | 我的      | ![移动端个人中心](https://gitee.com/tao__tao/FastDocs/raw/main/src/public/app_mine.png) |
-| 个人  | ![移动端个人信息](https://gitee.com/tao__tao/FastDocs/raw/main/src/public/app_profile.png) | 设置   | ![移动端设置](https://gitee.com/tao__tao/FastDocs/raw/main/src/public/app_setting.png) | 工作台      | ![移动端工作台](https://gitee.com/tao__tao/FastDocs/raw/main/src/public/app_work.png) |
-
-## 🛠️ 二开教程
-
-### 后端开发
-
-1. **编写实体类层**:在 `backend/app/api/v1/module_generator/demo/model.py` 中创建 example 的 ORM 模型(对应 Spring Boot 中的实体类层)
-2. **编写数据模型层**:在 `backend/app/api/v1/module_generator/demo/schema.py` 中创建 example 数据模型(对应 Spring Boot 中的 DTO 层)
-3. **编写查询参数模型层**:在 `backend/app/api/v1/module_generator/demo/param.py` 中创建 example 的查询参数模型(对应 Spring Boot 中的 DTO 层)
-4. **编写持久化层**:在 `backend/app/api/v1/cruds/module_generator/crud.py` 中创建 example 数据层(对应 Spring Boot 中的 Mapper 或 DAO 层)
-5. **编写业务层**:在 `backend/app/api/v1/services/module_generator/service.py` 中创建 example 数据层(对应 Spring Boot 中的 Service 层)
-6. **编写接口层**:在 `backend/app/api/v1/controllers/module_generator/controller.py` 中创建 example 数据层(对应 Spring Boot 中的 Controller 层)
-7. **将 demo 模块添加至系统初始化脚本**:在 `backend/app/scripts/initialize.py` 中添加(如果需要可以把 demo 的菜单权限,配置到 `backend/app/scripts/data/system_menu.json` 和 `backend/app/scripts/data/system_role_menus.json` 或从前端页面菜单中新增)
-8.  **将 demo 模块添加至数据库迁移脚本中**:在 `backend/app/alembic/env.py` 中添加
-
-### 代码生成教程
-
-代码生成模块是本项目的核心功能之一,可以帮助开发者快速生成完整的 CRUD 代码,大幅提升开发效率。该模块基于 Jinja2 模板引擎,可生成前后端一体化的完整功能模块。
-
-#### 代码生成流程
-
-1. **创建或导入数据表**:
-   - 方式一:通过"创建表"功能直接在系统中创建新表
-   - 方式二:通过"导入"功能将现有数据库表导入到代码生成器中
-
-2. **配置生成参数**:
-   - 基础配置:
-     - 表名称、表描述、实体类名称
-   - 生成配置:
-     - 生成包路径(package_name):如 `student`
-     - 生成模块名(module_name):如 `student`
-     - 生成业务名(business_name):如 `student`
-     - 生成功能名(function_name):如 `学生管理`
-     - 生成代码方式:zip压缩包下载 或 项目目录写入
-     - 上级菜单:选择生成功能所属的菜单分类
-
-3. **字段配置**:
-   - 配置每个字段的:
-     - 字段列类型、Python类型、Python字段名
-     - 是否为主键、是否自增、是否必填
-     - 是否为插入字段、编辑字段、列表字段、查询字段
-     - 查询方式(等于、不等于、大于、小于、范围)
-     - 显示类型(文本框、文本域、下选框、复选框、单选框、日期控件)
-     - 字典类型(用于下拉框数据源)
-
-4. **代码预览**:
-   - 预览将要生成的代码内容
-   - 支持预览后端(Python)、前端(Vue/TS)、数据库(SQL)代码
-   - 可按类型筛选预览内容
-
-5. **生成代码**:
-   - 点击"下载代码"生成并下载zip压缩包
-   - 点击"写入本地"直接写入到项目目录中
-
-#### 生成的文件结构
-
-代码生成器会生成完整的前后端代码结构:
-
-**后端文件**:
-- 控制器层:`backend/app/api/v1/module_{module_name}/{business_name}/controller.py`
-- 服务层:`backend/app/api/v1/module_{module_name}/{business_name}/service.py`
-- 数据访问层:`backend/app/api/v1/module_{module_name}/{business_name}/crud.py`
-- 数据模型层:`backend/app/api/v1/module_{module_name}/{business_name}/model.py`
-- 数据模式层:`backend/app/api/v1/module_{module_name}/{business_name}/schema.py`
-
-**前端文件**:
-- API接口文件:`frontend/src/api/module_{module_name}/{business_name}.ts`
-- 页面组件文件:`frontend/src/views/module_{module_name}/{business_name}/index.vue`
-
-**数据库文件**:
-- 菜单SQL文件:`backend/sql/module_{module_name}/{business_name}_menu.sql`
-
-#### 使用示例
-
-1. 在数据库中创建新表,如 `sys_student`
-2. 登录系统,进入**代码生成**模块
-3. 点击"导入",选择 `sys_student` 表
-4. 配置生成参数:
-   - 生成包路径:`student`
-   - 生成模块名:`student`
-   - 生成业务名:`student`
-   - 生成功能名:`学生管理`
-   - 上级菜单:系统管理
-5. 配置字段属性(如设置哪些字段需要显示、查询、编辑等)
-6. 点击"预览代码"查看生成的代码
-7. 点击"下载代码"或"写入本地"生成完整功能模块
-8. 重启服务,新功能模块即可使用
-
-### 前端部分
-
-1. **前端接入后端接口地址**:在 `frontend/src/api/demo/example.ts` 中配置
-2. **编写前端页面**:在 `frontend/src/views/demo/example/index.vue` 中编写
-
-### 移动端部分
-
-1. **移动端接入后端接口地址**:在 `fastapp/src/api` 中编写
-2. **编写移动端页面**:在 `fastapp/src/pages` 中编写
-
-## ℹ️ 帮助
-
-更多详情请查看 [官方文档](https://service.fastapiadmin.com)
-
-## 👥 贡献者
-
-<a href="https://github.com/1014TaoTao/FastapiAdmin/graphs/contributors">
-  <img src="https://contrib.rocks/image?repo=1014TaoTao/FastapiAdmin"/>
-</a>
-
-## 🙏 特别鸣谢
-
-感谢以下开源项目的贡献和支持:
-
-- [FastAPI](https://fastapi.tiangolo.com/)
-- [Pydantic](https://docs.pydantic.dev/)
-- [SQLAlchemy](https://www.sqlalchemy.org/)
-- [APScheduler](https://github.com/agronholm/apscheduler)
-- [Vue3](https://cn.vuejs.org/)
-- [TypeScript](https://www.typescriptlang.org/)
-- [Vite](https://github.com/vitejs/vite)
-- [Element Plus](https://element-plus.org/)
-- [UniApp](https://uniapp.dcloud.net.cn/)
-- [Wot-Design-UI](https://wot-ui.cn/)
-
-## 🎨 社区交流
-
-| 微信二维码 | 群组二维码 | 微信支付二维码 |
-| --- | --- | --- |
-| ![微信二维码](https://gitee.com/tao__tao/FastDocs/raw/main/src/public/wechat.jpg) | ![群组二维码](https://gitee.com/tao__tao/FastDocs/raw/main/src/public/group.jpg) | ![微信支付二维码](https://gitee.com/tao__tao/FastDocs/raw/main/src/public/wechatPay.jpg) |
-
-## ❤️ 支持项目
-
-如果你喜欢这个项目,请给我一个 ⭐️ Star 支持一下吧!非常感谢!
-
-[![Stargazers over time](https://starchart.cc/1014TaoTao/FastapiAdmin.svg?variant=adaptive)](https://starchart.cc/1014TaoTao/FastapiAdmin)

+ 1 - 1
backend/app/api/v1/module_system/user/controller.py

@@ -14,7 +14,7 @@ from app.core.base_params import PaginationQueryParam
 from app.core.base_schema import BatchSetAvailable
 from app.core.logger import log
 
-from ..auth.schema import AuthSchema
+from app.api.v1.module_system.auth.schema import AuthSchema
 from .service import UserService
 from .schema import (
     CurrentUserUpdateSchema,

+ 37 - 16
backend/app/config/path_conf.py

@@ -1,31 +1,52 @@
+# app/config/path_conf.py
+import os
+import sys
 from pathlib import Path
 
-# 项目根目录
-BASE_DIR = Path(__file__).parent.parent.parent
-
-# alembic 迁移文件存放路径
+# ===================== 关键:检测打包环境 =====================
+# PyInstaller 打包后会设置 sys.frozen 属性,sys._MEIPASS 是临时解压目录
+is_packaged = getattr(sys, 'frozen', False)
+MEIPASS_DIR = Path(sys._MEIPASS) if is_packaged else Path('.')
+
+# ===================== 适配 BASE_DIR =====================
+if is_packaged:
+    # 打包后:BASE_DIR 指向可执行文件所在目录(而非临时目录,方便读取外部配置)
+    BASE_DIR = Path(os.path.dirname(os.path.abspath(sys.executable)))
+else:
+    # 开发环境:沿用原逻辑(基于__file__推导项目根目录)
+    BASE_DIR = Path(__file__).parent.parent.parent
+
+# ===================== 原有路径定义(仅适配静态文件/配置路径) =====================
+# alembic 迁移文件存放路径(打包后若需迁移,需手动复制到BASE_DIR)
 ALEMBIC_VERSION_DIR = BASE_DIR / 'app' / 'alembic' / 'versions'
 
-# 日志文件路径
+# 日志文件路径(打包后日志输出到可执行文件同级logs目录)
 LOG_DIR = BASE_DIR / 'logs'
 
-# 静态资源目录
+# 静态资源目录(优先级:1.可执行文件同级static 2.临时目录内static)
 STATIC_DIR = BASE_DIR / 'static'
+if is_packaged and not STATIC_DIR.exists():
+    STATIC_DIR = MEIPASS_DIR / 'static'
 
-# 上传文件目录
+# 上传/下载文件目录
 UPLOAD_DIR = STATIC_DIR / 'upload'
-
-# 下载文件目录
 DOWNLOAD_DIR = STATIC_DIR / 'download'
 
-# 环境配置目录
+# 环境配置目录(核心:打包后读取可执行文件同级的env文件夹)
 ENV_DIR = BASE_DIR / 'env'
+# 兜底:若外部无env文件夹,读取打包嵌入的env(临时目录内)
+if is_packaged and not ENV_DIR.exists():
+    ENV_DIR = MEIPASS_DIR / 'env'
+
+# 初始化脚本(打包后仅保留临时目录内的脚本,若需运行时修改需手动复制)
+SCRIPT_DIR: Path = MEIPASS_DIR / 'app' / 'scripts' / 'data' if is_packaged else BASE_DIR / 'app' / 'scripts' / 'data'
 
-# 初始化脚本
-SCRIPT_DIR: Path = BASE_DIR / 'app' / 'scripts' / 'data'
+# 模版文件配置(打包后从临时目录读取,静态模版无需外部修改)
+TEMPLATE_DIR: Path = MEIPASS_DIR / 'app' / 'api' / 'v1' / 'module_generator' / 'gencode' / 'templates' if is_packaged else BASE_DIR / 'app' / 'api' / 'v1' / 'module_generator' / 'gencode' / 'templates'
 
-# 模版文件配置
-TEMPLATE_DIR: Path = BASE_DIR / 'app' / 'api' / 'v1' / 'module_generator' / 'gencode' / 'templates'
+# banner.txt 文件路径(优先级:1.外部BASE_DIR 2.临时目录)
+BANNER_FILE = BASE_DIR / 'banner.txt' if (BASE_DIR / 'banner.txt').exists() else MEIPASS_DIR / 'banner.txt'
 
-# banner.txt 文件路径
-BANNER_FILE = BASE_DIR / 'banner.txt'
+# ===================== 自动创建必要目录(避免运行时报错) =====================
+for dir_path in [LOG_DIR, STATIC_DIR, UPLOAD_DIR, DOWNLOAD_DIR, ENV_DIR]:
+    dir_path.mkdir(exist_ok=True, parents=True)

+ 42 - 14
backend/app/utils/captcha_util.py

@@ -3,7 +3,9 @@
 import base64
 import random
 import string
+import sys
 from io import BytesIO
+from pathlib import Path
 from typing import Tuple
 from PIL import Image, ImageDraw, ImageFont
 
@@ -14,11 +16,37 @@ class CaptchaUtil:
     """
     验证码工具类
     """
-    @classmethod 
+
+    @classmethod
+    def _get_real_font_path(cls) -> str:
+        """
+        私有方法:获取字体文件的真实路径(兼容开发/打包环境)
+        - 开发环境:项目根目录下的相对路径
+        - 打包环境:PyInstaller 临时目录下的路径
+        """
+        # 基础相对路径(从settings中获取)
+        font_relative_path = settings.CAPTCHA_FONT_PATH
+
+        if getattr(sys, 'frozen', False):
+            # 打包后:拼接PyInstaller临时目录路径
+            real_path = Path(sys._MEIPASS) / font_relative_path
+        else:
+            # 开发环境:拼接项目根目录路径(根据你的项目结构调整parent层级)
+            # 假设当前文件路径:app/utils/captcha_util.py
+            # 项目根目录 = 当前文件目录 → app/utils → app → 项目根
+            real_path = Path(__file__).parent.parent.parent / font_relative_path
+
+        # 验证路径是否存在,避免加载失败
+        if not real_path.exists():
+            raise FileNotFoundError(f"验证码字体文件不存在:{real_path}")
+
+        return str(real_path)
+
+    @classmethod
     def generate_captcha(cls) -> Tuple[str, str]:
         """
         生成带有噪声和干扰的验证码图片(4位随机字符)。
-        
+
         返回:
         - Tuple[str, str]: [base64图片字符串, 验证码值]。
         """
@@ -32,8 +60,8 @@ class CaptchaUtil:
         image = Image.new('RGB', (width, height), color=background_color)
         draw = ImageDraw.Draw(image)
 
-        # 使用指定字体
-        font = ImageFont.truetype(font=settings.CAPTCHA_FONT_PATH, size=settings.CAPTCHA_FONT_SIZE)
+        # ========== 修复:使用真实字体路径 ==========
+        font = ImageFont.truetype(font=cls._get_real_font_path(), size=settings.CAPTCHA_FONT_SIZE)
 
         # 计算文本总宽度和高度
         total_width = sum(draw.textbbox((0, 0), char, font=font)[2] for char in captcha_value)
@@ -48,14 +76,14 @@ class CaptchaUtil:
         for char in captcha_value:
             # 使用深色文字,增加对比度
             text_color = tuple(random.randint(0, 80) for _ in range(3))
-            
+
             # 随机偏移,增加干扰
             x_offset = x + random.uniform(-2, 2)
             y_offset = y_start + random.uniform(-2, 2)
-            
+
             # 绘制字符
             draw.text((x_offset, y_offset), char, font=font, fill=text_color)
-            
+
             # 更新x坐标,增加字符间距的随机性
             x += draw.textbbox((0, 0), char, font=font)[2] + random.uniform(1, 5)
 
@@ -77,14 +105,14 @@ class CaptchaUtil:
         buffer = BytesIO()
         image.save(buffer, format='PNG', optimize=True)
         base64_string = base64.b64encode(buffer.getvalue()).decode()
-        
+
         return base64_string, captcha_value
-    
+
     @classmethod
     def captcha_arithmetic(cls) -> Tuple[str, int]:
         """
         创建验证码图片(加减乘运算)。
-        
+
         返回:
         - Tuple[str, int]: [base64图片字符串, 计算结果]。
         """
@@ -93,13 +121,13 @@ class CaptchaUtil:
         image = Image.new('RGB', (160, 60), color=background_color)
         draw = ImageDraw.Draw(image)
 
-        # 设置字体
-        font = ImageFont.truetype(font=settings.CAPTCHA_FONT_PATH, size=settings.CAPTCHA_FONT_SIZE)
+        # ========== 修复:使用真实字体路径 ==========
+        font = ImageFont.truetype(font=cls._get_real_font_path(), size=settings.CAPTCHA_FONT_SIZE)
 
         # 生成运算数字和运算符
         operators = ['+', '-', '*']
         operator = random.choice(operators)
-        
+
         # 对于减法,确保num1大于num2
         if operator == '-':
             num1 = random.randint(6, 10)
@@ -107,7 +135,7 @@ class CaptchaUtil:
         else:
             num1 = random.randint(1, 9)
             num2 = random.randint(1, 9)
-        
+
         # 计算结果
         result_map = {
             '+': lambda x, y: x + y,

+ 36 - 15
backend/main.py

@@ -1,12 +1,15 @@
 # -*- coding: utf-8 -*-
 
 import os
+import sys
+from pathlib import Path
 from typing import Annotated
 import uvicorn
 import typer
 from fastapi import FastAPI
 from alembic import command
 from alembic.config import Config
+import importlib
 
 from app.common.enums import EnvironmentEnum
 
@@ -48,37 +51,53 @@ def create_app() -> FastAPI:
     return app
 
 # typer.Option是非必填;typer.Argument是必填
-@fastapiadmin_cli.command(name="run", help="启动 FastapiAdmin 服务, 运行 python main.py run --env=dev 不加参数默认 dev 环境")
-def run(env: Annotated[EnvironmentEnum, typer.Option("--env", help="运行环境 (dev, prod)")] = EnvironmentEnum.DEV) -> None:
+@fastapiadmin_cli.command(name="run",
+                          help="启动 FastapiAdmin 服务, 运行 python main.py run --env=dev 不加参数默认 dev 环境")
+def run(env: Annotated[
+    EnvironmentEnum, typer.Option("--env", help="运行环境 (dev, prod)")] = EnvironmentEnum.DEV) -> None:
     """启动FastAPI服务"""
 
     try:
         # 设置环境变量
         os.environ["ENVIRONMENT"] = env.value
         typer.echo("项目启动中...")
-        
+
         # 清除配置缓存,确保重新加载配置
         from app.config.setting import get_settings
         get_settings.cache_clear()
         settings = get_settings()
-        
+
         from app.core.logger import setup_logging
         setup_logging()
 
         # 显示启动横幅
         from app.utils.banner import worship
         worship(env.value)
-        
-        # 启动uvicorn服务
-        uvicorn.run(
-            app=f'main:create_app', 
-            host=settings.SERVER_HOST,
-            port=settings.SERVER_PORT,
-            reload=True if env.value == EnvironmentEnum.DEV.value else False,
-            factory=True,
-            log_config=None
-        )
-        
+
+        # 检测是否为PyInstaller打包环境
+        is_packaged = getattr(sys, 'frozen', False)
+
+        if is_packaged:
+            app = create_app()
+            uvicorn.run(
+                app=app,
+                host=settings.SERVER_HOST,
+                port=settings.SERVER_PORT,
+                reload=False,  # 打包后强制关闭 reload
+                factory=False,
+                log_config=None
+            )
+        else:
+            app_str = "main:create_app"
+            uvicorn.run(
+                app=app_str,  # 开发环境传字符串路径
+                host=settings.SERVER_HOST,
+                port=settings.SERVER_PORT,
+                reload=env == EnvironmentEnum.DEV,  # 开发环境开启 reload
+                factory=(app_str.endswith("create_app")),  # 若传函数名则开启 factory
+                log_config=None
+            )
+
     except KeyboardInterrupt:
         from app.utils.console import display_shutdown_info
         display_shutdown_info()
@@ -102,6 +121,8 @@ def upgrade(env: Annotated[EnvironmentEnum, typer.Option("--env", help="运行
     command.upgrade(alembic_cfg, "head")
     typer.echo("所有迁移已应用。")
 
+
 if __name__ == '__main__':
+
     fastapiadmin_cli()
 

+ 116 - 0
backend/main.spec

@@ -0,0 +1,116 @@
+# main.spec
+import sys
+import os
+import pkgutil
+import glob  # 新增:匹配所有 module_* 目录
+from pathlib import Path
+
+# 1. 动态获取项目根目录(无需手动写死)
+PROJECT_ROOT = Path('/root/.hd/hd-crane-gs/backend').absolute()  # spec文件所在目录 = 项目根目录
+
+# 修复:扫描所有 module_* 目录并构建 datas 配置
+def get_module_datas():
+    """获取所有 module_* 目录的打包配置"""
+    api_v1_dir = PROJECT_ROOT / "app" / "api" / "v1"
+    module_datas = []
+    if api_v1_dir.exists():
+        # 匹配所有 module_* 目录(兼容所有系统)
+        module_dirs = glob.glob(str(api_v1_dir / "module_*"))
+        for mod_dir in module_dirs:
+            mod_dir_path = Path(mod_dir)
+            if mod_dir_path.is_dir():
+                # 格式:(源目录, 目标目录) → 保持原结构 app/api/v1/module_xxx
+                target_path = str(mod_dir_path.relative_to(PROJECT_ROOT))
+                module_datas.append((str(mod_dir_path), target_path))
+    return module_datas
+
+def get_all_needed_modules():
+    all_modules = []
+    # 扫描 app 目录下所有 .py 文件(排除 __init__.py)
+    all_py_files = PROJECT_ROOT / "app"
+    for file in all_py_files.rglob("*.py"):
+        if file.name == "__init__.py":
+            continue
+        rel_path = file.relative_to(PROJECT_ROOT)
+        mod_name = rel_path.with_suffix("").as_posix().replace("/", ".")
+        all_modules.append(mod_name)
+    all_modules = list(set(all_modules))
+    print(f"✅ 扫描到 {len(all_modules)} 个模块")
+    return all_modules
+
+# 执行扫描,获取所有模块
+hidden_imports = get_all_needed_modules()
+# 获取 module_* 目录的 datas 配置
+module_datas = get_module_datas()
+
+# 2. 导入PyInstaller核心模块
+from PyInstaller.utils.hooks import collect_all
+from PyInstaller.building.build_main import Analysis, PYZ, EXE, COLLECT
+
+# 基础配置
+block_cipher = None
+
+# 3. 收集第三方依赖(asyncmy)
+asyncmy_datas, asyncmy_binaries, asyncmy_hiddenimports = collect_all('asyncmy')
+
+# 4. 分析项目代码(核心修复:添加 module_datas)
+a = Analysis(
+    ['main.py'],  # 主文件(确保在 PROJECT_ROOT 下)
+    pathex=[str(PROJECT_ROOT)],  # 项目根目录
+    binaries=asyncmy_binaries,
+    datas=[
+        *asyncmy_datas,
+        *module_datas,  # 关键:添加所有 module_* 目录的打包配置
+         # 新增:打包所有 __init__.py(确保包目录被识别)
+        (str(PROJECT_ROOT / "app"), "app"),
+        (os.path.join(PROJECT_ROOT, "env"), "env"),
+        (os.path.join(PROJECT_ROOT, "static"), "static"),
+        (os.path.join(PROJECT_ROOT, "banner.txt"), "."),
+        (os.path.join(PROJECT_ROOT, "app/api/v1/module_generator/gencode/templates"), "app/api/v1/module_generator/gencode/templates"),
+        (os.path.join(PROJECT_ROOT, "app/scripts/data"), "app/scripts/data"),
+    ],    
+    hiddenimports=[
+        # 第三方依赖
+        *asyncmy_hiddenimports,
+        'asyncmy.auth',
+        'asyncmy.connection',
+        'asyncmy.cursors',
+        'asyncmy.protocol',
+        'asyncmy.utils',
+        'passlib',
+        'passlib.context',
+        'passlib.handlers',
+        'passlib.handlers.bcrypt',
+        'passlib.handlers.md5_crypt',
+        # 项目模块
+        *hidden_imports,
+    ],
+    hookspath=[],
+    hooksconfig={},
+    runtime_hooks=[],
+    excludes=[],
+    noarchive=False,  # 关键:不归档,保留目录结构
+)
+
+# 5. 打包为PYZ归档
+pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)
+
+# 6. 生成可执行文件
+exe = EXE(
+    pyz,
+    a.scripts,
+    a.binaries,
+    a.zipfiles,
+    a.datas,
+    [],
+    name='main',
+    debug=False,
+    bootloader_ignore_signals=False,
+    strip=False,
+    upx=False,  # 欧拉系统禁用UPX
+    runtime_tmpdir=None,
+    console=True,
+    disable_windowed_traceback=False,
+    argv_emulation=False,
+    target_arch=None,
+)

+ 1 - 1
backend/requirements.txt

@@ -27,7 +27,7 @@ redis==5.2.1                # redis 同/异步操作数据库(用户celery配套
 asyncmy==0.2.9              # mysql 异步操作数据库:基于 mysqlclient:asyncmy 是 mysqlclient 的异步版本,mysqlclient 是一个 C 语言编写的 MySQL 客户端,性能较高。性能:asyncmy 通常在性能上优于 aiomysql,特别是在高并发和大数据量的场景下。
 PyMySQL==1.1.2              # mysql 同步步操作数据库基于 pymysql:aiomysql 是 pymysql 的异步版本,pymysql 是一个纯 Python 实现的 MySQL 客户端。成熟度:aiomysql 相对较为成熟,社区支持较好,文档也比较完善。
 asyncpg==0.30.0             # postgresql 异步操作数据库基于 psycopg2:asyncpg 是 psycopg2 的异步版本,psycopg2 是一个 pure-Python PostgreSQL 数据库适配器。性能:asyncpg 通常在性能上优于 psycopg2,特别是在高并发和大数据量的场景下。
-psycopg2==2.9.10            # postgresql 同步操作数据库基于 psycopg2:psycopg2 是一个 pure-Python PostgreSQL 适配器。
+psycopg2-binary==2.9.10     # postgresql 同步操作数据库基于 psycopg2:psycopg2 是一个 pure-Python PostgreSQL 适配器。
 cryptography==45.0.2        # mysql8 密码加密
 openai==1.55.2              # ai 大模型
 rich==13.9.4                # 终端打印美化

+ 0 - 291
devops/README.md

@@ -1,291 +0,0 @@
-# FastapiAdmin 部署文档
-
-本文档详细描述了 FastapiAdmin 项目的部署流程、环境要求、配置说明及常见问题排查方法。
-
-## 项目简介
-
-FastapiAdmin 是一个基于 FastAPI 和 Vue3 的管理系统,包含后端 API、前端界面、移动端应用和文档网站。项目采用 Docker 容器化部署,便于在不同环境中快速部署和运行。
-
-## 项目结构
-
-```sh
-FastapiAdmin/
-├── backend/      # 后端应用代码
-├── frontend/     # 前端应用代码
-├── devops/       # 部署配置文件
-│   ├── backend/  # 后端部署目录
-│   ├── mysql/    # MySQL 部署目录
-│   ├── nginx/    # Nginx 部署目录
-│   ├── redis/    # Redis 部署目录
-│   └── README.md # 部署说明文档
-├── deploy.sh     # 一键部署脚本
-└── docker-compose.yaml # Docker 编排文件
-```
-
-## 系统要求
-
-在部署项目之前,请确保服务器满足以下要求:
-
-- **操作系统**:Linux (推荐 Ubuntu 20.04+) 或 macOS
-- **Docker**:20.10.0 或更高版本
-- **Docker Compose**:2.0.0 或更高版本
-- **Git**:2.0.0 或更高版本
-- **Node.js**:16.0.0 或更高版本
-- **npm/pnpm**:8.0.0 或更高版本
-- **内存**:至少 4GB RAM
-- **磁盘空间**:至少 20GB 可用空间
-
-## 部署前准备
-
-### 1. 环境检查
-
-首先,检查系统是否已安装必要的依赖:
-
-```bash
-# 检查 Docker 版本
-docker --version
-# 检查 Docker Compose 版本
-docker compose version
-# 检查 Git 版本
-git --version
-# 检查 Node.js 版本
-node --version
-# 检查 npm 版本
-npm --version
-# 检查 pnpm 版本
-pnpm --version
-```
-
-如果缺少任何依赖,请先安装它们。
-
-### 2. 克隆项目
-
-如果尚未克隆项目代码,可以使用以下命令:
-
-```bash
-git clone https://gitee.com/tao__tao/fastapiadmin.git
-cd fastapiadmin
-```
-
-## 一键部署
-
-项目提供了一键部署脚本 `deploy.sh`,可以自动完成从代码拉取到服务启动的全过程。
-
-### 1. 赋予脚本执行权限
-
-```bash
-chmod +x deploy.sh
-```
-
-### 2. 执行部署脚本
-
-```bash
-./deploy.sh
-```
-
-部署脚本会自动执行以下步骤:
-
-- 检查系统依赖
-- 停止现有容器(如果存在)
-- 拉取最新代码
-- 构建 Docker 镜像
-- 启动容器
-- 显示容器状态和日志
-
-## 部署脚本命令详解
-
-部署脚本支持以下命令行参数:
-
-### 完整部署(默认)
-
-```bash
-./deploy.sh
-```
-
-执行完整的部署流程,包括检查依赖、停止容器、更新代码、构建镜像、启动容器和显示日志。
-
-### 仅停止服务
-
-```bash
-./deploy.sh --stop
-```
-
-停止所有正在运行的项目容器。
-
-### 启动服务
-
-```bash
-./deploy.sh --start
-```
-
-启动所有服务(等同于执行完整部署流程)。
-
-### 查看日志
-
-```bash
-./deploy.sh --logs
-# 或简写
-./deploy.sh -l
-```
-
-显示所有容器的日志信息。
-
-### 查看帮助信息
-
-```bash
-./deploy.sh --help
-# 或简写
-./deploy.sh -h
-```
-
-显示脚本使用说明。
-
-## 部署流程详解
-
-部署脚本的执行流程如下:
-
-1. **权限和依赖检查**
-   - 检查脚本执行权限
-   - 检查系统依赖(git、docker、node、npm、pnpm)
-
-2. **停止现有容器**
-   - 如果项目目录存在,停止并删除现有容器
-   - 如果项目目录不存在,从 Git 仓库克隆代码
-
-3. **更新代码**
-   - 拉取最新的代码更新
-   - 检测前端、移动端和文档目录是否存在
-
-4. **构建前端(当前已注释,如需启用请取消注释 deploy.sh 中的 build_frontend 调用)**
-   - 安装前端依赖并构建前端工程
-   - 安装移动端依赖并构建移动端工程
-   - 安装文档依赖并构建文档
-
-5. **构建镜像和启动容器**
-   - 构建项目所需的 Docker 镜像
-   - 启动所有服务容器
-   - 清理 72 小时前的旧镜像
-
-6. **显示容器状态和日志**
-   - 显示所有容器的运行状态
-   - 显示各服务的日志信息
-
-## 服务访问
-
-部署完成后,可以通过以下地址访问各服务:
-
-- **前端管理系统**:[https://service.fastapiadmin.com/web](https://service.fastapiadmin.com/web)
-- **移动端应用**:[https://service.fastapiadmin.com/app](https://service.fastapiadmin.com/app)
-- **项目文档**:[https://service.fastapiadmin.com](https://service.fastapiadmin.com)
-- **API 文档**:[https://service.fastapiadmin.com/api/v1/docs](https://service.fastapiadmin.com/api/v1/docs)
-
-默认登录信息:
-
-- **用户名**:admin
-- **密码**:123456
-
-> **注意**:实际部署时,请根据服务器配置修改域名或使用 IP 地址访问。
-
-## 容器管理
-
-### 查看容器状态
-
-```bash
-docker compose ps
-```
-
-### 查看实时日志
-
-```bash
-# 查看所有服务的实时日志
-docker compose logs -f
-
-# 查看单个服务的实时日志(例如后端服务)
-docker compose logs -f backend
-```
-
-### 停止服务
-
-```bash
-docker compose down
-```
-
-### 重启服务
-
-```bash
-docker compose restart
-```
-
-### 进入容器
-
-```bash
-# 进入后端容器
-docker compose exec backend bash
-
-# 进入数据库容器
-docker compose exec mysql bash
-```
-
-## 问题排查
-
-### 常见问题
-
-#### 1. 端口冲突
-
-如果启动容器时出现端口冲突,请检查是否有其他服务占用了相同的端口,并在 docker-compose.yaml 中修改端口映射。
-
-#### 2. 数据库连接失败
-
-- 检查数据库容器是否正常运行
-- 确认数据库配置是否正确(用户名、密码、数据库名)
-- 查看后端服务日志获取详细错误信息
-
-#### 3. 前端访问后端 API 失败
-
-- 检查 Nginx 配置是否正确
-- 确认 API 路径配置是否匹配
-- 查看浏览器控制台的网络请求和错误信息
-
-### 配置文件
-
-以下是可能需要修改的关键配置文件:
-
-1. **后端配置**:`backend/env/.env.prod.py`
-2. **前端配置**:`frontend/vite.config.ts` 和 `frontend/.env.production`
-3. **Docker 配置**:`docker-compose.yaml`
-4. **Nginx 配置**:`devops/nginx/nginx.conf`
-
-### 日志查看
-
-遇到问题时,建议先查看相关服务的日志:
-
-```bash
-# 查看后端服务日志
-docker compose logs backend
-
-# 查看 Nginx 服务日志
-docker compose logs nginx
-
-# 查看 MySQL 服务日志
-docker compose logs mysql
-
-# 查看 Redis 服务日志
-docker compose logs redis
-```
-
-## 安全建议
-
-1. **修改默认密码**:部署后请立即修改默认的管理员密码
-2. **配置 HTTPS**:在生产环境中请配置 SSL 证书,启用 HTTPS
-3. **限制访问**:根据实际需求配置防火墙规则,限制对敏感服务的访问
-4. **定期更新**:定期拉取最新代码并更新部署,以获取安全补丁和新功能
-
-## 维护建议
-
-1. **定期备份**:定期备份数据库和重要配置文件
-2. **监控服务**:设置服务监控,及时发现并处理异常情况
-3. **清理镜像**:定期清理不再使用的 Docker 镜像,释放磁盘空间
-
-## 联系与支持
-
-如有任何问题或需要技术支持,请联系项目维护者。

+ 0 - 72
devops/backend/Dockerfile

@@ -1,72 +0,0 @@
-# 第一阶段:构建(包含源码,用于打包)
-FROM python:3.10 as builder
-
-# 使用 LABEL 替代 MAINTAINER
-LABEL maintainer="CuiHongEn"
-
-# 设置时区
-ENV TZ Asia/Shanghai
-
-# 设置容器内工作目录
-WORKDIR /home
-
-# 安装系统依赖(打包需要)
-RUN apt-get update && apt-get install -y --no-install-recommends \
-    gcc \
-    && rm -rf /var/lib/apt/lists/*
-
-# 将当前主机目录全部文件复制至容器工作目录
-COPY ./backend/requirements.txt .
-
-# 安装依赖
-RUN pip install --no-cache-dir -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple pyinstaller>=5.13.0
-
-# 复制项目源码(仅构建阶段需要)
-COPY . .
-
-# 使用PyInstaller打包(重点:指定入口为main.py的cli命令)
-# 注意:--hidden-import需根据实际依赖补充(动态导入的模块)
-RUN pyinstaller --name=hd_crane_gs \
-    --onefile \
-    # Uvicorn相关
-    --hidden-import=uvicorn.logging \
-    --hidden-import=uvicorn.loops \
-    --hidden-import=uvicorn.loops.auto \
-    --hidden-import=uvicorn.protocols \
-    --hidden-import=uvicorn.protocols.http \
-    --hidden-import=uvicorn.protocols.http.auto \
-    --hidden-import=uvicorn.protocols.websockets \
-    --hidden-import=uvicorn.protocols.websockets.auto \
-    --hidden-import=uvicorn.lifespan \
-    --hidden-import=uvicorn.lifespan.on \
-    # Alembic相关
-    --hidden-import=alembic.autogenerate \
-    --hidden-import=alembic.runtime.migration \
-    --hidden-import=alembic.runtime.environment \
-    # 项目内部模块(根据实际结构补充)
-    --hidden-import=app.config.setting \
-    --hidden-import=app.plugin.init_app \
-    --hidden-import=app.core.logger \
-    --hidden-import=app.utils.banner \
-    --hidden-import=app.utils.console \
-    --hidden-import=app.common.enums \
-    backend/main.py
-# 第二阶段:运行(仅包含运行时,无源码)
-FROM python:3.10
-
-# 设置工作目录
-WORKDIR /home
-
-# 从构建阶段复制打包后的可执行文件
-COPY --from=builder /home/build/hd_crane_gs .
-
-# 复制Alembic迁移脚本(如果需要运行migrate命令)
-# 注意:只复制迁移脚本目录,不含源码
-#COPY --from=builder /app/alembic /app/alembic
-#COPY --from=builder /app/alembic.ini /app/alembic.ini
-
-# 运行应用
-CMD ["./hd_crane_gs", "run", "--env=prod"]
-
-# 暴露端口
-EXPOSE 8001

+ 59 - 0
devops/docker-compose.yaml

@@ -0,0 +1,59 @@
+# 应用服务
+services:
+  # 数据库服务
+  mysql:
+    container_name: mysql
+    image: mysql:8.0
+    restart: always
+    environment:
+      TZ: "Asia/Shanghai"
+      MYSQL_ROOT_PASSWORD: "!23Qwe"
+      MYSQL_DATABASE: "cmis_gs"
+      MYSQL_DEFAULT_AUTH: "mysql_native_password"
+    ports:
+      - "3306:3306"
+    volumes:
+      - ./mysql/data:/var/lib/mysql
+      - ./mysql/conf:/etc/mysql/conf.d
+      - ./mysql/logs:/var/log/mysql
+    command: --default-authentication-plugin=mysql_native_password
+    networks:
+      - app_network
+
+  # redis服务
+  redis:
+    container_name: redis
+    image: redis:6
+    restart: always
+    environment:
+      TZ: "Asia/Shanghai"
+    ports:
+      - "6379:6379"
+    volumes:
+      - ./redis/conf/redis.conf:/etc/redis/redis.conf
+      - ./redis/data:/data
+      - ./redis/logs:/var/log/redis
+    command: redis-server /etc/redis/redis.conf
+    networks:
+      - app_network
+  
+  # 前端nginx服务
+  nginx:
+    container_name: nginx
+    image: nginx:latest
+    restart: always
+    environment:
+      TZ: "Asia/Shanghai"
+    ports:
+      - "80:80"
+      - "443:443"
+    volumes:
+      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
+      - ../hd-crane-gs/frontend:/usr/share/nginx/html/frontend
+    networks:
+      - app_network
+
+# 网络
+networks:
+  app_network:
+    driver: bridge

+ 5 - 119
deploy.sh → devops/docker.sh

@@ -3,15 +3,7 @@
 # 设置全局变量
 PROJECT_NAME="hd-crane-gs"
 WORK_DIR="$(cd "$(dirname "$0")" && pwd)"
-PROJECT_PATH="${WORK_DIR}/${PROJECT_NAME}"
-GIT_REPO="http://www.hldcloud.cn:3000/cuihongen/${PROJECT_NAME}.git"
-
-# 是否有更新前端
-UPDATE_FRONTEND=false
-# 是否有更新移动端
-UPDATE_FASTAPP=false
-# 是否有更新官网
-UPDATE_FASTDOCS=false
+PROJECT_PATH="${WORK_DIR}"
 
 # 日志级别控制
 LOG_LEVEL=${LOG_LEVEL:-INFO}
@@ -46,7 +38,7 @@ check_permissions() {
     log "==========🔍 检查系统依赖...==========" "INFO"
     local missing_deps=()
     
-    for cmd in git docker node npm pnpm; do
+    for cmd in docker node npm pnpm; do
         if ! command -v $cmd &> /dev/null; then
             missing_deps+=($cmd)
             log "❌ $cmd 未安装" "ERROR"
@@ -67,113 +59,15 @@ check_permissions() {
 stop_project() {
     log "==========⏹️ 停止项目容器...==========" "INFO"
     log "📂 当前工作目录: $(pwd)" "INFO"
-    log "🎯 项目完整路径: ${PROJECT_PATH}" "INFO"
-    log "🗂️  工作目录: ${WORK_DIR}" "INFO"
-    
-    if [ -d "${PROJECT_PATH}" ]; then
-        log "📂 进入项目目录: ${PROJECT_PATH}" "INFO"
-        cd "${PROJECT_PATH}" || { log "❌ 无法进入项目目录:${PROJECT_PATH}" "ERROR"; exit 1; }
-        
-        if [ -f "docker-compose.yaml" ] || [ -f "docker-compose.yml" ]; then
+    if [ -f "docker-compose.yaml" ] || [ -f "docker-compose.yml" ]; then
             docker compose down || { log "❌ 停止容器失败" "ERROR"; exit 1; }
             log "✅ 项目容器已停止并删除" "INFO"
         else
             log "❌ docker-compose 文件未找到" "ERROR"
             exit 1
         fi
-    else
-        log "📥 项目不存在,开始克隆代码到 ${PROJECT_PATH}" "INFO"
-        log "📂 进入工作目录: ${WORK_DIR}" "INFO"
-        cd "${WORK_DIR}" || { log "❌ 无法进入工作目录:${WORK_DIR}" "ERROR"; exit 1; }
-        git clone "${GIT_REPO}" || { log "❌ 项目克隆失败:${GIT_REPO}" "ERROR"; exit 1; }
-        log "📂 克隆完成,进入项目目录: ${PROJECT_PATH}" "INFO"
-        cd "${PROJECT_PATH}" || { log "❌ 无法进入项目目录:${PROJECT_PATH}" "ERROR"; exit 1; }
-        UPDATE_FRONTEND=true
-        UPDATE_FASTAPP=true
-        UPDATE_FASTDOCS=true
-        log "✅ 代码克隆成功,当前目录: $(pwd)" "INFO"
-    fi
 }
 
-# 更新代码
-update_code() {
-    log "==========🔍 更新最新代码...==========" "INFO"
-    log "📂 当前工作目录: $(pwd)" "INFO"
-    log "🎯 项目路径: ${PROJECT_PATH}" "INFO"
-    
-    # 确保我们在正确的目录
-    if [ "$(pwd)" != "${PROJECT_PATH}" ]; then
-        cd "${PROJECT_PATH}" || { log "❌ 无法进入项目目录:${PROJECT_PATH}" "ERROR"; exit 1; }
-    fi
-    
-    # 检查是否是新克隆的项目
-    if [ ! -d ".git" ]; then
-        log "📥 初始化Git仓库..." "INFO"
-        git init
-        git remote add origin "${GIT_REPO}"
-        git pull origin main || git pull origin master
-    else
-        # 保存当前分支
-        local current_branch=$(git rev-parse --abbrev-ref HEAD)
-        log "📂 当前Git分支: ${current_branch}" "INFO"
-        git pull --force || { log "❌ 拉取更新失败" "ERROR"; exit 1; }
-        git log -1 --oneline || { log "❌ 获取提交信息失败" "ERROR"; exit 1; }
-    fi
-    
-    # 检查目录存在性并设置更新标志
-    if [ -d "frontend" ]; then
-        UPDATE_FRONTEND=true
-        log "📦 检测到前端工程" "INFO"
-    fi
-    if [ -d "fastapp" ]; then
-        UPDATE_FASTAPP=true
-        log "📦 检测到移动端工程" "INFO"
-    fi
-    if [ -d "fastdocs" ]; then
-        UPDATE_FASTDOCS=true
-        log "📦 检测到官网工程" "INFO"
-    fi
-    
-    log "✅ 代码更新成功" "INFO"
-}
-
-# 打包前端
-build_frontend() {
-    log "==========🚀 打包前端...==========" "INFO"
-    
-    # 构建前端
-    if [ -d "frontend" ] && [ "$UPDATE_FRONTEND" = true ]; then
-        cd frontend || { log "❌ 无法进入前端目录" "ERROR"; exit 1; }
-        log "📦 安装前端依赖..." "INFO"
-        pnpm install || { log "❌ 前端依赖安装失败" "ERROR"; exit 1; }
-        log "🔨 打包前端工程..." "INFO"
-        pnpm run build || { log "❌ 前端工程打包失败" "ERROR"; exit 1; }
-        log "✅ 前端工程打包成功" "INFO"
-        cd .. || { log "❌ 无法返回项目根目录" "ERROR"; exit 1; }
-    fi
-
-    # 构建小程序
-    if [ -d "fastapp" ] && [ "$UPDATE_FASTAPP" = true ]; then
-        cd fastapp || { log "❌ 无法进入小程序目录" "ERROR"; exit 1; }
-        log "📦 安装小程序依赖..." "INFO"
-        pnpm install || { log "❌ 小程序依赖安装失败" "ERROR"; exit 1; }
-        log "🔨 打包小程序工程..." "INFO"
-        pnpm run build:h5 || { log "❌ 小程序工程打包失败" "ERROR"; exit 1; }
-        log "✅ 小程序工程打包成功" "INFO"
-        cd .. || { log "❌ 无法返回项目根目录" "ERROR"; exit 1; }
-    fi
-
-    # 构建项目文档
-    if [ -d "fastdocs" ] && [ "$UPDATE_FASTDOCS" = true ]; then
-        cd fastdocs || { log "❌ 无法进入项目文档目录" "ERROR"; exit 1; }
-        log "📦 安装项目文档依赖..." "INFO"
-        pnpm install || { log "❌ 项目文档依赖安装失败" "ERROR"; exit 1; }
-        log "🔨 打包项目文档..." "INFO"
-        pnpm run docs:build || { log "❌ 项目文档打包生成失败" "ERROR"; exit 1; }
-        log "✅ 项目文档打包成功" "INFO"
-        cd .. || { log "❌ 无法返回项目根目录" "ERROR"; exit 1; }
-    fi
-}
 
 # 构建镜像&启动容器
 start_containers() {
@@ -208,11 +102,6 @@ show_containers_logs() {
     log "📊 当前容器状态:" "INFO"
     docker compose ps --format "table {{.Service}}\t{{.Name}}\t{{.Status}}\t{{.Ports}}"
     
-    log "📋 后端服务日志:" "INFO"
-    echo "----------------------------------------"
-    docker compose logs backend
-    echo "----------------------------------------"
-    
     log "📋 Nginx服务日志:" "INFO"
     echo "----------------------------------------"
     docker compose logs nginx
@@ -231,7 +120,7 @@ show_containers_logs() {
     log "💡 实时日志查看命令:" "INFO"
     log "  - 查看所有服务实时日志:docker compose logs -f" "INFO"
     log "  - 查看单个服务实时日志:docker compose logs -f [服务名]" "INFO"
-    log "  - 服务名:backend, nginx, mysql, redis" "INFO"
+    log "  - 服务名:nginx, mysql, redis" "INFO"
 }
 
 # 信号处理
@@ -253,14 +142,11 @@ main() {
     
     check_permissions
     stop_project
-    update_code
-    # build_frontend
     start_containers
     show_containers_logs
     
     log "🎉 部署完成!以下是访问信息:
-    📌 客户端: 192.168.0.247
-    📌 后端管理: 192.168.0.247/web
+    📌 前端: 192.168.0.247/
     📌 后端接口: 192.168.0.247/api/v1/docs
     📌 登录信息: 账号 admin,密码 123456" "SUCCESS"
 }

+ 10 - 11
devops/nginx/nginx.conf

@@ -30,24 +30,23 @@ http {
         listen 80; # 内网仅用80端口访问
         server_name _; # 匹配所有IP/无域名场景,替代原域名
 
-        # 官网代理 - 根路径访问官网(IP+端口直接访问)
         location / {
-            root /usr/share/nginx/html/fastdocs/dist;
+            root /usr/share/nginx/html/frontend/dist;
             index index.html index.htm;
             try_files $uri $uri/ /index.html; #解决页面刷新404问题
         }
 
         # 前端代理 - /web访问前端(http://192.168.0.247/web)
-        location /web {
-            alias /usr/share/nginx/html/frontend/dist;
-            try_files $uri $uri/ /web/index.html; #解决页面刷新404问题
-        }
+        #location / {
+        #    alias /usr/share/nginx/html/frontend/dist;
+        #    try_files $uri $uri/ /index.html; #解决页面刷新404问题
+        #}
 
         # 小程序代理 - /app访问小程序(http://192.168.0.247/app)
-        location /app {
-            alias /usr/share/nginx/html/fastapp/dist/build/h5;
-            try_files $uri $uri/ /app/index.html; #解决页面刷新404问题
-        }
+        #location /app {
+        #    alias /usr/share/nginx/html/fastapp/dist/build/h5;
+        #    try_files $uri $uri/ /app/index.html; #解决页面刷新404问题
+        #}
 
         # 后端代理 - /api/v1转发到内网后端服务
         location /api/v1 {
@@ -74,4 +73,4 @@ http {
             root   /usr/share/nginx/html;
         }
     }
-}
+}

+ 0 - 87
docker-compose.yaml

@@ -1,87 +0,0 @@
-# 应用服务
-services:
-  # 数据库服务
-  mysql:
-    container_name: mysql
-    image: mysql:8.0
-    restart: always
-    environment:
-      TZ: "Asia/Shanghai"
-      MYSQL_ROOT_PASSWORD: "!23Qwe"
-      MYSQL_DATABASE: "cmis_gs"
-      MYSQL_DEFAULT_AUTH: "mysql_native_password"
-    ports:
-      - "3306:3306"
-    volumes:
-      - ./devops/mysql/data:/var/lib/mysql
-      - ./devops/mysql/conf:/etc/mysql/conf.d
-      - ./devops/mysql/logs:/var/log/mysql
-    command: --default-authentication-plugin=mysql_native_password
-    networks:
-      - app_network
-
-  # redis服务
-  redis:
-    container_name: redis
-    image: redis:6
-    restart: always
-    environment:
-      TZ: "Asia/Shanghai"
-    ports:
-      - "6379:6379"
-    volumes:
-      - ./devops/redis/conf/redis.conf:/etc/redis/redis.conf
-      - ./devops/redis/data:/data
-      - ./devops/redis/logs:/var/log/redis
-    command: redis-server /etc/redis/redis.conf
-    networks:
-      - app_network
-    
-  # 后端服务
-  backend:
-    container_name: backend
-    build:
-      context: ./
-      dockerfile: ./devops/backend/Dockerfile
-    image: backend:latest
-    restart: always
-    environment:
-      TZ: "Asia/Shanghai"
-    ports:
-      - "8001:8001"
-    depends_on:
-      - mysql
-      - redis
-    networks:
-      - app_network
-  
-  # 前端nginx服务
-  nginx:
-    container_name: nginx
-    image: nginx:latest
-    restart: always
-    environment:
-      TZ: "Asia/Shanghai"
-    ports:
-      - "80:80"
-      - "443:443"
-    volumes:
-      - ./devops/nginx/nginx.conf:/etc/nginx/nginx.conf
-      # - ./frontend/dist:/usr/share/nginx/html/frontend/dist 如果使用服务器构建前端则不要注释这三行
-      # - ./fastapp/dist/build/h5:/usr/share/nginx/html/fastapp/dist/build/h5
-      # - ./fastdocs/dist:/usr/share/nginx/html/fastdocs/dist
-      #  下面三行是本地前端打包好放在服务器的路径,如果使用服务器打包则使用上面方式
-      - /home/hdcranegs/frontend:/usr/share/nginx/html/frontend
-      - /home/hdcranegs/fastapp:/usr/share/nginx/html/fastapp
-      - /home/hdcranegs/fastdocs:/usr/share/nginx/html/fastdocs
-      # ssl 证书
-      #- /home/hdcranegs/ssl:/etc/nginx/ssl:ro
-    depends_on:
-      - backend
-    networks:
-      - app_network
-
-# 网络
-networks:
-  app_network:
-    driver: bridge

+ 1 - 1
frontend/vite.config.ts

@@ -23,7 +23,7 @@ export default defineConfig(({ mode }: ConfigEnv) => {
   const isProduction = mode === "production";
 
   return {
-    base: "/web",
+    base: "/",
     resolve: {
       alias: {
         "@": pathSrc,