# 7-校园二手交易系统 - 功能说明
# 项目概述
本系统是一个基于 Django 3.2 + Vue 3 前后端分离架构的校园二手交易系统,后端由 12 个功能独立的 Django App 组成(管理员、用户、商家用户、商品分类、二手商品、商品图片、订单明细、支付记录、收藏、评论、收货地址、系统公告),提供管理员与普通用户两类角色的登录、后台管理与前台浏览能力,覆盖商品分类维护、二手商品发布与管理、商品图片、商品评价、商品收藏、订单明细、支付记录、收货地址与系统公告等业务,数据库共 13 张表并以逻辑外键关联;后端基于 Django REST Framework 提供统一响应格式的 RESTful 接口,使用自定义 JWT(PyJWT)认证与中间件统一拦截鉴权;前端采用 Vue 3 Composition API + Element Plus + Vite + Pinia + Axios 构建,按角色拆分为管理后台界面(AdminLayout)与前台用户界面(FrontLayout)两套界面,并按 JWT 中的 type 字段(ADMIN / USER)做界面分流。
# 项目概览
# ✨ 创新点
# 1. 模块化的 Django App 架构
- 要点:
settings.py的INSTALLED_APPS中注册了 12 个业务 App(apps.admin、apps.user、apps.merchant、apps.goods_category、apps.goods、apps.goods_image、apps.order_item、apps.payment、apps.favorite、apps.comment、apps.notice、apps.address),每个 App 独立维护models.py、views.py、urls.py、XxxSerializer.py。 - 要点:项目根 URLConf(
project/urls.py)按模块前缀挂载(/admin/、/user/、/merchant/、/goods_category/、/goods/、/goods_image/、/order_item/、/payment/、/favorite/、/comment/、/address/、/notice/、/common/)。 - 要点:
apps.admin使用自定义配置类CustomAdminConfig(label = 'custom_admin'),避免与django.contrib.admin的应用标签冲突。
# 2. 自定义 JWT Token 认证与中间件统一鉴权
- 要点:
utils/jwt_auth.py使用 PyJWT(HS256)签发 Token,payload 携带id、username、type(角色标识),超时时间默认为60*24*30分钟。 - 要点:
middleware/TokenInterceptorMiddleware.py从请求头token(request.META['HTTP_TOKEN'])读取并解析 Token,把id、username、type注入request,解析失败或无 Token 统一返回code = 401。 - 要点:中间件配置了精确白名单(
/common/login、/common/register、/common/retrievePassword、/goods/uPage、/love、/goods/getGoodsByCategoryId、/category/list)与前缀白名单(/uploads/、/static/、/swagger/、/django-admin/)。
# 3. 角色化的双界面设计与跳转隔离
- 要点:后台界面
AdminLayout.vue与前台界面FrontLayout.vue分别对应/admin/*与/*两套路由,菜单项由前端根据localStorage.currentUser.type判断渲染。 - 要点:
AdminLayout.vue中若当前用户type === 'USER'则跳回前台/;FrontLayout.vue中若type !== 'USER'则跳转到后台/admin。 - 要点:登录页
Login.vue提供"管理员 / 用户"两类角色选择,登录成功后按type分别跳转/admin与/。
# 4. 逻辑外键与"先建表、后建模型"的数据库映射
- 要点:全部 13 张表通过 SQL 脚本(
project/sql/d_7_second_hand_trading_system.sql)建表,脚本中SET FOREIGN_KEY_CHECKS = 0,表之间使用逻辑关联字段(如goods.category_id、goods_image.goods_id、order_item.order_id、comment.goods_id、favorite.user_id)。 - 要点:所有模型均声明
managed = False并显式指定db_table,Django 只做读写映射、不接管建表。 - 要点:
apps/common/signals.py提供通用pre_save信号处理函数,在create_time为空时自动写入当前时间。
# 5. 统一响应格式与统一异常/错误处理
- 要点:
apps/common/ResponseMessage.py统一返回{"code":..., "msg":..., "data":...}(success→ 200、failed/other→ 500、jump→ 自定义 code,如 401)。 - 要点:
utils/exception_handler.py提供全局异常处理器(自定义异常 → Django 内置异常 → DRF 异常 → 未知异常),utils/custom_exception.py定义了NotFoundException、PermissionDeniedException、UnauthorizedException、ValidationException、BusinessException等异常类。 - 要点:前端
utils/http.js的响应拦截器按code分支处理(200 直接返回、401 清除 Token 并跳登录页、500 报错),网络层错误单独兜底提示。
# ✨ 项目亮点
# 一、 业务功能亮点
- 校园二手交易业务全覆盖:围绕二手交易提供商品分类、二手商品、商品图片、订单明细、支付记录、收藏、评论、收货地址、系统公告 9 个业务模块,每个模块均提供分页查询、新增、更新、批量删除、详情、全量列表 6 类接口。
- 管理员与普通用户双角色管理:登录接口按前端传入的
type分别查询admin表(管理员)与user表(普通用户),角色信息写入 JWT 并贯穿前后端鉴权与界面分流。 - 商品状态与商家审核字段:
goods.status默认值为"上架",前台首页与详情页据此筛选和判断"立即购买"是否可用;merchant表提供status(默认"待审核")与reject_reason(拒绝原因)字段,后台"商家用户管理"页面可维护审核状态与拒绝原因。 - 账号与个人中心闭环:提供注册、登录、找回密码(按手机号重置)、当前用户信息查询与修改、修改密码(校验原密码)、管理员重置密码(重置为
123456)等账号功能。 - 图片/文件统一上传能力:
/file/upload接口配合前端MyUpload.vue组件,支持头像、商品图片、营业执照等图像字段的上传、预览、替换与删除,上传结果以完整 URL 回填表单字段。
# 二、 技术实现亮点
- 现代化前端技术栈:采用 Vue ^3.4.29(Composition API)、Element Plus ^2.8.4、Vite ^5.3.1、Axios ^1.7.5、Pinia ^2.2.2、vue-router ^4.4.3,并在
package.json中引入 ECharts ^5.5.1、@wangeditor/editor ^5.1.14、@wangeditor/editor-for-vue ^5.1.12、swiper ^11.1.14、dayjs ^1.11.13、lodash ^4.17.21、crypto-js ^4.1.1、sm-crypto ^0.3.13 等依赖。 - 稳定可靠的后端架构:Django~=3.2(settings 由 Django 3.2.20 的
startproject生成)+ Django REST Framework ~3.14.0,数据访问使用 PyMySQL==1.1.0 与 mysqlclient==2.1.1,接口文档使用 drf-yasg==1.21.7,跨域使用 django-cors-headers==4.2.0,认证使用 PyJWT==2.7.0。 - 完善的数据库设计:13 张核心表,全部使用逻辑外键关联、不建物理外键;模型统一
managed = False映射既有表,通用pre_save信号自动填充创建时间;接口分页大小统一由settings.PAGE_SIZE = 10控制。 - 务实的第三方集成:集成 django-cors-headers(允许所有域名跨域、允许携带 Cookie、请求头白名单包含
token)、drf-yasg(/swagger/接口文档)、PyJWT(Token 签发与解析)、wangEditor(富文本编辑器组件)、ECharts(已列入前端依赖)。 - 安全性设计:请求头
token传递 JWT(HS256 + DjangoSECRET_KEY作为密钥)、中间件对所有非白名单接口统一校验并注入用户上下文、Token 失效/缺失统一返回 401 并由前端自动跳转登录页、上传文件使用uuid4重命名避免重名覆盖、修改个人信息/密码时校验操作者必须为本人(user_id != request.id直接拒绝)、重置密码接口仅允许type == 'ADMIN'调用。
# 三、 用户体验亮点
- 双界面设计:后台
AdminLayout.vue提供侧边菜单式管理界面(首页、管理员管理、用户管理、商家用户管理、商品分类管理、二手商品管理、商品图片管理、订单明细管理、支付记录管理、收藏管理、评论管理、收货地址管理、系统公告管理),前台FrontLayout.vue提供顶部导航式用户界面(首页、个人中心),两套界面互不干扰。 - 响应式布局:
FrontLayout.vue与PersonalCenter.vue均包含@media (max-width: 768px)断点样式(小屏隐藏用户名文字与菜单文字);PersonalCenter.vue使用:xs / :sm / :md栅格自适应;前台首页商品列表使用grid-template-columns: repeat(auto-fill, minmax(280px, 1fr))自适应列数。 - 交互优化:
- 友好的加载提示和错误提示:
ElMessage.error提示加载失败,Axios 拦截器对 401/404/500/502/503 与网络错误分类提示。 - 重要操作的确认弹窗:删除前使用
ElMessageBox.confirm二次确认(提示"此操作将永久删除 ID 为 [...] 的数据")。 - 及时的全局消息提示:登录、注册、修改、新增、编辑、删除等操作成功后统一
ElMessage成功提示。 - 严谨的前后端表单验证:前端
el-form的rules/:rules校验必填项,后端 DRF 序列化器is_valid()二次校验,失败返回统一错误响应。
- 友好的加载提示和错误提示:
- 文件上传体验:
MyUpload.vue组件支持"点击替换"(limit === 1时超限自动替换旧文件)、超出数量限制提示、点击预览(图片/视频/音频弹窗预览、附件直接下载),上传请求头自动携带 Token;MyEditor.vue编辑器内置图片与视频上传配置(server指向/file/upload)。
# 管理员(ADMIN)
# 账号与登录
登录:在 /login 选择"管理员"角色并以 admin 表账号登录,成功后写入 Token 与用户信息并跳转后台 /admin。
注册:在 /register 选择"管理员"类型并填写头像、用户名、密码、昵称完成注册(校验用户名重复)。
找回密码:在 /retrievePassword 按手机号重置密码。
退出登录:后台右上角菜单退出登录,清空 localStorage 并跳回 /login。
个人信息:后台菜单"个人信息"(/admin/editCurrentUser)修改自己的头像、邮箱、电话,保存后重新拉取当前用户并写入 localStorage。
修改密码:后台菜单"修改密码"(/admin/editPassword)输入旧密码与新密码修改,成功后清空本地登录态并要求重新登录。
# 首页
首页:后台首页(/admin/home,菜单入口 /admin)。
# 用户与商家管理
管理员管理:后台"管理员管理"页面对管理员账号做分页查询(支持按用户名、手机号搜索)、新增、编辑、删除、批量删除,并可重置指定账号密码;对应接口 /admin/page、/admin/list、/admin/add、/admin/update、/admin/delete、/admin/detail。
用户管理:后台"用户管理"页面对普通用户做分页查询(支持按用户名、手机号搜索)、新增、编辑、删除、批量删除与密码重置;对应接口 /user/page、/user/list、/user/save、/user/delete。
商家用户管理:后台"商家用户管理"页面对商家账号做分页查询(支持按用户名、商家名称、店铺名称搜索)、新增、编辑、删除、批量删除,可维护密码、商家名称、联系电话、邮箱、头像、店铺名称、店铺简介、营业执照图片、审核状态、拒绝原因、账户余额。
重置密码:在管理员管理、用户管理页面可对指定账号执行密码重置(/common/resetPassword?type=ADMIN|USER&id=),重置结果为 123456,仅 type == 'ADMIN' 可调用。
# 商品管理
商品分类管理:维护商品分类的分页查询(支持按分类名称搜索)、新增、编辑、删除、批量删除,字段为分类名称、分类描述;对应接口 /goods_category/page 等。
二手商品管理:维护二手商品的分页查询(支持按商品标题搜索)、新增、编辑、删除、批量删除,字段涵盖商品标题、分类ID、封面图片、价格、原价、库存数量、商品描述、新旧程度、交易方式、所在位置、浏览量、发布者ID、发布者类型、商品状态、创建时间;对应接口 /goods/page、/goods/add、/goods/update、/goods/delete、/goods/detail、/goods/list。
商品图片管理:维护商品图片的分页查询、新增、编辑、删除、批量删除,字段为商品ID、图片地址、排序;对应接口 /goods_image/page 等。
# 交易管理
订单明细管理:维护订单明细的分页查询(支持按商品标题搜索)、新增、编辑、删除、批量删除,字段为订单ID、商品ID、商品标题、商品图片、商品单价、购买数量、小计金额、创建时间;对应接口 /order_item/page 等。
支付记录管理:维护支付记录的分页查询、新增、编辑、删除、批量删除,字段为订单ID、支付流水号、支付方式、支付金额、支付状态、支付时间;对应接口 /payment/page 等。
# 互动与运营
收藏管理:维护收藏记录的分页查询、新增、编辑、删除、批量删除,字段为用户ID、商品ID、创建时间;对应接口 /favorite/page 等。
评论管理:维护评论的分页查询、新增、编辑、删除、批量删除,字段为商品ID、评论用户ID、评论内容、评分、创建时间;对应接口 /comment/page 等。
收货地址管理:维护收货地址的分页查询(支持按收货人姓名搜索)、新增、编辑、删除、批量删除,字段为用户ID、收货人姓名、收货人电话、省份、城市、区县、详细地址、是否默认;对应接口 /address/page 等。
系统公告管理:维护系统公告的分页查询(支持按公告标题搜索)、新增、编辑、删除、批量删除,字段为公告标题、公告内容;对应接口 /notice/page 等。
# 普通用户(USER)
# 账号与登录
登录:在 /login 选择"用户"角色并以 user 表账号登录,成功后写入 Token 与用户信息并跳转前台 /index。
注册:在 /register 选择"用户"类型,填写头像、用户名、密码、昵称注册。
找回密码:在 /retrievePassword 按手机号重置密码。
退出登录:前台右上角退出登录,清空 localStorage 并跳回 /login。
# 首页与商品
首页(商品列表):前台 /index 加载商品分类(/goods_category/list)并按分类筛选商品,商品以卡片形式展示封面图片、标题、价格、原价、新旧程度、浏览量,支持分页;请求 /goods/page 时携带 status: '上架' 参数。
商品详情:前台 /goods/detail/:id 展示封面图片、标题、价格、原价、新旧程度、库存、交易方式、所在位置、浏览量、商品状态("上架"显示为成功标签)与商品描述;状态为"上架"时才可点击"立即购买"。
# 个人中心
个人信息:前台 /personalCenter/profile 展示当前登录用户的用户名、昵称、邮箱、联系方式,并提供"编辑信息""修改密码"入口。
编辑信息:/editCurrentUser 修改自己的头像、邮箱、电话(用户名与昵称置灰不可改),保存后同步更新本地登录信息。
修改密码:/editPassword 输入旧密码与新密码修改密码,成功后清空本地登录态并跳转登录页。
商品评价(前台入口):在商品详情页可查看评价列表(/comment/list)并通过弹窗发表评价,表单包含评分(el-rate,默认 5 分)与评价内容,提交至 /comment/add。
收藏(前台入口):在商品详情页点击"收藏"按钮调用 /favorite/add 收藏商品、再次点击调用 /favorite/delete 取消收藏,按钮文案在"收藏/已收藏"之间切换。
# 功能权限对照表
| 功能模块 | 管理员(ADMIN) | 普通用户(USER) |
|---|---|---|
| 登录 / 注册 / 找回密码 | ✓ | ✓ |
| 后台管理界面(/admin/*) | ✓ | -(type === 'USER' 时自动跳回前台) |
| 后台首页 | ✓ | - |
| 前台界面(/index、/personalCenter) | -(type !== 'USER' 时自动跳转后台) | ✓ |
| 前台商品列表与商品详情 | - | ✓ |
| 商品评价 | 评论管理(分页/新增/编辑/删除/批量删除全部评论) | 查看评价列表、发表评价 |
| 商品收藏 | 收藏管理(分页/新增/编辑/删除/批量删除收藏记录) | 在商品详情页收藏 / 取消收藏 |
| 个人信息(查看与修改) | 仅自己的(/common/currentUser、/common/updateCurrentUser,非本人 ID 直接拒绝) | 仅自己的(同上) |
| 修改密码 | 仅自己的(校验原密码) | 仅自己的(校验原密码) |
| 重置他人密码 | ✓(/common/resetPassword,要求 type == 'ADMIN') | - |
| 管理员管理 | ✓(分页/新增/编辑/删除/批量删除) | - |
| 用户管理 | ✓(分页/新增/编辑/删除/批量删除) | - |
| 商家用户管理 | ✓(分页/新增/编辑/删除/批量删除) | - |
| 商品分类管理 | ✓(分页/新增/编辑/删除/批量删除) | -(仅可通过 /goods_category/list 读取分类用于前台筛选) |
| 二手商品管理 | ✓(分页/新增/编辑/删除/批量删除) | - |
| 商品图片管理 | ✓(分页/新增/编辑/删除/批量删除) | - |
| 订单明细管理 | ✓(分页/新增/编辑/删除/批量删除) | - |
| 支付记录管理 | ✓(分页/新增/编辑/删除/批量删除) | - |
| 收货地址管理 | ✓(分页/新增/编辑/删除/批量删除) | -(前台无收货地址页面) |
| 系统公告管理 | ✓(分页/新增/编辑/删除/批量删除) | -(前台无公告页面) |
| 文件上传(/file/upload) | ✓ | ✓(需携带 Token,非白名单接口) |
# 业务状态说明
说明:以下状态取值均来自 SQL 建表脚本的字段默认值与前端代码中的实际比对值;状态字段均为
VARCHAR自由文本,代码中未定义状态枚举常量与状态扭转接口。
商品状态(goods.status)
- 上架:
goods.status的默认值(DEFAULT '上架');前台首页请求/goods/page时携带status: '上架',商品详情页以status === '上架'判断"立即购买"按钮是否可用。
商家审核状态(merchant.status)
- 待审核:
merchant.status的默认值(DEFAULT '待审核');配合merchant.reject_reason(拒绝原因)字段在后台"商家用户管理"页面维护。
订单状态(order.order_status)
- 待支付:
order.order_status的默认值(DEFAULT '待支付');订单表另含支付时间、发货时间、完成时间、取消原因、订单备注等字段。
支付状态(payment.payment_status)
- 待支付:
payment.payment_status的默认值(DEFAULT '待支付');支付方式payment.payment_method默认值为"余额支付",订单表payment_method默认值同为"余额支付"。
收货地址默认标识(address.is_default)
- 否:
address.is_default的默认值(DEFAULT '否')。
其他字段默认值
- 商品库存:
goods.stock默认 1;浏览量:goods.view_count默认 0;评论评分:comment.rating默认 5;商品图片排序:goods_image.sort_order默认 0;商家余额/用户余额:merchant.balance、user.balance默认 0.00。
# 默认账号
说明:以下账号来自
project/sql/d_7_second_hand_trading_system.sql中的初始化INSERT语句,密码在数据库中为明文存储(varchar字段,登录接口直接做字符串比对,未做哈希加密)。
# 管理员
用户名: admin
密码: 123456
(所属表:admin,昵称:系统管理员,联系方式:13800000000,邮箱:admin@example.com)
2
3
# 测试用户
用户名: user
密码: 123456
(所属表:user,昵称:管理员,联系方式:13800000000,邮箱:user@qqq.com,余额:0.00)
2
3
备注:SQL 脚本仅包含以上两条账号初始化数据;
merchant(商家用户表)在脚本中没有初始化记录。管理员重置密码接口POST /common/resetPassword会将目标账号密码重置为123456。
# 核心业务流程
# 用户登录与角色分流流程
1. 打开 /login 页面,选择"管理员"或"用户"角色(对应 type = ADMIN / USER),输入用户名与密码。
2. 前端调用 POST /common/login,提交 {username, password, type}。
3. 后端 LoginAPIView 先校验 type 必须为 ADMIN 或 USER;ADMIN 查询 admin 表(AdminSerializer),USER 查询 user 表(UserSerializer)。
4. 未查到账号或密码字符串比对不一致,返回"用户名或者是密码错误"。
5. 校验通过后调用 create_token 生成 JWT(算法 HS256,payload = {id, username, type},有效期 60*24*30 分钟)。
6. 接口返回用户信息 + token + type;前端把 token 与 currentUser 写入 localStorage。
7. 前端按 type 跳转:USER → 前台 / ;ADMIN → 后台 /admin。
2
3
4
5
6
7
# 接口鉴权(JWT Token)流程
1. 前端 Axios 实例的请求拦截器从 localStorage 读取 token,写入请求头 token。
2. 请求进入 TokenInterceptorMiddleware,先判断路径是否命中精确白名单(/common/login、/common/register、/common/retrievePassword、/goods/uPage、/love、/goods/getGoodsByCategoryId、/category/list)。
3. 或命中前缀白名单(/uploads/、/static/、/swagger/、/django-admin/)时直接放行。
4. 未命中白名单时读取 HTTP_TOKEN 请求头,调用 get_payload 解析 JWT。
5. 解析成功则把 token、id、username、type 注入 request 对象,交由视图处理,视图中可通过 getattr(request, 'type', 'USER') 获取角色。
6. 解析失败或未携带 token 时返回 {"code": 401, "msg": "访问接口未授权,请重新登录"}。
7. 前端响应拦截器收到 code = 401 后清除本地 token、弹出错误提示并跳转 /login。
2
3
4
5
6
7
# 商品发布与浏览流程
1. 管理员进入后台"二手商品管理"(/admin/goods),点击"新增"填写商品标题、分类ID、封面图片、价格、原价、库存数量、商品描述、新旧程度、交易方式、所在位置、发布者ID、发布者类型、商品状态等字段。
2. 提交 POST /goods/add 写入 goods 表;商品状态默认取 SQL 默认值"上架",创建时间由通用 pre_save 信号自动填充。
3. 编辑商品调用 PUT /goods/update;删除与批量删除由前端调用 DELETE /goods/delBatch(删除前弹窗二次确认)。
4. 前台首页 /index 调用 GET /goods_category/list 加载全部分类,点击分类后调用 GET /goods/page 传 pageNum 与 status: '上架' 分页加载商品。
5. 点击商品卡片跳转 /goods/detail/:id,调用 GET /goods/detail?id= 加载商品详情,并按 status === '上架' 决定"立即购买"按钮是否可用。
6. 前端详情页在加载详情后还会请求 POST /goods/addView 记录浏览;后端 apps/goods/urls.py 目前仅注册 page、list、add、update、delete、detail 六个路由。
2
3
4
5
6
# 商品评价与收藏流程
1. 用户进入商品详情页,页面调用 GET /comment/list 加载评价列表,并使用只读 el-rate 展示每条评价的评分。
2. 点击"发表评价"打开弹窗,填写评分(el-rate,默认 5 分)与评价内容,提交 POST /comment/add(goods_id、rating、content)写入 comment 表。
3. 提交成功后关闭弹窗并重新加载评价列表。
4. 点击"收藏"按钮调用 POST /favorite/add(携带 goods_id)写入 favorite 表,按钮变为"已收藏"。
5. 再次点击"已收藏"调用 DELETE /favorite/delete 取消收藏,按钮恢复为"收藏"。
6. 页面加载时前端还会请求 GET /favorite/check 判断当前收藏状态;后端 apps/favorite/urls.py 目前仅注册 page、list、add、update、delete、detail 六个路由。
2
3
4
5
6
# 技术说明
# 系统架构
- 前端:Vue ^3.4.29 + Element Plus ^2.8.4 + Vite ^5.3.1(另含 Axios ^1.7.5、Pinia ^2.2.2、vue-router ^4.4.3)
- 后端:Django ~3.2(settings 由 Django 3.2.20 生成)+ Django REST Framework ~3.14.0
- 数据库:MySQL 8.0(库名
d_7_second_hand_trading_system,字符集 utf8mb4,排序规则 utf8mb4_unicode_ci) - 认证:自定义 JWT Token(PyJWT 2.7.0,HS256,请求头
token) - 接口文档:drf-yasg 1.21.7(Swagger)
- 跨域:django-cors-headers 4.2.0(允许所有域名、允许携带 Cookie,允许请求头包含
token)
# 访问地址
- 后端API:http://127.0.0.1:8000(前端
.env.development中VITE_APP_API_URL='http://127.0.0.1:8000') - Swagger文档:http://127.0.0.1:8000/swagger/
- Django管理后台:http://127.0.0.1:8000/django-admin/
- 前端页面:http://localhost:5173(开发环境,
cd project/frontend && npm run dev)
# 数据库
- 数据库名:
d_7_second_hand_trading_system - 字符集:utf8mb4(排序规则 utf8mb4_unicode_ci)
- 总表数:13 张表(admin、user、merchant、goods_category、goods、goods_image、order、order_item、payment、favorite、comment、address、notice)
- 表与模块对应:13 张表中 12 张有对应的 Django 模型与接口模块;
order(订单表)目前没有对应的 Django App 与接口,order_item(订单明细)与payment(支付记录)模块为独立模块。
| 表名 | 说明 | 对应后端模块 |
|---|---|---|
| admin | 管理员表 | apps.admin |
| user | 用户表(含 balance 余额字段) | apps.user |
| merchant | 商家用户表(含审核状态与余额) | apps.merchant |
| goods_category | 商品分类表 | apps.goods_category |
| goods | 二手商品表 | apps.goods |
| goods_image | 商品图片表 | apps.goods_image |
| order_item | 订单明细表 | apps.order_item |
| payment | 支付记录表 | apps.payment |
| favorite | 收藏表 | apps.favorite |
| comment | 评论表 | apps.comment |
| address | 收货地址表 | apps.address |
| notice | 系统公告表 | apps.notice |
| order | 订单表 | 无对应模块(仅 SQL 建表) |
# API接口规范
RESTful风格(各业务模块统一注册以下 6 个地址):
GET /{module}/page # 分页查询
GET /{module}/list # 全量列表(不分页)
POST /{module}/add # 新增
PUT /{module}/update # 更新
DELETE /{module}/delete # 批量删除(请求体直接传 ID 数组)
GET /{module}/detail?id= # 查询详情
公共接口:
POST /common/login # 登录
PUT /common/register # 注册
POST /common/retrievePassword # 找回密码
GET /common/currentUser # 当前用户信息
POST /common/updateCurrentUser # 更新当前用户信息
POST /common/updatePassword # 修改密码
POST /common/resetPassword?type=&id= # 重置密码(管理员)
POST /file/upload # 文件上传
分页参数:pageNum(页码,从 1 开始)
分页大小:由后端 settings.PAGE_SIZE = 10 固定控制,接口不读取 pageSize 参数
响应格式:
{
"code": 200,
"msg": "操作成功",
"data": {...}
}
(失败时 code = 500、msg 为错误描述;未授权时 code = 401)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
说明:前端管理页面调用的批量删除地址为
/{module}/delBatch,而后端apps/*/urls.py中注册的删除路由为/{module}/delete;/user模块另注册了save(新增/编辑)与delete两个地址。
# 系统特色
# 富文本编辑
- 组件:
frontend/src/components/MyEditor.vue(基于@wangeditor/editor^5.1.14 与@wangeditor/editor-for-vue^5.1.12 封装)。 - 支持功能:完整工具栏(Toolbar)+ 编辑区(Editor),内容变更时通过
content-change事件向父组件回传 HTML;内置图片与视频上传配置(上传地址/file/upload,请求头携带 token,customInsert回填res.data.url),视频上传maxFileSize配置为100 * 1024 * 1024。 - 使用情况:
frontend/src/views/admin/Admin.vue与frontend/src/views/admin/User.vue中引入了该组件;其余页面(如二手商品管理的商品描述)使用普通输入框录入。
# 文件上传
- 单文件限制:
settings.py中未配置上传大小限制;前端MyUpload.vue通过limit参数限制上传数量(默认 100,头像等字段使用:limit="1",超出时会自动替换旧文件);MyEditor.vue的视频上传限制为100 * 1024 * 1024。 - 支持格式:由前端组件的
accept决定——imageCard/image为image/*,video为video/*,audio为audio/*,file类型不做限制;后端FileUploadAPIView未对扩展名做校验,保留原文件扩展名。 - 存储方式:后端
POST /file/upload接收request.FILES['file'],用uuid4()+ 原扩展名生成唯一文件名,保存到settings.UPLOAD_PATH(值为"uploads\\",即项目根目录下的uploads目录,目录不存在时自动创建)。 - 访问格式:
settings.HTTP_PICTURE = "http://127.0.0.1:8000/uploads/",接口返回{"name": 原文件名, "url": HTTP_PICTURE + 唯一文件名},例如http://127.0.0.1:8000/uploads/xxxxxxxx.png;开发环境同时通过static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)提供/uploads/静态访问。