TL的开发

Fuadmin

部署很方便

我选择数据库部署在Docker上面,前后端代码编写都在本地。

  1. 在Docker当中将数据库启动
  2. 启动后端程序
  3. 启动前端程序

前端程序启动

# 进入项目目录
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以及 解决方式

  1. docker-compose up启动时报错 HTTPConnection.request() got an unexpected keyword argument ‘chunked‘
    首先降低docker版本
    pip install docker==6.0.0
    然后
    pip install ‘urllib3<2’

  2. 安装以来的过程当中需要用到外网
    安装依赖即可。
    https://github.com/NingYuanLin/cau_auth

  3. ModuleNotFoundError: No module named ‘corsheaders’
    https://wenku.csdn.net/answer/ce55fad8ce9b49d89611931f10212126

  4. 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。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值