• 一款专为女性设计的月经周期管理应用,帮助用户记录、追踪和预测月经周期,关注女性健康。

  • 项目地址:https://gitee.com/xiao-zheng666/menstruation-app

项目概述

本项目是一个全栈 Web 应用,采用前后端分离架构开发。用户可以记录每次月经的开始日期、持续时间、痛经程度、情绪变化和身体症状等信息,系统会自动计算周期天数并预测下次月经日期,同时提供直观的日历视图和数据统计分析功能。

技术栈

后端技术

技术

版本

说明

Spring Boot

2.7.5

基础框架

MyBatis-Plus

3.5.3

ORM 框架

MySQL

5.7+

关系型数据库

Spring Security

-

安全框架

JWT (jjwt)

0.11.5

身份认证

Lombok

-

简化代码

Hutool

5.8.24

工具类库

Apache POI

5.2.3

Excel 导出

前端技术

技术

版本

说明

Vue.js

3.4.0

渐进式 JavaScript 框架

Vue Router

4.2.5

路由管理

Pinia

2.1.7

状态管理

Element Plus

2.4.4

UI 组件库

Axios

1.6.2

HTTP 请求库

ECharts

5.4.3

数据可视化图表库

FullCalendar

6.1.10

日历组件

Day.js

1.11.10

日期处理库

Vite

5.0.10

构建工具

Sass

1.69.5

CSS 预处理器

功能特性

核心功能

  • 用户认证:支持用户注册、登录,基于 JWT 的身份验证机制

  • 记录管理:完整记录每次月经信息,包括开始日期、持续天数、痛经程度、心情标签、症状等

  • 症状追踪:预设 13 种常见症状模板,分为身体症状和情绪症状两大类

  • 周期预测:根据历史记录采用加权平均算法预测下次月经日期和排卵期

  • 规律评分:计算周期规律性评分(0-100分)

数据展示

  • 首页仪表盘:展示总记录数、平均周期、平均行经天数、规律评分等关键指标

  • 日历视图:在日历上直观展示行经期、排卵期和预测期,支持月/周视图切换

  • 统计分析:周期趋势折线图、行经天数分布柱状图

  • 历史时间线:精美的时间线展示历史记录

用户设置

  • 头像上传:支持自定义头像上传

  • 昵称修改:个性化昵称设置

  • 密码修改:安全的密码修改功能

  • 数据导出:支持导出 Excel 格式的记录数据

其他功能

  • 访问统计:记录页面访问量(PV)和独立访客数(UV)

  • 深色模式:支持明暗主题切换

  • 响应式设计:完美适配桌面端和移动端设备

  • 精美动画:骨架屏加载、成功动画、悬浮效果等

项目结构

menstruation-app/
├── backend/                          # 后端项目
│   ├── pom.xml                       # Maven 配置文件
│   └── src/main/
│       ├── java/com/period/
│       │   ├── common/               # 通用类
│       │   │   ├── Result.java       # 统一响应结果
│       │   │   ├── BusinessException.java
│       │   │   └── GlobalExceptionHandler.java
│       │   ├── config/               # 配置类
│       │   │   ├── SecurityConfig.java
│       │   │   ├── JwtAuthenticationFilter.java
│       │   │   ├── JwtUtils.java
│       │   │   └── WebConfig.java
│       │   ├── controller/           # 控制器层
│       │   │   ├── AuthController.java
│       │   │   ├── RecordController.java
│       │   │   ├── SymptomController.java
│       │   │   ├── UploadController.java
│       │   │   ├── ExportController.java
│       │   │   └── VisitController.java
│       │   ├── dto/                  # 数据传输对象
│       │   ├── entity/               # 实体类
│       │   ├── mapper/               # 数据访问层
│       │   └── service/              # 业务逻辑层
│       └── resources/
│           └── schema.sql            # 数据库初始化脚本
│
├── frontend/                         # 前端项目
│   ├── package.json
│   ├── index.html
│   └── src/
│       ├── main.js                   # 入口文件
│       ├── App.vue                   # 根组件
│       ├── router/                   # 路由配置
│       ├── stores/                   # Pinia 状态管理
│       ├── api/                      # API 接口封装
│       │   ├── request.js            # Axios 封装
│       │   ├── auth.js
│       │   ├── record.js
│       │   ├── symptom.js
│       │   └── visit.js
│       ├── components/               # 公共组件
│       │   ├── Timeline.vue          # 历史时间线
│       │   └── RecordForm.vue        # 记录表单
│       ├── views/                    # 页面组件
│       │   ├── Login.vue             # 登录注册
│       │   ├── MainLayout.vue        # 主布局
│       │   ├── Home.vue              # 首页
│       │   ├── Calendar.vue          # 日历
│       │   ├── Statistics.vue        # 统计
│       │   └── Settings.vue          # 设置
│       └── styles/                   # 样式文件
│
└── README.md

数据库设计

用户表 (user)

字段

类型

说明

id

BIGINT

主键 ID

username

VARCHAR(50)

用户名,唯一

password

VARCHAR(255)

密码(加密存储)

nickname

VARCHAR(50)

昵称

avatar

VARCHAR(255)

头像 URL

created_at

TIMESTAMP

创建时间

deleted

TINYINT

逻辑删除标记

月经记录表 (period_record)

字段

类型

说明

id

BIGINT

主键 ID

user_id

BIGINT

用户 ID,外键

period_date

DATE

月经开始日期

period_days

INT

行经天数,默认 5

cycle_days

INT

周期天数

pain_level

INT

痛经程度 0-5

mood

VARCHAR(20)

心情标签

symptoms

VARCHAR(500)

症状 JSON 数组

notes

TEXT

备注

created_at

TIMESTAMP

创建时间

deleted

TINYINT

逻辑删除标记

症状模板表 (symptom_template)

字段

类型

说明

id

BIGINT

主键 ID

name

VARCHAR(50)

症状名称

icon

VARCHAR(50)

图标标识

category

VARCHAR(20)

分类:physical/emotional

sort

INT

排序

访问明细表 (visit_log)

字段

类型

说明

id

BIGINT

主键 ID

user_id

BIGINT

用户 ID(游客为 NULL)

ip_address

VARCHAR(50)

IP 地址

user_agent

VARCHAR(500)

浏览器 UA

device_type

VARCHAR(20)

设备类型

browser

VARCHAR(50)

浏览器名称

os

VARCHAR(50)

操作系统

page_url

VARCHAR(255)

访问页面

visit_time

TIMESTAMP

访问时间

访问统计表 (visit_stats)

字段

类型

说明

id

BIGINT

主键 ID

visit_date

DATE

访问日期

pv_count

INT

页面访问量

uv_count

INT

独立访客数

login_count

INT

登录用户访问次数

guest_count

INT

游客访问次数

总访问量表 (total_visits)

字段

类型

说明

id

BIGINT

主键 ID

total_pv

BIGINT

总 PV

total_uv

BIGINT

总 UV

快速开始

环境要求

  • JDK 1.8+

  • Node.js 16+

  • MySQL 5.7+

  • Maven 3.6+

后端启动

  1. 创建数据库并导入初始化脚本:

CREATE DATABASE period_tracker DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

然后执行 backend/src/main/resources/schema.sql 初始化表结构。

  1. 修改数据库配置 application.yml

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/period_tracker?useSSL=false&serverTimezone=Asia/Shanghai
    username: your_username
    password: your_password

jwt:
  secret: your-secret-key-must-be-at-least-256-bits-long-for-hs256
  expiration: 604800000

upload:
  path: /your/upload/path
  url-prefix: /uploads
  1. 启动后端服务:

cd backend
mvn spring-boot:run

后端服务默认运行在 http://localhost:8088

前端启动

  1. 安装依赖:

cd frontend
npm install
  1. 启动开发服务器:

npm run dev
  1. 构建生产版本:

npm run build

前端服务默认运行在 http://localhost:5173

API 接口

认证相关

方法

路径

说明

POST

/api/auth/register

用户注册

POST

/api/auth/login

用户登录

GET

/api/auth/me

获取当前用户信息

PUT

/api/auth/me

更新用户信息

记录相关

方法

路径

说明

GET

/api/records

获取所有记录

POST

/api/records

添加记录

PUT

/api/records/{id}

更新记录

DELETE

/api/records/{id}

删除记录

GET

/api/records/statistics

获取统计数据

GET

/api/records/export

导出 Excel

症状相关

方法

路径

说明

GET

/api/symptoms

获取症状模板列表

上传相关

方法

路径

说明

POST

/api/upload/avatar

上传头像

访问统计相关

方法

路径

说明

POST

/api/visit/record

记录访问

GET

/api/visit/stats

获取访问统计

预设症状

身体症状 (Physical)

  • 腹痛、腰酸、头痛、疲劳

  • 乳房胀痛、食欲改变、失眠、痤疮

情绪症状 (Emotional)

  • 情绪波动、焦虑、抑郁、易怒、哭泣

周期预测算法

系统采用加权平均算法预测下次月经日期:

  • 最新一次记录权重:40%

  • 倒数第二、三次各占:15%

  • 其余记录平分:30%

同时计算周期规律性评分,帮助用户了解自身周期健康状况。

参考项目

UI 设计参考: keeleycenc/menstruation

许可证

MIT License

贡献指南

欢迎提交 Issue 和 Pull Request 参与项目开发。