这次分到了一个完整的模块,记录一下。以便下次可以借鉴!
首先是查询的前端开始(只记录JS部分):
1.1.1按条件查询的JS:
/**
* 分页查询
*/
loadTableData(pageSize,pageNum){
if(this.queryData.occurrenceTime != ''){
let time = commonJs.formatDate(this.queryData.occurrenceTime);
this.queryData.occurrenceTime = time.replace(/\-/g,' ');
}
accidentCApi.getAccidentQuery(pageSize,pageNum,this.queryData).then(
(response)=>{
this.tableData = response.data.data.list;
/*this.total = response.data.data.total;*/
}
);
},
执行初始化函数:
1.1.2 写好前端的查询字段:
data () {
return {
apiUrl,
accidentId:'', // ID
way:'',//0:详情 1:新增 2:编辑
ruleForm: {
memberName:'',
bedName:'',
occurrenceTime:'',
levelName:'',
personnel:'',
chargePenson:'',
className:'',
reason:'',
remark:'',
measures:'',
result:'',
paths:[], // 图片数组
},
}
},
这样就可以展示数据了:
1.1.3前端描述完毕,可以描述后台的分页查询代码;
1.1.3–1 controller层代码:
/**
* 事故登记---分页查询--条件搜索
* @param pageSize
* @param pageNum
* @param
* @return
*/
@POST(value = "/v1/accident/{pageSize}/{pageNum}")
@ApiOperation(httpMethod = "POST", value = "[日常管理]-[事故登记分页查询]", notes = "事故登记分页查询", response = AccidentCDTO.class)
public String getAccidentInfoList(
@ApiParam(name = "pageSize", value = "分页大小", required = true) @PathVariable("pageSize") int pageSize,
@ApiParam(name = "pageNum", value = "当前页数", required = true) @PathVariable("pageNum") int pageNum,
@ApiParam(name = "query", value = "查询条件", required = false)@RequestBody AccidentQueryCDTO query) {
return ResultContent(ResultStatus.SUCCESS, accidentCService.listAccidentQuery(query, pageNum, pageSize));
}
1.1.3–2service层和service实现
@Override
public PageInfo<AccidentCDTO> listAccidentQuery(AccidentQueryCDTO accidentQueryCDTO, int pageSize, int pageNum) {
// 分页设置
PageHelper.startPage(pageNum, pageSize);
Long orgId = CurrentContext.getCurrentOrgId();
Long tenantId = CurrentContext.getCurrentTenantId();
accidentQueryCDTO.setOrgId(orgId);
accidentQueryCDTO.setTenantId(tenantId);
List<AccidentCDTO> list = dao.listAccidentQuery(accidentQueryCDTO);
long total = ((Page) list).getTotal();
PageInfo<AccidentCDTO> pageResult = new PageInfo<>(list);
pageResult.setTotal(total);
// 查询总共的事故数量
Integer number = dao.countAccident();
accidentQueryCDTO.setTotal(number);
// 按照分类进行统计事故数量
List<Map> mapList = dao.countAccidentByName();
accidentQueryCDTO.setClassNameAndCount(mapList);
return pageResult;
}
1.1.3–3dao层的SQL的写法如下:
<select id="listAccidentQuery" resultType="com.xksh.pensioncloud.daily.dto.AccidentQueryCDTO">
SELECT
member_name AS memberName,
bed_Name AS bedName,
LEVEL_NAME AS levelName,
OCCURRENCE_TIME AS occurrenceTime,
PERSONNEL AS personnel,
CHARGE_PENSON AS chargePenson,
CLASS_NAME AS className,
accident_id as accidentId,
remark AS remark
FROM
tb_cloud_accident
WHERE DELETED = 0
AND ORG_ID = #{orgId}
AND TENANT_ID = #{tenantId}
<if test="null != memberName and memberName != '' ">
AND member_name like concat('%',#{memberName},'%')
</if>
<if test="null != occurrenceTime and occurrenceTime != '' ">
AND OCCURRENCE_TIME BETWEEN STR_TO_DATE(CONCAT(#{occurrenceTime},'00 00 00'),'%Y %m %d %H %i %s')
AND STR_TO_DATE(CONCAT(#{occurrenceTime},'23 59 59'),'%Y %m %d %H %i %s')
</if>
<if test="null != bedName and bedName != '' ">
AND bed_Name like concat('%',#{bedName},'%')
</if>
<if test="null != personnel and personnel != '' ">
AND PERSONNEL like concat('%',#{personnel},'%')
</if>
<if test="null != chargePenson and chargePenson != '' ">
AND CHARGE_PENSON like concat('%',#{chargePenson},'%')
</if>
<if test="null != remark and remark != '' ">
AND remark like concat('%',#{remark},'%')
</if>
<if test="null != levelName and levelName != '' ">
AND LEVEL_NAME like concat('%',#{levelName},'%')
</if>
<if test="classId != null and classId != 0">
AND CLASS_ID = #{classId}
</if>
ORDER BY CREATE_TIME DESC
</select>
1.2查询详情;
1.2.1根据一个函数,从主页调到对应的ID的详情页;
detail(way,row){
this.$router.push({name: 'accidentDetail',params:{way:way,row:row,}});
},
/**
<template scope="scope">
<el-button type="text" size="small" @click.stop="detail(0,scope.row)">
详情</el-button>
</template>
1.2.2
JS代码的写法:
/**
* 获取事故登记详情
*/
getDetailInfo(accidentId){
accidentCApi.getDetailInfo(accidentId).then(
(response)=>{
debugger
this.ruleForm = response.data.data;
}
);
},
定义好返回的字段:
data () {
return {
apiUrl,
accidentId:'', // ID
way:'',//0:详情 1:新增 2:编辑
ruleForm: {
memberName:'',
bedName:'',
occurrenceTime:'',
levelName:'',
personnel:'',
chargePenson:'',
className:'',
reason:'',
remark:'',
measures:'',
result:'',
paths:[], // 图片数组
},
}
},
|
1.2.3 后台代码的写法
1.2.3–1controller层
/**
* 事故详情
* @param accidentId
* @return
*/
@POST(value = "/info/{accidentId}")
@ApiOperation(httpMethod = "POST", value = "[日常管理]-[事故登记]-[事故登记详情]", notes = "事故登记详情", response = AccidentCDTO.class)
public String getDeathInfo(@ApiParam(name = "accidentId", value = "事故登记id", required = true) @PathVariable("accidentId") Long accidentId) {
if(accidentId !=null){
return ResultContent(ResultStatus.SUCCESS, accidentCService.findById(accidentId));
}else{
return ResultContent(ResultStatus.BEAN_VALID_FAILED,"参数错误");
}
}
1.2.3–2service层的实现的写法:
@Override
public AccidentCDTO findById(Long accidentId) {
AccidentCDO accidentCDO = this.dao.selectByPrimaryKey(accidentId);
List<String> list = new ArrayList<>();
AccidentCDTO accidentCDTO = new AccidentCDTO();
// 将DO 转换为DTO
BeanUtils.copyProperties(accidentCDO,accidentCDTO);
// 图片查询
List<AccidentEnclosureCDO> accidentEnclosureCDOS = accidentEnclosureCService.findById(accidentId);
for(AccidentEnclosureCDO enclosureCDO :accidentEnclosureCDOS){
list.add(enclosureCDO.getFile());
}
// 返给前端path集合
accidentCDTO.setPaths(list);
return accidentCDTO;
}
1.2.3–3 接下来的话,只要DO和DAO按照规范写,就可以不用写简单的SQL语句了。
1.3 新增:
前端JS的部分:
将前端的对象封装到对象中,定义对象
data () {
return {
// 关于图片的
apiUrl,
token:'',
bedInfoStatus:'',
AccidentClassList:[], // 事故分类
levelList:[], // 事故等级
accidentId:'', // ID
loginInfo:'',
realName:'', // 管理员名字
way:'',//0:详情 1:新增 2:编辑
ruleFileList:[],
ruleForm: {
memberId:null,
memberName:'',
bedId:null,
bedName:'',
occurrenceTime:'',
levelId:'',
levelName:'',
personnel:'',
chargePenson:'',
classId:'',
className:'',
reason:'',
remark:'',
measures:'',
ruleFileList:[],
result:'',
},
queryData:{
},
members:[{
memberId:1,
memberName: "张小建",
value: "张小建",
}],
memberView:{
"memberName": ""
},
1.3.2 通过一个函数将表单提交。
/**
* 新增事故登记
*/
submitForm(formName){
let self = this;
self.queryData.memberId = self.ruleForm.memberId; // 会员姓名
self.queryData.memberName = self.ruleForm.memberName;
self.queryData.bedId = self.ruleForm.bedId; // 床位号
self.queryData.bedName = self.ruleForm.bedName;
self.queryData.occurrenceTime = self.ruleForm.occurrenceTime; // 发生时间
self.queryData.levelId = self.ruleForm.levelId; // 事故等级
self.queryData.levelName = self.ruleForm.levelName;
self.queryData.personnel = self.ruleForm.personnel; // 值班人员
self.queryData.chargePenson = self.ruleForm.chargePenson; // 负责人
self.queryData.classId = self.ruleForm.classId; // 事故分类
self.queryData.className = self.ruleForm.className;
self.queryData.reason = self.ruleForm.reason ; // 事故原因
self.queryData.remark = self.ruleForm.remark; // 事故描述
self.queryData.measures = self.ruleForm.measures; // 处理措施
self.queryData.result = self.ruleForm.result; // 处理结果
self.queryData.ruleFileList = self.ruleForm.ruleFileList; // 图片的URL集合
self.$refs[formName].validate((valid) => {
if (valid) {
self.queryData.occurrenceTime=commonJs.formatDateTime(self.queryData.occurrenceTime);
accidentCApi.insertAccident(self.queryData).then(
(response) => {
if (response.data.status == 200) {
self.$message({
message: '保存成功',
type: 'success'
});
self.$router.push({name: 'accident'});
} else {
self.$message({
message: '保存失败',
type: 'error'
});
}
},
);
}
});
},
1.3.3 后台代码的写法
1.3.3—1controller层的写法:
/**
* 新增事故登记
* @param accidentCDTO
* @return
*/
@POST(value = "/addAccident")
@ApiOperation(httpMethod = "POST", value = "[日常管理]-[事故登记]-[新增事故登记]", notes = "新建事故登记记录")
public String addAccident(@ApiParam(name = "accidentCDTO", value = "保存信息", required = false)
@RequestBody AccidentCDTO accidentCDTO) {
return ResultContent(ResultStatus.SUCCESS, accidentCService.addAccident(accidentCDTO));
}
1.3.3---- 后台service的写法:
@Override
@Transactional
public int addAccident(AccidentCDTO accidentCDTO) {
int result = 0;
// 事故登记实体新增
AccidentCDO accidentCDO = new AccidentCDO();
BeanUtils.copyProperties(accidentCDTO,accidentCDO);
accidentCDO.setPersonnel(CurrentContext.getCurrentUserName());
result = this.dao.insertSelective(accidentCDO);
// 获得该事故的主键Id
Long accidentId = accidentCDO.getAccidentId();
List<Map<String, String>> ruleFileList = accidentCDTO.getRuleFileList();
// 事故图片与事故登记实体的对应关系新增
for(Map<String, String> file : ruleFileList){
AccidentEnclosureCDO accidentEnclosureCDO = new AccidentEnclosureCDO();
accidentEnclosureCDO.setAccidentId(accidentId);
accidentEnclosureCDO.setDateUpload(new Date());
accidentEnclosureCDO.setFile(file.get("path"));
accidentEnclosureCService.save(accidentEnclosureCDO);
}
return result;
}
1.3.3–3 dao层,因为是简单的SQL,自动生成。只需要DO与DAO符合就可以了。不阐述。
1.4.1 关于图书上传—新增图片;
前端的写法:
<div class="panel-content">
<el-row>
<el-col :span="24">
<el-upload class="upload-demo" ref="upload" accept=".jpg,.jpeg,.png,.JPG,.JPEG" :action="apiUrl+'/annexs?access_token='+token" :multiple="true" :on-success="handSuccess" :on-preview="handlePreview" :on-remove="handleRemove" :auto-upload="false">
<el-button slot="trigger" size="small" type="primary">选取文件</el-button>
<el-button style="margin-left: 10px;" size="small" type="success" @click="submitUpload">上传到服务器</el-button>
<div slot="tip" class="el-upload__tip">1、只能上传jpg/png文件,且不超过5M(最多可上传9张)<br/>2、保证文件清晰</div>
</el-upload>
</el-col>
</el-row>
</div>
通过success函数,将成功上传的返回的参数,放到file中,通过push跟ruleForm一起提交到后台。
通过三个简单的函数,进行提交:
1.4.2. 调用后台的先前的接口,直接将图片保存到后台的数据库。然后将返回的url,封装到ruleForm中,当成一个数组传送到后台进行解析。插入到数据库中。
1.5.1 展示图片:
前端写法:
然后在img中现实 图片数组:
1.5.2 后台代码的写法:
1.5.2–1 controller层的代码复用:
1.5.3–2 service层的实现:
dao层和SQL均为简单的SQL,符合规则可以自动生成。
到此,大体描述完成了!!!
本次描述了 对一个实体的条件查询;根据ID查询详情;以及新增;而新增方面包含了图片的上传,以及后面新加的图片详情的查询。 与上一讲的修改,合在一起,就是一个模块的完整的增删改查了。以后碰到类似的,可以进行借鉴这里的了。