# 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 报错),网络层错误单独兜底提示。

# ✨ 项目亮点

# 一、 业务功能亮点

  1. 校园二手交易业务全覆盖:围绕二手交易提供商品分类、二手商品、商品图片、订单明细、支付记录、收藏、评论、收货地址、系统公告 9 个业务模块,每个模块均提供分页查询、新增、更新、批量删除、详情、全量列表 6 类接口。
  2. 管理员与普通用户双角色管理:登录接口按前端传入的 type 分别查询 admin 表(管理员)与 user 表(普通用户),角色信息写入 JWT 并贯穿前后端鉴权与界面分流。
  3. 商品状态与商家审核字段:goods.status 默认值为"上架",前台首页与详情页据此筛选和判断"立即购买"是否可用;merchant 表提供 status(默认"待审核")与 reject_reason(拒绝原因)字段,后台"商家用户管理"页面可维护审核状态与拒绝原因。
  4. 账号与个人中心闭环:提供注册、登录、找回密码(按手机号重置)、当前用户信息查询与修改、修改密码(校验原密码)、管理员重置密码(重置为 123456)等账号功能。
  5. 图片/文件统一上传能力:/file/upload 接口配合前端 MyUpload.vue 组件,支持头像、商品图片、营业执照等图像字段的上传、预览、替换与删除,上传结果以完整 URL 回填表单字段。

# 二、 技术实现亮点

  1. 现代化前端技术栈:采用 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 等依赖。
  2. 稳定可靠的后端架构: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。
  3. 完善的数据库设计:13 张核心表,全部使用逻辑外键关联、不建物理外键;模型统一 managed = False 映射既有表,通用 pre_save 信号自动填充创建时间;接口分页大小统一由 settings.PAGE_SIZE = 10 控制。
  4. 务实的第三方集成:集成 django-cors-headers(允许所有域名跨域、允许携带 Cookie、请求头白名单包含 token)、drf-yasg(/swagger/ 接口文档)、PyJWT(Token 签发与解析)、wangEditor(富文本编辑器组件)、ECharts(已列入前端依赖)。
  5. 安全性设计:请求头 token 传递 JWT(HS256 + Django SECRET_KEY 作为密钥)、中间件对所有非白名单接口统一校验并注入用户上下文、Token 失效/缺失统一返回 401 并由前端自动跳转登录页、上传文件使用 uuid4 重命名避免重名覆盖、修改个人信息/密码时校验操作者必须为本人(user_id != request.id 直接拒绝)、重置密码接口仅允许 type == 'ADMIN' 调用。

# 三、 用户体验亮点

  1. 双界面设计:后台 AdminLayout.vue 提供侧边菜单式管理界面(首页、管理员管理、用户管理、商家用户管理、商品分类管理、二手商品管理、商品图片管理、订单明细管理、支付记录管理、收藏管理、评论管理、收货地址管理、系统公告管理),前台 FrontLayout.vue 提供顶部导航式用户界面(首页、个人中心),两套界面互不干扰。
  2. 响应式布局:FrontLayout.vue 与 PersonalCenter.vue 均包含 @media (max-width: 768px) 断点样式(小屏隐藏用户名文字与菜单文字);PersonalCenter.vue 使用 :xs / :sm / :md 栅格自适应;前台首页商品列表使用 grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)) 自适应列数。
  3. 交互优化:
    • 友好的加载提示和错误提示:ElMessage.error 提示加载失败,Axios 拦截器对 401/404/500/502/503 与网络错误分类提示。
    • 重要操作的确认弹窗:删除前使用 ElMessageBox.confirm 二次确认(提示"此操作将永久删除 ID 为 [...] 的数据")。
    • 及时的全局消息提示:登录、注册、修改、新增、编辑、删除等操作成功后统一 ElMessage 成功提示。
    • 严谨的前后端表单验证:前端 el-form 的 rules/:rules 校验必填项,后端 DRF 序列化器 is_valid() 二次校验,失败返回统一错误响应。
  4. 文件上传体验: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)
1
2
3

# 测试用户

用户名: user
密码: 123456
(所属表:user,昵称:管理员,联系方式:13800000000,邮箱:user@qqq.com,余额:0.00)
1
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。
1
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。
1
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 六个路由。
1
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 六个路由。
1
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)
1
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/ 静态访问。
Java导航网   |