commits
This commit is contained in:
+70
-70
@@ -1,70 +1,70 @@
|
||||
# Go后端项目文档
|
||||
|
||||
## 📚 文档目录
|
||||
|
||||
### 开发文档
|
||||
- [后端开发规则](./后端开发规则.md)
|
||||
- [接口文件](./接口文件.md)
|
||||
- [服务端启动命令](./服务端启动命令.md)
|
||||
- [大文件上传配置](./大文件上传配置.md) - 文件上传限制和超时配置
|
||||
|
||||
### 存储配置功能文档
|
||||
- [📖 快速开始](./QUICK_START.md) - 5分钟快速上手
|
||||
- [📘 完整实现说明](./README_STORAGE.md) - 功能概述和使用指南
|
||||
- [📗 详细使用指南](./storage-config-guide.md) - 深入的配置和使用说明
|
||||
- [✅ 部署检查清单](./DEPLOYMENT_CHECKLIST.md) - 生产环境部署指南
|
||||
- [🎉 实现报告](./IMPLEMENTATION_COMPLETE.md) - 完整的实现细节
|
||||
|
||||
### 数据库文档
|
||||
- [SQL迁移脚本](./sql/) - 数据库迁移文件
|
||||
|
||||
## 🚀 快速导航
|
||||
|
||||
### 新手入门
|
||||
1. 阅读 [快速开始](./QUICK_START.md)
|
||||
2. 查看 [服务端启动命令](./服务端启动命令.md)
|
||||
3. 了解 [后端开发规则](./后端开发规则.md)
|
||||
|
||||
### 存储功能使用
|
||||
1. [快速开始](./QUICK_START.md) - 快速配置存储
|
||||
2. [完整实现说明](./README_STORAGE.md) - 了解核心功能
|
||||
3. [详细使用指南](./storage-config-guide.md) - 深入学习
|
||||
|
||||
### 生产部署
|
||||
1. [部署检查清单](./DEPLOYMENT_CHECKLIST.md) - 按清单逐项检查
|
||||
2. [实现报告](./IMPLEMENTATION_COMPLETE.md) - 了解技术细节
|
||||
|
||||
## 📂 项目结构
|
||||
|
||||
```
|
||||
go/
|
||||
├── controllers/ # 控制器层
|
||||
├── models/ # 数据模型层
|
||||
├── services/ # 业务服务层
|
||||
├── routers/ # 路由配置
|
||||
├── pkg/ # 公共包
|
||||
├── conf/ # 配置文件
|
||||
├── migrations/ # 数据库迁移
|
||||
├── scripts/ # 脚本工具
|
||||
└── docs/ # 文档(本目录)
|
||||
```
|
||||
|
||||
## 🔗 相关链接
|
||||
|
||||
- [Beego框架文档](https://beego.vip/)
|
||||
- [七牛云开发文档](https://developer.qiniu.com/)
|
||||
- [Go语言官方文档](https://golang.org/doc/)
|
||||
|
||||
## 📝 更新日志
|
||||
|
||||
### 2026-04-09
|
||||
- ✅ 增加大文件上传支持(最大 2GB)
|
||||
- ✅ 移除服务器超时限制
|
||||
- ✅ 优化 CORS 配置
|
||||
- ✅ 完善文件上传文档
|
||||
|
||||
### 2024-01-01
|
||||
- ✅ 完成存储配置功能
|
||||
- ✅ 支持本地存储和七牛云存储
|
||||
- ✅ 实现文件迁移功能
|
||||
- ✅ 完善文档体系
|
||||
# Go后端项目文档
|
||||
|
||||
## 📚 文档目录
|
||||
|
||||
### 开发文档
|
||||
- [后端开发规则](./后端开发规则.md)
|
||||
- [接口文件](./接口文件.md)
|
||||
- [服务端启动命令](./服务端启动命令.md)
|
||||
- [大文件上传配置](./大文件上传配置.md) - 文件上传限制和超时配置
|
||||
|
||||
### 存储配置功能文档
|
||||
- [📖 快速开始](./QUICK_START.md) - 5分钟快速上手
|
||||
- [📘 完整实现说明](./README_STORAGE.md) - 功能概述和使用指南
|
||||
- [📗 详细使用指南](./storage-config-guide.md) - 深入的配置和使用说明
|
||||
- [✅ 部署检查清单](./DEPLOYMENT_CHECKLIST.md) - 生产环境部署指南
|
||||
- [🎉 实现报告](./IMPLEMENTATION_COMPLETE.md) - 完整的实现细节
|
||||
|
||||
### 数据库文档
|
||||
- [SQL迁移脚本](./sql/) - 数据库迁移文件
|
||||
|
||||
## 🚀 快速导航
|
||||
|
||||
### 新手入门
|
||||
1. 阅读 [快速开始](./QUICK_START.md)
|
||||
2. 查看 [服务端启动命令](./服务端启动命令.md)
|
||||
3. 了解 [后端开发规则](./后端开发规则.md)
|
||||
|
||||
### 存储功能使用
|
||||
1. [快速开始](./QUICK_START.md) - 快速配置存储
|
||||
2. [完整实现说明](./README_STORAGE.md) - 了解核心功能
|
||||
3. [详细使用指南](./storage-config-guide.md) - 深入学习
|
||||
|
||||
### 生产部署
|
||||
1. [部署检查清单](./DEPLOYMENT_CHECKLIST.md) - 按清单逐项检查
|
||||
2. [实现报告](./IMPLEMENTATION_COMPLETE.md) - 了解技术细节
|
||||
|
||||
## 📂 项目结构
|
||||
|
||||
```
|
||||
go/
|
||||
├── controllers/ # 控制器层
|
||||
├── models/ # 数据模型层
|
||||
├── services/ # 业务服务层
|
||||
├── routers/ # 路由配置
|
||||
├── pkg/ # 公共包
|
||||
├── conf/ # 配置文件
|
||||
├── migrations/ # 数据库迁移
|
||||
├── scripts/ # 脚本工具
|
||||
└── docs/ # 文档(本目录)
|
||||
```
|
||||
|
||||
## 🔗 相关链接
|
||||
|
||||
- [Beego框架文档](https://beego.vip/)
|
||||
- [七牛云开发文档](https://developer.qiniu.com/)
|
||||
- [Go语言官方文档](https://golang.org/doc/)
|
||||
|
||||
## 📝 更新日志
|
||||
|
||||
### 2026-04-09
|
||||
- ✅ 增加大文件上传支持(最大 2GB)
|
||||
- ✅ 移除服务器超时限制
|
||||
- ✅ 优化 CORS 配置
|
||||
- ✅ 完善文件上传文档
|
||||
|
||||
### 2024-01-01
|
||||
- ✅ 完成存储配置功能
|
||||
- ✅ 支持本地存储和七牛云存储
|
||||
- ✅ 实现文件迁移功能
|
||||
- ✅ 完善文档体系
|
||||
|
||||
@@ -1,18 +1,18 @@
|
||||
-- 创建存储配置表
|
||||
CREATE TABLE IF NOT EXISTS `yz_system_storage_config` (
|
||||
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
|
||||
`storage_type` varchar(20) NOT NULL DEFAULT 'local' COMMENT '存储类型: local-本地存储, qiniu-七牛云',
|
||||
`qiniu_access_key` varchar(255) DEFAULT NULL COMMENT '七牛云AccessKey',
|
||||
`qiniu_secret_key` varchar(255) DEFAULT NULL COMMENT '七牛云SecretKey',
|
||||
`qiniu_bucket` varchar(128) DEFAULT NULL COMMENT '七牛云Bucket名称',
|
||||
`qiniu_domain` varchar(255) DEFAULT NULL COMMENT '七牛云CDN域名',
|
||||
`qiniu_region` varchar(50) DEFAULT NULL COMMENT '七牛云存储区域',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统存储配置表';
|
||||
|
||||
-- 插入默认配置(本地存储)
|
||||
INSERT INTO `yz_system_storage_config` (`storage_type`, `create_time`)
|
||||
VALUES ('local', NOW())
|
||||
ON DUPLICATE KEY UPDATE `storage_type` = 'local';
|
||||
-- 创建存储配置表
|
||||
CREATE TABLE IF NOT EXISTS `yz_system_storage_config` (
|
||||
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
|
||||
`storage_type` varchar(20) NOT NULL DEFAULT 'local' COMMENT '存储类型: local-本地存储, qiniu-七牛云',
|
||||
`qiniu_access_key` varchar(255) DEFAULT NULL COMMENT '七牛云AccessKey',
|
||||
`qiniu_secret_key` varchar(255) DEFAULT NULL COMMENT '七牛云SecretKey',
|
||||
`qiniu_bucket` varchar(128) DEFAULT NULL COMMENT '七牛云Bucket名称',
|
||||
`qiniu_domain` varchar(255) DEFAULT NULL COMMENT '七牛云CDN域名',
|
||||
`qiniu_region` varchar(50) DEFAULT NULL COMMENT '七牛云存储区域',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统存储配置表';
|
||||
|
||||
-- 插入默认配置(本地存储)
|
||||
INSERT INTO `yz_system_storage_config` (`storage_type`, `create_time`)
|
||||
VALUES ('local', NOW())
|
||||
ON DUPLICATE KEY UPDATE `storage_type` = 'local';
|
||||
|
||||
@@ -1,45 +1,45 @@
|
||||
-- 投诉建议「产品分类」:区分用户针对哪类产品提建议
|
||||
-- 请在目标库手动执行(utf8mb4)
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `yz_system_complaint_category` (
|
||||
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(64) NOT NULL COMMENT '分类名称,如:官网、租户后台、小程序',
|
||||
`code` varchar(32) DEFAULT NULL COMMENT '可选编码,便于程序识别',
|
||||
`sort` int NOT NULL DEFAULT 0 COMMENT '排序,越小越靠前',
|
||||
`status` tinyint NOT NULL DEFAULT 1 COMMENT '1启用 0禁用',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
|
||||
`delete_time` datetime DEFAULT NULL COMMENT '软删',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_delete_time` (`delete_time`),
|
||||
KEY `idx_status` (`status`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='投诉建议-产品分类';
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `yz_system_platform_complaint` (
|
||||
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
|
||||
`category_id` bigint unsigned NOT NULL COMMENT '产品分类ID',
|
||||
`title` varchar(200) NOT NULL COMMENT '标题',
|
||||
`content` text NOT NULL COMMENT '建议/投诉内容',
|
||||
`contact_name` varchar(64) DEFAULT NULL COMMENT '联系人',
|
||||
`contact_phone` varchar(32) DEFAULT NULL COMMENT '联系电话',
|
||||
`contact_email` varchar(128) DEFAULT NULL COMMENT '联系邮箱',
|
||||
`status` tinyint NOT NULL DEFAULT 0 COMMENT '0待处理 1处理中 2已回复 3已关闭',
|
||||
`reply_content` text COMMENT '平台回复内容',
|
||||
`reply_time` datetime DEFAULT NULL COMMENT '回复时间',
|
||||
`tid` bigint unsigned DEFAULT NULL COMMENT '可选:关联租户ID',
|
||||
`remark` varchar(512) DEFAULT NULL COMMENT '管理员内部备注',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
|
||||
`delete_time` datetime DEFAULT NULL COMMENT '软删',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_category_id` (`category_id`),
|
||||
KEY `idx_status` (`status`),
|
||||
KEY `idx_delete_time` (`delete_time`),
|
||||
KEY `idx_tid` (`tid`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='平台端-投诉建议';
|
||||
|
||||
-- 可选:示例分类(执行完建表后按需取消注释)
|
||||
-- INSERT INTO `yz_system_complaint_category` (`name`,`code`,`sort`,`status`) VALUES
|
||||
-- ('官网','site',0,1),
|
||||
-- ('租户后台','tenant_admin',10,1),
|
||||
-- ('小程序','miniapp',20,1);
|
||||
-- 投诉建议「产品分类」:区分用户针对哪类产品提建议
|
||||
-- 请在目标库手动执行(utf8mb4)
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `yz_system_complaint_category` (
|
||||
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(64) NOT NULL COMMENT '分类名称,如:官网、租户后台、小程序',
|
||||
`code` varchar(32) DEFAULT NULL COMMENT '可选编码,便于程序识别',
|
||||
`sort` int NOT NULL DEFAULT 0 COMMENT '排序,越小越靠前',
|
||||
`status` tinyint NOT NULL DEFAULT 1 COMMENT '1启用 0禁用',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
|
||||
`delete_time` datetime DEFAULT NULL COMMENT '软删',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_delete_time` (`delete_time`),
|
||||
KEY `idx_status` (`status`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='投诉建议-产品分类';
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `yz_system_platform_complaint` (
|
||||
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
|
||||
`category_id` bigint unsigned NOT NULL COMMENT '产品分类ID',
|
||||
`title` varchar(200) NOT NULL COMMENT '标题',
|
||||
`content` text NOT NULL COMMENT '建议/投诉内容',
|
||||
`contact_name` varchar(64) DEFAULT NULL COMMENT '联系人',
|
||||
`contact_phone` varchar(32) DEFAULT NULL COMMENT '联系电话',
|
||||
`contact_email` varchar(128) DEFAULT NULL COMMENT '联系邮箱',
|
||||
`status` tinyint NOT NULL DEFAULT 0 COMMENT '0待处理 1处理中 2已回复 3已关闭',
|
||||
`reply_content` text COMMENT '平台回复内容',
|
||||
`reply_time` datetime DEFAULT NULL COMMENT '回复时间',
|
||||
`tid` bigint unsigned DEFAULT NULL COMMENT '可选:关联租户ID',
|
||||
`remark` varchar(512) DEFAULT NULL COMMENT '管理员内部备注',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
|
||||
`delete_time` datetime DEFAULT NULL COMMENT '软删',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_category_id` (`category_id`),
|
||||
KEY `idx_status` (`status`),
|
||||
KEY `idx_delete_time` (`delete_time`),
|
||||
KEY `idx_tid` (`tid`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='平台端-投诉建议';
|
||||
|
||||
-- 可选:示例分类(执行完建表后按需取消注释)
|
||||
-- INSERT INTO `yz_system_complaint_category` (`name`,`code`,`sort`,`status`) VALUES
|
||||
-- ('官网','site',0,1),
|
||||
-- ('租户后台','tenant_admin',10,1),
|
||||
-- ('小程序','miniapp',20,1);
|
||||
|
||||
@@ -1,31 +1,31 @@
|
||||
-- Cursor 激活码管理
|
||||
-- status: 0 未使用 1 已使用 2 已过期 3 已禁用
|
||||
-- type: 0 自定义 1 天卡 7 周卡 30 月卡 90 季卡 365 年卡
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `yz_platform_cursor_activation_code` (
|
||||
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
|
||||
`code` varchar(128) NOT NULL COMMENT '激活码',
|
||||
`type` int NOT NULL DEFAULT 30 COMMENT '卡密类型:0自定义 1天卡 7周卡 30月卡 90季卡 365年卡',
|
||||
`status` tinyint NOT NULL DEFAULT 0 COMMENT '状态:0未使用 1已使用 2已过期 3已禁用',
|
||||
`duration_days` int NOT NULL DEFAULT 30 COMMENT '有效天数',
|
||||
`bind_account` varchar(128) DEFAULT NULL COMMENT '绑定账号',
|
||||
`bind_device_id` bigint unsigned DEFAULT NULL COMMENT '绑定设备ID,关联 yz_platform_cursor_equipment.id',
|
||||
`machine_code` varchar(128) DEFAULT NULL COMMENT '绑定设备机器码',
|
||||
`device_info` varchar(1000) DEFAULT NULL COMMENT '绑定设备信息',
|
||||
`owner_user_id` bigint unsigned DEFAULT NULL COMMENT '归属用户ID',
|
||||
`owner_user_name` varchar(128) DEFAULT NULL COMMENT '归属用户名称',
|
||||
`activated_at` datetime DEFAULT NULL COMMENT '激活时间',
|
||||
`expired_at` datetime DEFAULT NULL COMMENT '过期时间',
|
||||
`remark` varchar(1000) DEFAULT NULL COMMENT '备注',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`delete_time` datetime DEFAULT NULL COMMENT '删除时间',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_code` (`code`),
|
||||
KEY `idx_status_delete` (`status`,`delete_time`),
|
||||
KEY `idx_type_status` (`type`,`status`),
|
||||
KEY `idx_bind_account` (`bind_account`),
|
||||
KEY `idx_bind_device_id` (`bind_device_id`),
|
||||
KEY `idx_owner_user_id` (`owner_user_id`),
|
||||
KEY `idx_expired_at` (`expired_at`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Cursor续杯激活码';
|
||||
-- Cursor 激活码管理
|
||||
-- status: 0 未使用 1 已使用 2 已过期 3 已禁用
|
||||
-- type: 0 自定义 1 天卡 7 周卡 30 月卡 90 季卡 365 年卡
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `yz_platform_cursor_activation_code` (
|
||||
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
|
||||
`code` varchar(128) NOT NULL COMMENT '激活码',
|
||||
`type` int NOT NULL DEFAULT 30 COMMENT '卡密类型:0自定义 1天卡 7周卡 30月卡 90季卡 365年卡',
|
||||
`status` tinyint NOT NULL DEFAULT 0 COMMENT '状态:0未使用 1已使用 2已过期 3已禁用',
|
||||
`duration_days` int NOT NULL DEFAULT 30 COMMENT '有效天数',
|
||||
`bind_account` varchar(128) DEFAULT NULL COMMENT '绑定账号',
|
||||
`bind_device_id` bigint unsigned DEFAULT NULL COMMENT '绑定设备ID,关联 yz_platform_cursor_equipment.id',
|
||||
`machine_code` varchar(128) DEFAULT NULL COMMENT '绑定设备机器码',
|
||||
`device_info` varchar(1000) DEFAULT NULL COMMENT '绑定设备信息',
|
||||
`owner_user_id` bigint unsigned DEFAULT NULL COMMENT '归属用户ID',
|
||||
`owner_user_name` varchar(128) DEFAULT NULL COMMENT '归属用户名称',
|
||||
`activated_at` datetime DEFAULT NULL COMMENT '激活时间',
|
||||
`expired_at` datetime DEFAULT NULL COMMENT '过期时间',
|
||||
`remark` varchar(1000) DEFAULT NULL COMMENT '备注',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`delete_time` datetime DEFAULT NULL COMMENT '删除时间',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_code` (`code`),
|
||||
KEY `idx_status_delete` (`status`,`delete_time`),
|
||||
KEY `idx_type_status` (`type`,`status`),
|
||||
KEY `idx_bind_account` (`bind_account`),
|
||||
KEY `idx_bind_device_id` (`bind_device_id`),
|
||||
KEY `idx_owner_user_id` (`owner_user_id`),
|
||||
KEY `idx_expired_at` (`expired_at`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Cursor续杯激活码';
|
||||
|
||||
@@ -1,21 +1,26 @@
|
||||
-- 软件升级产品(客户端拉取版本与下载地址)
|
||||
-- 安装包建议上传到文件管理,分类使用「appsupgrade」(或任意分类,记录 file_id 即可)
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `yz_system_software_upgrade` (
|
||||
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(128) NOT NULL COMMENT '软件显示名称',
|
||||
`code` varchar(64) NOT NULL COMMENT '客户端唯一标识,与 check 接口 code 一致',
|
||||
`latest_version` varchar(32) NOT NULL DEFAULT '0.0.0' COMMENT '当前发布的最新版本号',
|
||||
`file_id` bigint unsigned DEFAULT NULL COMMENT '关联 yz_system_files.id,安装包',
|
||||
`download_url` varchar(512) DEFAULT NULL COMMENT '完整下载地址;为空则用 file_id 对应 src 拼公开 URL',
|
||||
`force_update` tinyint NOT NULL DEFAULT 0 COMMENT '1 建议强制更新',
|
||||
`release_notes` varchar(2000) DEFAULT NULL COMMENT '更新说明',
|
||||
`status` tinyint NOT NULL DEFAULT 1 COMMENT '1 启用 0 停用',
|
||||
`sort` int NOT NULL DEFAULT 0,
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
|
||||
`delete_time` datetime DEFAULT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_code` (`code`),
|
||||
KEY `idx_status_delete` (`status`,`delete_time`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='软件升级产品';
|
||||
-- 软件升级产品(客户端拉取版本与下载地址)
|
||||
-- 安装包建议上传到文件管理,分类使用「appsupgrade」(或任意分类,记录 file_id 即可)
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `yz_system_software_upgrade` (
|
||||
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(128) NOT NULL COMMENT '软件显示名称',
|
||||
`code` varchar(64) NOT NULL COMMENT '客户端唯一标识,与 check 接口 code 一致',
|
||||
`latest_version` varchar(32) NOT NULL DEFAULT '0.0.0' COMMENT '当前发布的最新版本号',
|
||||
`file_id` bigint unsigned DEFAULT NULL COMMENT '关联 yz_system_files.id,安装包',
|
||||
`download_url` varchar(512) DEFAULT NULL COMMENT '兼容旧客户端的单安装包地址;为空则用 file_id 对应 src 拼公开 URL',
|
||||
`download_urls` text DEFAULT NULL COMMENT '多运行环境安装包地址 JSON,如 {"windows":"...","mac":"...","ubuntu":"...","linux":"..."}',
|
||||
`force_update` tinyint NOT NULL DEFAULT 0 COMMENT '1 建议强制更新',
|
||||
`release_notes` varchar(2000) DEFAULT NULL COMMENT '更新说明',
|
||||
`status` tinyint NOT NULL DEFAULT 1 COMMENT '1 启用 0 停用',
|
||||
`sort` int NOT NULL DEFAULT 0,
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
|
||||
`delete_time` datetime DEFAULT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_code` (`code`),
|
||||
KEY `idx_status_delete` (`status`,`delete_time`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='软件升级产品';
|
||||
|
||||
-- 已有表升级:
|
||||
-- ALTER TABLE `yz_system_software_upgrade`
|
||||
-- ADD COLUMN `download_urls` text DEFAULT NULL COMMENT '多运行环境安装包地址 JSON,如 {"windows":"...","mac":"...","ubuntu":"...","linux":"..."}' AFTER `download_url`;
|
||||
|
||||
+42
-42
@@ -1,43 +1,43 @@
|
||||
go/
|
||||
├── models/ # 仅负责数据模型相关
|
||||
│ ├── 结构体(struct)定义
|
||||
│ ├── 字段标签与表名(TableName)
|
||||
│ └── 数据库初始化(注册模型、连接数据库)
|
||||
│
|
||||
├── services/ # 核心业务逻辑层
|
||||
│ ├── 所有业务处理方法(含CRUD)
|
||||
│ ├── 模型数据校验
|
||||
│ ├── 密码等安全相关加解密
|
||||
│ └── 与 models 层的数据库操作
|
||||
│
|
||||
└── controllers/ # 控制器层,专注 HTTP
|
||||
├── 请求参数解析
|
||||
├── 参数有效性验证
|
||||
├── 调用 services 处理业务
|
||||
└── 响应数据统一格式化与错误处理
|
||||
|
||||
|
||||
## 分层架构开发规范
|
||||
|
||||
### Models 层
|
||||
- 只负责定义数据库结构和初始化,包含结构体、字段标签与表名映射,数据库注册与连接。
|
||||
- 不允许包含任何业务逻辑、数据校验、密码处理或和 HTTP 相关的代码。
|
||||
|
||||
### Services 层
|
||||
- 实现所有业务流程、数据访问、校验和跨模型业务逻辑。
|
||||
- 通过 models 操作数据库,仅返回 struct 或错误。
|
||||
- 实现数据校验、密码加密等业务需求;不直接处理 HTTP 请求或响应。
|
||||
|
||||
### Controllers 层
|
||||
- 只负责接收和解析 HTTP 请求,进行参数校验。
|
||||
- 调用 services 执行业务逻辑。
|
||||
- 负责返回统一格式的响应结果,对业务错误进行捕获和转义为 HTTP 状态码和消息。
|
||||
|
||||
### 其它要求
|
||||
- 各层代码职责单一,禁止跨层调用(如 controllers 直接操作 models)。
|
||||
- 统一异常处理,业务错误只在 services 返回,controllers 负责转换为 HTTP 响应。
|
||||
- 保持 controller 轻量简洁,绝不包含业务处理逻辑。
|
||||
- services 层所有数据变更、校验等均可单元测试。
|
||||
- models 变动需清晰文档和数据库迁移脚本。
|
||||
|
||||
go/
|
||||
├── models/ # 仅负责数据模型相关
|
||||
│ ├── 结构体(struct)定义
|
||||
│ ├── 字段标签与表名(TableName)
|
||||
│ └── 数据库初始化(注册模型、连接数据库)
|
||||
│
|
||||
├── services/ # 核心业务逻辑层
|
||||
│ ├── 所有业务处理方法(含CRUD)
|
||||
│ ├── 模型数据校验
|
||||
│ ├── 密码等安全相关加解密
|
||||
│ └── 与 models 层的数据库操作
|
||||
│
|
||||
└── controllers/ # 控制器层,专注 HTTP
|
||||
├── 请求参数解析
|
||||
├── 参数有效性验证
|
||||
├── 调用 services 处理业务
|
||||
└── 响应数据统一格式化与错误处理
|
||||
|
||||
|
||||
## 分层架构开发规范
|
||||
|
||||
### Models 层
|
||||
- 只负责定义数据库结构和初始化,包含结构体、字段标签与表名映射,数据库注册与连接。
|
||||
- 不允许包含任何业务逻辑、数据校验、密码处理或和 HTTP 相关的代码。
|
||||
|
||||
### Services 层
|
||||
- 实现所有业务流程、数据访问、校验和跨模型业务逻辑。
|
||||
- 通过 models 操作数据库,仅返回 struct 或错误。
|
||||
- 实现数据校验、密码加密等业务需求;不直接处理 HTTP 请求或响应。
|
||||
|
||||
### Controllers 层
|
||||
- 只负责接收和解析 HTTP 请求,进行参数校验。
|
||||
- 调用 services 执行业务逻辑。
|
||||
- 负责返回统一格式的响应结果,对业务错误进行捕获和转义为 HTTP 状态码和消息。
|
||||
|
||||
### 其它要求
|
||||
- 各层代码职责单一,禁止跨层调用(如 controllers 直接操作 models)。
|
||||
- 统一异常处理,业务错误只在 services 返回,controllers 负责转换为 HTTP 响应。
|
||||
- 保持 controller 轻量简洁,绝不包含业务处理逻辑。
|
||||
- services 层所有数据变更、校验等均可单元测试。
|
||||
- models 变动需清晰文档和数据库迁移脚本。
|
||||
|
||||
建议先设计 models 层,随后 services 层,最后实现 controllers,实现过程中注意分层原则。
|
||||
+243
-243
@@ -1,243 +1,243 @@
|
||||
# 大文件上传配置说明
|
||||
|
||||
## 概述
|
||||
|
||||
为支持大型软件安装包(如桌面客户端安装程序)的上传,系统已调整文件上传限制和超时配置。
|
||||
|
||||
## 配置修改
|
||||
|
||||
### 1. 文件大小限制
|
||||
|
||||
**文件位置**: `go/controllers/platform_file.go`
|
||||
|
||||
**修改内容**:
|
||||
```go
|
||||
// 修改前
|
||||
const fileUploadMaxMB = 200 // 200MB
|
||||
|
||||
// 修改后
|
||||
const fileUploadMaxMB = 2048 // 2GB,适用于大型软件安装包
|
||||
```
|
||||
|
||||
### 2. 服务器超时配置
|
||||
|
||||
**文件位置**: `go/conf/app.conf`
|
||||
|
||||
**新增配置**:
|
||||
```ini
|
||||
# 服务器超时配置(支持大文件上传)
|
||||
# 0 表示不设置超时限制
|
||||
ServerTimeOut = 0
|
||||
# 最大请求体大小(字节),0 表示不限制
|
||||
MaxMemory = 0
|
||||
```
|
||||
|
||||
## CORS 配置
|
||||
|
||||
**文件位置**: `go/routers/router.go`
|
||||
|
||||
当前 CORS 配置允许跨域请求:
|
||||
|
||||
```go
|
||||
beego.InsertFilter("*", beego.BeforeRouter, func(ctx *context.Context) {
|
||||
ctx.Output.Header("Access-Control-Allow-Origin", "*")
|
||||
ctx.Output.Header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, PATCH, OPTIONS")
|
||||
ctx.Output.Header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization")
|
||||
ctx.Output.Header("Access-Control-Max-Age", "86400")
|
||||
|
||||
if ctx.Input.Method() == "OPTIONS" {
|
||||
ctx.Output.Status = 200
|
||||
ctx.Output.Body([]byte(""))
|
||||
return
|
||||
}
|
||||
})
|
||||
```
|
||||
|
||||
### 生产环境 CORS 配置建议
|
||||
|
||||
在生产环境中,建议将 `Access-Control-Allow-Origin` 设置为具体的前端域名:
|
||||
|
||||
```go
|
||||
// 开发环境
|
||||
ctx.Output.Header("Access-Control-Allow-Origin", "*")
|
||||
|
||||
// 生产环境(推荐)
|
||||
allowedOrigins := []string{
|
||||
"https://platform.yunzer.cn",
|
||||
"https://www.yunzer.cn",
|
||||
}
|
||||
origin := ctx.Request.Header.Get("Origin")
|
||||
for _, allowed := range allowedOrigins {
|
||||
if origin == allowed {
|
||||
ctx.Output.Header("Access-Control-Allow-Origin", origin)
|
||||
break
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 上传流程
|
||||
|
||||
### 1. 文件上传接口
|
||||
|
||||
**路由**: `POST /platform/uploadfile`
|
||||
|
||||
**控制器**: `PlatformFileController.UploadFile`
|
||||
|
||||
**处理流程**:
|
||||
1. 验证用户身份(JWT token)
|
||||
2. 解析 multipart form(最大 2GB)
|
||||
3. 检查文件大小(不超过 2GB)
|
||||
4. 获取存储服务(本地或七牛云)
|
||||
5. 上传文件到存储服务
|
||||
6. 检查文件 MD5 是否已存在
|
||||
7. 保存文件记录到数据库
|
||||
8. 返回文件信息(URL、ID、名称)
|
||||
|
||||
### 2. 存储服务
|
||||
|
||||
系统支持两种存储方式:
|
||||
|
||||
- **本地存储**: 文件保存在 `uploads/` 目录
|
||||
- **七牛云存储**: 文件上传到七牛云 OSS
|
||||
|
||||
存储方式通过 `yz_system_storage_config` 表配置。
|
||||
|
||||
## 性能优化建议
|
||||
|
||||
### 1. Nginx 反向代理配置
|
||||
|
||||
如果使用 Nginx 作为反向代理,需要调整以下配置:
|
||||
|
||||
```nginx
|
||||
server {
|
||||
listen 80;
|
||||
server_name api.yunzer.cn;
|
||||
|
||||
# 客户端请求体大小限制(0 表示不限制)
|
||||
client_max_body_size 0;
|
||||
|
||||
# 客户端请求体缓冲区大小
|
||||
client_body_buffer_size 128k;
|
||||
|
||||
# 超时配置
|
||||
client_body_timeout 3600s;
|
||||
send_timeout 3600s;
|
||||
proxy_connect_timeout 3600s;
|
||||
proxy_send_timeout 3600s;
|
||||
proxy_read_timeout 3600s;
|
||||
|
||||
location / {
|
||||
proxy_pass http://localhost: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;
|
||||
|
||||
# 禁用请求体缓冲(直接流式传输)
|
||||
proxy_request_buffering off;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 2. 磁盘空间监控
|
||||
|
||||
大文件上传需要足够的磁盘空间:
|
||||
|
||||
```bash
|
||||
# 检查磁盘空间
|
||||
df -h
|
||||
|
||||
# 监控 uploads 目录大小
|
||||
du -sh uploads/
|
||||
|
||||
# 设置磁盘空间告警(推荐使用监控工具)
|
||||
```
|
||||
|
||||
### 3. 数据库优化
|
||||
|
||||
对于频繁的文件查询,建议添加索引:
|
||||
|
||||
```sql
|
||||
-- MD5 索引(用于去重)
|
||||
CREATE INDEX idx_system_file_md5 ON yz_system_file(md5);
|
||||
|
||||
-- 租户 + 删除时间索引(用于文件列表查询)
|
||||
CREATE INDEX idx_system_file_tid_delete ON yz_system_file(tid, delete_time);
|
||||
```
|
||||
|
||||
## 故障排查
|
||||
|
||||
### 1. 上传失败:文件过大
|
||||
|
||||
**错误信息**: "文件大小不能超过 2048MB"
|
||||
|
||||
**解决方案**:
|
||||
- 检查 `fileUploadMaxMB` 常量设置
|
||||
- 确认 Nginx `client_max_body_size` 配置
|
||||
- 检查磁盘剩余空间
|
||||
|
||||
### 2. 上传超时
|
||||
|
||||
**错误信息**: "请求失败,请检查网络连接"
|
||||
|
||||
**解决方案**:
|
||||
- 检查 `app.conf` 中的 `ServerTimeOut` 配置
|
||||
- 检查 Nginx 超时配置
|
||||
- 检查网络带宽和稳定性
|
||||
|
||||
### 3. CORS 错误
|
||||
|
||||
**错误信息**: "已拦截跨源请求:同源策略禁止读取..."
|
||||
|
||||
**解决方案**:
|
||||
- 检查 `go/routers/router.go` 中的 CORS 配置
|
||||
- 确认 `Access-Control-Allow-Origin` 包含前端域名
|
||||
- 检查 `Access-Control-Allow-Headers` 包含 `Authorization`
|
||||
|
||||
### 4. 文件不存在(404)
|
||||
|
||||
**错误信息**: "请求的资源不存在"
|
||||
|
||||
**可能原因**:
|
||||
- 文件记录在数据库中不存在
|
||||
- 租户 ID (tid) 不匹配
|
||||
- 文件已被标记为删除
|
||||
|
||||
**解决方案**:
|
||||
```sql
|
||||
-- 检查文件记录
|
||||
SELECT * FROM yz_system_file WHERE id = 320;
|
||||
|
||||
-- 检查是否被删除
|
||||
SELECT * FROM yz_system_file WHERE id = 320 AND delete_time IS NULL;
|
||||
```
|
||||
|
||||
## 监控指标
|
||||
|
||||
建议监控以下指标:
|
||||
|
||||
1. **上传成功率**: 成功上传数 / 总上传请求数
|
||||
2. **平均上传时间**: 按文件大小分段统计
|
||||
3. **磁盘使用率**: uploads 目录大小 / 总磁盘空间
|
||||
4. **错误率**: 按错误类型分类统计
|
||||
|
||||
## 相关文件
|
||||
|
||||
- `go/controllers/platform_file.go` - 文件上传控制器
|
||||
- `go/services/storage_service.go` - 存储服务接口
|
||||
- `go/conf/app.conf` - 服务器配置
|
||||
- `go/routers/router.go` - 路由和 CORS 配置
|
||||
- `go/models/system_file.go` - 文件数据模型
|
||||
|
||||
## 更新日志
|
||||
|
||||
- **2026-04-09**:
|
||||
- 文件大小限制从 200MB 提升到 2GB
|
||||
- 移除服务器超时限制
|
||||
- 更新文档
|
||||
|
||||
## 参考资料
|
||||
|
||||
- [Beego 文档 - 文件上传](https://beego.vip/docs/mvc/controller/file.md)
|
||||
- [Nginx 文件上传配置](http://nginx.org/en/docs/http/ngx_http_core_module.html#client_max_body_size)
|
||||
- [七牛云 Go SDK](https://developer.qiniu.com/kodo/1238/go)
|
||||
# 大文件上传配置说明
|
||||
|
||||
## 概述
|
||||
|
||||
为支持大型软件安装包(如桌面客户端安装程序)的上传,系统已调整文件上传限制和超时配置。
|
||||
|
||||
## 配置修改
|
||||
|
||||
### 1. 文件大小限制
|
||||
|
||||
**文件位置**: `go/controllers/platform_file.go`
|
||||
|
||||
**修改内容**:
|
||||
```go
|
||||
// 修改前
|
||||
const fileUploadMaxMB = 200 // 200MB
|
||||
|
||||
// 修改后
|
||||
const fileUploadMaxMB = 2048 // 2GB,适用于大型软件安装包
|
||||
```
|
||||
|
||||
### 2. 服务器超时配置
|
||||
|
||||
**文件位置**: `go/conf/app.conf`
|
||||
|
||||
**新增配置**:
|
||||
```ini
|
||||
# 服务器超时配置(支持大文件上传)
|
||||
# 0 表示不设置超时限制
|
||||
ServerTimeOut = 0
|
||||
# 最大请求体大小(字节),0 表示不限制
|
||||
MaxMemory = 0
|
||||
```
|
||||
|
||||
## CORS 配置
|
||||
|
||||
**文件位置**: `go/routers/router.go`
|
||||
|
||||
当前 CORS 配置允许跨域请求:
|
||||
|
||||
```go
|
||||
beego.InsertFilter("*", beego.BeforeRouter, func(ctx *context.Context) {
|
||||
ctx.Output.Header("Access-Control-Allow-Origin", "*")
|
||||
ctx.Output.Header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, PATCH, OPTIONS")
|
||||
ctx.Output.Header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization")
|
||||
ctx.Output.Header("Access-Control-Max-Age", "86400")
|
||||
|
||||
if ctx.Input.Method() == "OPTIONS" {
|
||||
ctx.Output.Status = 200
|
||||
ctx.Output.Body([]byte(""))
|
||||
return
|
||||
}
|
||||
})
|
||||
```
|
||||
|
||||
### 生产环境 CORS 配置建议
|
||||
|
||||
在生产环境中,建议将 `Access-Control-Allow-Origin` 设置为具体的前端域名:
|
||||
|
||||
```go
|
||||
// 开发环境
|
||||
ctx.Output.Header("Access-Control-Allow-Origin", "*")
|
||||
|
||||
// 生产环境(推荐)
|
||||
allowedOrigins := []string{
|
||||
"https://platform.yunzer.cn",
|
||||
"https://www.yunzer.cn",
|
||||
}
|
||||
origin := ctx.Request.Header.Get("Origin")
|
||||
for _, allowed := range allowedOrigins {
|
||||
if origin == allowed {
|
||||
ctx.Output.Header("Access-Control-Allow-Origin", origin)
|
||||
break
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 上传流程
|
||||
|
||||
### 1. 文件上传接口
|
||||
|
||||
**路由**: `POST /platform/uploadfile`
|
||||
|
||||
**控制器**: `PlatformFileController.UploadFile`
|
||||
|
||||
**处理流程**:
|
||||
1. 验证用户身份(JWT token)
|
||||
2. 解析 multipart form(最大 2GB)
|
||||
3. 检查文件大小(不超过 2GB)
|
||||
4. 获取存储服务(本地或七牛云)
|
||||
5. 上传文件到存储服务
|
||||
6. 检查文件 MD5 是否已存在
|
||||
7. 保存文件记录到数据库
|
||||
8. 返回文件信息(URL、ID、名称)
|
||||
|
||||
### 2. 存储服务
|
||||
|
||||
系统支持两种存储方式:
|
||||
|
||||
- **本地存储**: 文件保存在 `uploads/` 目录
|
||||
- **七牛云存储**: 文件上传到七牛云 OSS
|
||||
|
||||
存储方式通过 `yz_system_storage_config` 表配置。
|
||||
|
||||
## 性能优化建议
|
||||
|
||||
### 1. Nginx 反向代理配置
|
||||
|
||||
如果使用 Nginx 作为反向代理,需要调整以下配置:
|
||||
|
||||
```nginx
|
||||
server {
|
||||
listen 80;
|
||||
server_name api.yunzer.cn;
|
||||
|
||||
# 客户端请求体大小限制(0 表示不限制)
|
||||
client_max_body_size 0;
|
||||
|
||||
# 客户端请求体缓冲区大小
|
||||
client_body_buffer_size 128k;
|
||||
|
||||
# 超时配置
|
||||
client_body_timeout 3600s;
|
||||
send_timeout 3600s;
|
||||
proxy_connect_timeout 3600s;
|
||||
proxy_send_timeout 3600s;
|
||||
proxy_read_timeout 3600s;
|
||||
|
||||
location / {
|
||||
proxy_pass http://localhost: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;
|
||||
|
||||
# 禁用请求体缓冲(直接流式传输)
|
||||
proxy_request_buffering off;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 2. 磁盘空间监控
|
||||
|
||||
大文件上传需要足够的磁盘空间:
|
||||
|
||||
```bash
|
||||
# 检查磁盘空间
|
||||
df -h
|
||||
|
||||
# 监控 uploads 目录大小
|
||||
du -sh uploads/
|
||||
|
||||
# 设置磁盘空间告警(推荐使用监控工具)
|
||||
```
|
||||
|
||||
### 3. 数据库优化
|
||||
|
||||
对于频繁的文件查询,建议添加索引:
|
||||
|
||||
```sql
|
||||
-- MD5 索引(用于去重)
|
||||
CREATE INDEX idx_system_file_md5 ON yz_system_file(md5);
|
||||
|
||||
-- 租户 + 删除时间索引(用于文件列表查询)
|
||||
CREATE INDEX idx_system_file_tid_delete ON yz_system_file(tid, delete_time);
|
||||
```
|
||||
|
||||
## 故障排查
|
||||
|
||||
### 1. 上传失败:文件过大
|
||||
|
||||
**错误信息**: "文件大小不能超过 2048MB"
|
||||
|
||||
**解决方案**:
|
||||
- 检查 `fileUploadMaxMB` 常量设置
|
||||
- 确认 Nginx `client_max_body_size` 配置
|
||||
- 检查磁盘剩余空间
|
||||
|
||||
### 2. 上传超时
|
||||
|
||||
**错误信息**: "请求失败,请检查网络连接"
|
||||
|
||||
**解决方案**:
|
||||
- 检查 `app.conf` 中的 `ServerTimeOut` 配置
|
||||
- 检查 Nginx 超时配置
|
||||
- 检查网络带宽和稳定性
|
||||
|
||||
### 3. CORS 错误
|
||||
|
||||
**错误信息**: "已拦截跨源请求:同源策略禁止读取..."
|
||||
|
||||
**解决方案**:
|
||||
- 检查 `go/routers/router.go` 中的 CORS 配置
|
||||
- 确认 `Access-Control-Allow-Origin` 包含前端域名
|
||||
- 检查 `Access-Control-Allow-Headers` 包含 `Authorization`
|
||||
|
||||
### 4. 文件不存在(404)
|
||||
|
||||
**错误信息**: "请求的资源不存在"
|
||||
|
||||
**可能原因**:
|
||||
- 文件记录在数据库中不存在
|
||||
- 租户 ID (tid) 不匹配
|
||||
- 文件已被标记为删除
|
||||
|
||||
**解决方案**:
|
||||
```sql
|
||||
-- 检查文件记录
|
||||
SELECT * FROM yz_system_file WHERE id = 320;
|
||||
|
||||
-- 检查是否被删除
|
||||
SELECT * FROM yz_system_file WHERE id = 320 AND delete_time IS NULL;
|
||||
```
|
||||
|
||||
## 监控指标
|
||||
|
||||
建议监控以下指标:
|
||||
|
||||
1. **上传成功率**: 成功上传数 / 总上传请求数
|
||||
2. **平均上传时间**: 按文件大小分段统计
|
||||
3. **磁盘使用率**: uploads 目录大小 / 总磁盘空间
|
||||
4. **错误率**: 按错误类型分类统计
|
||||
|
||||
## 相关文件
|
||||
|
||||
- `go/controllers/platform_file.go` - 文件上传控制器
|
||||
- `go/services/storage_service.go` - 存储服务接口
|
||||
- `go/conf/app.conf` - 服务器配置
|
||||
- `go/routers/router.go` - 路由和 CORS 配置
|
||||
- `go/models/system_file.go` - 文件数据模型
|
||||
|
||||
## 更新日志
|
||||
|
||||
- **2026-04-09**:
|
||||
- 文件大小限制从 200MB 提升到 2GB
|
||||
- 移除服务器超时限制
|
||||
- 更新文档
|
||||
|
||||
## 参考资料
|
||||
|
||||
- [Beego 文档 - 文件上传](https://beego.vip/docs/mvc/controller/file.md)
|
||||
- [Nginx 文件上传配置](http://nginx.org/en/docs/http/ngx_http_core_module.html#client_max_body_size)
|
||||
- [七牛云 Go SDK](https://developer.qiniu.com/kodo/1238/go)
|
||||
|
||||
+183
-183
@@ -1,183 +1,183 @@
|
||||
# 文档整理说明
|
||||
|
||||
## 📁 文档结构
|
||||
|
||||
所有文档已按照项目结构整理到对应的 `docs/` 目录中。
|
||||
|
||||
### 后端文档 (go/docs/)
|
||||
|
||||
```
|
||||
go/docs/
|
||||
├── README.md # 文档索引(新增)
|
||||
├── 后端开发规则.md # 开发规范
|
||||
├── 接口文件.md # 接口文档
|
||||
├── 服务端启动命令.md # 启动说明
|
||||
├── QUICK_START.md # 快速开始(新增)
|
||||
├── README_STORAGE.md # 存储功能说明(新增)
|
||||
├── storage-config-guide.md # 存储详细指南(新增)
|
||||
├── DEPLOYMENT_CHECKLIST.md # 部署清单(新增)
|
||||
├── IMPLEMENTATION_COMPLETE.md # 实现报告(新增)
|
||||
├── 文档整理说明.md # 本文件(新增)
|
||||
└── sql/
|
||||
└── add_storage_config_table.sql # 数据库迁移
|
||||
```
|
||||
|
||||
### 前端文档 (platform/docs/)
|
||||
|
||||
```
|
||||
platform/docs/
|
||||
├── README.md # 文档索引(新增)
|
||||
├── dictionary-usage.md # 字典使用
|
||||
├── pinia-dict-guide.md # Pinia字典指南
|
||||
├── 一键复制.md # 复制功能
|
||||
├── 拼接接口路径.md # 接口路径
|
||||
├── 接口调用.md # 接口调用
|
||||
├── 获取缓存数据.md # 缓存数据
|
||||
├── 调用图片上传组件.md # 图片上传
|
||||
└── 调用字典.md # 字典调用
|
||||
```
|
||||
|
||||
### 项目根目录
|
||||
|
||||
```
|
||||
项目根目录/
|
||||
└── README.md # 总导航(新增)
|
||||
```
|
||||
|
||||
## 📝 文档分类
|
||||
|
||||
### 1. 开发文档
|
||||
- 后端开发规则.md
|
||||
- 接口文件.md
|
||||
- 服务端启动命令.md
|
||||
|
||||
### 2. 功能文档
|
||||
- dictionary-usage.md
|
||||
- pinia-dict-guide.md
|
||||
- 调用字典.md
|
||||
- 调用图片上传组件.md
|
||||
- 等...
|
||||
|
||||
### 3. 存储配置功能文档(新增)
|
||||
- QUICK_START.md - 快速开始
|
||||
- README_STORAGE.md - 功能说明
|
||||
- storage-config-guide.md - 详细指南
|
||||
- DEPLOYMENT_CHECKLIST.md - 部署清单
|
||||
- IMPLEMENTATION_COMPLETE.md - 实现报告
|
||||
|
||||
### 4. 索引文档(新增)
|
||||
- 项目根目录/README.md - 总导航
|
||||
- go/docs/README.md - 后端文档索引
|
||||
- platform/docs/README.md - 前端文档索引
|
||||
|
||||
## 🔍 文档查找
|
||||
|
||||
### 按功能查找
|
||||
|
||||
**存储配置功能**:
|
||||
1. 快速开始 → `go/docs/QUICK_START.md`
|
||||
2. 功能说明 → `go/docs/README_STORAGE.md`
|
||||
3. 详细指南 → `go/docs/storage-config-guide.md`
|
||||
4. 部署清单 → `go/docs/DEPLOYMENT_CHECKLIST.md`
|
||||
|
||||
**字典功能**:
|
||||
1. 使用说明 → `platform/docs/dictionary-usage.md`
|
||||
2. Pinia指南 → `platform/docs/pinia-dict-guide.md`
|
||||
|
||||
**图片上传**:
|
||||
1. 组件调用 → `platform/docs/调用图片上传组件.md`
|
||||
|
||||
### 按角色查找
|
||||
|
||||
**新手开发者**:
|
||||
1. 项目总览 → `README.md`
|
||||
2. 后端开发 → `go/docs/后端开发规则.md`
|
||||
3. 快速开始 → `go/docs/QUICK_START.md`
|
||||
|
||||
**运维人员**:
|
||||
1. 启动命令 → `go/docs/服务端启动命令.md`
|
||||
2. 部署清单 → `go/docs/DEPLOYMENT_CHECKLIST.md`
|
||||
|
||||
**产品经理**:
|
||||
1. 功能说明 → `go/docs/README_STORAGE.md`
|
||||
2. 实现报告 → `go/docs/IMPLEMENTATION_COMPLETE.md`
|
||||
|
||||
## 📋 文档规范
|
||||
|
||||
### 文件命名
|
||||
- 中文文档:使用中文名称(如:后端开发规则.md)
|
||||
- 英文文档:使用大写+下划线(如:README_STORAGE.md)
|
||||
- 索引文档:统一使用 README.md
|
||||
|
||||
### 文档结构
|
||||
```markdown
|
||||
# 标题
|
||||
|
||||
## 概述
|
||||
简要说明文档内容
|
||||
|
||||
## 目录
|
||||
- 章节1
|
||||
- 章节2
|
||||
|
||||
## 详细内容
|
||||
...
|
||||
|
||||
## 相关链接
|
||||
- 链接1
|
||||
- 链接2
|
||||
```
|
||||
|
||||
### 文档位置
|
||||
- 后端相关文档 → `go/docs/`
|
||||
- 前端相关文档 → `platform/docs/`
|
||||
- 移动端相关文档 → `babyhealth/docs/`
|
||||
- 项目总览 → 根目录 `README.md`
|
||||
|
||||
## 🔄 文档更新
|
||||
|
||||
### 新增文档
|
||||
1. 确定文档类型(后端/前端/通用)
|
||||
2. 放入对应的 `docs/` 目录
|
||||
3. 更新对应的 `README.md` 索引
|
||||
4. 如需要,更新根目录 `README.md`
|
||||
|
||||
### 修改文档
|
||||
1. 直接修改对应文档
|
||||
2. 更新文档底部的"最后更新"时间
|
||||
3. 如有重大变更,更新索引文档
|
||||
|
||||
### 删除文档
|
||||
1. 删除文档文件
|
||||
2. 从索引中移除引用
|
||||
3. 检查其他文档中的链接
|
||||
|
||||
## ✅ 整理完成清单
|
||||
|
||||
- [x] 创建后端文档索引 (go/docs/README.md)
|
||||
- [x] 创建前端文档索引 (platform/docs/README.md)
|
||||
- [x] 创建项目总导航 (README.md)
|
||||
- [x] 移动存储功能文档到 go/docs/
|
||||
- [x] 删除根目录的临时文档
|
||||
- [x] 创建文档整理说明(本文件)
|
||||
|
||||
## 📌 注意事项
|
||||
|
||||
1. **文档位置**: 所有文档必须放在对应项目的 `docs/` 目录中
|
||||
2. **索引更新**: 新增文档后必须更新索引文件
|
||||
3. **链接检查**: 修改文档位置后检查所有引用链接
|
||||
4. **命名规范**: 遵循统一的文件命名规范
|
||||
5. **内容质量**: 保持文档的准确性和时效性
|
||||
|
||||
## 🎯 后续优化
|
||||
|
||||
- [ ] 添加文档搜索功能
|
||||
- [ ] 生成文档网站(如使用 VuePress)
|
||||
- [ ] 添加文档版本管理
|
||||
- [ ] 自动化文档检查工具
|
||||
- [ ] 文档贡献指南
|
||||
|
||||
---
|
||||
|
||||
**整理完成时间**: 2024-01-01
|
||||
**整理人员**: AI Assistant
|
||||
# 文档整理说明
|
||||
|
||||
## 📁 文档结构
|
||||
|
||||
所有文档已按照项目结构整理到对应的 `docs/` 目录中。
|
||||
|
||||
### 后端文档 (go/docs/)
|
||||
|
||||
```
|
||||
go/docs/
|
||||
├── README.md # 文档索引(新增)
|
||||
├── 后端开发规则.md # 开发规范
|
||||
├── 接口文件.md # 接口文档
|
||||
├── 服务端启动命令.md # 启动说明
|
||||
├── QUICK_START.md # 快速开始(新增)
|
||||
├── README_STORAGE.md # 存储功能说明(新增)
|
||||
├── storage-config-guide.md # 存储详细指南(新增)
|
||||
├── DEPLOYMENT_CHECKLIST.md # 部署清单(新增)
|
||||
├── IMPLEMENTATION_COMPLETE.md # 实现报告(新增)
|
||||
├── 文档整理说明.md # 本文件(新增)
|
||||
└── sql/
|
||||
└── add_storage_config_table.sql # 数据库迁移
|
||||
```
|
||||
|
||||
### 前端文档 (platform/docs/)
|
||||
|
||||
```
|
||||
platform/docs/
|
||||
├── README.md # 文档索引(新增)
|
||||
├── dictionary-usage.md # 字典使用
|
||||
├── pinia-dict-guide.md # Pinia字典指南
|
||||
├── 一键复制.md # 复制功能
|
||||
├── 拼接接口路径.md # 接口路径
|
||||
├── 接口调用.md # 接口调用
|
||||
├── 获取缓存数据.md # 缓存数据
|
||||
├── 调用图片上传组件.md # 图片上传
|
||||
└── 调用字典.md # 字典调用
|
||||
```
|
||||
|
||||
### 项目根目录
|
||||
|
||||
```
|
||||
项目根目录/
|
||||
└── README.md # 总导航(新增)
|
||||
```
|
||||
|
||||
## 📝 文档分类
|
||||
|
||||
### 1. 开发文档
|
||||
- 后端开发规则.md
|
||||
- 接口文件.md
|
||||
- 服务端启动命令.md
|
||||
|
||||
### 2. 功能文档
|
||||
- dictionary-usage.md
|
||||
- pinia-dict-guide.md
|
||||
- 调用字典.md
|
||||
- 调用图片上传组件.md
|
||||
- 等...
|
||||
|
||||
### 3. 存储配置功能文档(新增)
|
||||
- QUICK_START.md - 快速开始
|
||||
- README_STORAGE.md - 功能说明
|
||||
- storage-config-guide.md - 详细指南
|
||||
- DEPLOYMENT_CHECKLIST.md - 部署清单
|
||||
- IMPLEMENTATION_COMPLETE.md - 实现报告
|
||||
|
||||
### 4. 索引文档(新增)
|
||||
- 项目根目录/README.md - 总导航
|
||||
- go/docs/README.md - 后端文档索引
|
||||
- platform/docs/README.md - 前端文档索引
|
||||
|
||||
## 🔍 文档查找
|
||||
|
||||
### 按功能查找
|
||||
|
||||
**存储配置功能**:
|
||||
1. 快速开始 → `go/docs/QUICK_START.md`
|
||||
2. 功能说明 → `go/docs/README_STORAGE.md`
|
||||
3. 详细指南 → `go/docs/storage-config-guide.md`
|
||||
4. 部署清单 → `go/docs/DEPLOYMENT_CHECKLIST.md`
|
||||
|
||||
**字典功能**:
|
||||
1. 使用说明 → `platform/docs/dictionary-usage.md`
|
||||
2. Pinia指南 → `platform/docs/pinia-dict-guide.md`
|
||||
|
||||
**图片上传**:
|
||||
1. 组件调用 → `platform/docs/调用图片上传组件.md`
|
||||
|
||||
### 按角色查找
|
||||
|
||||
**新手开发者**:
|
||||
1. 项目总览 → `README.md`
|
||||
2. 后端开发 → `go/docs/后端开发规则.md`
|
||||
3. 快速开始 → `go/docs/QUICK_START.md`
|
||||
|
||||
**运维人员**:
|
||||
1. 启动命令 → `go/docs/服务端启动命令.md`
|
||||
2. 部署清单 → `go/docs/DEPLOYMENT_CHECKLIST.md`
|
||||
|
||||
**产品经理**:
|
||||
1. 功能说明 → `go/docs/README_STORAGE.md`
|
||||
2. 实现报告 → `go/docs/IMPLEMENTATION_COMPLETE.md`
|
||||
|
||||
## 📋 文档规范
|
||||
|
||||
### 文件命名
|
||||
- 中文文档:使用中文名称(如:后端开发规则.md)
|
||||
- 英文文档:使用大写+下划线(如:README_STORAGE.md)
|
||||
- 索引文档:统一使用 README.md
|
||||
|
||||
### 文档结构
|
||||
```markdown
|
||||
# 标题
|
||||
|
||||
## 概述
|
||||
简要说明文档内容
|
||||
|
||||
## 目录
|
||||
- 章节1
|
||||
- 章节2
|
||||
|
||||
## 详细内容
|
||||
...
|
||||
|
||||
## 相关链接
|
||||
- 链接1
|
||||
- 链接2
|
||||
```
|
||||
|
||||
### 文档位置
|
||||
- 后端相关文档 → `go/docs/`
|
||||
- 前端相关文档 → `platform/docs/`
|
||||
- 移动端相关文档 → `babyhealth/docs/`
|
||||
- 项目总览 → 根目录 `README.md`
|
||||
|
||||
## 🔄 文档更新
|
||||
|
||||
### 新增文档
|
||||
1. 确定文档类型(后端/前端/通用)
|
||||
2. 放入对应的 `docs/` 目录
|
||||
3. 更新对应的 `README.md` 索引
|
||||
4. 如需要,更新根目录 `README.md`
|
||||
|
||||
### 修改文档
|
||||
1. 直接修改对应文档
|
||||
2. 更新文档底部的"最后更新"时间
|
||||
3. 如有重大变更,更新索引文档
|
||||
|
||||
### 删除文档
|
||||
1. 删除文档文件
|
||||
2. 从索引中移除引用
|
||||
3. 检查其他文档中的链接
|
||||
|
||||
## ✅ 整理完成清单
|
||||
|
||||
- [x] 创建后端文档索引 (go/docs/README.md)
|
||||
- [x] 创建前端文档索引 (platform/docs/README.md)
|
||||
- [x] 创建项目总导航 (README.md)
|
||||
- [x] 移动存储功能文档到 go/docs/
|
||||
- [x] 删除根目录的临时文档
|
||||
- [x] 创建文档整理说明(本文件)
|
||||
|
||||
## 📌 注意事项
|
||||
|
||||
1. **文档位置**: 所有文档必须放在对应项目的 `docs/` 目录中
|
||||
2. **索引更新**: 新增文档后必须更新索引文件
|
||||
3. **链接检查**: 修改文档位置后检查所有引用链接
|
||||
4. **命名规范**: 遵循统一的文件命名规范
|
||||
5. **内容质量**: 保持文档的准确性和时效性
|
||||
|
||||
## 🎯 后续优化
|
||||
|
||||
- [ ] 添加文档搜索功能
|
||||
- [ ] 生成文档网站(如使用 VuePress)
|
||||
- [ ] 添加文档版本管理
|
||||
- [ ] 自动化文档检查工具
|
||||
- [ ] 文档贡献指南
|
||||
|
||||
---
|
||||
|
||||
**整理完成时间**: 2024-01-01
|
||||
**整理人员**: AI Assistant
|
||||
|
||||
+299
-299
@@ -1,300 +1,300 @@
|
||||
## 方式一:使用 systemd 服务(推荐)
|
||||
|
||||
### 自动安装(推荐)
|
||||
|
||||
使用安装脚本自动配置 systemd 服务:
|
||||
|
||||
```bash
|
||||
# 进入脚本目录
|
||||
cd /www/wwwroot/api.yunzer.cn/scripts
|
||||
|
||||
# 添加执行权限
|
||||
chmod +x install-systemd-service.sh
|
||||
|
||||
# 运行安装脚本
|
||||
sudo bash install-systemd-service.sh
|
||||
|
||||
或者
|
||||
|
||||
sudo env PATH=$PATH:/usr/local/btgo/bin bash install-systemd-service.sh
|
||||
|
||||
|
||||
```
|
||||
|
||||
脚本会自动:
|
||||
- 停止现有服务和进程
|
||||
- 创建正确的 systemd 配置文件
|
||||
- 启动服务
|
||||
- 启用开机自启
|
||||
- 显示服务状态和日志
|
||||
|
||||
### 手动安装
|
||||
|
||||
如果需要手动配置:
|
||||
|
||||
```bash
|
||||
# 1. 停止现有服务
|
||||
systemctl stop go-api
|
||||
pkill -f "go run main.go"
|
||||
|
||||
# 2. 复制服务文件
|
||||
sudo cp /www/wwwroot/api.yunzer.cn/scripts/go-api.service /etc/systemd/system/
|
||||
|
||||
# 3. 重载 systemd
|
||||
sudo systemctl daemon-reload
|
||||
|
||||
# 4. 启动服务
|
||||
sudo systemctl start go-api
|
||||
|
||||
# 5. 启用开机自启
|
||||
sudo systemctl enable go-api
|
||||
|
||||
# 6. 查看状态
|
||||
sudo systemctl status go-api
|
||||
```
|
||||
|
||||
### 启动服务
|
||||
```bash
|
||||
systemctl start go-api
|
||||
```
|
||||
|
||||
### 查看状态
|
||||
```bash
|
||||
systemctl status go-api
|
||||
```
|
||||
|
||||
### 常用命令
|
||||
```bash
|
||||
# 启动
|
||||
systemctl start go-api
|
||||
|
||||
# 停止
|
||||
systemctl stop go-api
|
||||
|
||||
# 重启
|
||||
systemctl restart go-api
|
||||
|
||||
# 查看状态
|
||||
systemctl status go-api
|
||||
|
||||
# 查看日志(systemd 日志)
|
||||
journalctl -u go-api -f
|
||||
|
||||
# 查看日志(文件日志)
|
||||
tail -f /www/wwwroot/api.yunzer.cn/go.log
|
||||
|
||||
# 开机自启
|
||||
systemctl enable go-api
|
||||
|
||||
# 禁用开机自启
|
||||
systemctl disable go-api
|
||||
```
|
||||
|
||||
## 方式二:使用管理脚本(推荐)
|
||||
|
||||
### 脚本位置
|
||||
```bash
|
||||
/www/wwwroot/api.yunzer.cn/scripts/service.sh
|
||||
```
|
||||
|
||||
### 添加执行权限
|
||||
```bash
|
||||
chmod +x /www/wwwroot/api.yunzer.cn/scripts/service.sh
|
||||
```
|
||||
|
||||
### 常用命令
|
||||
```bash
|
||||
# 启动服务
|
||||
bash /www/wwwroot/api.yunzer.cn/scripts/service.sh start
|
||||
|
||||
# 停止服务
|
||||
bash /www/wwwroot/api.yunzer.cn/scripts/service.sh stop
|
||||
|
||||
# 重启服务
|
||||
bash /www/wwwroot/api.yunzer.cn/scripts/service.sh restart
|
||||
|
||||
# 查看状态
|
||||
bash /www/wwwroot/api.yunzer.cn/scripts/service.sh status
|
||||
|
||||
# 查看日志(最后 50 行)
|
||||
bash /www/wwwroot/api.yunzer.cn/scripts/service.sh logs
|
||||
|
||||
# 实时查看日志
|
||||
bash /www/wwwroot/api.yunzer.cn/scripts/service.sh logs -f
|
||||
|
||||
# 查看最后 100 行日志
|
||||
bash /www/wwwroot/api.yunzer.cn/scripts/service.sh logs 100
|
||||
```
|
||||
|
||||
### 创建快捷命令(可选)
|
||||
```bash
|
||||
# 添加到 ~/.bashrc
|
||||
echo 'alias go-service="bash /www/wwwroot/api.yunzer.cn/scripts/service.sh"' >> ~/.bashrc
|
||||
source ~/.bashrc
|
||||
|
||||
# 使用快捷命令
|
||||
go-service start
|
||||
go-service restart
|
||||
go-service status
|
||||
go-service logs -f
|
||||
```
|
||||
|
||||
## 方式三:后台直接启动
|
||||
|
||||
### 启动服务
|
||||
```bash
|
||||
cd /www/wwwroot/api.yunzer.cn
|
||||
nohup go run main.go > go.log 2>&1 &
|
||||
```
|
||||
|
||||
### 查看是否运行成功
|
||||
```bash
|
||||
tail -f go.log
|
||||
```
|
||||
|
||||
### 查看进程
|
||||
```bash
|
||||
ps aux | grep "go run main.go" | grep -v grep
|
||||
```
|
||||
|
||||
### 重启服务
|
||||
```bash
|
||||
pkill -f "go run main.go" && cd /www/wwwroot/api.yunzer.cn && nohup go run main.go > go.log 2>&1 &
|
||||
```
|
||||
|
||||
### 停止服务
|
||||
```bash
|
||||
pkill -f "go run main.go"
|
||||
```
|
||||
|
||||
## 日志查看
|
||||
|
||||
### 查看实时日志
|
||||
```bash
|
||||
# systemd 方式
|
||||
journalctl -u go-api -f
|
||||
|
||||
# 直接启动方式
|
||||
tail -f /www/wwwroot/api.yunzer.cn/go.log
|
||||
```
|
||||
|
||||
### 查看最近日志
|
||||
```bash
|
||||
# systemd 方式
|
||||
journalctl -u go-api -n 100
|
||||
|
||||
# 直接启动方式
|
||||
tail -n 100 /www/wwwroot/api.yunzer.cn/go.log
|
||||
```
|
||||
|
||||
### 查看错误日志
|
||||
```bash
|
||||
# systemd 方式
|
||||
journalctl -u go-api -p err
|
||||
|
||||
# 直接启动方式
|
||||
grep -i error /www/wwwroot/api.yunzer.cn/go.log
|
||||
```
|
||||
|
||||
## 常见问题
|
||||
|
||||
### 1. 服务启动失败
|
||||
|
||||
**检查日志**:
|
||||
```bash
|
||||
# systemd
|
||||
journalctl -u go-api -n 50
|
||||
|
||||
# 直接启动
|
||||
tail -n 50 /www/wwwroot/api.yunzer.cn/go.log
|
||||
```
|
||||
|
||||
**常见原因**:
|
||||
- 端口被占用(8081)
|
||||
- 数据库连接失败
|
||||
- 配置文件错误
|
||||
|
||||
### 2. 端口被占用
|
||||
|
||||
**查看端口占用**:
|
||||
```bash
|
||||
netstat -tlnp | grep 8081
|
||||
# 或
|
||||
lsof -i :8081
|
||||
```
|
||||
|
||||
**停止占用进程**:
|
||||
```bash
|
||||
# 找到 PID
|
||||
lsof -i :8081
|
||||
|
||||
# 停止进程
|
||||
kill -9 <PID>
|
||||
```
|
||||
|
||||
### 3. 进程残留
|
||||
|
||||
**查找残留进程**:
|
||||
```bash
|
||||
ps aux | grep "go run main.go" | grep -v grep
|
||||
```
|
||||
|
||||
**清理残留进程**:
|
||||
```bash
|
||||
pkill -9 -f "go run main.go"
|
||||
```
|
||||
|
||||
### 4. 日志文件不存在
|
||||
|
||||
**原因**:启动命令没有重定向输出
|
||||
|
||||
**解决**:使用正确的启动命令
|
||||
```bash
|
||||
nohup go run main.go > go.log 2>&1 &
|
||||
```
|
||||
|
||||
## 性能监控
|
||||
|
||||
### 查看资源占用
|
||||
```bash
|
||||
# CPU 和内存
|
||||
top -p $(pgrep -f "go run main.go")
|
||||
|
||||
# 详细信息
|
||||
ps aux | grep "go run main.go" | grep -v grep
|
||||
```
|
||||
|
||||
### 查看连接数
|
||||
```bash
|
||||
netstat -an | grep 8081 | wc -l
|
||||
```
|
||||
|
||||
### 查看文件描述符
|
||||
```bash
|
||||
lsof -p $(pgrep -f "go run main.go") | wc -l
|
||||
```
|
||||
|
||||
## 生产环境建议
|
||||
|
||||
1. **使用 systemd 服务**:更稳定,支持自动重启
|
||||
2. **配置日志轮转**:防止日志文件过大
|
||||
3. **监控服务状态**:使用监控工具(如 Prometheus)
|
||||
4. **定期备份**:备份数据库和配置文件
|
||||
5. **使用编译后的二进制**:比 `go run` 更高效
|
||||
|
||||
### 编译并运行(推荐生产环境)
|
||||
```bash
|
||||
# 编译
|
||||
cd /www/wwwroot/api.yunzer.cn
|
||||
go build -o server main.go
|
||||
|
||||
# 运行
|
||||
nohup ./server > go.log 2>&1 &
|
||||
|
||||
# 或使用 systemd(修改 ExecStart)
|
||||
# ExecStart=/www/wwwroot/api.yunzer.cn/server
|
||||
```
|
||||
|
||||
## 更新日期
|
||||
|
||||
## 方式一:使用 systemd 服务(推荐)
|
||||
|
||||
### 自动安装(推荐)
|
||||
|
||||
使用安装脚本自动配置 systemd 服务:
|
||||
|
||||
```bash
|
||||
# 进入脚本目录
|
||||
cd /www/wwwroot/api.yunzer.cn/scripts
|
||||
|
||||
# 添加执行权限
|
||||
chmod +x install-systemd-service.sh
|
||||
|
||||
# 运行安装脚本
|
||||
sudo bash install-systemd-service.sh
|
||||
|
||||
或者
|
||||
|
||||
sudo env PATH=$PATH:/usr/local/btgo/bin bash install-systemd-service.sh
|
||||
|
||||
|
||||
```
|
||||
|
||||
脚本会自动:
|
||||
- 停止现有服务和进程
|
||||
- 创建正确的 systemd 配置文件
|
||||
- 启动服务
|
||||
- 启用开机自启
|
||||
- 显示服务状态和日志
|
||||
|
||||
### 手动安装
|
||||
|
||||
如果需要手动配置:
|
||||
|
||||
```bash
|
||||
# 1. 停止现有服务
|
||||
systemctl stop go-api
|
||||
pkill -f "go run main.go"
|
||||
|
||||
# 2. 复制服务文件
|
||||
sudo cp /www/wwwroot/api.yunzer.cn/scripts/go-api.service /etc/systemd/system/
|
||||
|
||||
# 3. 重载 systemd
|
||||
sudo systemctl daemon-reload
|
||||
|
||||
# 4. 启动服务
|
||||
sudo systemctl start go-api
|
||||
|
||||
# 5. 启用开机自启
|
||||
sudo systemctl enable go-api
|
||||
|
||||
# 6. 查看状态
|
||||
sudo systemctl status go-api
|
||||
```
|
||||
|
||||
### 启动服务
|
||||
```bash
|
||||
systemctl start go-api
|
||||
```
|
||||
|
||||
### 查看状态
|
||||
```bash
|
||||
systemctl status go-api
|
||||
```
|
||||
|
||||
### 常用命令
|
||||
```bash
|
||||
# 启动
|
||||
systemctl start go-api
|
||||
|
||||
# 停止
|
||||
systemctl stop go-api
|
||||
|
||||
# 重启
|
||||
systemctl restart go-api
|
||||
|
||||
# 查看状态
|
||||
systemctl status go-api
|
||||
|
||||
# 查看日志(systemd 日志)
|
||||
journalctl -u go-api -f
|
||||
|
||||
# 查看日志(文件日志)
|
||||
tail -f /www/wwwroot/api.yunzer.cn/go.log
|
||||
|
||||
# 开机自启
|
||||
systemctl enable go-api
|
||||
|
||||
# 禁用开机自启
|
||||
systemctl disable go-api
|
||||
```
|
||||
|
||||
## 方式二:使用管理脚本(推荐)
|
||||
|
||||
### 脚本位置
|
||||
```bash
|
||||
/www/wwwroot/api.yunzer.cn/scripts/service.sh
|
||||
```
|
||||
|
||||
### 添加执行权限
|
||||
```bash
|
||||
chmod +x /www/wwwroot/api.yunzer.cn/scripts/service.sh
|
||||
```
|
||||
|
||||
### 常用命令
|
||||
```bash
|
||||
# 启动服务
|
||||
bash /www/wwwroot/api.yunzer.cn/scripts/service.sh start
|
||||
|
||||
# 停止服务
|
||||
bash /www/wwwroot/api.yunzer.cn/scripts/service.sh stop
|
||||
|
||||
# 重启服务
|
||||
bash /www/wwwroot/api.yunzer.cn/scripts/service.sh restart
|
||||
|
||||
# 查看状态
|
||||
bash /www/wwwroot/api.yunzer.cn/scripts/service.sh status
|
||||
|
||||
# 查看日志(最后 50 行)
|
||||
bash /www/wwwroot/api.yunzer.cn/scripts/service.sh logs
|
||||
|
||||
# 实时查看日志
|
||||
bash /www/wwwroot/api.yunzer.cn/scripts/service.sh logs -f
|
||||
|
||||
# 查看最后 100 行日志
|
||||
bash /www/wwwroot/api.yunzer.cn/scripts/service.sh logs 100
|
||||
```
|
||||
|
||||
### 创建快捷命令(可选)
|
||||
```bash
|
||||
# 添加到 ~/.bashrc
|
||||
echo 'alias go-service="bash /www/wwwroot/api.yunzer.cn/scripts/service.sh"' >> ~/.bashrc
|
||||
source ~/.bashrc
|
||||
|
||||
# 使用快捷命令
|
||||
go-service start
|
||||
go-service restart
|
||||
go-service status
|
||||
go-service logs -f
|
||||
```
|
||||
|
||||
## 方式三:后台直接启动
|
||||
|
||||
### 启动服务
|
||||
```bash
|
||||
cd /www/wwwroot/api.yunzer.cn
|
||||
nohup go run main.go > go.log 2>&1 &
|
||||
```
|
||||
|
||||
### 查看是否运行成功
|
||||
```bash
|
||||
tail -f go.log
|
||||
```
|
||||
|
||||
### 查看进程
|
||||
```bash
|
||||
ps aux | grep "go run main.go" | grep -v grep
|
||||
```
|
||||
|
||||
### 重启服务
|
||||
```bash
|
||||
pkill -f "go run main.go" && cd /www/wwwroot/api.yunzer.cn && nohup go run main.go > go.log 2>&1 &
|
||||
```
|
||||
|
||||
### 停止服务
|
||||
```bash
|
||||
pkill -f "go run main.go"
|
||||
```
|
||||
|
||||
## 日志查看
|
||||
|
||||
### 查看实时日志
|
||||
```bash
|
||||
# systemd 方式
|
||||
journalctl -u go-api -f
|
||||
|
||||
# 直接启动方式
|
||||
tail -f /www/wwwroot/api.yunzer.cn/go.log
|
||||
```
|
||||
|
||||
### 查看最近日志
|
||||
```bash
|
||||
# systemd 方式
|
||||
journalctl -u go-api -n 100
|
||||
|
||||
# 直接启动方式
|
||||
tail -n 100 /www/wwwroot/api.yunzer.cn/go.log
|
||||
```
|
||||
|
||||
### 查看错误日志
|
||||
```bash
|
||||
# systemd 方式
|
||||
journalctl -u go-api -p err
|
||||
|
||||
# 直接启动方式
|
||||
grep -i error /www/wwwroot/api.yunzer.cn/go.log
|
||||
```
|
||||
|
||||
## 常见问题
|
||||
|
||||
### 1. 服务启动失败
|
||||
|
||||
**检查日志**:
|
||||
```bash
|
||||
# systemd
|
||||
journalctl -u go-api -n 50
|
||||
|
||||
# 直接启动
|
||||
tail -n 50 /www/wwwroot/api.yunzer.cn/go.log
|
||||
```
|
||||
|
||||
**常见原因**:
|
||||
- 端口被占用(8081)
|
||||
- 数据库连接失败
|
||||
- 配置文件错误
|
||||
|
||||
### 2. 端口被占用
|
||||
|
||||
**查看端口占用**:
|
||||
```bash
|
||||
netstat -tlnp | grep 8081
|
||||
# 或
|
||||
lsof -i :8081
|
||||
```
|
||||
|
||||
**停止占用进程**:
|
||||
```bash
|
||||
# 找到 PID
|
||||
lsof -i :8081
|
||||
|
||||
# 停止进程
|
||||
kill -9 <PID>
|
||||
```
|
||||
|
||||
### 3. 进程残留
|
||||
|
||||
**查找残留进程**:
|
||||
```bash
|
||||
ps aux | grep "go run main.go" | grep -v grep
|
||||
```
|
||||
|
||||
**清理残留进程**:
|
||||
```bash
|
||||
pkill -9 -f "go run main.go"
|
||||
```
|
||||
|
||||
### 4. 日志文件不存在
|
||||
|
||||
**原因**:启动命令没有重定向输出
|
||||
|
||||
**解决**:使用正确的启动命令
|
||||
```bash
|
||||
nohup go run main.go > go.log 2>&1 &
|
||||
```
|
||||
|
||||
## 性能监控
|
||||
|
||||
### 查看资源占用
|
||||
```bash
|
||||
# CPU 和内存
|
||||
top -p $(pgrep -f "go run main.go")
|
||||
|
||||
# 详细信息
|
||||
ps aux | grep "go run main.go" | grep -v grep
|
||||
```
|
||||
|
||||
### 查看连接数
|
||||
```bash
|
||||
netstat -an | grep 8081 | wc -l
|
||||
```
|
||||
|
||||
### 查看文件描述符
|
||||
```bash
|
||||
lsof -p $(pgrep -f "go run main.go") | wc -l
|
||||
```
|
||||
|
||||
## 生产环境建议
|
||||
|
||||
1. **使用 systemd 服务**:更稳定,支持自动重启
|
||||
2. **配置日志轮转**:防止日志文件过大
|
||||
3. **监控服务状态**:使用监控工具(如 Prometheus)
|
||||
4. **定期备份**:备份数据库和配置文件
|
||||
5. **使用编译后的二进制**:比 `go run` 更高效
|
||||
|
||||
### 编译并运行(推荐生产环境)
|
||||
```bash
|
||||
# 编译
|
||||
cd /www/wwwroot/api.yunzer.cn
|
||||
go build -o server main.go
|
||||
|
||||
# 运行
|
||||
nohup ./server > go.log 2>&1 &
|
||||
|
||||
# 或使用 systemd(修改 ExecStart)
|
||||
# ExecStart=/www/wwwroot/api.yunzer.cn/server
|
||||
```
|
||||
|
||||
## 更新日期
|
||||
|
||||
2026-04-09
|
||||
Reference in New Issue
Block a user