1.数据库
1.1.表说明
No | 表名称 | 中文名 |
---|---|---|
1 | hospital | 医院信息表 |
2 | setmeal | 体检套餐信息表 |
3 | setmealdetail | 体检套餐明细表 |
4 | checkitem | 检查项信息表 |
5 | checkitemdetail | 检查项明细表 |
6 | orders | 体检预约订单表 |
7 | doctor | 医生信息表 |
8 | user | 用户信息表 |
9 | admin | 管理员信息表 |
10 | conclusion | 体检结论表 |
11 | cireport | 检查项报告表 |
12 | cidetailreport | 检查项明细报告表 |
约束类型标识:
PK:primary key 主键
FK:foreign key 外键
NN:not null 非空
UQ:unique 唯一索引
AI: auto increment 自增长列
1.hospital
No | 字段名 | 数据类型 | size | 约束 | 说明 |
---|---|---|---|---|---|
1 | hpld | int | PK、AI | 医院编号 | |
2 | name | varchar | 40 | NN | 医院名称 |
3 | img | mediumtext | NN | 医院图片 | |
4 | telphone | varchar | 40 | NN | 医院电话 |
5 | adress | varchar | 40 | NN | 医院地址 |
6 | businessHours | varchar | 50 | NN | 营业时间 |
7 | deadline | varchar | 50 | NN | 采血截止时间 |
2.setmeal
No | 字段名 | 数据类型 | size | 约束 | 说明 |
---|---|---|---|---|---|
1 | smId | int | PK、AI | 套餐编号 | |
2 | name | varchar | 40 | NN | 套餐名称 |
3 | type | char | 1 | NN | 套餐类型 (男,女) |
4 | price | decimal | (8,2) | NN | 套餐价格 |
3.setmealdetail
No | 字段名 | 数据类型 | size | 约束 | 说明 |
---|---|---|---|---|---|
1 | sdId | int | PK、AI | 套餐明细编号 | |
2 | smId | int | NN FK | 套餐编号 | |
3 | ciId | int | NN FK | 检查项编号 |
4.checkitem
No | 字段名 | 数据类型 | size | 约束 | 说明 |
---|---|---|---|---|---|
1 | ciId | int | PK、AI | 检查项编号 | |
2 | name | varchar | 20 | NN | 检查项名称 |
3 | content | varchar | 200 | NN | 检查项内容 |
4 | meaning | varchar | 200 | NN | 检查项意义 |
5.checkitemdetail
No | 字段名 | 数据类型 | size | 约束 | 说明 |
---|---|---|---|---|---|
1 | cdId | int | PK、AI | 检查项明细编号 | |
2 | name | varchar | 40 | NN | 检查项细明名称 |
3 | unit | varchar | 20 | NN | 检查项明细单位 |
4 | minrange | double | NN | 检查项细明正常值范围中的最小值 | |
5 | maxrange | double | NN | 检查项细明正常值范围中的最大值 | |
6 | normalValue | varchar | 20 | NN | 检查项细明正常值(非数字型) |
7 | normalValueString | varchar | 20 | NN | 检查项验证范围说明文字 |
8 | type | int | 1 | NN | 检查项明细类型(1:数值围范验证型;2:数值相等验证型;3:无需验证型;4:描述型;5:其它) |
9 | ciId | int | 11 | NN | 所属检查项编号 |
6.order
No | 字段名 | 数据类型 | size | 约束 | 说明 |
---|---|---|---|---|---|
1 | orderId | int | PK、AI | 订单编号 | |
2 | userId | char | 11 | NN FK | 客户编号 |
3 | hpId | int | NN FK | 医院编号 | |
4 | smId | int | NN FK | 套餐编号 | |
5 | orderDate | varchar | 10 | NN | 预约日期 |
6 | state | int | 1 | NN | 订单状态(1:未归档,2:已归档) |
7.doctor
No | 字段名 | 数据类型 | size | 约束 | 说明 |
---|---|---|---|---|---|
1 | docId | int | PK、AI | 医生编号 | |
2 | name | varchar | 20 | NN | 医生姓名 |
3 | password | varchar | 20 | NN | 登录密码 |
4 | title | varchar | 20 | NN | 医生职称 |
5 | img | mediumtext | NN | 医生照片 |
8.user
No | 字段名 | 数据类型 | size | 约束 | 说明 |
---|---|---|---|---|---|
1 | userId | char | 11 | PK | 用户编号(手机号码) |
2 | name | varchar | 20 | NN | 真实姓名 |
3 | password | varchar | 20 | NN | 登录密码 |
4 | gender | char | 1 | NN | 用户性别 |
5 | identityCard | char | 18 | NN | 身份证号 |
9.admin
No | 字段名 | 数据类型 | size | 约束 | 说明 |
---|---|---|---|---|---|
1 | loginName | varchar | 20 | PK | 登录名 |
2 | password | varchar | 10 | NN | 登录密码 |
3 | img | mediumtext | NN | 管理员头像 |
10.conclusion
No | 字段名 | 数据类型 | size | 约束 | 说明 |
---|---|---|---|---|---|
1 | ccId | int | 20 | PK AI | 体检结论编号 |
2 | title | varchar | 40 | NN | 结论标题 |
3 | content | varchar | 400 | NN | 结论内容 |
4 | orderId | int | 11 | NN | 所属订单编号 |
11.cireport
No | 字段名 | 数据类型 | size | 约束 | 说明 |
---|---|---|---|---|---|
1 | cirId | int | 11 | PK AI | 检查项报告主键 |
2 | ciId | int | 11 | NN | 检查项编号 |
3 | ciName | varchar | 30 | NN | 检查项名称 |
4 | orderId | int | 11 | NN | 所属订单编号 |
12.cidetailreport
No | 字段名 | 数据类型 | size | 约束 | 说明 |
---|---|---|---|---|---|
1 | cidrId | int | 11 | PK AI | 检查项明细报告主键 |
2 | name | varchar | 40 | NN | 检查项明细名称 |
3 | unit | varchar | 20 | NN | 检查项明细名称 |
4 | minrange | double | NN | 检查项细明正常值范围中的最小值' | |
5 | maxrange | double | NN | 检查项细明正常值范围中的最大值' | |
6 | normalValue | varchar | 20 | NN | 检查项细明正常值(非数字型) |
7 | normalValueString | varchar | 20 | NN | 检查项验证范围说明文字) |
8 | type | int | 1 | NN | 检查项明细类型(1:数值范围验证型;2:数值相等验证型;3:无需验证型;4:描述型;5:其它) |
9 | value | varchar | 100 | NN | 检查项目明细值 |
10 | isError | int | NN | 此项是否异常(0:无异常;1:异常) | |
11 | cirId | int | 11 | NN | 所属检查项报告编号 |
1.2.创建数据库
数据库名: xixin
1.3.执行建表sql
DROP TABLE IF EXISTS `admin`;
DROP TABLE IF EXISTS `checkitem`;
DROP TABLE IF EXISTS `doctor`;
DROP TABLE IF EXISTS `hospital`;
DROP TABLE IF EXISTS `order`;
DROP TABLE IF EXISTS `setmeal`;
DROP TABLE IF EXISTS `setmealdetail`;
DROP TABLE IF EXISTS `user`;
DROP TABLE IF EXISTS `inspectionreport`;
DROP TABLE IF EXISTS `cireport`;
DROP TABLE IF EXISTS `cidetailreport`;
DROP TABLE IF EXISTS `checkitemdetail`;
CREATE TABLE `admin` (
`loginName` varchar(20) COMMENT '登录名',
`password` varchar(10) NOT NULL COMMENT '登录密码',
`img` mediumtext NOT NULL COMMENT '管理员头像',
PRIMARY KEY (`loginName`)
);
CREATE TABLE `checkitem` (
`ciId` int NOT NULL COMMENT '检查项编号',
`name` varchar(30) NOT NULL COMMENT '检查项名称',
`content` varchar(200) NOT NULL COMMENT '检查项内容',
`meaning` varchar(200) NOT NULL COMMENT '检查项意义',
PRIMARY KEY (`ciId`)
);
CREATE TABLE `checkitemdetail` (
`cdId` int PRIMARY KEY COMMENT '检查项明细编号',
`name` varchar(40) NOT NULL COMMENT '检查项细明名称',
`unit` varchar(20) COMMENT '检查项明细单位',
`minrange` double COMMENT '检查项细明正常值范围中的最小值',
`maxrange` double COMMENT '检查项细明正常值范围中的最大值',
`normalValue` varchar(20) COMMENT '检查项细明正常值(非数字型)',
`normalValueString` varchar(20) COMMENT '检查项验证范围说明文字',
`type` int NOT NULL DEFAULT '1' COMMENT '检查项明细类型(1:数值围范验证型;2:数值相等验证型;3:无需验证型;4:描述型;5:其它)',
`ciId` int NOT NULL COMMENT '所属检查项编号'
) ;
CREATE TABLE `doctor` (
`docId` int NOT NULL AUTO_INCREMENT COMMENT '医生编号',
`name` varchar(20) NOT NULL COMMENT '医生姓名',
`password` varchar(20) NOT NULL COMMENT '登录密码',
`title` varchar(20) NOT NULL COMMENT '医生职称',
`img` mediumtext NOT NULL COMMENT '医生照片',
PRIMARY KEY (`docId`) USING BTREE
);
CREATE TABLE `hospital` (
`hpId` int NOT NULL AUTO_INCREMENT COMMENT '医院编号',
`name` varchar(30) NOT NULL COMMENT '医院名称',
`img` mediumtext NOT NULL COMMENT '医院图片',
`telephone` varchar(20) NOT NULL COMMENT '医院电话',
`address` varchar(100) NOT NULL COMMENT '医院地址',
`businessHours` varchar(100) NOT NULL COMMENT '营业时间',
`deadline` varchar(30) NOT NULL COMMENT '采血截止时间',
PRIMARY KEY (`hpId`)
);
CREATE TABLE `order` (
`orderId` int NOT NULL AUTO_INCREMENT COMMENT '订单编号',
`userId` varchar(11) NOT NULL COMMENT '客户编号',
`hpId` int NOT NULL COMMENT '所属医院编号',
`smId` int NOT NULL COMMENT '所属套餐编号',
`orderDate` varchar(10) NOT NULL COMMENT '预约日期',
`state` int(1) NOT NULL COMMENT '订单状态(1:未归档,2:已归档)',
PRIMARY KEY (`orderId`)
);
CREATE TABLE `setmeal` (
`smId` int NOT NULL AUTO_INCREMENT COMMENT '套餐编号',
`name` varchar(255) NOT NULL COMMENT '套餐名称',
`type` CHAR(1) NOT NULL COMMENT '套餐类型(男,女)',
`price` DECIMAL(8,2) NOT NULL COMMENT '套餐价格',
PRIMARY KEY (`smId`)
);
CREATE TABLE `setmealdetail` (
`sdId` int AUTO_INCREMENT COMMENT '套餐明细编号',
`smId` int NOT NULL COMMENT '套餐编号',
`ciId` int NOT NULL COMMENT '检查项编号',
PRIMARY KEY (`sdId`)
);
CREATE TABLE `user` (
`userId` varchar(11) NOT NULL COMMENT '用户编号(手机号码)',
`name` varchar(20) NOT NULL COMMENT '真实姓名',
`password` varchar(20) NOT NULL COMMENT '密码',
`gender` char(1) NOT NULL COMMENT '用户性别',
`identityCard` char(18) NOT NULL COMMENT '身份证号',
PRIMARY KEY (`userId`)
);
CREATE TABLE `conclusion` (
`ccId` int PRIMARY KEY AUTO_INCREMENT COMMENT '体检结论编号',
`title` varchar(40) NOT NULL COMMENT '结论标题',
`content` varchar(400) DEFAULT NULL COMMENT '结论内容',
`orderId` int(11) NOT NULL COMMENT '所属订单编号'
) ;
CREATE TABLE `cireport` (
`cirId` int PRIMARY KEY AUTO_INCREMENT COMMENT '检查项报告主键',
`ciId` int NOT NULL COMMENT '检查项编号',
`ciName` varchar(30) NOT NULL COMMENT '检查项名称',
`orderId` int(11) NOT NULL COMMENT '所属订单编号'
);
CREATE TABLE `cidetailreport` (
`cidrId` int PRIMARY KEY AUTO_INCREMENT COMMENT '检查项明细报告主键',
`name` varchar(40) NOT NULL COMMENT '检查项明细名称',
`unit` varchar(20) DEFAULT NULL COMMENT '检查项明细单位',
`minrange` double DEFAULT NULL COMMENT '检查项细明正常值范围中的最小值',
`maxrange` double DEFAULT NULL COMMENT '检查项细明正常值范围中的最大值',
`normalValue` varchar(20) DEFAULT NULL COMMENT '检查项细明正常值(非数字型)',
`normalValueString` varchar(20) DEFAULT NULL COMMENT '检查项验证范围说明文字',
`type` int NOT NULL DEFAULT '1' COMMENT '检查项明细类型(1:数值范围验证型;2:数值相等验证型;3:无需验证型;4:描述型;5:其它)',
`value` varchar(100) DEFAULT NULL COMMENT '检查项目明细值',
`isError` int NOT NULL DEFAULT '0' COMMENT '此项是否异常(0:无异常;1:异常)',
`cirId` int NOT NULL COMMENT '所属检查项报告编号'
) ;
1.4.执行数据初始化sql
2.后端项目
2.1.创建SpringBoot工程
项目名: xixin-backend
Spring Boot版本: 3.5.5
选择依赖: Lombok,Spring Boot DevTools,Spring Web,MySQL Driver
新建包:config response controller service mapper po util
新建目录: mappers
2.2.在pom.xml文件中添加mybatis-plus依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
<version>3.5.7</version>
</dependency>
2.3.修改项目配置
application.yml
# server配置
server:
port: 1234 # 端口
servlet:
context-path: /backend # 上下文路径
# jdbc 数据源配置
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/xixin?characterEncoding=utf8&serverTimezone=GMT%2B8
username: root
password: root
# mybatis-plus配置
mybatis-plus:
type-aliases-package: com.neuedu.xixinbackend.po # po别名包
mapper-locations: classpath:mappers/*.xml # 批量加载mapper映射文件
configuration:
map-underscore-to-camel-case: false # 关闭列名驼峰命名转换
global-config:
db-config:
table-underline: false # 关闭表名驼峰命名转换
# 日志级别
logging:
level:
com.neuedu.xixinbackend: DEBUG
2.4.相关配置配置类
1.在config包下新建 WeMvcConfig 类
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
@Configuration
@EnableWebMvc
public class WebMvcConfig implements WebMvcConfigurer {
/**
* 跨域访问设置
*/
public void addCorsMappings(CorsRegistry registry) {
/*
* addMapping:配置可以被跨域的路径,可以任意配置,可以具体到直接请求路径。
* allowedOrigins:允许访问的url,可以固定单条或者多条内容
* allowedMethods:允许的请求方式,如:POST、GET、PUT、DELETE等。
* allowedHeaders:允许的请求header,可以自定义设置任意请求头信息。
*/
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("*")
.allowedHeaders("*")
.exposedHeaders("*");
}
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
StringHttpMessageConverter converter = new StringHttpMessageConverter();
converter.setDefaultCharset(Charset.forName("UTF-8"));
List<MediaType> list = new ArrayList<MediaType>();
list.add( MediaType.APPLICATION_JSON);
converter.setSupportedMediaTypes(list);
converters.add(converter);
converters.add( new MappingJackson2HttpMessageConverter() );
}
}
2.在config包下新建MybatisPlusConfig 类
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
2.5.响应结果封装
在response包下新建 Result 类
import lombok.Builder;
import lombok.Data;
@Data
@Builder
public class Result<T> {
private int code; // 状态码
private String msg; // 消息
private T data; // 数据
// 成功静态方法
public static <T> Result<T> success(T data) {
return Result.<T>builder()
.code(200)
.msg("success")
.data(data)
.build();
}
// 失败静态方法
public static <T> Result<T> error(int code, String msg) {
return Result.<T>builder()
.code(code)
.msg(msg)
.build();
}
}
2.6.修改启动类
增加mapper接口扫描
@MapperScan("com.neuedu.xixinbackend.mapper")
2.7.数据非空判断工具类
在util包下新建 NotEmptyUtil 类
public class NotEmptyUtil {
public static boolean notEmpty(Object data){
if(data == null){
return false;
}
if(data instanceof String){
return !((String) data).isEmpty();
}
return true;
}
}
2.8.管理员登录功能开发
1.创建po类
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Admin {
private String loginName;
private String password;
}
2.创建mapper接口
在mapper包下新建 AdminMapper接口
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.neuedu.xixinbackend.po.Admin;
public interface AdminMapper extends BaseMapper<Admin> {
}
3.创建service接口与实现类
在service包下新建 AdminService接口及AdminServiceImpl实现类
AdminService
import com.neuedu.xixinbackend.po.Admin;
public interface AdminService {
Admin login(Admin admin);
}
AdminServiceImpl
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.neuedu.xixinbackend.mapper.AdminMapper;
import com.neuedu.xixinbackend.po.Admin;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class AdminServiceImpl implements AdminService {
@Autowired
private AdminMapper mapper;
@Override
public Admin login(Admin admin) {
QueryWrapper<Admin> wrapper = new QueryWrapper<Admin>();
wrapper.eq("loginName",admin.getLoginName());
wrapper.eq("password",admin.getPassword());
return mapper.selectOne(wrapper);
}
}
4.创建controller类
在controller包下创建AdminController
import com.neuedu.xixinbackend.po.Admin;
import com.neuedu.xixinbackend.response.Result;
import com.neuedu.xixinbackend.service.AdminService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/admin")
public class AdminController {
@Autowired
private AdminService service;
@GetMapping("/{name}/{password}")
public Result<Admin> getAdmin(@PathVariable("name")String loginName, @PathVariable("password") String password){
Admin admin = new Admin(loginName,password);
Admin result = service.login(admin);
if(result==null){
return Result.error(500,"登录名或密码错误");
}else {
return Result.success(admin);
}
}
}
5.使用 ApiFox 发送请求测试
测试地址: http://127.0.0.1:1234/backend/admin/admin/123
2.9.医院信息管理功能开发
1.创建po类
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Hospital {
@TableId(type = IdType.AUTO)
private Integer hpId;
private String name;
private String img;
private String telephone;
private String address;
private String businessHours;
private String deadline;
}
2.创建mapper接口
在mapper包下新建 HospitalMapper接口
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.neuedu.xixinbackend.po.Hospital;
public interface HospitalMapper extends BaseMapper<Hospital> {
}
3.创建service接口与实现类
在service包下新建 HospitalService接口及HospitalServiceImpl实现类
HospitalService
import com.neuedu.xixinbackend.po.Hospital;
import java.util.List;
public interface HospitalService {
String addHospital(Hospital hospital);
String updateHospital(Hospital hospital);
List<Hospital> queryAllHospital();
List<Hospital> query(Hospital hospital);
}
HospitalServiceImpl
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.neuedu.xixinbackend.mapper.HospitalMapper;
import com.neuedu.xixinbackend.po.Hospital;
import com.neuedu.xixinbackend.util.NotEmptyUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class HospitalServiceImpl implements HospitalService{
@Autowired
private HospitalMapper mapper;
@Override
public String addHospital(Hospital hospital) {
return mapper.insert(hospital)==1?"新增成功":"新增失败";
}
@Override
public String updateHospital(Hospital hospital) {
return mapper.updateById(hospital)==1?"修改成功":"修改失败";
}
@Override
public List<Hospital> queryAllHospital() {
return mapper.selectList(null);
}
@Override
public List<Hospital> query(Hospital hospital) {
QueryWrapper<Hospital> queryWrapper = new QueryWrapper<>();
queryWrapper.like(NotEmptyUtil.notEmpty(hospital.getName()),"name",hospital.getName());
queryWrapper.like(NotEmptyUtil.notEmpty(hospital.getAddress()),"address",hospital.getAddress());
return mapper.selectList(queryWrapper);
}
}
4.创建controller类
在controller包下创建HospitalController
import com.neuedu.xixinbackend.po.Hospital;
import com.neuedu.xixinbackend.response.Result;
import com.neuedu.xixinbackend.service.HospitalService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/hospital")
public class HospitalController {
@Autowired
private HospitalService service;
@GetMapping
public Result<List<Hospital>> queryAll(){
List<Hospital> list = service.queryAllHospital();
return Result.success(list);
}
@PostMapping("/query")
public Result<List<Hospital>> query(@RequestBody Hospital hospital){
List<Hospital> list = service.query(hospital);
return Result.success(list);
}
@PostMapping
public Result<String> add(@RequestBody Hospital hospital){
String result = service.addHospital(hospital);
return Result.success(result);
}
@PutMapping
public Result<String> update(@RequestBody Hospital hospital){
String result = service.updateHospital(hospital);
return Result.success(result);
}
}
5.使用 ApiFox 发送请求测试
测试地址: http://127.0.0.1:1234/backend/hospital