阶段更新

This commit is contained in:
2026-07-14 10:09:24 +08:00
parent 3da6718729
commit cc9f6c4d71
13 changed files with 1262 additions and 446 deletions
+313
View File
@@ -0,0 +1,313 @@
# 记事本模块部署检查清单
## 📋 部署前检查
### 1. 数据库准备
- [ ] 执行 SQL 文件创建数据表
```bash
mysql -u用户名 -p数据库名 < sql/yz_platform_notebook.sql
```
- [ ] 验证表创建成功
```sql
SHOW TABLES LIKE 'yz_platform_notebook';
DESC yz_platform_notebook;
```
### 2. 后端代码检查
- [✅] 模型文件已创建: `go/models/platform_notebook.go`
- [✅] 模型已注册: `go/models/init.go`
- [✅] 控制器已创建: `go/controllers/platform_notebook.go`
- [✅] 路由已注册: `go/routers/platform/platform.go`
- [✅] 代码编译通过
### 3. 前端代码检查
- [✅] API文件已创建: `platform/src/api/notebook.js`
- [✅] 主页面已创建: `platform/src/views/apps/notebook/index.vue`
- [✅] 编辑器组件已创建: `platform/src/views/apps/notebook/components/edit.vue`
- [✅] WangEditor组件已创建: `platform/src/views/apps/notebook/components/WangEditor.vue`
### 4. 依赖检查
- [ ] 前端安装 WangEditor
```bash
cd platform
npm install @wangeditor/editor
# 或
yarn add @wangeditor/editor
```
### 5. 菜单配置
- [ ] 在平台管理后台添加记事本菜单项
- 路径: `/apps/notebook`
- 组件: `apps/notebook/index.vue`
- 图标: `fa-solid fa-book` 或其他合适的图标
- 标题: `记事本` 或 `我的笔记`
## 🚀 部署步骤
### 后端部署
1. **停止服务**
```bash
# 如果服务正在运行,先停止
pkill -f "go run main.go"
```
2. **编译代码**
```bash
cd go
go build -o server
```
3. **启动服务**
```bash
./server
# 或使用后台运行
nohup ./server > server.log 2>&1 &
```
### 前端部署
1. **安装依赖**
```bash
cd platform
npm install
# 或
yarn install
```
2. **开发模式测试**
```bash
npm run dev
# 或
yarn dev
```
3. **生产构建**
```bash
npm run build
# 或
yarn build
```
## ✅ 功能测试
### 基础功能测试
1. **访问页面**
- [ ] 能够正常访问记事本页面
- [ ] 页面布局正常显示
- [ ] 左侧列表和右侧编辑器都能正常显示
2. **创建笔记**
- [ ] 点击"新建笔记"按钮
- [ ] 输入标题和内容
- [ ] 点击"创建"按钮
- [ ] 创建成功,笔记出现在列表中
3. **编辑笔记**
- [ ] 点击列表中的笔记
- [ ] 笔记内容正确加载到编辑器
- [ ] 修改标题和内容
- [ ] 点击"保存"按钮
- [ ] 保存成功,列表中的笔记信息更新
4. **删除笔记**
- [ ] 点击笔记右侧的"更多"按钮
- [ ] 点击"删除"
- [ ] 确认删除
- [ ] 笔记从列表中移除
5. **搜索笔记**
- [ ] 在搜索框输入关键词
- [ ] 列表自动过滤显示匹配的笔记
- [ ] 清空搜索框,显示所有笔记
### 富文本编辑器测试
1. **文本格式**
- [ ] 加粗、斜体、下划线
- [ ] 标题(H1-H6
- [ ] 字体颜色和背景色
2. **列表和引用**
- [ ] 有序列表
- [ ] 无序列表
- [ ] 引用块
3. **插入内容**
- [ ] 插入链接
- [ ] 插入代码块
- [ ] 插入表格
4. **图片上传** (需要配置上传接口)
- [ ] 点击图片按钮
- [ ] 选择图片文件
- [ ] 图片正确上传并显示
### API测试 (使用浏览器控制台)
```javascript
// 1. 在浏览器控制台加载测试脚本
// 将 test-api.js 的内容粘贴到控制台
// 2. 运行完整测试
await NotebookTest.runFullTest();
// 3. 或单独测试各个功能
await NotebookTest.create(); // 创建笔记
await NotebookTest.list(); // 获取列表
await NotebookTest.detail(1); // 获取详情
await NotebookTest.update(1, {...}); // 更新笔记
await NotebookTest.delete(1); // 删除笔记
```
## 🐛 常见问题排查
### 1. 编译错误
**问题**: `cannot use &claims.UserID (value of type *int) as *uint64`
**解决**: 已修复,使用类型转换 `userID := uint64(claims.UserID)`
---
**问题**: `undefined: PlatformNotebook`
**解决**: 检查 `go/models/init.go` 中是否已注册模型
---
### 2. 数据库错误
**问题**: 表不存在
**解决**:
```sql
-- 检查表是否存在
SHOW TABLES LIKE 'yz_platform_notebook';
-- 如果不存在,执行 SQL 文件
SOURCE sql/yz_platform_notebook.sql;
```
---
**问题**: 字段不存在
**解决**: 确认字段名使用 `create_time`, `update_time`, `delete_time`
---
### 3. 前端错误
**问题**: WangEditor 未定义
**解决**:
```bash
npm install @wangeditor/editor
```
---
**问题**: API 请求 401 未授权
**解决**:
- 检查用户是否已登录
- 检查 JWT Token 是否有效
- 检查 Token 是否正确设置在请求头中
---
**问题**: 笔记列表为空
**解决**:
- 检查数据库中是否有数据
- 检查用户ID是否匹配
- 查看浏览器控制台和网络请求
---
### 4. 权限错误
**问题**: 无法访问其他用户的笔记
**说明**: 这是正常的,每个用户只能访问自己的笔记
---
## 📊 性能优化建议
### 数据库优化
1. 为常用查询字段添加索引(已添加)
- `user_id`
- `create_time`
- `is_deleted`
2. 定期清理软删除的数据
```sql
-- 删除30天前的软删除数据
DELETE FROM yz_platform_notebook
WHERE is_deleted = 1
AND delete_time < DATE_SUB(NOW(), INTERVAL 30 DAY);
```
### 前端优化
1. 列表分页加载(已实现)
2. 内容预览截取(已实现)
3. 懒加载编辑器组件
4. 防抖搜索功能(可选)
### 后端优化
1. 添加缓存层(Redis
2. 内容压缩存储
3. 异步处理大文件
4. API 限流保护
## 🔐 安全建议
1. **内容安全**
- 前端显示时做 XSS 过滤
- 后端存储前做内容校验
- 限制单篇笔记大小
2. **访问控制**
- JWT Token 验证(已实现)
- 用户权限校验(已实现)
- API 频率限制
3. **数据备份**
- 定期备份数据库
- 软删除机制(已实现)
- 版本控制(可选)
## 📝 后续功能扩展
- [ ] 笔记分类/文件夹
- [ ] 笔记标签
- [ ] 笔记分享
- [ ] 导出功能(PDF/Markdown
- [ ] 版本历史
- [ ] 协作编辑
- [ ] 全文搜索
- [ ] 附件上传
- [ ] 模板功能
- [ ] 快捷键支持
## ✨ 完成标志
- [✅] SQL 表创建成功
- [✅] 后端代码编译通过
- [✅] 前端页面正常访问
- [ ] 所有功能测试通过
- [ ] 无控制台错误
- [ ] 性能表现良好
## 📞 技术支持
如遇到问题,请检查:
1. 浏览器控制台错误信息
2. 后端服务日志
3. 数据库连接状态
4. API 请求响应
祝部署顺利!🎉
+116
View File
@@ -0,0 +1,116 @@
# 项目文档导航
## 📚 项目结构
本项目包含两个主要部分:
### 后端项目 (Go)
- 目录:`go/`
- 文档:[go/docs/README.md](./go/docs/README.md)
- 技术栈:Go + Beego + MySQL
### 前端项目 (Platform)
- 目录:`platform/`
- 文档:[platform/docs/README.md](./platform/docs/README.md)
- 技术栈:Vue 3 + Element Plus + Vite
### 移动端项目 (BabyHealth)
- 目录:`babyhealth/`
- 技术栈:uni-app
## 🚀 快速开始
### 后端启动
```bash
cd go
go mod download
bee run
```
详细文档:[go/docs/服务端启动命令.md](./go/docs/服务端启动命令.md)
### 前端启动
```bash
cd platform
npm install
npm run dev
```
## 📖 核心功能文档
### 存储配置功能(最新)
完整的文件存储解决方案,支持本地存储和七牛云存储:
- **快速开始**[go/docs/QUICK_START.md](./go/docs/QUICK_START.md)
- **完整说明**[go/docs/README_STORAGE.md](./go/docs/README_STORAGE.md)
- **使用指南**[go/docs/storage-config-guide.md](./go/docs/storage-config-guide.md)
- **部署清单**[go/docs/DEPLOYMENT_CHECKLIST.md](./go/docs/DEPLOYMENT_CHECKLIST.md)
- **实现报告**[go/docs/IMPLEMENTATION_COMPLETE.md](./go/docs/IMPLEMENTATION_COMPLETE.md)
### 其他功能
- **后端开发**[go/docs/后端开发规则.md](./go/docs/后端开发规则.md)
- **接口文档**[go/docs/接口文件.md](./go/docs/接口文件.md)
- **字典使用**[platform/docs/dictionary-usage.md](./platform/docs/dictionary-usage.md)
- **图片上传**[platform/docs/调用图片上传组件.md](./platform/docs/调用图片上传组件.md)
## 🗂️ 文档组织
```
项目根目录/
├── README.md # 本文件(总导航)
├── go/ # 后端项目
│ ├── docs/ # 后端文档
│ │ ├── README.md # 后端文档索引
│ │ ├── QUICK_START.md # 快速开始
│ │ ├── README_STORAGE.md # 存储功能说明
│ │ └── ... # 其他文档
│ └── ...
├── platform/ # 前端项目
│ ├── docs/ # 前端文档
│ │ ├── README.md # 前端文档索引
│ │ └── ... # 其他文档
│ └── ...
└── babyhealth/ # 移动端项目
└── ...
```
## 🔧 开发环境
### 必需软件
- Go 1.17+
- Node.js 14+
- MySQL 5.7+
- Git
### 推荐工具
- VS Code
- Postman
- MySQL Workbench
- Git GUI
## 📝 开发规范
- 后端开发规范:[go/docs/后端开发规则.md](./go/docs/后端开发规则.md)
- 前端代码规范:遵循 Vue 3 官方风格指南
- Git 提交规范:使用语义化提交信息
## 🐛 问题反馈
如遇到问题,请:
1. 查看相关文档
2. 检查日志文件
3. 提交 Issue
## 📄 许可证
本项目遵循相应的开源许可证。
---
**最后更新**: 2024-01-01
+248
View File
@@ -0,0 +1,248 @@
# Go (Beego) 多租户二级域名系统部署与配置指南
本指南详细介绍在 **不改变你目前宝塔部署路径** 的前提下,如何配置 `yunzer.com.cn``dh2.fun` 及其所有二级域名的 Nginx,让它们能够直接访问并使用部署在 `www.yunzer.cn` 的官网前端静态模板。
---
## 🛠️ 第一步:宝塔物理部署路径规划(保持现状)
请确认或保持你目前在宝塔服务器上的物理目录部署,不需要进行任何文件移动:
1. **企业官网门户前台 (`frontend`)**
- 物理路径: `/www/wwwroot/www.yunzer.cn`
- 说明: 你的 `frontend` 编译打包文件平铺部署在此目录下(有 `index.html`)。
2. **平台运营管理后台 (`platform`)**
- 物理路径: `/www/wwwroot/platform.yunzer.cn`
3. **租户/商家管理后台 (`back`)**
- 物理路径: `/www/wwwroot/back.yunzer.cn`
4. **Go 后端 API 服务**
- 运行端口: 本地 `http://10.31.100.2:8081`
---
## 📄 第二步:修改 `yunzer.com.cn` 和 `dh2.fun` 的 Nginx 配置
为了绕过宝塔面板对 SSL 注释规则的保存验证限制,以下配置中**完全保留了宝塔原生生成的 `#SSL-START``#error_page 404/404.html;` 以及 `#SSL-END` 结构**。
请分别在宝塔面板对应站点的 **“配置文件”** 选项中,替换为以下内容:
### 1. `yunzer.com.cn` 的 Nginx 配置文件
```nginx
server {
listen 80;
listen 443 ssl;
listen 443 quic;
http2 on;
# 匹配主域名和所有租户的子域名
server_name yunzer.com.cn ~^(?<subdomain>.+)\.yunzer\.com\.cn$;
index index.html;
# 核心修改:直接指向部署了 frontend 的静态资源路径
root /www/wwwroot/www.yunzer.cn;
#CERT-APPLY-CHECK--START
include /www/server/panel/vhost/nginx/well-known/yunzer.com.cn.conf;
#CERT-APPLY-CHECK--END
include /www/server/panel/vhost/nginx/extension/yunzer.com.cn/*.conf;
#SSL-START SSL相关配置,请勿删除或修改下一行带注释的404规则
#error_page 404/404.html;
#HTTP_TO_HTTPS_START
set $isRedcert 1;
if ($server_port != 443) {
set $isRedcert 2;
}
if ( $uri ~ /\.well-known/ ) {
set $isRedcert 1;
}
if ($isRedcert != 1) {
rewrite ^(/.*)$ https://$host$1 permanent;
}
#HTTP_TO_HTTPS_END
ssl_certificate /www/server/panel/vhost/cert/yunzer.com.cn/fullchain.pem;
ssl_certificate_key /www/server/panel/vhost/cert/yunzer.com.cn/privkey.pem;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
ssl_prefer_server_ciphers on;
ssl_session_tickets on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
add_header Strict-Transport-Security "max-age=31536000";
add_header Alt-Svc 'quic=":443"; h3=":443"; h3-29=":443"; h3-27=":443";h3-25=":443"; h3-T050=":443"; h3-Q050=":443";h3-Q049=":443";h3-Q048=":443"; h3-Q046=":443"; h3-Q043=":443"';
error_page 497 https://$host$request_uri;
#SSL-END
#ERROR-PAGE-START 错误页配置,可以注释、删除或修改
error_page 404 /404.html;
#ERROR-PAGE-END
# --- 安全与防盗链拦截 START ---
location ~* (\.user.ini|\.htaccess|\.htpasswd|\.env.*|\.project|\.bashrc|\.bash_profile|\.bash_logout|\.DS_Store|\.gitignore|\.gitattributes|LICENSE|README\.md|CLAUDE\.md|CHANGELOG\.md|CHANGELOG|CONTRIBUTING\.md|TODO\.md|FAQ\.md|composer\.json|composer\.lock|package(-lock)?\.json|yarn\.lock|pnpm-lock\.yaml|\.\w+~|\.swp|\.swo|\.bak(up)?|\.old|\.tmp|\.temp|\.log|\.sql(\.gz)?|docker-compose\.yml|docker\.env|Dockerfile|\.csproj|\.sln|Cargo\.toml|Cargo\.lock|go\.mod|go\.sum|phpunit\.xml|phpunit\.xml|pom\.xml|build\.gradl|pyproject\.toml|requirements\.txt|application(-\w+)?\.(ya?ml|properties))$ {
return 404;
}
location ~* /(\.git|\.svn|\.bzr|\.vscode|\.claude|\.idea|\.ssh|\.github|\.npm|\.yarn|\.pnpm|\.cache|\.husky|\.turbo|\.next|\.nuxt|node_modules|runtime)/ {
return 404;
}
location ~ \.well-known {
allow all;
}
if ( $uri ~ "^/\.well-known/.*\.(php|jsp|py|js|css|lua|ts|go|zip|tar\.gz|rar|7z|sql|bak)$" ) {
return 403;
}
# --- 安全与防盗链拦截 END ---
# 静态资源缓存
location ~* \.(gif|jpg|jpeg|png|bmp|swf)$ {
expires 30d;
error_log /dev/null;
access_log /dev/null;
}
location ~* \.(js|css)$ {
expires 12h;
error_log /dev/null;
access_log /dev/null;
}
# --- Go API 反向代理及 Vue 路由支持 ---
# 1. 代理 /api/ 请求到本地运行在 8081 端口的 Go 服务
location /api/ {
proxy_pass http://10.31.100.2:8081/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# 2. 代理文件上传目录到 Go 静态服务
location /uploads/ {
proxy_pass http://10.31.100.2:8081/uploads/;
}
# 3. 前端单页面应用 (Vue Router) History 模式重定向
location / {
try_files $uri $uri/ /index.html;
}
access_log /www/wwwlogs/yunzer.com.cn.log;
error_log /www/wwwlogs/yunzer.com.cn.error.log;
}
```
### 2. `dh2.fun` 的 Nginx 配置文件
```nginx
server {
listen 80;
listen 443 ssl;
listen 443 quic;
http2 on;
# 匹配主域名和所有租户的子域名
server_name dh2.fun ~^(?<subdomain>.+)\.dh2\.fun$;
index index.html;
# 核心修改:直接指向部署了 frontend 的静态资源路径
root /www/wwwroot/www.yunzer.cn;
#CERT-APPLY-CHECK--START
include /www/server/panel/vhost/nginx/well-known/dh2.fun.conf;
#CERT-APPLY-CHECK--END
include /www/server/panel/vhost/nginx/extension/dh2.fun/*.conf;
#SSL-START SSL相关配置,请勿删除或修改下一行带注释的404规则
#error_page 404/404.html;
#HTTP_TO_HTTPS_START
set $isRedcert 1;
if ($server_port != 443) {
set $isRedcert 2;
}
if ( $uri ~ /\.well-known/ ) {
set $isRedcert 1;
}
if ($isRedcert != 1) {
rewrite ^(/.*)$ https://$host$1 permanent;
}
#HTTP_TO_HTTPS_END
ssl_certificate /www/server/panel/vhost/cert/dh2.fun/fullchain.pem;
ssl_certificate_key /www/server/panel/vhost/cert/dh2.fun/privkey.pem;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
ssl_prefer_server_ciphers on;
ssl_session_tickets on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
add_header Strict-Transport-Security "max-age=31536000";
add_header Alt-Svc 'quic=":443"; h3=":443"; h3-29=":443"; h3-27=":443";h3-25=":443"; h3-T050=":443"; h3-Q050=":443";h3-Q049=":443";h3-Q048=":443"; h3-Q046=":443"; h3-Q043=":443"';
error_page 497 https://$host$request_uri;
#SSL-END
#ERROR-PAGE-START 错误页配置,可以注释、删除或修改
error_page 404 /404.html;
#ERROR-PAGE-END
# 禁止访问的敏感文件
location ~* (\.user.ini|\.htaccess|\.htpasswd|\.env.*|\.project|\.bashrc|\.bash_profile|\.bash_logout|\.DS_Store|\.gitignore|\.gitattributes|LICENSE|README\.md|CLAUDE\.md|CHANGELOG\.md|CHANGELOG|CONTRIBUTING\.md|TODO\.md|FAQ\.md|composer\.json|composer\.lock|package(-lock)?\.json|yarn\.lock|pnpm-lock\.yaml|\.\w+~|\.swp|\.swo|\.bak(up)?|\.old|\.tmp|\.temp|\.log|\.sql(\.gz)?|docker-compose\.yml|docker\.env|Dockerfile|\.csproj|\.sln|Cargo\.toml|Cargo\.lock|go\.mod|go\.sum|phpunit\.xml|phpunit\.xml|pom\.xml|build\.gradl|pyproject\.toml|requirements\.txt|application(-\w+)?\.(ya?ml|properties))$
{
return 404;
}
# 禁止访问的敏感目录
location ~* /(\.git|\.svn|\.bzr|\.vscode|\.claude|\.idea|\.ssh|\.github|\.npm|\.yarn|\.pnpm|\.cache|\.husky|\.turbo|\.next|\.nuxt|node_modules|runtime)/ {
return 404;
}
#一键申请SSL证书验证目录相关设置
location ~ \.well-known{
allow all;
}
#禁止在证书验证目录放入敏感文件
if ( $uri ~ "^/\.well-known/.*\.(php|jsp|py|js|css|lua|ts|go|zip|tar\.gz|rar|7z|sql|bak)$" ) {
return 403;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
error_log /dev/null;
access_log /dev/null;
}
location ~ .*\.(js|css)?$
{
expires 12h;
error_log /dev/null;
access_log /dev/null;
}
# --- Go API 反向代理及 Vue 路由支持 ---
location /api/ {
proxy_pass http://10.31.100.2:8081/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location /uploads/ {
proxy_pass http://10.31.100.2:8081/uploads/;
}
location / {
try_files $uri $uri/ /index.html;
}
}
```