1. 项目概述
这个基于SpringBoot+Vue的中医养生系统是一个典型的毕业设计项目,采用前后端分离架构实现。系统主要面向中医养生领域,整合了中医理论、养生知识和现代Web技术,为用户提供个性化的养生方案推荐、健康管理等功能。
作为一名有多年全栈开发经验的工程师,我认为这类系统在当前健康意识提升的大环境下具有实际应用价值。系统后端采用SpringBoot框架,前端使用Vue.js,这种技术组合既能保证系统稳定性,又能提供良好的用户体验。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术架构设计
2.1 后端技术选型
SpringBoot作为后端框架具有明显优势:
- 自动配置简化了Spring应用的初始搭建和开发过程
- 内嵌Tomcat服务器,无需部署WAR文件
- 提供starter依赖简化构建配置
- 强大的监控和健康检查功能
核心依赖包括:
xml复制<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
2.2 前端技术选型
Vue.js作为前端框架的优势:
- 渐进式框架,易于集成
- 组件化开发,提高代码复用性
- 响应式数据绑定,简化DOM操作
- 丰富的生态系统(Vue Router、Vuex等)
典型项目结构:
code复制src/
├── assets/ # 静态资源
├── components/ # 公共组件
├── router/ # 路由配置
├── store/ # Vuex状态管理
├── views/ # 页面组件
├── App.vue # 根组件
└── main.js # 入口文件
3. 核心功能实现
3.1 中医体质辨识模块
这是系统的核心功能之一,基于中医"九种体质"理论实现。用户通过填写问卷,系统会分析用户的体质类型(如平和质、气虚质等)。
后端实现关键代码:
java复制@RestController
@RequestMapping("/api/constitution")
public class ConstitutionController {
@Autowired
private ConstitutionService constitutionService;
@PostMapping("/identify")
public Result identifyConstitution(@RequestBody QuestionnaireDTO dto) {
String constitutionType = constitutionService.analyze(dto);
return Result.success(constitutionType);
}
}
前端问卷组件示例:
vue复制<template>
<div class="questionnaire">
<h3>中医体质辨识问卷</h3>
<div v-for="(question, index) in questions" :key="index">
<p>{{ question.content }}</p>
<el-radio-group v-model="answers[index]">
<el-radio :label="1">没有</el-radio>
<el-radio :label="2">很少</el-radio>
<el-radio :label="3">有时</el-radio>
<el-radio :label="4">经常</el-radio>
<el-radio :label="5">总是</el-radio>
</el-radio-group>
</div>
<el-button @click="submit">提交</el-button>
</div>
</template>
3.2 养生方案推荐系统
根据用户体质类型,系统会推荐相应的饮食、运动和作息建议。这部分采用了规则引擎+内容推荐的混合模式。
数据库设计关键表:
sql复制CREATE TABLE `health_advice` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`constitution_type` varchar(20) NOT NULL COMMENT '体质类型',
`advice_type` enum('diet','exercise','lifestyle') NOT NULL COMMENT '建议类型',
`content` text NOT NULL COMMENT '建议内容',
`priority` int(11) DEFAULT '0' COMMENT '优先级',
PRIMARY KEY (`id`),
KEY `idx_constitution` (`constitution_type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
推荐算法核心逻辑:
java复制public List<HealthAdvice> recommendAdvice(String constitutionType) {
// 基础规则推荐
List<HealthAdvice> baseAdvices = healthAdviceMapper.selectByConstitution(constitutionType);
// 个性化调整(基于用户历史行为)
List<UserBehavior> behaviors = userBehaviorMapper.selectByUserId(userId);
if (!behaviors.isEmpty()) {
baseAdvices = adjustByBehavior(baseAdvices, behaviors);
}
// 季节性调整
baseAdvices = adjustBySeason(baseAdvices);
return baseAdvices.stream()
.sorted(Comparator.comparingInt(HealthAdvice::getPriority).reversed())
.limit(10)
.collect(Collectors.toList());
}
4. 前后端交互实现
4.1 RESTful API设计
系统采用标准的RESTful风格API设计,主要接口包括:
| 接口路径 | 方法 | 描述 | 参数 |
|---|---|---|---|
| /api/user/register | POST | 用户注册 | UserDTO |
| /api/user/login | POST | 用户登录 | LoginDTO |
| /api/constitution/identify | POST | 体质辨识 | QuestionnaireDTO |
| /api/advice/recommend | GET | 获取推荐 | constitutionType |
| /api/record/add | POST | 添加健康记录 | HealthRecordDTO |
4.2 跨域问题解决
在SpringBoot中配置CORS:
java复制@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("GET", "POST", "PUT", "DELETE")
.allowedHeaders("*")
.maxAge(3600);
}
}
4.3 数据交互格式
前后端统一使用JSON格式交互,示例登录请求:
json复制{
"username": "user123",
"password": "password123"
}
响应格式:
json复制{
"code": 200,
"message": "success",
"data": {
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"userInfo": {
"userId": 1,
"username": "user123"
}
}
}
5. 数据库设计
5.1 核心表结构
- 用户表(user)
sql复制CREATE TABLE `user` (
`user_id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL,
`password` varchar(100) NOT NULL,
`email` varchar(100) DEFAULT NULL,
`phone` varchar(20) DEFAULT NULL,
`constitution_type` varchar(20) DEFAULT NULL COMMENT '体质类型',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`user_id`),
UNIQUE KEY `idx_username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
- 健康记录表(health_record)
sql复制CREATE TABLE `health_record` (
`record_id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`record_type` enum('diet','exercise','symptom','sleep') NOT NULL,
`content` text NOT NULL,
`record_time` datetime NOT NULL,
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`record_id`),
KEY `idx_user` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
5.2 MyBatis配置
application.yml配置:
yaml复制mybatis:
mapper-locations: classpath:mapper/*.xml
type-aliases-package: com.tcm.entity
configuration:
map-underscore-to-camel-case: true
Mapper接口示例:
java复制@Mapper
public interface HealthRecordMapper {
@Insert("INSERT INTO health_record(user_id, record_type, content, record_time) " +
"VALUES(#{userId}, #{recordType}, #{content}, #{recordTime})")
@Options(useGeneratedKeys = true, keyProperty = "recordId")
int insert(HealthRecord record);
@Select("SELECT * FROM health_record WHERE user_id = #{userId} ORDER BY record_time DESC")
List<HealthRecord> selectByUserId(Integer userId);
}
6. 系统安全实现
6.1 密码加密存储
使用BCryptPasswordEncoder进行密码加密:
java复制@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
// 其他配置...
}
用户注册时加密密码:
java复制@Service
public class UserServiceImpl implements UserService {
@Autowired
private PasswordEncoder passwordEncoder;
@Override
public void register(UserDTO userDTO) {
User user = new User();
user.setUsername(userDTO.getUsername());
user.setPassword(passwordEncoder.encode(userDTO.getPassword()));
// 其他字段设置...
userMapper.insert(user);
}
}
6.2 JWT认证
JWT工具类实现:
java复制@Component
public class JwtTokenUtil {
private String secret = "tcm-secret-key";
private long expiration = 86400; // 24小时
public String generateToken(UserDetails userDetails) {
Map<String, Object> claims = new HashMap<>();
return Jwts.builder()
.setClaims(claims)
.setSubject(userDetails.getUsername())
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + expiration * 1000))
.signWith(SignatureAlgorithm.HS512, secret)
.compact();
}
public Boolean validateToken(String token, UserDetails userDetails) {
final String username = getUsernameFromToken(token);
return (username.equals(userDetails.getUsername()) && !isTokenExpired(token));
}
// 其他方法...
}
6.3 接口权限控制
使用Spring Security配置权限:
java复制@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeRequests()
.antMatchers("/api/user/login", "/api/user/register").permitAll()
.anyRequest().authenticated()
.and()
.addFilter(new JwtAuthenticationFilter(authenticationManager()))
.addFilter(new JwtAuthorizationFilter(authenticationManager()))
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS);
}
// 其他配置...
}
7. 系统部署
7.1 后端部署
使用SpringBoot内嵌Tomcat,打包为可执行JAR:
bash复制mvn clean package
java -jar target/tcm-system-0.0.1-SNAPSHOT.jar
生产环境推荐使用Docker部署:
dockerfile复制FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
7.2 前端部署
Vue项目打包:
bash复制npm run build
Nginx配置示例:
nginx复制server {
listen 80;
server_name tcm.example.com;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
location /api {
proxy_pass http://backend:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
8. 项目扩展方向
8.1 微信小程序集成
通过uni-app框架可以快速将系统扩展到微信小程序平台:
javascript复制// 小程序登录逻辑
uni.login({
provider: 'weixin',
success: function (loginRes) {
uni.request({
url: 'https://api.tcm.com/miniapp/login',
method: 'POST',
data: {
code: loginRes.code
},
success: (res) => {
uni.setStorageSync('token', res.data.token);
}
});
}
});
8.2 人工智能辅助诊断
集成机器学习模型辅助体质辨识:
python复制# Python模型服务示例
import pickle
from flask import Flask, request, jsonify
app = Flask(__name__)
model = pickle.load(open('tcm_model.pkl', 'rb'))
@app.route('/predict', methods=['POST'])
def predict():
data = request.get_json()
features = preprocess(data)
prediction = model.predict([features])
return jsonify({'constitution': prediction[0]})
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
9. 开发心得与建议
-
中医知识准确性:系统中最具挑战性的部分是确保中医理论和养生建议的准确性。建议与中医专家合作,或参考权威的中医典籍。
-
用户体验优化:体质辨识问卷不宜过长,20-30个问题为宜。可以采用渐进式问卷,根据用户回答动态调整后续问题。
-
性能考虑:养生方案推荐可以加入缓存机制,对相同体质的用户推荐结果缓存24小时。
-
数据可视化:健康记录数据可以结合ECharts等库实现趋势分析,帮助用户更直观了解自身状况。
-
测试要点:
- 体质辨识算法的准确性测试
- 高并发下的接口性能测试
- 移动端适配测试
- 安全性测试(XSS、SQL注入等)
这个项目不仅涵盖了主流的前后端技术栈,还涉及专业的中医领域知识,是一个综合性很强的毕业设计选题。通过这个项目,学生可以全面掌握现代Web开发的全流程,同时了解如何将传统知识与现代技术相结合。
