1. 项目背景与核心价值
这个中药实验管理系统平台是一个典型的Java Web全栈项目,采用SpringBoot+Vue技术栈实现。作为毕业设计选题,它完美涵盖了现代企业级应用开发的核心技术要点,同时具有医药行业特色。我在实际开发过程中发现,这类系统在中医药院校、制药企业实验室和科研机构中都有真实需求。
系统主要解决中药实验数据管理中的三个痛点:
- 实验数据分散在Excel和纸质记录中,难以统一管理
- 实验进度和资源调配缺乏可视化监控
- 药材属性和实验结果的关联分析效率低下
提示:选择医药行业作为毕设领域有个隐藏优势 - 业务逻辑相对固定,可以更专注于技术实现,避免在需求频繁变更上浪费时间。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术栈选型解析
2.1 后端技术决策
SpringBoot 2.7.x版本是经过多个项目验证的稳定选择。相比原生Spring,它通过以下配置简化了开发:
java复制// 典型的主启动类配置
@SpringBootApplication
@MapperScan("com.tcm.mapper") // MyBatis接口扫描
@EnableTransactionManagement // 注解事务支持
public class TcmApplication {
public static void main(String[] args) {
SpringApplication.run(TcmApplication.class, args);
}
}
数据库选用MySQL 8.0,主要考虑:
- JSON字段支持(存储药材的复杂属性)
- 窗口函数(实验数据统计分析)
- 与Spring Data JPA的良好兼容性
2.2 前端架构设计
Vue 3 + Element Plus的组合提供了:
- Composition API更适合复杂业务逻辑封装
- 基于Vite的构建速度比Webpack快5-8倍
- 实验看板适合用ECharts实现数据可视化
关键依赖示例:
javascript复制// vite.config.js 优化配置
export default defineConfig({
plugins: [
vue(),
// 自动按需引入Element Plus组件
AutoImport({
resolvers: [ElementPlusResolver()],
}),
],
build: {
chunkSizeWarningLimit: 1500, // 解决大文件警告
}
})
3. 核心功能模块实现
3.1 药材库存管理
采用RBAC模型控制操作权限,核心SQL设计:
sql复制CREATE TABLE `herb` (
`id` bigint NOT NULL AUTO_INCREMENT,
`name` varchar(50) COLLATE utf8mb4_bin NOT NULL COMMENT '药材名称',
`specs` json DEFAULT NULL COMMENT '规格属性',
`stock` decimal(10,3) DEFAULT '0.000' COMMENT '库存量(kg)',
`storage_condition` varchar(20) DEFAULT '常温' COMMENT '存储条件',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
前端采用树形表格展示分类:
vue复制<el-table
:data="herbList"
row-key="id"
:tree-props="{children: 'children'}"
border>
<el-table-column prop="name" label="药材名称" width="180"/>
<el-table-column prop="specs" label="属性">
<template #default="{row}">
<el-tag
v-for="(value,key) in row.specs"
:key="key">
{{key}}:{{value}}
</el-tag>
</template>
</el-table-column>
</el-table>
3.2 实验流程跟踪
状态机设计是核心难点,采用Spring StateMachine实现:
java复制public enum ExperimentStates {
DRAFT, APPROVED, PREPARING,
IN_PROGRESS, COMPLETED, CANCELLED
}
public enum ExperimentEvents {
SUBMIT, APPROVE, REJECT,
PREPARE, START, FINISH, CANCEL
}
@Configuration
@EnableStateMachineFactory
public class StateMachineConfig extends EnumStateMachineConfigurerAdapter {
@Override
public void configure(StateMachineStateConfigurer<ExperimentStates, ExperimentEvents> states)
throws Exception {
states
.withStates()
.initial(ExperimentStates.DRAFT)
.states(EnumSet.allOf(ExperimentStates.class));
}
}
4. 接口文档规范
采用Swagger + OpenAPI 3.0规范,关键配置:
java复制@Bean
public OpenAPI customOpenAPI() {
return new OpenAPI()
.info(new Info().title("中药实验管理系统API")
.version("1.0")
.contact(new Contact().name("开发者").email("dev@example.com")))
.externalDocs(new ExternalDocumentation()
.description("完整文档"));
}
// 接口示例
@Operation(summary = "创建实验")
@PostMapping("/experiments")
public Result createExperiment(@RequestBody @Valid ExperimentDTO dto) {
// ...
}
前端通过axios封装统一请求处理:
javascript复制const service = axios.create({
baseURL: import.meta.env.VITE_APP_BASE_API,
timeout: 10000
})
// 请求拦截器
service.interceptors.request.use(config => {
if (store.getters.token) {
config.headers['Authorization'] = 'Bearer ' + getToken()
}
return config
}, error => {
return Promise.reject(error)
})
5. 部署与性能优化
5.1 多环境配置
SpringBoot的profile配置:
yaml复制# application-dev.yml
server:
port: 8080
spring:
datasource:
url: jdbc:mysql://localhost:3306/tcm_dev
username: devuser
password: dev123
# application-prod.yml
spring:
datasource:
url: jdbc:mysql://prod-db:3306/tcm_prod?useSSL=false&serverTimezone=Asia/Shanghai
hikari:
maximum-pool-size: 20
connection-timeout: 30000
5.2 Vue项目优化
- 路由懒加载:
javascript复制const routes = [
{
path: '/herb',
component: () => import('@/views/herb/index.vue')
}
]
- 生产环境去除console:
javascript复制// vite.config.js
export default defineConfig(({ mode }) => {
return {
esbuild: {
drop: mode === 'production' ? ['console', 'debugger'] : []
}
}
})
6. 毕设开发经验分享
- 数据库设计建议:
- 药材表与实验表采用软删除设计(is_deleted字段)
- 建立created_time和updated_time的联合索引
- 使用触发器自动维护更新时间戳
- 前端调试技巧:
javascript复制// 在main.js中添加
if (import.meta.env.DEV) {
window.__APP__ = app
}
// 然后在浏览器控制台可以直接调试
// __APP__.config.globalProperties.$store
- 接口联调时常见问题:
- 跨域问题:确保后端配置了正确的CORS
- 时间格式:统一使用ISO8601格式(yyyy-MM-dd'T'HH:mm:ss)
- 大文件上传:需要调整Nginx的client_max_body_size
这个项目我在实际开发中遇到过几个典型问题:药材属性的动态字段存储最初用字符串拼接导致查询困难,后来改用MySQL的JSON类型;实验状态机在并发操作时出现状态冲突,通过添加@Transactional和版本号控制解决。建议在开发前期就设计好这些关键机制。
