后台项目环境搭建
后端项目搭建
项目架构
具体总目录
hospital-manage:医院接口模拟端(已开发,直接使用)
yygh-parent:根目录,管理子模块:
- common:公共模块父节点
- common-util:工具类模块,所有模块都可以依赖于它
- rabbit-util:rabbitmq业务封装
- service-util:service服务的工具包,包含service服务的公共配置类,所有service模块依赖于它
- server-gateway:服务网关
- model:实体类模块
- service:api接口服务父节点
- service-hosp:医院api接口服务
- service-cmn:公共api接口服务
- service-user:用户api接口服务
- service-order:订单api接口服务
- service-oss:文件api接口服务
- service-sms:短信 api接口服务
- service-task:定时任务服务
- service-statistics:统计api接口服务
- service-client:feign服务调用父节点
- service-cmn-client:公共api接口
- service-hosp-client:医院api接口
- service-order-client:订单api接口
- service-user:用户api接口

具体依赖
此处具体依赖只是思路,具体依赖见详细文档。
parent打包方式为pom,dependencyManagement作为管理依赖
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><modules><module>common</module><module>model</module><module>service</module></modules><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.1.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.atguigu</groupId><artifactId>yygh-parent</artifactId><version>0.0.1-SNAPSHOT</version><name>yygh-parent</name><description>Demo project for Spring Boot</description><packaging>pom</packaging><properties>后面引用作为版本</properties><dependencyManagement><!--配置dependencyManagement锁定依赖的版本--><dependencies>...</dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
其他二级模块,如service,common(除model)打包方式还是为pom,model为单个实体类,打包还是为jar,都依赖依赖parent模块,引入依赖时可以忽略版本
例如:
<parent><artifactId>yygh-parent</artifactId><groupId>com.atguigu</groupId><version>0.0.1-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>service</artifactId><packaging>pom</packaging><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies>...</dependencies>
其他三级模块,依赖二级模块即可,打包为jar,需要使用其他模块,直接引入即可
swagger测试
概述
编写和维护接口文档是每个程序员的职责,根据Swagger2可以快速帮助我们编写最新的API接口文档,再也不用担心开会前仍忙于整理各种资料了,间接提升了团队开发的沟通效率。
常用注解(swagger通过注解表明该接口会生成文档,包括接口名、请求方法、参数、返回信息):
- @Api:修饰整个类,描述Controller的作用
- @ApiOperation:描述一个类的一个方法,或者说一个接口
- @ApiParam:单个参数描述
- @ApiModel:用对象来接收参数
- @ApiModelProperty:用对象接收参数时,描述对象的一个字段
- @ApiImplicitParam:一个请求参数
- @ApiImplicitParams:多个请求参数
common中引入依赖
<!--swagger--><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId></dependency><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId></dependency>
添加配置

/*** Swagger2配置信息*/@Configuration@EnableSwagger2public class Swagger2Config {@Beanpublic Docket webApiConfig() {return new Docket(DocumentationType.SWAGGER_2).groupName("webApi").apiInfo(webApiInfo()).select()//只显示api路径下的页面.paths(Predicates.and(PathSelectors.regex("/api/.*"))).build();}@Beanpublic Docket adminApiConfig() {return new Docket(DocumentationType.SWAGGER_2).groupName("adminApi").apiInfo(adminApiInfo()).select()//只显示admin路径下的页面.paths(Predicates.and(PathSelectors.regex("/admin/.*"))).build();}private ApiInfo webApiInfo() {return new ApiInfoBuilder().title("网站-API文档").description("本文档描述了网站微服务接口定义").version("1.0").contact(new Contact("peanut", "http://peanut325.github.io", "1009703142@qq.com")).build();}private ApiInfo adminApiInfo() {return new ApiInfoBuilder().title("后台管理系统-API文档").description("本文档描述了后台管理系统微服务接口定义").version("1.0").contact(new Contact("peanut", "http://peanut325.github.io", "1009703142@qq.com")).build();}}
在需要使用的模块中导入此模块依赖,并扫描包
<dependency><groupId>com.atguigu</groupId><artifactId>service-util</artifactId><version>0.0.1-SNAPSHOT</version></dependency>
@SpringBootApplication@ComponentScan(basePackages = "com.atguigu") // 扫描common工程public class ServiceHospApplication {public static void main(String[] args) {SpringApplication.run(ServiceHospApplication.class, args);}}
登录页面即可测试

全局异常处理
spring boot 默认情况下会映射到 /error 进行异常处理,但是提示并不十分友好,下面自定义异常处理,提供友好展示。

自定义异常类
继承RuntimeException即可
/*** 自定义全局异常类** @author qy*/@Data@ApiModel(value = "自定义全局异常类")public class YyghException extends RuntimeException {@ApiModelProperty(value = "异常状态码")private Integer code;/*** 通过状态码和错误消息创建异常对象* @param message* @param code*/public YyghException(String message, Integer code) {super(message);this.code = code;}/*** 接收枚举类型对象* @param resultCodeEnum*/public YyghException(ResultCodeEnum resultCodeEnum) {super(resultCodeEnum.getMessage());this.code = resultCodeEnum.getCode();}@Overridepublic String toString() {return "YyghException{" +"code=" + code +", message=" + this.getMessage() +'}';}}
添加全局异常处理类
/*** 统一异常处理*/@RestControllerAdvicepublic class GlobalExceptionHandler {@ExceptionHandler(YyghException.class)public Result error(YyghException exception) {exception.printStackTrace();return Result.fail();}}
返回统一结果集
由于是前后端分离的项目,所以需要统一的返回结果集规范数据

全局统一结果集类
/*** 全局统一返回结果类*/@Data@ApiModel(value = "全局统一返回结果")public class Result<T> {@ApiModelProperty(value = "返回码")private Integer code;@ApiModelProperty(value = "返回消息")private String message;@ApiModelProperty(value = "返回数据")private T data;public Result(){}protected static <T> Result<T> build(T data) {Result<T> result = new Result<T>();if (data != null)result.setData(data);return result;}public static <T> Result<T> build(T body, ResultCodeEnum resultCodeEnum) {Result<T> result = build(body);result.setCode(resultCodeEnum.getCode());result.setMessage(resultCodeEnum.getMessage());return result;}public static <T> Result<T> build(Integer code, String message) {Result<T> result = build(null);result.setCode(code);result.setMessage(message);return result;}public static<T> Result<T> ok(){return Result.ok(null);}/*** 操作成功* @param data* @param <T>* @return*/public static<T> Result<T> ok(T data){Result<T> result = build(data);return build(data, ResultCodeEnum.SUCCESS);}public static<T> Result<T> fail(){return Result.fail(null);}/*** 操作失败* @param data* @param <T>* @return*/public static<T> Result<T> fail(T data){Result<T> result = build(data);return build(data, ResultCodeEnum.FAIL);}public Result<T> message(String msg){this.setMessage(msg);return this;}public Result<T> code(Integer code){this.setCode(code);return this;}public boolean isOk() {if(this.getCode().intValue() == ResultCodeEnum.SUCCESS.getCode().intValue()) {return true;}return false;}}
定义状态码(枚举类型)
/*** 统一返回结果状态信息类*/@Getterpublic enum ResultCodeEnum {SUCCESS(200,"成功"),FAIL(201, "失败"),PARAM_ERROR( 202, "参数不正确"),SERVICE_ERROR(203, "服务异常"),DATA_ERROR(204, "数据异常"),DATA_UPDATE_ERROR(205, "数据版本异常"),LOGIN_AUTH(208, "未登陆"),PERMISSION(209, "没有权限"),CODE_ERROR(210, "验证码错误"),// LOGIN_MOBLE_ERROR(211, "账号不正确"),LOGIN_DISABLED_ERROR(212, "改用户已被禁用"),REGISTER_MOBLE_ERROR(213, "手机号已被使用"),LOGIN_AURH(214, "需要登录"),LOGIN_ACL(215, "没有权限"),URL_ENCODE_ERROR( 216, "URL编码失败"),ILLEGAL_CALLBACK_REQUEST_ERROR( 217, "非法回调请求"),FETCH_ACCESSTOKEN_FAILD( 218, "获取accessToken失败"),FETCH_USERINFO_ERROR( 219, "获取用户信息失败"),//LOGIN_ERROR( 23005, "登录失败"),PAY_RUN(220, "支付中"),CANCEL_ORDER_FAIL(225, "取消订单失败"),CANCEL_ORDER_NO(225, "不能取消预约"),HOSCODE_EXIST(230, "医院编号已经存在"),NUMBER_NO(240, "可预约号不足"),TIME_NO(250, "当前时间不可以预约"),SIGN_ERROR(300, "签名错误"),HOSPITAL_OPEN(310, "医院未开通,暂时不能访问"),HOSPITAL_LOCK(320, "医院被锁定,暂时不能访问"),;private Integer code;private String message;private ResultCodeEnum(Integer code, String message) {this.code = code;this.message = message;}}
数据库设计
运行资料中的sql即可,会创建4个数据库

前端项目搭建
由于使用的时vue-admin-template,在谷粒学院有详细配置。
项目架构
├── build // 构建脚本
├── config // 全局配置
├── node_modules // 项目依赖模块
├── src //项目源代码
├── static // 静态资源
└── package.jspon // 项目信息和依赖配置
src
├── api // 各种接口
├── assets // 图片等资源
├── components // 各种公共组件,非公共组件在各自view下维护
├── icons //svg icon
├── router // 路由表
├── store // 存储
├── styles // 各种样式
├── utils // 公共工具,非公共工具,在各自view下维护
├── views // 各种layout
├── App.vue //项目顶层组件
├── main.js //项目入口文件
└── permission.js //认证入口
安装依赖
npm insall
如果node.js版本过高,会安装失败,可以降低版本,也可以使用评论区的解决方法,虽然我不知道什么意思,但确实成功了!!!

启动项目
npm run dev
