一个非前后端分离的 Spring Boot 项目,包含:
- 用户注册 / 登录 / 退出
- MySQL 存储
- 账号密码列表管理
- 账号密码按登录用户隔离
- 第三方账号密码 AES-GCM 加密入库
- 登录密码 BCrypt 哈希入库
- 每个账号单独设置步数范围
- 每个账号单独设置是否每天定时执行
- 手动执行
- 执行日志
- Zepp Life 登录、app_token 获取、步数上报
- 登录 token / app_token 加密缓存
/api/**JSON 接口
- Java 8
- Spring Boot 2.7.18
- Spring MVC
- Spring Security
- Spring Data JPA
- Thymeleaf
- MySQL 8
src/main/java/com/example/stepwong
config 安全配置
controller 页面控制器
dto 表单对象和执行结果对象
entity JPA 实体
repository 数据访问层
security 当前登录用户工具
service 业务服务、加密服务、定时任务、执行网关
数据库连接已写入 src/main/resources/application.yml。首次部署时先执行建表脚本:
mysql -uroot -p < sql/stepwong_web_schema.sqlAPP_CRYPTO_SECRET 用于加密保存第三方账号密码,建议至少 32 位。
export APP_CRYPTO_SECRET="replace-with-a-long-random-secret-32"mvn spring-boot:run默认访问地址:
http://localhost:18080
url: jdbc:mysql://localhost:3306/stepwong_web?useUnicode=true&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
username: root
password: root如需切换数据库,直接修改 src/main/resources/application.yml 中的 spring.datasource 配置。
- 登录用户保存在
app_users。 - 账号记录保存在
step_accounts,每条记录都有owner_id。 - 查询、编辑、删除、显示密码、手动执行都使用
owner_id + id查询。 - 执行日志保存在
execution_logs,每条日志都有owner_id。 - 日志页面只查询当前登录用户的最近 100 条记录。
- 第三方账号密码使用
CryptoService加密后保存,不明文入库。
StepScheduleRunner 每分钟扫描一次到期任务:
auto_enabled = true
run_hour = 当前小时
run_minute = 当前分钟
last_run_date 不是今天
命中后调用 StepExecutionService 执行,并写入日志。
默认实现:
com.example.stepwong.service.ZeppLifeStepGateway
执行流程:
- 调用
https://api-user.zepp.com/v2/registrations/tokens获取 access code。 - 调用
https://account.huami.com/v2/client/login获取 login_token 和 user_id。 - 调用
https://account-cn.huami.com/v1/client/app_tokens获取 app_token。 - 调用
https://api-mifit-cn.huami.com/v1/data/band_data.json上报随机步数。 - login_token / app_token 使用
CryptoService加密后缓存在step_accounts,后续优先复用,失败后自动清空并重新登录。
本地只跑页面流程、不调用外部接口时,可启用测试 profile:
mvn spring-boot:run -Dspring-boot.run.profiles=local-test所有 /api/** 接口需要登录态或 Basic Auth。
POST /api/register 注册登录用户
GET /api/me 查询当前登录用户
GET /api/accounts 查询账号列表
POST /api/accounts 新增账号
GET /api/accounts/{id} 查询账号详情
PUT /api/accounts/{id} 更新账号
DELETE /api/accounts/{id} 删除账号
POST /api/accounts/{id}/execute 手动执行
POST /api/accounts/{id}/reveal 显示明文密码
GET /api/logs 查询最近 100 条日志
新增 / 更新账号请求体示例:
{
"displayName": "主账号",
"accountNo": "13800138000",
"password": "zepp-password",
"minStep": 18000,
"maxStep": 25000,
"autoEnabled": true,
"runHour": 8,
"runMinute": 35,
"enabled": true
}执行入口是:
com.example.stepwong.service.StepGateway
当前默认接入 Zepp Life。需要本地测试时使用 local-test profile 切换到 LocalTestStepGateway。
/login 登录
/register 注册
/accounts 账号密码列表
/accounts/new 添加账号
/logs 执行日志
项目同时保留 application.yml 和 application.properties,其中 application.properties 使用完整的 spring.datasource.* 配置,避免 YAML 缩进错误导致启动时读取不到数据库连接。
当前数据库连接:
spring.datasource.url=jdbc:mysql://localhost:3306/stepwong_web?useUnicode=true&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver项目保留 src/main/resources/application.yml 和 src/main/resources/application.properties 两份配置,同时新增 DataSourceConfig 作为兜底数据源配置。即使运行环境没有正确读取资源配置,也会使用当前 MySQL 连接创建数据源,避免出现 url attribute is not specified。