Fuadmin
部署很方便
我选择数据库部署在Docker上面,前后端代码编写都在本地。
- 在Docker当中将数据库启动
- 启动后端程序
- 启动前端程序
前端程序启动
# 进入项目目录
cd fu-admin/web
# 安装依赖
pnpm install --registry=https://registry.npm.taobao.org
# 启动服务
pnpm dev
后端程序启动
# 克隆项目
git clone https://gitee.com/fuadmin/fu-admin.git
# 进入项目目录
cd fu-admin/backend
# 在 `env.py` 中配置数据库信息
# 默认是Mysql,如果使用SqlServer,请在requirements.txt中打开
mssql-django==1.1.2
pyodbc==4.0.32
# 安装依赖环境
pip install -r requirements.txt
# 执行迁移命令:
python manage.py makemigrations system
python manage.py migrate
# 初始化数据
python manage.py init
# 初始化省市县数据:
python manage.py init_area
# 启动项目
python manage.py runserver 0.0.0.0:8000
# 或使用 daphne :
daphne -b 0.0.0.0 -p 8000 fuadmin.asgi:application
前置知识
Django-Ninja教程
Python-Django-Ninja基础入门教程_哔哩哔哩_bilibili
Django Ninja (django-ninja.dev)
将工程Demo工程运行起来(热部署):
python manage.py runserver
API文档功能
创建数据库命令
python manage.py migrate
同步数据库命令
python manage.py make
(每次在models里面创建好一个模型(表)后就要同步一下数据库)
创建管理员
python manage.py createsuperuser
使用Docker已经能够进行部署
文件夹分成三个部分:
- backend - 后端代码
- docker
- web - 前端代码
docker compose
docker-compose up -d
docker-compose exec fuadmin-django bash
python manage.py makemigrations system demo
python manage.py migrate
python manage.py init
python manage.py init_area
部署好后,直接访问http://localhost:8080
Docker遇到问题的终极解决方案
Debug
可能的Solution:
-
使用System目录下面的models来创建表格。
-
使用System目录下面的initialize来填充表格里面的数据。
尝试创建一个新的模块 DemoMyApp
1. 创建App
- 通过命令创建App
python manage.py startapp DemoMyApp
2. 在fuadmin/setting.py里添加我们的app
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'django_celery_beat',
'django_celery_results',
'system',
'demo',
'generator',
'DemoMyApp',
]
3. 创建 models 模型
- 编写项目管理模型内容
DemoMyApp/models.py
,如下:
from django.db import models
from utils.models import CoreModel
class DemoMyApp(CoreModel):
name = models.CharField(null=False, max_length=64, verbose_name="项目名称", help_text="项目名称")
code = models.CharField(max_length=32, verbose_name="项目编码", help_text="项目编码")
status = models.CharField(max_length=64, verbose_name="项目状态", help_text="项目状态")
class Meta:
db_table = "Demo"
verbose_name = '项目演示'
verbose_name_plural = verbose_name
ordering = ('-create_datetime',)
4. 迁移数据库文件
- 执行迁移命令:
python3 manage.py makemigrations DemoMyApp
python3 manage.py migrate DemoMyApp
- 迁移成功后,通过数据库可查看到
5. 创建api、路由接口
- 创建
api.py
from typing import List
from ninja import Router, ModelSchema, Query, Field
from ninja.pagination import paginate
from demo.models import Demo
from utils.fu_crud import create, delete, update, retrieve, ImportSchema, export_data, import_data
from utils.fu_ninga import MyPagination, FuFilters
router = Router()
# 设置过滤字段
class Filters(FuFilters):
name: str = Field(None, alias="name")
code: str = Field(None, alias="code")
status: int = Field(None, alias="status")
id: str = Field(None, alias="demo_id")
# 设置请求接收字段
class DemoSchemaIn(ModelSchema):
class Config:
model = Demo
model_fields = ['name', 'code', 'sort', 'status']
# 设置响应字段
class DemoSchemaOut(ModelSchema):
class Config:
model = Demo
model_fields = "__all__"
# 创建Demo
@router.post("/demo", response=DemoSchemaOut)
def create_demo(request, data: DemoSchemaIn):
demo = create(request, data, Demo)
return demo
# 删除Demo
@router.delete("/demo/{demo_id}")
def delete_demo(request, demo_id: int):
delete(demo_id, Demo)
return {"success": True}
# 更新Demo
@router.put("/demo/{demo_id}", response=DemoSchemaOut)
def update_demo(request, demo_id: int, data: DemoSchemaIn):
demo = update(request, demo_id, data, Demo)
return demo
# 获取Demo
@router.get("/demo", response=List[DemoSchemaOut])
@paginate(MyPagination)
def list_demo(request, filters: Filters = Query(...)):
qs = retrieve(request, Demo, filters)
return qs
# 导入
@router.get("/demo/all/export")
def export_demo(request):
title_dict = {
'name': '名称',
'code': '编码',
'status': '状态',
'sort': '排序',
}
return export_data(request, Demo, DemoSchemaOut, title_dict)
# 导出
@router.post("/demo/all/import")
def import_demo(request, data: ImportSchema):
title_dict = {
'名称': 'name',
'编码': 'code',
'状态': 'status',
'排序': 'sort',
}
return import_data(request, Demo, DemoSchemaIn, data, title_dict)
6. models
from django.db import models
from utils.models import CoreModel
# Create your models here.
class Mytable(CoreModel):
testCaseNumber = models.CharField(null=False, max_length=64, verbose_name="测试案例编号", help_text="测试案例编号")
validationRequirementNumber = models.CharField(max_length=32, verbose_name="验证需求编号", help_text="验证需求编号")
testPurpose = models.TextField( verbose_name="测试目的", help_text="测试目的")
testScenariosOrPrinciple = models.CharField(max_length=32, verbose_name="测试场景/原理", help_text="测试场景/原理")
testingTechnology = models.CharField(max_length=32, verbose_name="测试技术", help_text="测试技术")
securityLevel = models.CharField(max_length=32, verbose_name="安全等级", help_text="安全等级")
testCodeImplantation = models.CharField(max_length=32, verbose_name="测试代码植入", help_text="测试代码植入")
precondition = models.CharField(max_length=32, verbose_name="先决条件", help_text="先决条件")
environmentalDescription = models.CharField(max_length=32, verbose_name="环境说明", help_text="环境说明")
caseDesigners = models.CharField(max_length=32, verbose_name="案例设计人员", help_text="案例设计人员")
testResults = models.TextField( verbose_name="测试结果", help_text="测试结果")
test = models.CharField(max_length=32, verbose_name="测试", help_text="测试")
name = models.CharField(max_length=32, verbose_name="姓名", help_text="姓名")
tester = models.CharField(max_length=32, verbose_name="测试人员", help_text="测试人员")
testingTime = models.CharField(max_length=32, verbose_name="测试时间", help_text="测试时间")
stepInstructions = models.TextField( verbose_name="步骤说明", help_text="步骤说明")
expectedResults = models.TextField( verbose_name="预期结果", help_text="预期结果")
actualResult = models.TextField( verbose_name="实际结果", help_text="实际结果")
specialMessage = models.TextField( verbose_name="special", help_text="special")
class Meta:
db_table = "table_test"
verbose_name = '表格演示'
verbose_name_plural = verbose_name
ordering = ('-create_datetime',)
7. fileCRUD 的 API
from datetime import date
from typing import List
from ninja import Schema,Router
from django.shortcuts import get_object_or_404
from table.models import Mytable
router = Router()
class TableIn(Schema):
testCaseNumber:str
validationRequirementNumber:str
testPurpose:str
testScenariosOrPrinciple:str
testingTechnology:str
securityLevel:str
testCodeImplantation:str
precondition:str
environmentalDescription:str
caseDesigners:str
testResults:str
test:str
name:str
tester:str
testingTime:str
stepInstructions:str
expectedResults:str
actualResult:str
specialMessage:str
class TableOut(Schema):
id: int
testCaseNumber:str
validationRequirementNumber:str
testPurpose:str
testScenariosOrPrinciple:str
testingTechnology:str
securityLevel:str
testCodeImplantation:str
precondition:str
environmentalDescription:str
caseDesigners:str
testResults:str
test:str
name:str
tester:str
testingTime:str
stepInstructions:str
expectedResults:str
actualResult:str
specialMessage:str
@router.post("/table")
def create_a_table_element(request, payload: TableIn):
myTable = Mytable.objects.create(**payload.dict())
return {"id": myTable.id}
@router.get("/allTableElements", response=List[TableOut])
def get_all_table_elements(request):
qs = Mytable.objects.all()
return qs
# 更新table
@router.put("/updateTable/{table_id}", response=TableOut)
def update_table_element(request, table_id: int, payload: TableIn):
mytable = get_object_or_404(Mytable, id=table_id)
for attr, value in payload.dict().items():
setattr(mytable, attr, value)
mytable.save()
return {"success": True}
# 删除table
@router.delete("/deleteTable/{table_id}")
def delete_table_element(request, table_id: int):
mytable = get_object_or_404(Mytable, id=table_id)
mytable.delete()
return {"success": True}
搜索引擎学习
将Elasticsearch集成到Django当中。
这一部分单独划出一个Blog
有关前端的框架问题
不要全部都学。。。
只需要数据传过来,我能够显示就行了
Docker 当中可能遇到的bug以及 解决方式
-
docker-compose up启动时报错 HTTPConnection.request() got an unexpected keyword argument ‘chunked‘
首先降低docker版本
pip install docker==6.0.0
然后
pip install ‘urllib3<2’ -
安装以来的过程当中需要用到外网
安装依赖即可。
https://github.com/NingYuanLin/cau_auth -
ModuleNotFoundError: No module named ‘corsheaders’
https://wenku.csdn.net/answer/ce55fad8ce9b49d89611931f10212126 -
pip install mysqlclient出现错误
用conda install =》 有后续bug
这个错误表明在安装 mysqlclient 时,mysql_config 无法被找到。这通常是由于缺少 MySQL 客户端库的开发文件引起的。你可以通过安装这些开发文件来解决这个问题。
首先,确保你的系统上安装了 MySQL 客户端库的开发文件。在 Ubuntu 等 Debian 系统上,可以使用以下命令安装:
bash
Copy code
sudo apt-get update
sudo apt-get install libmysqlclient-dev
在 Red Hat 等系统上,可以使用以下命令安装:
bash
Copy code
sudo yum install mysql-devel
在 macOS 上,可以使用以下命令安装:
bash
Copy code
brew install mysql-client
在 Windows 上,你需要下载并安装 MySQL Connector/C 开发包,然后将其路径添加到系统的 PATH 环境变量中。
安装完这些开发文件后,再尝试运行你的 pip install 命令:
bash
Copy code
pip install -r requirements.txt
这应该能够成功安装 mysqlclient。