# java前后端分离社区论坛系统 **Repository Path**: makesoft/bbs ## Basic Information - **Project Name**: java前后端分离社区论坛系统 - **Description**: 当前分支后端springboot-2.7.5+mybatis-plus-3.5.5 + mybatis-plus-join 前端 nuxt3 + vue3 + elementPlus + tailwindcss + pinia nodejs版本推荐 * 18.20.5 演示地址http://www.makesoft.cn QQ交流群:64240406 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: http://www.makesoft.cn - **GVP Project**: No ## Statistics - **Stars**: 50 - **Forks**: 9 - **Created**: 2021-09-16 - **Last Updated**: 2026-11-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: nuxt3, vue3, SpringBoot, mybatis-plus, mybatis-plus-join ## README # MakeSoft BBS · 软件编程开发者社区 > 一套面向软件编程开发者的**知识分享 + 社区互动 + 资源付费**全站系统:Java 后端双服务 + PC 前台 + 管理后台 + 移动端四端齐全,内置文章/资源/问答/面经/动态/影视/商城/任务/抽奖/工作流等 20+ 业务域。 - 在线演示: - 管理后台: - 源码仓库:`https://gitee.com/makesoft/bbs.git` - 技术交流 QQ 群:64240406 --- ## 目录 - [界面预览](#界面预览) - [功能全景](#功能全景) - [技术栈](#技术栈) - [系统架构](#系统架构) - [目录结构](#目录结构) - [端口与请求链路](#端口与请求链路) - [快速开始(本地开发)](#快速开始本地开发) - [生产部署](#生产部署) - [数据库](#数据库) - [配置与环境变量](#配置与环境变量) - [开发规范](#开发规范) - [常见问题](#常见问题) - [许可证](#许可证) --- ## 界面预览 ### PC 前台 | 首页(浅色) | 首页(暗色,按时段自动切换) | |---|---| | ![首页](readme/images/pc-01-home.jpg) | ![首页暗色](readme/images/pc-02-home-dark.jpg) | | 资讯中心 `/list` | 文章详情(正文 + 代码高亮 + 目录) | |---|---| | ![资讯中心](readme/images/pc-03-news.jpg) | ![文章详情](readme/images/pc-04-article.jpg) | | 问答 `/question` | 面经题库 `/code` | |---|---| | ![问答](readme/images/pc-05-question.jpg) | ![面经](readme/images/pc-06-code.jpg) | | 资源下载 `/resource` | 影视 `/media` | |---|---| | ![资源](readme/images/pc-07-resource.jpg) | ![影视](readme/images/pc-08-media.jpg) | | 商城 `/mall` | 动态 `/moment` | |---|---| | ![商城](readme/images/pc-09-mall.jpg) | ![动态](readme/images/pc-10-moment.jpg) | | 专题 `/subject` | 会员中心 `/vip` | |---|---| | ![专题](readme/images/pc-11-subject.jpg) | ![会员](readme/images/pc-12-vip.jpg) | | 任务广场 `/task` | 站内热榜 `/hot` | |---|---| | ![任务广场](readme/images/pc-13-task.jpg) | ![热榜](readme/images/pc-14-hot.jpg) | | 幸运抽奖 `/lucky` | 分类导航 `/sort` | |---|---| | ![抽奖](readme/images/pc-15-lucky.jpg) | ![分类导航](readme/images/pc-16-sort.jpg) | | 全站时间线 `/time` | 版本与价格 `/version` | |---|---| | ![时间线](readme/images/pc-17-time.jpg) | ![版本与价格](readme/images/pc-18-version.jpg) | | 关于 / 留言板 `/about` | 赞助榜 `/sponsor` | |---|---| | ![关于](readme/images/pc-19-about.jpg) | ![赞助](readme/images/pc-20-sponsor.jpg) | | 聊天室 `/chat`(WebSocket :8608) | |---| | ![聊天室](readme/images/pc-21-chat.jpg) | ### 管理后台 | 工作台(版本信息 / 今日数据 / 常用功能 / 访问量趋势) | |---| | ![工作台](readme/admin/admin-dashboard.png) | | 文章管理列表 | 文章添加/编辑(富文本 + 可见性设置) | |---|---| | ![文章管理](readme/admin/admin-article-list.png) | ![文章编辑](readme/admin/admin-article-edit.png) | | 审批流设计器(Flowable) | 网站信息设置 | |---|---| | ![流程设计](readme/admin/admin-flow-designer.png) | ![网站设置](readme/admin/admin-site-setting.png) | > 另有 `readme/` 根目录下的历史截图(旧版界面,含付费可见 / 密码可见 / 登录可见三种文章形态、面经筛选等),保留备查。 --- ## 功能全景 ### 内容域 | 业务 | 前台 | 后台 | 说明 | |---|---|---|---| | 文章资讯 | `/list`、`/information/*` | 文章 / 栏目 / 标签 | 六级可见性(`visit_auth`):公开、登录后可见、评论后可见、输入密码可见、会员可见、付费可见;富文本与 Markdown 双编辑器;评论、点赞、收藏、打赏、阅读量统计 | | 资源下载 | `/resource` | 资源管理 | 电子书 / 压缩包 / 安装包 / 源码等类型,多网盘线路,下载按积分扣费,带审核流 | | 问答 | `/question` | 问答管理 | 提问 / 回答 / 采纳 / 待回答,热门回答侧栏 | | 面经题库 | `/code` | 面经管理 | 公司 / 岗位 / 难度多维筛选,试卷下载,支持外部数据批量导入 | | 图文动态 | `/moment` | 动态管理 | 类朋友圈发布,关注流(follow feed)分发 | | 视频教程 | `/media` | 影视管理 | 剧集 / 分集、m3u8 播放、逐集播放进度记录 | | 专题 | `/subject` | 专题管理 | 章节聚合,章节可独立设置发布状态 | | SEO | sitemap / robots / og | 站点设置 | 百度主动推送、结构化数据(JSON-LD)、按页 SEO 元信息 | ### 社区与增长 | 业务 | 前台 | 后台 | 说明 | |---|---|---|---| | 社区任务广场 | `/task` | 任务管理 | 多步骤任务(`step_config`),完成进度实时展示,达标发放积分 / 签到卡 / 勋章 | | 签到 | 侧栏签到卡 | 签到配置 | 当月日历视图、翻月查看、补签卡(有效期与窗口天数后台可配) | | 抽奖 | `/lucky` | 抽奖管理 | 自绘转盘,四表模型(活动 / 奖品 / 规则 / 记录),概率与库存控制 | | 积分与会员 | `/vip` | 会员 / 套餐 | 积分获取消耗明细、会员折扣、等级与成长 | | 勋章 | `/medal/:userUid` | 勋章管理 | 勋章墙,用户主页展示 | | 通知中心 | `/user/notice` | — | per-row 已读、未读角标,评论 / 点赞 / 关注 / 收藏 / 审核事件触发 | | 聊天室 | `/chat` | — | Netty WebSocket 实时房间消息,历史落库分页 | | 站内热榜 | `/hot` | — | 多域聚合排行 | | 全站时间线 | `/time` | — | 按日期归档全站内容 | | 分类导航 | `/sort` | 栏目 / 分类 | 树形聚合入口 | | 投稿中心 | `/publish/*` | 审核 | 文章 / 动态 / 问答 / 资源 / 商品 / 面经六类统一投稿入口 | | 留言板 / 关于 / 版本价格 / 赞助 | `/messageBoard`、`/about`、`/version`、`/sponsor` | 对应配置 | 赞助榜、版本与定价说明 | ### 交易与平台 | 业务 | 说明 | |---|---| | 商城 | 商品 / 规格 / 轮播 / 订单 / 发货,源码与资源交易 | | 支付 | 微信支付、支付宝、云购OS 代理商户号;异步回调、退款链路、领域事件驱动 | | 财务 | 充值、提现、账单流水、资金统计 | | 存储引擎 | 本地 / 七牛 / 阿里云 OSS / 腾讯云 COS 四驱动统一抽象,上传、第三方头像镜像、Excel 导出、流程附件全部走引擎 | | 凭据管理 | 登录与支付凭据统一收敛到 `la_secret_config`,按字段回退旧表,后台三渠道页双写镜像 | | 工作流 | Flowable 6.8 审批流设计器、流程列表 / 实例 / 待办任务 | | 权限 | Sa-Token + 管理员 / 角色 / 菜单 / 部门 / 岗位,接口级权限码 fail-close | | 页面装修 | 后台拖拽装修首页组件(含签到卡等自定义组件注册表) | | 领域事件 | 内容域变更发布事件 → 落库订阅者 → 后台流水审计 | | 系统运维 | Quartz 定时任务、服务器监控(OSHI)、登录日志、操作日志、代码生成器 | | 移动端 | uni-app 24 个页面,一套代码出 H5 / 微信小程序 / App | --- ## 技术栈 ### 后端 | 分类 | 选型 | 版本 | |---|---|---| | 语言 / 运行时 | Java | 11 | | 主框架 | Spring Boot | 2.7.5(依赖统一由 `spring-boot-dependencies` BOM 管理) | | 构建 | Apache Maven 多模块 reactor | 3.8.x | | ORM | MyBatis-Plus | 3.5.5 | | 连表查询 | MyBatis-Plus-Join | 1.4.13 | | 分页 | PageHelper | 1.4.5 | | 认证鉴权 | Sa-Token(+ redis 集成) | 1.32.0 | | 工作流 | Flowable | 6.8.0 | | 定时任务 | Quartz | 2.3.2 | | 实时通信 | Netty(`netty-handler` + `netty-codec-http`,自建 WebSocket 服务) | Boot BOM 管理 | | 微信生态 | WxJava | 4.4.0 | | 第三方登录 | JustAuth | 1.15.1 | | 支付 | IJPay / 云购OS SDK | 2.8.1 / 2.0.29 | | 对象存储 | 七牛 / 阿里 OSS / 腾讯云 COS SDK | 7.17.0 / 3.10.2 / 5.6.54 | | Excel | EasyExcel | 3.1.3 | | 工具集 | Hutool / Commons-Lang3 / Commons-IO / Gson | 5.8.22 / 3.12.0 / 2.11.0 / 2.9.0 | | JSON | FastJSON2(1.x 使用去 autoType 变体) | 2.0.58 / 1.2.83_noneautotype | | Markdown | Flexmark | 0.62.2 | | 验证码 | Kaptcha | 2.3.2 | | 系统监控 | OSHI | 6.1.2 | | IP 归属 | ip2region | 2.6.5 | | API 文档 | Springfox Swagger2 | — | | 日志 | Log4j2(`spring-boot-starter-log4j2`,版本随 BOM) | 2.17.2+ | | 数据库 | MySQL | 8.0+(驱动 8.0.33) | | 缓存 | Redis | 6+ / 7.x | ### 前端 | 端 | 框架 | 关键依赖 | |---|---|---| | PC 前台 `pc/` | Nuxt 3.6.5 + Vue 3 + TypeScript 5.3 | Element Plus 2.4.3、TailwindCSS(`@nuxtjs/tailwindcss` 6.8.0)、Pinia 2.2 + `@pinia/nuxt` 0.4.11、Vditor 3.8 / mavon-editor、video.js 7、highlight.js 11、DOMPurify 3 / xss、spark-md5(分片上传)、nuxt-lodash、vite-plugin-svg-icons | | 管理后台 `admin/` | Vue 3.4 + Vite 3 + TypeScript | Element Plus 2.14、Pinia 2.2、Vue Router 4.4、Axios 0.27、ECharts 5.5 / vue-echarts 6、wangEditor 5、vuedraggable、vue-clipboard3、VueUse、unplugin-auto-import / components、ESLint + Prettier + Stylelint + lint-staged + commitizen | | 移动端 `uniapp/` | uni-app(Vue 3 + Vite,CLI 工程) | `@dcloudio/uni-*` 全家桶、pinia、z-paging、uniapp-router-next、vue-i18n、weixin-js-sdk、vconsole | 三端共用同一份 HTTP 响应契约:[`shared-http-contract.ts`](shared-http-contract.ts)(仓库根)。 --- ## 系统架构 ``` ┌──────────────────────────────────────────────────────────────┐ │ 浏览器 / 微信小程序 / App │ └─────────────────────────────┬────────────────────────────────┘ │ https://www.makesoft.cn ┌─────────────────────────────▼────────────────────────────────┐ │ nginx 80 / 443 —— 全站唯一对外入口 │ │ TLS · 静态资源 · 路径分发 · 上传体积按路径放开 │ │ 配置:pc/nginx/makesoft.conf(CORS 统一由后端负责) │ └────┬──────────────┬────────────────┬─────────────────┬───────┘ │ / │ /api/ │ /adminapi/ │ /admin/ ┌────▼─────────┐┌───▼──────────────┐┌▼───────────────┐┌▼─────────────┐ │ pc ││ make-front ││ make-admin ││ admin dist │ │ Nuxt SSR ││ Spring Boot ││ Spring Boot ││ 纯静态文件 │ │ :3000 ││ :8084 ctx=/api ││ :8082 ││ │ │ ││ └ Netty WS ││ ctx=/adminapi ││ │ │ ││ :8608 (/ws) │└┬───────────────┘└──────────────┘ └──────────────┘└───────┬──────────┘ │ │ │ ┌──────────▼────────────▼──────┐ │ MySQL 8.0 · Redis │ └──────────────────────────────┘ ``` ### Maven 模块依赖 ``` make-utils 通用工具(不依赖任何业务模块) └─ make-base 基础层:系统实体、Sa-Token 配置、CRUD 基类 └─ make-common 公共业务层:存储引擎、支付、微信、通知、领域事件、Quartz、日志 ├─ make-bo 业务对象 / 领域模型 ← make-front 依赖它 ├─ make-flow Flowable 工作流封装 ┐ make-admin ├─ make-generator 代码生成器 ┘ 依赖 bo + flow + generator ├─ make-front 前台接口应用(可执行 jar,:8084 /api,内含 Netty WS :8608) └─ make-admin 后台接口应用(可执行 jar,:8082 /adminapi) ``` 可执行应用只有两个:`make-front`、`make-admin`(各自带 `spring-boot-maven-plugin` 与 `@SpringBootApplication`);`make-flow` / `make-generator` 作为库被 `make-admin` 引用。 --- ## 目录结构 ``` bbs/ ├── server/ # Spring Boot 多模块(Maven reactor,parent: cn.makesoft:makesoft-java) │ ├── pom.xml # 版本与依赖统一管理 │ ├── make-utils/ # 工具层 │ ├── make-base/ # 基础层(实体、鉴权、CRUD 基类) │ ├── make-common/ # 公共业务层(存储 / 支付 / 微信 / 通知 / 事件 / 任务) │ ├── make-bo/ # 业务对象层 │ ├── make-flow/ # Flowable 工作流 │ ├── make-generator/ # 代码生成器 │ ├── make-front/ # 前台接口应用 :8084 context-path=/api │ └── make-admin/ # 后台接口应用 :8082 context-path=/adminapi │ ├── pc/ # PC 前台(Nuxt 3,SSR 可选) │ ├── pages/ # 46 个路由页面 │ ├── layouts/ # 布局:header(两态顶栏)/ sidebar / footer │ ├── components/ # 业务组件(Pc* 前缀为本站自研组件) │ ├── api/ # 按域拆分的接口层 │ ├── stores/ # Pinia(app / user / …) │ ├── composables/ # 组合式函数(useHeaderState / usePageSeo / useJsonLd …) │ ├── middleware/ plugins/ # 路由中间件、客户端插件 │ ├── assets/styles/ # 设计令牌与全局样式(theme.css) │ ├── server/ # Nitro 服务端路由(sitemap、robots 等) │ ├── nginx/makesoft.conf # 生产 nginx 单文件配置(全站唯一入口) │ ├── scripts/ # 构建辅助脚本 │ └── .env.{development,production} │ ├── admin/ # 管理后台(Vue 3 + Vite) │ └── src/{api,views,components,layout,router,stores,hooks,utils,config,enums} │ views/ 按域分:article resource question problem moment media shop │ finance consumer user organization permission setting │ decoration material channel app message lucky task │ flow workbench account dev_tools template │ ├── uniapp/ # 移动端(uni-app CLI,24 页,src/ 为工程根) │ ├── sql/ │ └── install.sql # 唯一 DDL 来源:建表 + 索引 + 种子数据(156 张表) │ ├── docker/ │ ├── docker-compose.yml # 开发/构建容器:maven · mysql 8.0.36 · redis 7.0.4 · node 18.20.5 │ └── config/mysql/mysqld.cnf │ ├── deploy/ │ ├── build.sh # 服务器就地构建:git pull → 构建 → stage │ ├── release.sh # 原子发布:备份 → 替换 → 重启 → 体检 → 失败回滚 │ ├── toolchain.sh # JAVA_HOME / PATH / MAVEN_OPTS / NODE_OPTIONS │ ├── maven-settings.xml # 阿里云镜像 │ └── DEPLOY.md # 发布手册(详细版) │ ├── scripts/ # 数据导入等一次性脚本 ├── readme/ # 文档图片(images/ 前台、admin/ 后台) ├── shared-http-contract.ts # 三端共用的 HTTP 响应契约 ├── local-secret.properties # 本地密钥(已 gitignore,绝不提交) └── LICENSE # Apache-2.0 ``` --- ## 端口与请求链路 | 端口 | 组件 | 说明 | |---|---|---| | 80 / 443 | nginx | 全站唯一对外入口,按路径分发 | | 3000 | pc(Nuxt SSR / Nitro) | `location /` → `pc_backend` | | 8084 | make-front | `location ^~ /api/` → `front_backend`,context-path `/api` | | 8082 | make-admin | `location ^~ /adminapi/` → `admin_backend`,context-path `/adminapi` | | 8608 | Netty WebSocket | `location ~ ^/ws(/\|$)` → `ws_backend` | | — | admin 前端 | 构建产物为静态文件,`location ^~ /admin/` 由 nginx 直出 | | 3306 / 6379 | MySQL / Redis | 容器内网(`makesoft` bridge),默认不向宿主机映射 | 要点: - 上传路径(`/api/uploads/`、`/api/static/`、`/adminapi/uploads/`)单独设 location,`client_max_body_size` 按路径放开。 - CORS 只在后端 `WebMvcConfig` 配置,nginx **故意不加**,避免两处冲突导致响应头重复。 - `pc/.env.production` 里的 `NUXT_INTERNAL_API_URL` 只给服务端自请求(sitemap)走容器名,不能填公网地址,否则会下发到浏览器造成跨域。 --- ## 快速开始(本地开发) ### 环境要求 | 工具 | 版本 | |---|---| | JDK | 11(11 以上未验证,`maven.compiler.source/target=11`) | | Maven | 3.8+ | | MySQL | **8.0+**(`install.sql` 含 `utf8mb4_0900_ai_ci` 等 8.0 专属标记,5.7 导不进去) | | Redis | 6+ / 7.x | | Node.js | 18.20.5(与 `docker/docker-compose.yml` 的 node 镜像一致) | | npm 镜像 | 建议 `https://registry.npmmirror.com` | ### 1. 导入数据库 ```bash mysql -uroot -p -e "CREATE DATABASE makesoft DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;" mysql -uroot -p makesoft < sql/install.sql ``` 每张表都是 `DROP TABLE IF EXISTS` + `CREATE TABLE`,**重跑会清空数据**,只用于初始化新库,绝不要对着有数据的库执行。脚本会导入后台跑起来所必需的种子数据:`la_admin` 1 条、`la_article` 3 条、`la_config` 52 条、`la_system_menu` 159 条等。**默认管理员口令见 `sql/install.sql` 中 `la_admin` 的 INSERT 行,部署后请立即修改。** ### 2. 起中间件(可选,用 Docker 最省事) ```bash cd docker MYSQL_ROOT_PASSWORD=yourpass REDIS_PASSWORD=yourpass docker compose up -d mysql redis ``` `maven` / `node` 两个服务是构建容器(把宿主源码挂载进容器),不想在宿主机装工具链时用它们。 ### 3. 配置密钥文件 在**仓库根**创建 `local-secret.properties`(已被 `.gitignore` 忽略): ```properties DB_HOST=127.0.0.1 DB_PORT=3306 DB_NAME=makesoft DB_PASSWORD=<你的数据库密码> REDIS_HOST=127.0.0.1 REDIS_PORT=6379 REDIS_PASSWORD=<你的 Redis 密码> ``` 两个 boot 应用通过 `spring.config.import: optional:file:./local-secret.properties` 读取(prod profile 读 `../local-secret.properties`)。文件不存在时相关占位符解析失败、应用启动报错——这是刻意的 fail-fast。 ### 4. 启动后端 IDEA 直接运行 `MakeFrontApplication` / `MakeAdminApplication`;或命令行: ```bash cd server mvn -B -T1 package -pl make-utils,make-base,make-common,make-bo,make-front,make-admin -am -DskipTests cd .. # 回到仓库根再启动,dev profile 才能按 ./local-secret.properties 找到密钥文件 java -jar server/make-front/target/make-front-1.0.0.jar --spring.profiles.active=dev java -jar server/make-admin/target/make-admin-1.0.0.jar --spring.profiles.active=dev ``` 冒烟检查: ```bash curl http://127.0.0.1:8084/api/pc/config # 前台配置,免登 curl http://127.0.0.1:8082/adminapi/config/getConfig # 后台配置端点 ``` > 注意:`dev` profile 读的是**相对启动目录**的 `./local-secret.properties`。用 IDEA 运行时把 Working directory 设为仓库根,否则密钥文件找不到。命令行 `java -jar` 同理,需在仓库根执行或改用 `--spring.config.additional-location`。 > > 另:不要用 context 根(`/api/`、`/adminapi/`)做健康检查,那里没有 handler,全局异常会返回 404。 ### 5. 启动前端 ```bash # PC 前台 → http://localhost:3000 cd pc && npm install && npm run dev # 管理后台 → vite 默认端口(host 0.0.0.0) cd admin && npm install && npm run dev # 移动端 H5 cd uniapp && npm install && npm run dev:h5 ``` `pc/.env.development` 默认把 `NUXT_API_URL` 指向 `http://localhost:8084`;`admin/.env.development` 的 `VITE_APP_BASE_URL` 指向 `http://localhost:8082`。 --- ## 生产部署 完整手册见 [`deploy/DEPLOY.md`](deploy/DEPLOY.md),这里给最小闭环。 ### 组件与落点 | 组件 | 构建 | 产物 | 生效方式 | |---|---|---|---| | `front` | `mvn package`(make-front) | `make-front-1.0.0.jar` | 重启 `makesoft-front` 容器 | | `admin` | `mvn package`(make-admin) | `make-admin-1.0.0.jar` | 重启 `makesoft-admin` 容器 | | `pc` | `npm run build:ssr` | `pc/.output/` | 重启 `makesoft-pc` 容器 | | `web` | `npx vite build --mode production` | `admin/dist/` 内容 | nginx 静态,无需重启 | ### 方式 A:服务器就地构建(推荐) ```bash git push origin master # 本地只做这一步 ssh ubuntu@ 'bash /opt/makesoft-deploy/deploy/build.sh front' ``` `build.sh ` 内部:`git pull` → 就地构建(`nice -n 19` 降优先级)→ 产物进 `stage/` → 调 `release.sh publish`。 ### 方式 B:本地构建 + rsync 上传 ```bash rsync -az make-front/target/make-front-1.0.0.jar \ ubuntu@:/opt/makesoft-deploy/deploy/stage/front/ ssh ubuntu@ 'sudo bash /opt/makesoft-deploy/deploy/release.sh publish front' ``` ### 发布机制(`release.sh`) 1. **备份零开销**:`cp -al` 硬链接快照到 `releases/<组件>/<时间戳>/`。 2. **原子切换**:jar 用同文件系统 `mv`;目录用 `rsync -az --delete` 增量。 3. **重启**:`docker restart`,不用 `kill -9`。 4. **体检**:轮询免登端点直到 200(admin 冷启动约 44s,超时给 120s)。 5. **失败自动回滚**:体检超时 → 恢复上一版本 → 再次重启复检。 ```bash ssh ubuntu@ 'sudo bash /opt/makesoft-deploy/deploy/release.sh list front' ssh ubuntu@ 'sudo bash /opt/makesoft-deploy/deploy/release.sh rollback front 20260919130000' ``` ### nginx 生产配置只有一份:[`pc/nginx/makesoft.conf`](pc/nginx/makesoft.conf)(含逐条修订说明与 CORS 决策记录)。部署时软链或复制到 `sites-enabled` 后 `nginx -t && nginx -s reload`。 ### ⚠️ 内存 参考机为 **2 核 / 3.6G、同时跑 6 个容器**。`nuxt build` 是内存大户,`toolchain.sh` 已限制 `MAVEN_OPTS=-Xmx768m`、`NODE_OPTIONS=--max-old-space-size=1536`,仍建议: - 低峰期构建; - 前端构建时临时 `docker stop makesoft-pc`(构建不依赖该容器,发布阶段 `release.sh` 会重启它); - 极端情况下 OOM killer 可能误杀生产容器。 --- ## 数据库 - 唯一 DDL 来源:[`sql/install.sql`](sql/install.sql),156 张表 = 109 张 `la_*` 业务表 + 39 张 `act_*` + 8 张 `flw_*`(后两组是 Flowable 自带表)。 - 表前缀 `la_` **直接写在实体 `@TableName` 上**,没有开启 MP 的全局表前缀;`t_` 只是 MyBatis-Plus-Join 的 `?_` 占位符,不是物理表名。 - 字符集 `utf8mb4` / `utf8mb4_0900_ai_ci`,因此 **MySQL 必须 8.0+**。 - 时间字段统一为**秒级 int**(`create_time` / `update_time`)。新表请沿用,不要混用 `datetime` 或毫秒。 - 线上增量变更脚本采用幂等守卫写法:查 `information_schema.STATISTICS`/`COLUMNS` 计数 → `SET @ddl := IF(...)` → `PREPARE`/`EXECUTE`,可重复执行。仓库目前不再保留 `sql/migration/` 目录(见下方「已知缺口」)。 - 热路径索引清单(播放记录、IM 消息、访问统计、动态关注流、影视分集排序、举报、领域事件、签到)已在生产 `EXPLAIN` 实测命中,改动前先跑执行计划。 ### ⚠️ 已知缺口(新装前必读) `install.sql` 与生产库做过一次逐表逐列比对,生产**多 14 张表、2 处列差异**,即:从 `install.sql` 全新初始化的库**跑不起下面这些功能**,需要另行补 DDL: | 缺失对象 | 影响 | |---|---| | `la_community_task`、`la_user_community_task` | 社区任务广场 `/task` | | `la_domain_event` | 领域事件流水与后台审计页 | | `la_lucky_activity`、`la_lucky_award_item`、`la_lucky_record`、`la_lucky_rule` | 抽奖 `/lucky` | | `la_award_product`、`la_dev_pay_config`、`la_dev_pay_way` | 奖品发货、开发态支付配置 | | `la_product` 缺 `audit_status`/`reject_reason`/`user_uid`,`la_resource` 缺 `audit_status`/`reject_reason` | 商品与资源的前台投稿审核 | | `la_problem_import_mogu`、`la_user_auth`、两张 `*_bak_20261017` | 临时/迁移遗留表,**不需要**进 install.sql | > 历史迁移脚本目录 `sql/migration/` 已随一次仓库清理移除,上述 DDL 目前只存在于生产库。补齐方式:从生产 `SHOW CREATE TABLE` 导出后并入 `install.sql`。 --- ## 配置与环境变量 ### 后端 | 变量 | 用途 | |---|---| | `SPRING_PROFILES_ACTIVE` | `dev` / `prod`,缺省 `dev`(Linux 下 dev 配置含 Windows 上传路径,生产必须显式传 `prod`) | | `DB_HOST` `DB_PORT` `DB_NAME` `DB_PASSWORD` | MySQL 连接 | | `REDIS_HOST` `REDIS_PORT` `REDIS_PASSWORD` | Redis 连接 | | `local-secret.properties` | 上述变量的载体,仓库根,gitignore | 业务配置(站点信息、支付参数、存储驱动、短信、签到窗口等)存在 **`la_config` 表**,由后台「设置」页维护,不写在 yml 里。注意 `la_config` 无唯一索引、Redis 整包缓存 30 分钟,改完不是立即全站生效。 ### 前端 | 端 | 文件 | 关键变量 | |---|---|---| | pc | `.env.development` / `.env.production` | `NUXT_API_URL`(浏览器侧)、`NUXT_INTERNAL_API_URL`(仅服务端)、`NUXT_API_PREFIX=/api`、`NUXT_BASE_URL`、`NUXT_CLIENT=4`、`NUXT_SSR`(非空则走 SSR)、`NITRO_PORT=3000`、`NUXT_VERSION`、`NUXT_DEFAULT_AVATAR`、`NUXT_BAIDU_TONGJI_ID` | | admin | `.env.development` / `.env.production` | `VITE_APP_BASE_URL`(后端地址);请求前缀 `adminapi` 在 `src/config` 内配置 | | uniapp | `.env.{development,production}.example` | `VITE_APP_BASE_URL`;请求前缀 `api` | `pc/` 与 `uniapp/` 的 `.env.*.example` 是模板,复制去掉 `.example` 后填值;`admin/` 的两个 env 已随仓库提交,改地址直接编辑即可。 --- ## 开发规范 - **接口契约**:响应体结构以 `shared-http-contract.ts` 为准;新增字段先想清楚是 VO 还是手拼 Map,前端读到下划线字段不一定是 bug。 - **前台资源地址**:封面 / 头像一律返回**绝对 URL**(`file_uid` 为 hex 的专题、双形态的 task icon 是例外,不要硬转)。 - **免登接口**:公开读接口必须显式加 `@NotLogin`,否则被拦截器挡掉;权限码走 `@UserAuth`,缺配置时 fail-close。 - **SQL 变更**:`install.sql` 是唯一 DDL 来源。线上结构/索引变更要**同步回 `install.sql` 的 `CREATE TABLE`**,并另附幂等 ALTER 脚本(查 `information_schema` 计数 → `SET @ddl := IF(...)` → `PREPARE`/`EXECUTE`)交评审后手工执行,**不直接跑生产**。 - **前端**:`pc/` 组件自研统一 `Pc*` 前缀;样式优先用 `assets/styles/theme.css` 的设计令牌,不要写死色值;顶栏两态(透明/白玻璃)由 `route.meta.pageBanner` 决定,新页面需要深色 banner 时记得声明。 - **提交**:按域拆分,`git add <具体路径>`,不要 `git add -A`;提交前 `git status` 复核暂存区。 - **不做的事**:不提交 `local-secret.properties`、`logs/`、`temp/`、`public/` 下的第三方参考代码。 --- ## 常见问题 **Q:`install.sql` 导入报 `Unknown collation: 'utf8mb4_0900_ai_ci'`?** MySQL 版本低于 8.0。升到 8.0+ 再导入,不要改脚本里的排序规则。 **Q:后端启动即失败,日志提示占位符无法解析?** 仓库根缺 `local-secret.properties`,或其中 `DB_HOST` / `REDIS_HOST` 为空。 **Q:前端页面能开,但数据全空?** `NUXT_API_URL` / `VITE_APP_BASE_URL` 指向了错误的后端端口;前台是 8084,后台是 8082。 **Q:后台菜单少了?** 菜单来自 `la_system_menu` 表,新页面需要配套菜单种子 SQL;另外 `la_config` 有 30 分钟整包缓存。 **Q:发布脚本报体检失败并自动回滚?** 多半是体检地址写成了 context 根。用免登端点:front `/api/pc/config`、admin `/adminapi/config/getConfig`。 **Q:聊天室连不上?** WebSocket 在 8608,经 nginx `/ws` 转发;检查 `application.yml` 的 `allowed-origins` 是否包含你的域名。 --- ## 许可证 本仓库的许可证以根 [`LICENSE`](LICENSE) 文件为准:**Apache License 2.0**。 早期 README 里「仅供学习交流使用」的说法与 `LICENSE` 冲突,本次文档重写已删除该表述,不再作为额外约束;使用、复制、修改、分发一律按 Apache-2.0 条款执行。 第三方组件各自遵循其原始许可证(Flowable、Element Plus、Nuxt、uni-app 等);对象存储、微信、支付相关 SDK 需自行申请密钥。 ## 交流与反馈 - 演示地址: - 后台演示: - QQ 交流群:64240406 - 问题反馈:欢迎在官网论坛发帖