docs: add soft copyright application documents and fix import indent

1. 新增软著申请所需的全套文档:README说明、操作说明书、软件设计说明书
2. 修复task.go文件中的import代码缩进格式
This commit is contained in:
2026-08-19 23:05:42 +08:00
parent 273fc90a95
commit aca5515e15
4 changed files with 687 additions and 3 deletions

58
doc/README.md Normal file
View File

@@ -0,0 +1,58 @@
# 软著申请材料说明
## 软件信息
- 软件全称:可转债轮动分析系统
- 版本号:V1.0
- 开发方式:独立开发
- 开发语言:Go(后端)、JavaScript/HTML/CSS(前端)
## 本目录文件
| 文件 | 说明 |
|------|------|
| 可转债轮动分析系统_操作说明书.md | 软著「文档鉴别材料」之一(操作说明书) |
| 可转债轮动分析系统_软件设计说明书.md | 软著「文档鉴别材料」之一(设计说明书,与操作说明书二选一提交即可) |
## 排版规范(两份文档通用)
| 项目 | 要求 |
|------|------|
| 页眉 | 「可转债轮动分析系统 V1.0」,宋体五号 |
| 页码 | 底部居中「第 X 页」,宋体五号 |
| 正文 | 宋体五号(10.5pt),固定行距 20 磅 |
| 一级标题 | 黑体三号加粗 |
| 二级标题 | 黑体四号加粗 |
| 三级标题 | 黑体小四加粗 |
| 每页行数 | 不少于 30 行 |
| 总页数 | 不少于 20 页(不足 60 页全部提交) |
| 最终格式 | Word 排版后导出 PDF 上传 |
## 后续步骤
1. 将上述 Markdown 内容复制到 Word,套用排版规范。
2. 操作说明书每章配一张系统界面截图(登录页、行情页、回测页、数据管理页),快速补足页数。
3. 生成「洁净版源程序」:去注释、去空行后,每页 50 行,取前 30 页 + 后 30 页。
4. 登录中国版权保护中心官网,选择 R11 计算机软件著作权登记,填写申请表并上传材料。
5. 实名认证、签章页签字后提交,等待审核(受理后约 60 个工作日)。
## 源程序整理命令(Go 文件,供参考)
在项目根目录执行 PowerShell:
```powershell
$out = "source_clean.txt"
Remove-Item $out -ErrorAction SilentlyContinue
Get-ChildItem -Recurse -Filter *.go | Where-Object { $_.FullName -notmatch '_test\.go$' } | ForEach-Object {
Add-Content $out ("`n// ===== " + $_.FullName + " =====")
Get-Content $_.FullName | ForEach-Object {
$line = $_.Trim()
if ($line -eq '') { return }
if ($line -like '//*') { return }
if ($line -like '*//*') { return }
if ($line -like '/*') { return }
Add-Content $out $_
}
}
Write-Host "生成完成,查看 source_clean.txt"
```

View File

@@ -0,0 +1,219 @@
# 可转债轮动分析系统 V1.0
## 操作说明书
---
### 一、引言
#### 1.1 编写目的
本说明书旨在介绍「可转债轮动分析系统 V1.0」的功能组成、运行环境和操作使用方法,帮助用户快速掌握系统的使用流程,同时也作为软件著作权登记的技术文档依据。
#### 1.2 读者对象
本说明书适用于可转债投资者、量化交易研究人员、金融数据工程师及系统运维人员。
#### 1.3 软件概述
可转债轮动分析系统是一款面向可转债市场的综合分析与数据管理平台。系统提供实时行情浏览、多策略历史回测、可转债历史数据入库与增量同步、异步任务管理等核心功能,帮助用户完成可转债的量化研究与投资决策。
系统采用 B/S 架构,后端基于 Go 语言开发,前端基于 HTML/JavaScript/CSS 开发,数据库采用 SQLite,任务状态缓存采用 Redis,支持 Docker 容器化部署。
#### 1.4 主要功能
1. 用户认证:支持用户名密码登录与邮箱验证码登录,提供注册功能与权限控制。
2. 实时行情:展示全量可转债实时行情,支持搜索、排序等操作。
3. 策略回测:支持低价轮动、双低轮动、溢价率轮动三种策略的历史回测。
4. 数据管理:展示数据库数据状态,提供全量更新与增量更新数据入库功能。
5. 异步任务:数据入库任务异步执行,实时显示任务进度,支持任务列表查询与取消。
---
### 二、运行环境
#### 2.1 硬件环境
| 配置项 | 最低要求 | 推荐配置 |
|--------|----------|----------|
| CPU | 双核 | 四核及以上 |
| 内存 | 2GB | 8GB |
| 硬盘 | 500MB 可用空间 | 2GB 及以上(视数据量) |
| 网络 | 可访问互联网 | 稳定宽带连接 |
#### 2.2 软件环境
| 类别 | 要求 |
|------|------|
| 操作系统 | Windows 10/11、Linux、macOS |
| 后端运行环境 | Go 1.25 及以上 |
| 数据库 | SQLite 3(内嵌,无需单独安装) |
| 缓存服务 | Redis(可选,未启动时自动降级) |
| 浏览器 | Chrome、Edge、Firefox 等现代浏览器 |
| 容器 | Docker(可选,用于启动 Redis) |
#### 2.3 部署方式
1. 直接运行:使用 `go run ./cmd/server` 启动后端服务,默认监听 8080 端口。
2. 环境变量配置:
- `PORT`:服务端口,默认 8080
- `STOCK_DB_PATH`:数据库文件路径
- `REDIS_ADDR`:Redis 地址,默认 localhost:6379
- `JOB_WORKERS`:任务并发数,默认 8
- `JOB_BATCH_SIZE`:批量写入阈值,默认 20
---
### 三、用户认证
#### 3.1 登录
1. 打开浏览器访问系统首页,未登录时自动跳转至登录页面。
2. 系统默认采用「用户名 + 密码」登录方式。
3. 输入用户名和密码,点击「登录」按钮。
4. 登录成功后自动跳转至系统主页。
#### 3.2 邮箱验证码登录
1. 在登录页面切换至「邮箱验证码登录」方式。
2. 输入邮箱地址,点击「发送验证码」。
3. 验证码发送后,在系统中输入收到的验证码。
4. 点击「登录」完成验证。
#### 3.3 注册
1. 在登录页面点击「注册」进入注册流程。
2. 填写用户名、邮箱、验证码和密码。
3. 提交后完成账号注册。
#### 3.4 权限控制
系统对未登录用户自动跳转登录页,对受保护接口返回未授权状态,保障数据安全。
---
### 四、实时行情
#### 4.1 功能说明
实时行情页面展示全量可转债的实时报价数据,包括价格、涨跌幅、溢价率、转股价值、转股价、纯债价值、正股名称及正股涨跌幅等字段。
#### 4.2 操作步骤
1. 登录系统后,默认进入「实时行情」页面。
2. 点击「刷新数据」按钮加载最新行情。
3. 在搜索框中输入代码、名称或正股名称进行过滤。
4. 通过「按溢价率」「按价格」「按涨跌」等下拉框选择排序字段。
5. 选择「升序」或「降序」调整排序方向。
6. 点击表头对应列也可快速切换排序。
---
### 五、策略回测
#### 5.1 功能说明
策略回测页面支持对可转债轮动策略进行历史回测,评估策略收益、回撤、夏普比率等指标,并与等权基准进行对比。
#### 5.2 策略类型
1. 低价轮动:按价格从低到高选取标的。
2. 双低轮动:按价格与溢价率综合选取标的。
3. 溢价率轮动:按溢价率从低到高选取标的。
#### 5.3 操作步骤
1. 点击顶部「策略回测」标签页。
2. 在「策略参数」区域选择策略类型,设置起始日期、结束日期、初始资金、持仓数量、调仓周期、价格区间等参数。
3. 在「转债选择」区域勾选参与回测的转债,或点击「全选」选择全部。
4. 点击「开始回测」按钮执行回测。
5. 回测完成后,自动展示回测结果,包括累计收益、年化收益、最大回撤、夏普比率、波动率、胜率等指标,以及净值曲线对比图。
#### 5.4 基本面过滤
勾选「基本面过滤」选项后,系统自动排除正股为 ST、资产负债率过高或净利润为负的转债。
---
### 六、数据管理
#### 6.1 数据状态
1. 点击顶部「数据管理」标签页。
2. 点击「刷新状态」按钮。
3. 页面展示数据库路径、转债数量、K线总数、数据区间等信息。
#### 6.2 全量更新
1. 在「数据更新任务」区域点击「全量更新」按钮。
2. 系统创建全量数据入库任务,拉取所有转债的历史K线数据。
3. 已入库的转债自动跳过,避免重复拉取。
#### 6.3 增量更新
1. 在「数据更新任务」区域点击「增量更新」按钮。
2. 系统创建增量同步任务,仅同步已入库转债自上次入库日期之后的新增数据。
3. 可通过「起始日期」输入框指定增量同步的起点日期。
#### 6.4 任务列表
1. 在「任务列表」区域点击「刷新任务」查看所有任务记录。
2. 任务列表展示任务ID、类型、状态、进度、成功数、失败数、开始时间、完成时间等信息。
3. 运行中的任务会显示进度条和实时进度百分比。
4. 点击「取消」按钮可取消运行中的任务。
#### 6.5 异步任务机制
数据入库任务采用异步执行方式,任务状态实时写入 Redis 缓存,同时持久化到 SQLite 数据库。前端通过定时轮询获取任务实时状态,实现任务进度的实时展示。
---
### 七、数据入库命令行工具
#### 7.1 功能说明
系统提供独立的数据入库命令行工具,支持全量入库与增量同步。
#### 7.2 全量入库
执行命令:`go run ./cmd/ingest -all -db stock.db`
#### 7.3 增量同步
执行命令:`go run ./cmd/ingest -incr -db stock.db`
---
### 八、系统架构
#### 8.1 总体架构
系统采用 MVC 三层架构:
1. Model 层:数据模型与存储接口,包括可转债、K线、用户、任务等数据模型。
2. Controller 层:HTTP 接口处理,包括行情、回测、认证、任务等控制器。
3. View 层:前端页面,包括登录页、主页等。
#### 8.2 数据源架构
系统采用主备数据源机制:
1. 主数据源:东方财富接口,提供实时行情与历史K线。
2. 备用数据源:腾讯财经接口,主数据源失败时自动切换。
3. 熔断机制:主数据源连续失败达到阈值后,进入熔断窗口直接使用备用数据源。
#### 8.3 异步任务架构
1. 任务管理器(Manager):管理任务注册表和全局限速器,支持多任务并发。
2. 任务执行器(Runner):单任务并发拉取与批量写入。
3. 限速器:令牌桶模式,控制 API 请求速率,避免高频请求被限流。
4. 缓存层:Redis 存储任务实时状态,SQLite 存储持久化记录。
---
### 九、常见问题
1. 无法访问系统:请检查服务是否启动、端口是否被占用。
2. 实时行情加载失败:可能是数据源网络异常,稍后重试。
3. Redis 连接失败:系统会自动降级,任务功能仍可使用,仅失去实时状态缓存。
4. 数据入库任务失败:可能是部分老转债在数据源无数据,属于正常现象。

View File

@@ -0,0 +1,407 @@
# 可转债轮动分析系统 V1.0
## 软件设计说明书
---
### 第一章 引言
#### 1.1 编写目的
本文档是「可转债轮动分析系统 V1.0」的软件设计说明书,旨在详细描述系统的总体架构设计、模块划分、数据结构、接口设计、关键算法及安全与性能设计,作为软件著作权登记的技术文档依据,同时为系统的后续维护与功能迭代提供设计参考。
#### 1.2 项目背景
可转债作为一种兼具债券属性与股票属性的金融工具,近年来市场规模不断扩大。投资者在进行可转债投资决策时,需要对全市场可转债的实时行情进行监控,并通过历史数据回测验证轮动策略的有效性。传统的人工分析与手工数据整理方式效率低下、时效性差。本系统旨在构建一个集行情浏览、策略回测、数据入库与任务管理于一体的可转债分析平台,提升可转债量化研究的效率与准确性。
#### 1.3 术语定义
| 术语 | 说明 |
|------|------|
| 可转债 | 可转换公司债券,可在特定条件下转换为公司股票 |
| 溢价率 | 转股溢价率,衡量可转债价格相对其转股价值的溢价程度 |
| 转股价值 | 可转债按当前转股价转换后对应的股票市值 |
| 轮动策略 | 定期按特定指标排序、调仓的投资策略 |
| 全量入库 | 拉取全部可转债的历史K线数据并写入数据库 |
| 增量同步 | 仅同步自上次入库日期之后新增的数据 |
| 熔断 | 数据源连续失败达到阈值后,短时间内直接切换备用源的机制 |
| 限速器 | 令牌桶算法实现的请求速率控制组件 |
---
### 第二章 总体设计
#### 2.1 设计目标
1. 提供可转债实时行情浏览与多维度排序、筛选能力。
2. 提供多策略历史回测能力,输出收益、回撤、夏普比率等关键指标。
3. 提供可转债历史数据的高效入库能力,支持全量与增量两种同步方式。
4. 提供异步任务管理能力,实现入库任务进度的实时展示。
5. 保证系统在数据源异常、缓存服务不可用等情况下的可用性。
#### 2.2 系统架构
系统采用 B/S 架构,总体分为三层:
1. **表示层(View)**:基于 HTML、JavaScript、CSS 开发的单页应用,包含登录页与主页(实时行情、策略回测、数据管理三个标签页)。
2. **控制层(Controller)**:基于 Go 语言 net/http 开发的路由与控制器,负责接收 HTTP 请求、权限校验、参数解析与响应封装。
3. **模型层(Model)**:包含数据模型定义、存储接口抽象、数据源访问与业务服务四部分。
系统整体遵循 MVC 设计模式,控制层与模型层通过接口解耦,便于替换数据源与存储实现。
#### 2.3 技术选型
| 技术 | 用途 | 选型理由 |
|------|------|----------|
| Go 1.25 | 后端开发语言 | 高并发、静态编译、部署简单 |
| net/http | HTTP 服务框架 | 标准库,无额外依赖 |
| SQLite 3 | 数据持久化 | 单文件、零配置、适合个人分析场景 |
| modernc.org/sqlite | SQLite 驱动 | 纯 Go 实现,无 CGO 依赖 |
| Redis | 任务状态缓存 | 高性能内存存储,支持实时状态查询 |
| go-redis/v9 | Redis 客户端 | 官方维护的 Go Redis 客户端 |
| Chart.js | 前端图表 | 开源图表库,用于回测净值曲线展示 |
| Docker | 容器化部署 | 便于 Redis 等中间件的一键启动 |
| golang.org/x/crypto | 密码加密 | 提供 bcrypt 密码哈希算法 |
---
### 第三章 模块设计
系统按功能划分为六大模块,各模块职责如下。
#### 3.1 用户认证模块
负责用户注册、登录、登出与权限校验。
**功能组成**:
1. 注册:用户名 + 邮箱 + 验证码 + 密码。
2. 登录:支持用户名密码登录与邮箱验证码登录两种方式。
3. 权限校验:通过 token 识别登录用户,未登录访问受保护资源时自动跳转或返回未授权。
4. 管理员账号:系统初始化时自动创建管理员账号。
**关键设计**:
- 密码使用 bcrypt 算法加盐哈希存储,不保存明文。
- 登录成功后生成随机 token,前端同时写入 localStorage 与 cookie,保证前后端鉴权一致。
- 验证码设置有效期与使用状态,验证后标记已使用。
#### 3.2 行情模块
负责可转债实时行情与历史K线数据的获取与展示。
**功能组成**:
1. 实时行情:获取全量可转债实时报价,过滤已退市转债。
2. 历史K线:获取指定转债的日K线数据。
3. 搜索与排序:支持按代码、名称、正股搜索,按多字段排序。
**关键设计**:
- 采用主备数据源机制,主数据源为东方财富接口,备用数据源为腾讯财经接口。
- 主数据源失败时自动切换备用数据源,保证数据可用性。
#### 3.3 策略回测模块
负责轮动策略的历史回测与结果展示。
**功能组成**:
1. 三种轮动策略:低价轮动、双低轮动、溢价率轮动。
2. 回测参数配置:起止日期、初始资金、持仓数量、调仓周期、价格区间等。
3. 基本面过滤:排除正股 ST、资产负债率过高或净利润为负的转债。
4. 结果展示:累计收益、年化收益、最大回撤、夏普比率、波动率、胜率等指标及净值曲线。
**关键设计**:
- 回测引擎以交易日为步长遍历历史数据,按调仓周期执行策略选股与调仓。
- 账户模型模拟现金与持仓,计算每日净值。
- 同时计算等权全转债基准,用于超额收益对比。
#### 3.4 数据入库模块
负责可转债历史数据的入库与同步。
**功能组成**:
1. 全量入库:拉取全部转债的历史K线。
2. 增量同步:仅同步已入库转债的新增数据。
3. 断点续跑:全量模式下跳过已入库转债,增量模式基于最后K线日期确定起点。
**关键设计**:
- 采用并发拉取 + 批量写入的架构,多 worker 并发获取数据,单 collector 串行批量写入数据库。
- SQLite 连接数限制为 1,避免写锁竞争。
- K线写入采用幂等 upsert 语义,重复写入自动跳过。
#### 3.5 异步任务模块
负责数据入库任务的异步执行与状态管理。
**功能组成**:
1. 任务创建:创建全量或增量入库任务。
2. 任务执行:异步并发执行入库任务。
3. 任务查询:查询任务列表与单个任务状态。
4. 任务取消:取消运行中的任务。
5. 实时进度:任务进度实时写入缓存,前端轮询展示。
**关键设计**:
- 任务管理器统一管理任务注册表与全局限速器,支持多任务并发。
- 任务状态同时写入 Redis(实时)与 SQLite(持久化),Redis 不可用时自动降级到 SQLite。
- 全局限速器采用令牌桶算法,控制数据源请求速率,避免高频请求被限流。
#### 3.6 数据源模块
负责外部行情数据的访问与容错。
**功能组成**:
1. 东财数据源:实时行情、历史K线、转债列表、基本面数据。
2. 腾讯数据源:历史K线备用源、实时报价。
3. 主备切换:主数据源失败时自动切换备用源。
4. 熔断机制:主源连续失败达到阈值后进入熔断窗口。
**关键设计**:
- 定义统一的数据源接口(MarketDataSource),屏蔽不同数据源的实现差异。
- 熔断窗口结束后自动放行一次探测请求,成功则解除熔断。
---
### 第四章 数据库设计
#### 4.1 数据库选型
系统采用 SQLite 3 作为持久化数据库。SQLite 为单文件嵌入式数据库,无需独立部署,适合个人分析场景;同时 SQL 语句遵循通用标准语法,便于后续迁移至 PostgreSQL 等数据库。
#### 4.2 核心数据表
**(1)可转债K线表(convertible_kline)**
存储每只可转债的日K线数据。
| 字段 | 类型 | 说明 |
|------|------|------|
| code | TEXT | 转债代码 |
| date | TEXT | 交易日期 |
| open | REAL | 开盘价 |
| close | REAL | 收盘价 |
| high | REAL | 最高价 |
| low | REAL | 最低价 |
| volume | INTEGER | 成交量 |
| amount | REAL | 成交额 |
| convert_price | REAL | 转股价 |
| convert_value | REAL | 转股价值 |
| premium_rate | REAL | 溢价率 |
主键:code + date 联合主键。
**(2)转债基础信息表(convert_bond)**
存储转债的基本信息。
| 字段 | 类型 | 说明 |
|------|------|------|
| code | TEXT | 转债代码(主键) |
| name | TEXT | 转债名称 |
| stock_code | TEXT | 正股代码 |
| initial_convert_price | REAL | 初始转股价 |
| list_date | TEXT | 上市日期 |
| delist_date | TEXT | 退市日期 |
**(3)用户表(user)**
存储注册用户信息。
| 字段 | 类型 | 说明 |
|------|------|------|
| id | INTEGER | 用户ID(自增主键) |
| username | TEXT | 用户名 |
| email | TEXT | 邮箱 |
| password_hash | TEXT | 密码哈希 |
| created_at | TEXT | 创建时间 |
| updated_at | TEXT | 更新时间 |
**(4)验证码表(verify_code)**
存储邮箱验证码信息。
| 字段 | 类型 | 说明 |
|------|------|------|
| id | INTEGER | 主键 |
| email | TEXT | 邮箱 |
| code | TEXT | 验证码 |
| purpose | TEXT | 用途(注册/登录) |
| expires_at | INTEGER | 过期时间 |
| used | INTEGER | 是否已使用 |
**(5)任务表(ingest_task)**
存储数据入库任务的持久化记录。
| 字段 | 类型 | 说明 |
|------|------|------|
| id | TEXT | 任务ID(主键) |
| type | TEXT | 任务类型(full/incremental) |
| status | TEXT | 任务状态 |
| total | INTEGER | 总数量 |
| done | INTEGER | 已完成数量 |
| success | INTEGER | 成功数量 |
| failed | INTEGER | 失败数量 |
| failed_codes | TEXT | 失败转债代码 |
| params | TEXT | 任务参数 |
| error | TEXT | 错误信息 |
| started_at | TEXT | 开始时间 |
| finished_at | TEXT | 完成时间 |
**(6)正股基本面表(stock_fundamental)**
存储正股的基本面数据,用于回测基本面过滤。
| 字段 | 类型 | 说明 |
|------|------|------|
| code | TEXT | 正股代码(主键) |
| name | TEXT | 名称 |
| roe | REAL | 净资产收益率 |
| debt_ratio | REAL | 资产负债率 |
| net_profit | REAL | 净利润 |
| status | INTEGER | 状态 |
| total_asset | REAL | 总资产 |
| total_debt | REAL | 总负债 |
| update_date | TEXT | 更新日期 |
---
### 第五章 接口设计
系统采用 RESTful 风格的 HTTP 接口,接口响应统一使用 JSON 格式,字段采用 camelCase 命名。除认证相关接口外,其余接口均需在请求头携带 Bearer token。
#### 5.1 认证接口
| 接口 | 方法 | 说明 |
|------|------|------|
| /api/auth/send-code | POST | 发送邮箱验证码 |
| /api/auth/register | POST | 注册账号 |
| /api/auth/login | POST | 登录 |
| /api/auth/logout | POST | 登出 |
| /api/auth/me | GET | 获取当前用户信息 |
#### 5.2 行情接口
| 接口 | 方法 | 说明 |
|------|------|------|
| /api/bonds | GET | 获取全量可转债实时行情 |
| /api/bonds/{code}/kline | GET | 获取指定转债日K线 |
#### 5.3 回测接口
| 接口 | 方法 | 说明 |
|------|------|------|
| /api/backtest | POST | 执行策略回测 |
#### 5.4 数据接口
| 接口 | 方法 | 说明 |
|------|------|------|
| /api/status | GET | 获取数据库数据状态 |
| /api/db/bonds | GET | 获取数据库中已有转债列表 |
#### 5.5 任务接口
| 接口 | 方法 | 说明 |
|------|------|------|
| /api/tasks | POST | 创建入库任务 |
| /api/tasks | GET | 获取任务列表 |
| /api/tasks/{id} | GET | 获取单个任务状态 |
| /api/tasks/{id}/cancel | POST | 取消任务 |
---
### 第六章 关键算法设计
#### 6.1 轮动策略算法
轮动策略的核心逻辑为:在每个调仓周期,按指定指标对可转债进行排序,选取排名靠前的 N 只转债作为持仓,卖出不在持仓中的转债,买入新进入的转债。
低价轮动按价格升序选债;双低轮动按「价格 + 溢价率」综合指标升序选债;溢价率轮动按溢价率升序选债。调仓周期、持仓数量、价格区间等参数由用户配置。
#### 6.2 主备切换与熔断算法
数据源请求采用「主源优先,失败切换」策略:
1. 请求首先发往主数据源。
2. 主源失败时,记录失败计数,并立即切换到备用数据源。
3. 当主源连续失败次数达到阈值(3 次)时,开启熔断,后续请求直接使用备用源。
4. 熔断窗口(10 分钟)结束后,放行一次探测请求;探测成功则解除熔断恢复主源。
#### 6.3 全局限速算法
系统采用令牌桶算法实现全局限速。令牌桶以固定速率(默认 400 毫秒一个令牌)生成令牌,初始突发额度为 4。每个数据请求在发出前必须获取一个令牌,未获取到令牌的请求等待。该算法保证数据请求速率稳定,避免因高频请求触发数据源的限流封禁。
#### 6.4 增量同步起点算法
增量同步时,系统一次性查询所有已入库转债的最后K线日期(GROUP BY 聚合查询),形成「转债代码 → 最后日期」映射。对每只转债,其增量同步起点为该最后日期的次日;若指定了起始日期参数,则以两者中较晚者为起点。该设计避免了逐只查询导致的性能损耗。
---
### 第七章 安全设计
#### 7.1 身份认证
系统采用 token 机制进行身份认证。登录成功后服务端生成随机 token,客户端在后续请求中携带 token,服务端校验 token 有效性。未登录用户访问受保护资源时,页面请求自动跳转登录页,接口请求返回 401 未授权。
#### 7.2 密码安全
用户密码采用 bcrypt 算法加盐哈希后存储,数据库中不保存明文密码。bcrypt 算法具有自适应的计算成本,能有效抵御暴力破解。
#### 7.3 数据安全
1. 敏感数据(如密码哈希)仅存储在本地数据库中,不对外暴露。
2. 接口响应仅返回必要字段,不泄露数据库连接信息等敏感数据。
3. 前端对用户输入进行基础校验,后端对请求参数进行统一校验。
#### 7.4 权限控制
系统通过中间件统一实现权限控制,所有受保护接口均经过权限校验中间件,确保只有登录用户才能访问业务数据。
---
### 第八章 性能与容错设计
#### 8.1 性能设计
1. **并发拉取**:数据入库任务采用多 worker 并发拉取数据,默认 8 个并发。
2. **批量写入**:拉取结果汇聚后按批次(默认 20 只)批量写入数据库,减少事务开销。
3. **单写者模型**:SQLite 连接数限制为 1,仅 collector 单 goroutine 写入,避免写锁竞争。
4. **聚合查询**:增量同步使用一次性聚合查询获取全部最后日期,避免逐只查询。
#### 8.2 容错设计
1. **数据源容错**:主备数据源切换 + 熔断机制,保证数据源异常时的可用性。
2. **缓存降级**:Redis 不可用时自动降级到内存空实现,任务系统仍可运行,仅失去实时状态缓存能力。
3. **写入重试**:数据库写入失败时自动重试(最多 3 次),应对文件系统短暂占用。
4. **请求退避**:数据源请求失败时按 3 秒、6 秒递增退避重试。
5. **优雅退出**:服务关闭时自动取消运行中的任务,避免数据不一致。
---
### 第九章 部署设计
#### 9.1 部署架构
系统后端编译为单个可执行文件,前端静态资源随程序提供。数据库为 SQLite 单文件。Redis 作为可选中间件通过 Docker 部署。
#### 9.2 部署步骤
1. 编译后端程序:`go build ./cmd/server`。
2. 配置环境变量(端口、数据库路径、Redis 地址等)。
3. 启动后端服务。
4. 如需 Redis,执行 `docker compose up -d` 启动 Redis 容器。
5. 浏览器访问系统地址完成使用。
#### 9.3 环境变量配置
| 变量 | 默认值 | 说明 |
|------|--------|------|
| PORT | 8080 | 服务端口 |
| STOCK_DB_PATH | 可执行目录下 stock.db | 数据库路径 |
| REDIS_ADDR | localhost:6379 | Redis 地址 |
| REDIS_PASSWORD | 空 | Redis 密码 |
| JOB_WORKERS | 8 | 任务并发数 |
| JOB_BATCH_SIZE | 20 | 批量写入阈值 |
---
### 第十章 总结
「可转债轮动分析系统 V1.0」采用 MVC 架构,通过模块化设计实现了用户认证、实时行情、策略回测、数据入库与异步任务管理五大核心功能。系统在数据源容错、缓存降级、并发性能、权限安全等方面进行了专门设计,具备良好的可用性、健壮性与可扩展性,能够满足可转债量化研究与投资决策的实际需求。

View File

@@ -11,9 +11,9 @@ import (
// 任务接口错误(包级哨兵错误,便于测试断言)。 // 任务接口错误(包级哨兵错误,便于测试断言)。
var ( var (
errBadTaskType = errString("无效的任务类型,支持 full / incremental") errBadTaskType = errString("无效的任务类型,支持 full / incremental")
errMissingTaskID = errString("缺少任务 ID") errMissingTaskID = errString("缺少任务 ID")
errTaskNotFound = errString("任务不存在") errTaskNotFound = errString("任务不存在")
errTaskNotRunning = errString("任务不存在或已结束,无法取消") errTaskNotRunning = errString("任务不存在或已结束,无法取消")
) )