# CourseDesignHub **Repository Path**: hacja/dbCourse_design ## Basic Information - **Project Name**: CourseDesignHub - **Description**: 课程设计 - **Primary Language**: Python - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 5 - **Created**: 2025-03-03 - **Last Updated**: 2025-10-29 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # CourseDesignHub 本项目为课程设计作品,仅供学习参考。 --- ## 背景介绍 大学数据库课程设计。要求:实现数据库的增删改查、进行数据库设计、满足数据库设计相关规范、实现前端页面、用户注册及系统管理员登录退出注册等基本功能、系统具有实用性且有一定的创新性。 本项目是基于达梦数据库的C2C模式的校园二手交易web平台。 当时的条件限制:只有一台实验室服务器(当做数据库服务器)和小组组员各自电脑;前后端代码都只能运行在组员电脑上面,只有数据库操作的时候连接服务器,图片静态资源存七牛云,结合qiniu python sdk实现上传和加载到前端功能。 ### 技术栈 前端用vue3,风格是element plus,后端Django4.2.20+DRF,数据库是达梦数据库开发版,NSFW-API鉴黄机制。此外用了内网穿透工具供组员连接数据库。 ## 实现的功能: ### 界面组件 - 首页商品瀑布流展示 - 商品详情页 - 响应式布局 ### 用户系统 - 注册,登录 - 手机号找回密码和邮箱找回密码 - 个人信息管理,包括上传头像(限制jpg,png,jpeg三种格式) - 查看我发布的商品、收藏、卖出、地址编辑、别人对我的评价等。 - 设置界面:具有C2C模式二手交易平台该有的设置项(比如密码设置、邮箱绑定设置就在这里) ### 商品系统 - 商品发布/编辑界面(带七牛云图片上传) - 商品状态管理(草稿/上架/下架状态切换) - 商品分类展示(只有一级/二级分类联动),注意,只有该分类有商品存在数据库且能正常获取到,才会渲染该分类的按钮,否则不会渲染该分类按钮,只会放一些测试商品的图片。 - 商品收藏/取消收藏功能 - 商品搜索,搜索框按照关键字搜索、点击分类展示该类别商品。这里只实现了简单的二级分类。搜索结果可根据发布时间,价格,卖家信用排序。可根据发货地和发货方式筛选。 ### 订单系统 - 订单和模拟支付(提交订单→支付界面) - 卖家视角订单管理(待发货/待收货状态) - 买家视角订单跟踪(待支付/待收货/待评价) - 订单评价功能(星级评分+文字评价) ### 后台管理 - 商品审核、用户/商品数据管理。 ### 安全性 有token认证机制、防爆破机制、防止越权和CSRF、简单的鉴黄机制(头像和商品图片的内容审核)、ORM自带sql注入防御。 ## 界面展示 很多界面图片都放在assets目录下面了,可以自行查看。 ## 项目架构介绍 ### 数据库设计 ![数据库设计](/assets/ER图.png) `具体实现见后端各个models.py` ### 后端结构 不是很会画架构图,应该就是下面这样 ![alt text](/assets/bk.png) ![alt text](/assets/bk2.png) ### 前端结构设计 ![alt text](/assets/image.png) ## 关键技术 ### drf框架 Django Rest Framework是一个用于构建Web API的强大框架。它基于Django,提供了一套完整的API开发工具,包括序列化、视图、路由、认证、权限、分页等。我们还使用了drf-yasg扩展,它是一个用于生成API文档的工具,可以自动生成API文档,方便前后端开发人员理解和使用API。 ### 七牛云API backend/utils/qiniu_tools.py是一个用于处理七牛云对象存储服务的工具类,主要提供了图片上传、获取和管理的功能。 里面的工具类 `ImageHandler` 封装了以下功能: 1. **初始化连接**:使用配置文件中的密钥创建七牛云连接 2. **生成上传凭证**:为上传操作创建授权令牌 3. **获取公有URL**:为已上传的文件生成可访问的公共URL 4. **删除文件**:从七牛云存储中删除指定文件 5. **上传头像**:上传用户头像到指定路径,并进行图片格式验证 6. **上传产品图片**:上传产品相关图片到指定路径 **详细说明** 初始化: 工具类通过Django配置文件中的设置初始化七牛云连接: - 使用 `QINIU_AK` 和 `QINIU_SK` 作为访问密钥 - 使用 `BUCKET_NAME` 指定存储空间 - 使用 `QINIU_DOMAIN` 作为文件访问域名 上传文件流程: 1. 图片文件验证(检查是否为有效图片) 2. 生成唯一文件名(基于用户ID或产品编码+时间戳/随机字符串) 3. 生成上传凭证Token 4. 上传文件内容到七牛云 5. 返回文件存储的key或相关信息 支持的图片格式: 工具类支持的图片格式包括:jpg、jpeg、png、gif,对于头像还支持webp格式。对于不匹配的格式,默认转为jpg。 安全措施: 1. 使用授权Token进行上传和删除操作 2. 图片文件类型验证 3. 使用时间戳和随机字符串生成唯一文件名,避免文件覆盖 ### djangosimplejwt ### 鉴黄机制NSFW-API ```python class NSFWChecker: def __init__(self): self.api_url = "http://localhost:3000/classify-many" self.threshold = 0.6 def check_images(self, images: List[UploadedFile]) -> bool: try: # 准备文件上传 files = [] for image in images: print(f"[DEBUG] 文件名: {image.name}") print(f"[DEBUG] 文件类型: {image.content_type}") print(f"[DEBUG] 文件大小: {image.size} bytes") # 转换WebP到PNG if image.content_type == 'image/webp': img = Image.open(image) img.verify() # 验证图片完整性 output = BytesIO() img.save(output, format='PNG') output.seek(0) file_content = output.read() files.append(('images', ('converted.png', file_content))) else: file_content = image.read() files.append(('images', (image.name, file_content))) image.seek(0) print(f"[DEBUG] 请求头: {requests.post(self.api_url).headers}") # 添加超时设置和详细的错误处理 response = requests.post( self.api_url, files=files, timeout=10, ) print(f"[DEBUG] 响应状态码: {response.status_code}") print(f"[DEBUG] 响应头: {response.headers}") print(f"[DEBUG] 响应内容: {response.text}") response.raise_for_status() results = response.json() # 检查每张图片的分类结果 for idx, result in enumerate(results): print(f"[DEBUG] 图片 {idx+1} 的分类结果:") print(f"porn: {result.get('porn', 0):.4f}") print(f"hentai: {result.get('hentai', 0):.4f}") print(f"sexy: {result.get('sexy', 0):.4f}") print(f"neutral: {result.get('neutral', 0):.4f}") print(f"drawing: {result.get('drawing', 0):.4f}") if (result.get('porn', 0) > self.threshold or result.get('hentai', 0) > self.threshold or result.get('sexy', 0) > self.threshold): raise ValueError("图片包含不适当内容") print("[DEBUG] 所有图片通过审核") return True except requests.RequestException as e: print(f"[ERROR] API 请求失败:") print(f"[ERROR] 异常类型: {type(e).__name__}") print(f"[ERROR] 异常信息: {str(e)}") if hasattr(e.response, 'text'): print(f"[ERROR] 服务器响应: {e.response.text}") raise ValueError(f"图片审核服务异常: {str(e)}") except Exception as e: print(f"[ERROR] 图片审核失败: {type(e).__name__} - {str(e)}") raise ValueError(f"图片审核失败: {str(e)}") ``` products目录的views.py和users目录的views.py中都有使用,用于审核用户上传的图片是否包含不适当内容,如果包含则抛出异常,否则返回True ```python # 鉴黄api调用 if 'multipart/form-data' in request.content_type: images_data = request.FILES.getlist('images', []) if images_data: try: pass # 我默认是不开启的,如果需要取消注释,删掉pass即可 # imageChecker = NSFWChecker() # imageChecker.check_images(images_data) except ValueError as e: return Response( {"error": "图片审核失败", "message": str(e)}, status=status.HTTP_400_BAD_REQUEST ) except request.exceptions.RequestException as e: return Response( {"error": "图片审核服务不可用", "message": str(e)}, status=status.HTTP_503_SERVICE_UNAVAILABLE ) ``` ### 达梦数据库定时任务 见backend/test/jobs.sql ## 🤔局限性/未完成的部分 由于是课程设计,加上其他课也有任务,时间比较紧,所以项目还是有很多不足的。 1. 没有很好的实现“校园”主题,本质上更像一个普通C2C二手交易平台,没有校园认证 2. 页面加载较慢 3. 地址部分,前端只能选测试地址,不能自定义地址(除非抓包) 4. 没有实现数据加密传输 5. 没实现和卖家沟通的功能 6. 前端状态管理做得不是很好,因为组员(包括我)是第一次搞课程项目,以前没搞过类似的,只用了响应式API。 7. 数据库方面,达梦数据库利用得不够充分,除了创建表来CURD和三个定时任务外好像没怎么用了,主要是老师说用国产数据库加分才用的。 8. 前端文件结构不够规范,清楚 ## 环境搭建教程 安装以下依赖 1. python3.11+vue3+nodejs+npm并配置相应环境变量 2. 前端frontend目录下执行`npm install`。注意安装Element Plus组件库和axios请求库 3. python依赖包(后端建议创建python虚拟环境venv,在虚拟环境安装依赖包):创建虚拟环境后直接在backend目录执行`pip install -r requirements.txt`,django-dmPython(源码安装); 4. 达梦数据库开发版,官网找搭建教程。 5. nsfw-api,上网搜penndu/nsfw-api:latest这个镜像,根据它的文档用docker构建。 6. 注意django_dmPython达梦官方文档的方法只能得到一个egg类型包,需要手动转换为wheel格式的包,手动安装wheel格式的包后,再移动到虚拟环境的site-packages目录下。忘了咋弄了,我当时是问AI搞的,不是很难。 ## 使用说明 1. 前端npm run dev 2. 后端python manager.py runserver 3. 后端注意配置文件.env ```env SECRET_KEY="你的django密钥" DB_NAME=你的达梦数据库名,达梦官方文档有告诉怎么写 DB_USER=数据库用户名 DB_PASSWORD=数据库密码 DB_HOST=数据库地址 DB_PORT=数据库端口 BACKET_NAME=七牛云存储空间名称 QINIU_AK=七牛云AK QINIU_SK=七牛云SK QINIU_DOMAIN=七牛云域名,自己上网搜索如何创建七牛云空间,获取测试域名,每个用户有免费空间10G。 EMAIL_HOST_USER =mailtrap的账号(因为这里有邮箱找回密码的功能,验证码是发生到自己这个邮箱沙箱里面的,不是发真实邮箱) EMAIL_HOST_PASSWORD =mailtrap的密码 ``` 4. localhost:5173是前端,127.0.0.1:8000是后端,127.0.0.1:8000/admin/是后台管理,127.0.0.1:8000/swagger/和127.0.0.1:8000/redoc/路径是后端API文档 ## 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request