项目整体总结
这是一套Golang + GORM + Gin 实现的安卓应用市场后端管理系统,配套单页 HTML 前端,采用经典分层架构:model数据模型 → repository仓储层 → service业务层 → handler控制器层,使用 JWT 鉴权,支持管理员、普通用户两套身份体系。
一、技术栈
- 后端 :Go、Gin、GORM、MySQL,bcrypt 密码加密、JWT 身份认证;APK 解析依赖
androidbinary库,实现 APK 解析、图标提取。 - 前端:原生 HTML+JavaScript,wangEditor5 富文本编辑器;无框架,单页面 SPA,省市级联选择。
- 存储:本地文件存储 APK、图标、图片视频;自定义静态文件处理器支持 HTTP‑Range 断点续传,防路径穿越。
二、数据库模型(核心数据表)
表格
| 表 | 用途 |
|---|---|
admin |
管理员账号,密码 bcrypt 哈希,token_version用于密码修改后作废旧 token |
user |
普通注册用户,支持上传权限限制,同样有token_version字段 |
app_info |
应用主表,记录应用名称、包名、审核状态、上下架状态、上传者信息、省市、强制下架理由 |
app_version |
应用版本表,一个应用多条版本,存储 APK 地址、版本号、文件大小,复合唯一索引防止同应用重复版本号 |
comment |
评论评分表,支持顶级评论 + 跟评,跟评不计入评分统计 |
download_log |
下载行为记录表,统计下载次数,每次下载写入记录 |
tag |
分类标签表,支持标签审核,管理员直接通过,普通用户创建需要审核,标签重命名同步更新应用分类快照 |
upload_appeal |
上传权限申诉表,被限制上传的用户提交申诉,管理员审批,通过解除限制 |
site_stat |
站点统计表,仅一条记录记录网站 PV 访问量 |
关键业务常量
- 应用状态:上下架(0 下架 / 1 上架);审核状态
draft草稿/pending待审核/approved已通过/rejected已拒绝,必须审核通过才可上架。 - 标签、申诉同样拥有 pending/approved/rejected 审核状态。
- JWT 中携带
token_version,修改 / 重置密码版本号 + 1,旧令牌直接失效,无需等待过期。
三、四层后端架构
1.model 层
定义 gorm 结构体、字段约束、索引、表名、状态常量;不写业务逻辑。
2.repository 仓储层
只做数据库操作,CRUD、事务、复杂 SQL。
- 事务场景:新建应用同时创建版本;删除应用事务级删除评论、下载记录、版本;
- 批量查询避免 N+1:批量统计下载量、批量评分统计;
- UNION 查询合并
admin+user作为上传者列表; - 原子更新:
token_version自增、PV 访问量自增。
3.service 业务层,实现核心业务规则
- 管理员业务:服务启动检测 admin 表为空,读取配置自动初始化超级管理员账号。
- 应用上传业务
- 用户上传:普通用户上传新应用,包名校查重;管理员豁免包名校验;
- APK 处理:保存文件、解析包名 / 版本、提取图标;失败自动清理磁盘孤儿文件,避免残留垃圾文件;
- 新建应用默认
draft草稿+下架;用户需要提交申请上架进入 pending 待审核队列; - 已审核通过的应用上传新版本,会自动置为待审核、强制下架,需要管理员重新审核;
- 审核业务
- 管理员审核通过:自动上架;
- 管理员拒绝:下架,记录拒绝意见;
- 管理员可强制上架应用下架,填写强制下架理由;
- 权限体系
- 用户上传可被管理员限制;被限制用户无法上传 APK,可提交申诉;管理员审批申诉通过解除限制;
- 用户注销 / 管理员删除用户:级联删除用户全部应用、版本、静态文件、评论、下载记录、申诉记录;
- 标签业务:管理员创建标签直接通过,普通用户创建标签进入待审核;标签删除自动清空应用对该标签的引用;重命名同步更新应用分类快照。
- 密码逻辑 :修改密码、重置密码都会
token_version+1,所有旧登录令牌失效。
4.handler 控制器层
接收 http 请求,参数校验,调用 service,统一返回util.Success/Fail包装的 JSON 响应; 中间件:
JWTAuth:仅允许管理员访问接口;LoginAuth:管理员、登录普通用户都可以访问;- 跨域中间件 CORS;
- 自定义静态资源服务,支持断点续传 apk 文件。
四、主要接口分组
- 公开接口(游客访问)
- 用户注册、统一登录;
- 获取上架应用列表、应用详情;提交评论;获取下载地址;站点统计;获取已审核标签列表。
- 登录用户接口(admin/user 均可)
- 修改密码、查看个人资料;
- 上传新应用、更新版本;
- 我的应用:编辑信息、申请上架、手动下架;
- 创建标签、提交上传权限申诉;富文本图片、视频上传。
- 管理员专属接口
- 管理员登录;
- 全部应用管理:分页查询、编辑、强制下架、删除(仅下架应用允许删除);
- 审核队列:应用审核通过 / 拒绝;
- 用户管理:查看全部上传者列表,重置密码,限制上传,删除用户;
- 标签完整管理:审核、重命名、删除标签;
- 申诉审批:处理用户上传权限申诉。
五、前端 SPA 页面(index.html + js 脚本)
纯前端页面,无框架,localStorage 存储 token、角色信息。 页面视图:市场首页、我的应用、用户管理、管理员全部应用、应用审核队列、标签管理、申诉审批、应用详情。 弹窗组件:登录注册、修改密码、上传 APK、编辑应用、重置密码、权限设置、申诉提交等弹窗;
- wangEditor 富文本编辑器,禁用本地上传,仅粘贴网络图片视频链接;
- 省市级联下拉选择省份城市;
- 列表分页组件,支持页码跳转;
- 下载逻辑:获取后端 apk 静态地址,浏览器原生下载。
六、重点安全 & 设计亮点
- 令牌版本控制:密码变更直接作废全部旧会话,不依赖 token 过期时间;
- 孤儿文件清理:APK 上传流程中,磁盘写入后业务逻辑失败,自动删除已写入的 apk/icon,不产生垃圾静态文件;
- 静态文件防护:自定义静态处理器,防御路径穿越攻击,支持断点续传;
- 事务保证数据一致性:删除应用时数据库层面事务删除关联数据;静态文件尽力删除,不阻断数据库操作;
- 权限校验分层:中间件鉴权 + service 层再次校验操作者身份(防止绕过前端);
- 批量聚合查询:列表查询下载、评分使用批量 SQL,避免循环 N+1 数据库查询;
- 业务状态强约束:必须审核通过才能上架;只有下架应用允许删除;版本更新触发重审核;
- 跨表用户名查重:注册普通用户时同时校验 admin 表,防止用户名冲突。
七、启动流程(main.go)
- 读取 yaml 配置;
- 初始化 MySQL,自动创建数据库;gorm 自动迁移建表;
- 依赖注入,组装 repository→service→handler;
- 如果 admin 表为空,读取配置初始化超级管理员;
- 存量应用回填上传者信息;
- 注册路由、中间件;启动 http 服务。
八、业务限制点
- 普通用户被限制上传后不能上传 APK,只能提交申诉;
- 应用删除:只有下架状态才允许删除;
- 用户不能直接上架应用,必须提交审核,管理员审核通过自动上架;用户仅可以执行下架操作;
- 更新已通过审核应用的版本,新版本会变为待审核并且下架,需要管理员重新审核。
- 标签:普通用户创建标签,需要管理员审核才能使用。