目录
一、传智健康环境搭建
二、 预约管理-检查项管理
三、预约管理-套餐管理
四:定时任务组件Quartz(与spring-task功能类似)
五、预约管理-预约设置
六、移动端开发-体检预约
七、移动端开发-手机快速登录、权限控制
八、ECharts图型报表
九、sql回顾
十、导出excel(POI导出excel)
1.1 采用分布式开发,按模块分为:
health_parent:父工程,打包方式为pom,统一锁定依赖的版本,同时聚合其他子模块便于统一执行maven命令
health_common:通用模块,打包方式为jar,存放项目中使用到的一些工具类、实体类、返回结果和常量类
health_interface:打包方式为jar,存放服务接口
health_service_provider:Dubbo服务模块,打包方式为war,存放服务实现类、Dao接口、Mapper映射文件等,作为服务提供方,需要部署到tomcat运行
health_backend:传智健康管理后台,打包方式为war,作为Dubbo服务消费方,存放Controller、HTML页面、js、css、spring配置文件等,需要部署到tomcat运行
health_mobile:移动端前台,打包方式为war,作为Dubbo服务消费方,存放Controller、HTML页面、js、css、spring配置文件等,需要部署到tomcat运行
1.2 ElementUI介绍
ElementUI是一套基于VUE2.0的桌面端组件库,ElementUI提供了丰富的组件帮助开发人员快速构建功能强大、风格统一的页面。
官网地址:http://element-cn.eleme.io/#/zh-CN
传智健康项目后台系统就是使用ElementUI来构建页面,在页面上引入 js 和 css 文件即可开始使用,如下:
2.1 ajax异步获取数据
axios.post("/checkItem/findPage.do",param).then((response) =>{//箭头函数
//正常结束
}).catch((r)=>{
//异常结束
});
2.2 输入校验
//写在data:{}里面
rules: {//校验规则
code: [{ required: true, message: '项目编码为必填项', trigger: 'blur' }],
name: [{ required: true, message: '项目名称为必填项', trigger: 'blur' }]
}
//写着方法里面 (dataEditForm为表单名称)
this.$refs['dataEditForm'].validate((valid)=>{
if(valid){//校验成功} else{}
});
2.3 框架的注解
Controller:
@RestController //包含@control 另将Java对象自动转成json对象
@RequestMapping("/checkItem") //与url的路径对应
@Reference //添加dubbo服务的service注入
@PreAuthorize("hasAuthority('CHECKITEM_ADD')")//权限校验 写在方法上
@RequestBody //写在方法形参前,自动将表单数据封装成Java对象
Service:
@Service(interfaceClass = CheckItemService.class) //此处的注解为dubbo提供的,interfaceClass是为了事务生成指定的对象,此处是cglib代理
@Transactional //事务注解
@Autowired //自动注入
2.4 分页条组件(绑定current-change事件,此事件是分页条组件自己定义的事件,当页码改变时触发,对应的处理函数为handleCurrentChange)
:current-page="pagination.currentPage"
:page-size="pagination.pageSize"
layout="total, prev, pager, next, jumper"
:total="pagination.total">
handleCurrentChange(currentPage) { //切换页码
//currentPage为切换后的页码
this.pagination.currentPage = currentPage;
this.findPage();
}
3.1 七牛云存储
官网:https://www.qiniu.com/
七牛云提供了多种方式操作对象存储服务,本项目采用Java SDK方式,地址:https://developer.qiniu.com/kodo/sdk/1239/java
//sql的添加方法自动返回自增的主键并封装到传过来的JavaBean中
insert into t_setmeal (code,name,sex,age,helpCode,price,remark,attention,img) values
(#{code},#{name},#{sex},#{age},#{helpCode},#{price},#{remark},# {attention},#{img})
maven坐标:
提供Spring配置文件spring-jobs.xml,配置自定义Job、任务描述、触发器、调度工厂等
spring-jobs.xml
applicationContext-job.xml
Apache POI(spread插件也有类似功能)
Apache POI是用Java编写的免费开源的跨平台的Java API,Apache POI提供API给Java程序对Microsoft Office格式档案读和写的功能,其中使用最多的就是使用POI操作Excel文件。
POI操作Excel表格封装了几个核心对象:
XSSFWorkbook:工作簿
XSSFSheet:工作表
Row:行
Cell:单元格
1. 阿里云短信服务:
导入相应maven坐标
导入工具类
入门:
public static void main(String[] args)throws Exception {
SMSUtils.sendShortMessage("SMS_159620392","13812345678","1234");}
2. 日历展示
页面中使用DatePicker控件来展示日历。根据需求,最多可以提前一个月进行体检预约,所以日历控件只展示未来一个月的日期
1、权限模块数据模型
前面已经分析了认证和授权的概念,要实现最终的权限控制,需要有一套表结构支撑:
用户表t_user、权限表t_permission、角色表t_role、菜单表t_menu、用户角色关系表t_user_role、角
色权限关系表t_role_permission、角色菜单关系表t_role_menu。
2、Spring Security简介
Spring Security是 Spring提供的安全认证服务的框架。 使用Spring Security可以帮助我们来简化认证和授权的过程。
官网:https://spring.io/projects/spring-security
3、总结
主要有4张表,用户,角色,权限,菜单。
认证只需要用户表
授权:用户和角色是一对多,角色和权限、菜单、用户是一对多。
认证通过后,需要根据用户找出对应的角色和权限。
权限控制可以通过spring_sercurity.xml中配置
也可以通过注入配置,精确到方法级别的权限控制
@PreAuthorize("hasAuthority('add')")//表示用户必须拥有add权限才能调用当前方法
不过需要开启组件扫描
还需要配置spring-security.xml文件。
4、登录后获取用户名
org.springframework.security.core.userdetails.User user = (org.springframework.security.core.userdetails.User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
ECharts缩写来自Enterprise Charts,商业级数据图表,是百度的一个开源的使用JavaScript实现的数据可视化工具
官网:https://echarts.baidu.com/
下载地址:https://echarts.baidu.com/download.html
官方实例地址:https://www.echartsjs.com/examples/
//获得Excel模板文件绝对路径
String temlateRealPath = request.getSession().getServletContext().getRealPath("template") + File.separator +
"report_template.xlsx";
//读取模板文件创建Excel表格对象
XSSFWorkbook workbook = new XSSFWorkbook(new FileInputStream(new File(temlateRealPath)));
XSSFSheet sheet = workbook.getSheetAt(0);
XSSFRow row = sheet.getRow(2);
row.getCell(5).setCellValue(reportDate);//日期
row = sheet.getRow(4);
row.getCell(5).setCellValue(todayNewMember);//新增会员数(本日)
...
rowNum = 12;
for(Map map : hotSetmeal){//热门套餐
String name = (String) map.get("name");
Long setmeal_count = (Long) map.get("setmeal_count");
BigDecimal proportion =(BigDecimal) map.get("proportion");
row = sheet.getRow(rowNum ++);
row.getCell(4).setCellValue(name);//套餐名称
row.getCell(5).setCellValue(setmeal_count);//预约数量
row.getCell(6).setCellValue(proportion.doubleValue());//占比 }
//通过输出流进行文件下载
ServletOutputStream out = response.getOutputStream();
response.setContentType("application/vnd.ms-excel");
response.setHeader("content-Disposition", "attachment;filename=report.xlsx");
workbook.write(out);
out.flush();
out.close();
workbook.close();