尚医通项目 - 笔记

1. MapperScan

(1)可以在启动类上加@MapperScan()
(2)可以创建一个配置类加@MapperScan()

2. 条件查询带分页

(1)创建vo类,封装条件值
(2)编写Controller:获取条件对象以及分页数据(当前页,每页记录数)

3. 统一异常处理

(1)全局异常:定义一个异常处理类加上注解@ControllerAdvice
尚医通项目 - 笔记_第1张图片
(2)自定义异常:

① 自定义一个异常类YyghException,继承RuntimeException,并在父类属性基础上添加了一个属性code(共包含message和code两个属性),并定义了两个构造器;
② 在上面(1)中的异常处理类中,添加一个新的方法来处理YyghException;
③ 业务逻辑中,将会出现异常的代码部分try、catch,抛出一个new YyghException(“失败”, 201)。

4. Vue

(1)created方法:在页面渲染之前执行
(2)mounted方法:在页面渲染之后执行

5. Node.js

(1)JavaScript运行环境
(2)模拟服务器效果

6. 模块化开发

(1)后端开发:对象与对象之间调用
(2)前端开发:js之间的调用

7. 数据字典列表功能

(1)DictServiceImpl中无需注入DictMapper,因为它继承了ServiceImpl,ServiceImpl中有

protected M baseMapper

所以直接直接调用baseMapper即可

(2)实体类Dict中有一个与数据库表中不对应的字段

@ApiModelProperty(value = "是否包含子节点")
@TableField(exist = false)
private boolean hasChildren

(3)DictServiceImpl里两个方法

//根据数据id查询子数据列表
@Override
public List<Dict> findChildData(Long id) {
	QueryWrapper<Dict> wrapper = new QueryWrapper<>();
	wrapper.eq("parent_id", id);
	List<Dict> dictList = baseMapper.selectList(wrapper);
	//向dictList集合中每个dict对象设置hasChildren
	for (Dict dict : dictList) {
		Long dictId = dict.getId();
		boolean isChild = this.isChildren(dictId);
		dict.setHasChildren(isChild );
	}
	return dictList;
}

//判断该id下面是否有子节点
@Override
public boolean isChildren(Long id)

8. EasyExcel

(1) 写操作

① 实体类

@Data
public class UserData {
	@ExcelProperty("用户编号", index = 0)
	private int uid;

	@ExcelProperty("用户名称", index = 1)
	private String username;
}

② 主方法

List<UserData> list = new ArrayList<>();
//......list中添加UserData对象
EasyExcel.write(fileName, UserData.class).sheet("用户信息").doWrite(list);

(2) 读操作

① 监听器

public class ExcelListener extends AnalysisEventListener<UserData> {
	//一行一行读取excel内容,从第二行开始读,userData就是数据
	@Override
	public void invoke(UserData userData, AnalysisContext analysisContext) {}
	
	//headMap是表头信息
	@Override
	public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {}
	
	//读取之后执行 
	@Override
	public void doAfterAllAnalysed(AnalysisContext analysisContext) {}
}

② 主方法

//读取文件路径
String fileName = "D:\\excel\\01.xlsx";
//调用方法实现读取操作
EasyExcel.read(fileName, UserData.class, new ExcelListener()).sheet().doRead();

(3) 项目下载数据到excel

① 设置下载信息

response.setContextType(...)
response.setCharacterEncoding(...)
response.setHead(...)

② 查询数据库

③ 调用方法进行写操作

EasyExcel.write(response.getOutPutStream(), DictEeVo.class)).sheet("...").doWrite(dictEeVoList);

④ 前端按钮上绑定事件,并写exportData方法

(4) 项目导入excel

EasyExcel.read(file.getInPutStream(), DictEeVo.class, new DictListener(baseMapper)).sheet().doRead();

9. Spring Cache + Redis缓存数据

(1) 定义redis的配置类

① 自定义key的规则
② 设置RedisTemplate规则(类型转换、序列化等)
③ 设置CacheManage缓存规则(数据有效时间、乱码处理等)

(2) application配置文件中添加redis配置

尚医通项目 - 笔记_第2张图片

(3) 涉及缓存的方法上添加注解

① @Cacheable用于查询方法

② @CacheEvict用于更新和删除方法

10. Nginx

尚医通项目 - 笔记_第3张图片

(1) 统一对外暴露9001端口,根据请求路径中的内容,分别转发到不同的服务

(2) 安装Nginx后,在nginx.conf文件中设置规则:

尚医通项目 - 笔记_第4张图片

11. MongoDB

尚医通项目 - 笔记_第5张图片

mysql和mongoDB术语对比

尚医通项目 - 笔记_第6张图片

12. SpringBoot整合MongoDB

(1) 引入依赖

(2) application中添加配置

spring.data.mongodb.uri=mongodb://192.168.44.165:27017/test
虚拟机IP地址或者本地IP地址+端口号+数据库名字

(3) 定义实体类User

尚医通项目 - 笔记_第7张图片

(4) 使用MongoTemplate进行CRUD

private MongoTemplate mongoTemplate;

//添加操作
mongoTemplate.insert(user)

//查询所有
mongoTemplate.findAll(User.class)

//根据id查询
mongoTemplate.findById("HD2I3984EFJKF49JTL3", User.class)

//条件查询
Query query = new Query(...);
mongoTemplate.find(query, User.class);

//模糊查询
Pattern pattern = Pattern.compile(...);
Query query = new Query(..., pattern);
mongoTemplate.find(query, User.class);

//分页条件查询
int pageNo = 1; //当前页
int  pageSize = 3; //每页显示记录数
Query query = new Query(...);
long count = mongoTemplate.count(query, User.class); //查询总记录数
//该页显示的记录
List<User> users = mongoTemplate.find(query.skip((pageNo - 1) * pageSize).limit(pageSize), User.class);

//修改操作
//先根据id查
User user = mongoTemplate.findById("UED293RJOWEJDIF09843", User.class);
//设置修改值
user.setName("new name");
user.setAge(25);
Query query = new Query(Criteria...);
Update update = new Update();
update.set("name", user.getName());
update.set("age", user.getAge());
UpdateResult upsert = mongoTemplate.upsert(query, update, User.class);
long modifiedCount = upsert.getModifiedCount(); //影响行数

//删除操作
mongoTemplate.remove(query, User.class);

(5) 使用MongoRepository进行CRUD

public interface UserRepository extends MongoRepository<User, String> {}

private UserRepository userRepository ;

13. 注册中心和远程调用 - Nacos

尚医通项目 - 笔记_第8张图片

(1) 添加Nacos依赖

(2) application中配置nacos服务地址

在这里插入图片描述

(3) 每一个服务的启动类上添加注解@EnableDiscoveyClient,这个服务就会在nacos中进行注册

(4) 在service-cmn中提供一个根据value和dictcode查询医院等级的接口

(5) 新建一个模块service_cmn_client封装服务调用Feign的相关内容,接口上添加被调用服务的服务名

尚医通项目 - 笔记_第9张图片

(6) 调用者服务service-hosp中添加service_cmn_client的依赖

尚医通项目 - 笔记_第10张图片

(7) service-hosp服务中调用的方法中,注入第(5)步中在service_cmn_client中定义的接口DcitFeignClient

尚医通项目 - 笔记_第11张图片

(8) service-hosp服务的启动类上加注解@EnableFeignClients(包名,指定扫描路径)

14. 数据字典之省市二级联动相关接口

15. 更新医院上线状态

//Impl实现类中的方法
public void updateStatus(String id, Integer status) {
	//根据id查询医院信息
	Hospital hospital = hospitalRepository.findById(id).get();
	//设置修改的值
	hospital.setStatus(status);
	hospital.setUpdateTime(new Date());
	hospitalRepository.save(hospital);
}

16. 医院详情功能

17. 医院排班

//科室实体类
public class DepartmentVo {
	//@ApiModelProperty(value = "科室编号")
	private String depcode;
	//@ApiModelProperty(value = "科室名称")
	private String depname;
	//@ApiModelProperty(value = "下级节点")
	private List<DepartmentVo> children;
}

总结:医院详情和医院排班都需要在前端设置隐藏路由

你可能感兴趣的:(javascript,java,前端)