1、管理员密码可修改
修改密码时 要先通过md5解密和加密 前端进行md5加密解密
修改一条数据的局部 用PATCH
Entity是数据库表对应到实体类的映射
pojo和Entity的区别在于没有和数据表中字段一 一对应
由于@RequestBody注解只能接受一条json 所以要有一个包含新密码和老密码的pojo
比如这里用到的pojo只包含了新密码和老密码 用到的Entity UserInfo里面包含和数据库中对应的所有属性
session.getAttribute把session中的数据取出进行对比 查看
在mapper层写SQL 先通过ID查到这个用户然后进行更改 更改时间用Now()函数更新为现在的时间
<update id="changePassword" parameterType="com.ocloud.report.manager.entity.UserInfo" >
update `site-report`.user_info
set password=#{password},modify_time=Now()
where id=#{id}
</update>
2、可导入lic文件
我的理解是会一直往数据库里面加lic但是不把旧的删掉 所以必须优先显示report time最新的数据
public Response uploadLic(@RequestPart("Lics") MultipartFile[] Lics) throws IOException {//以列表形式接收文件
用MultipartFile[]的形式接受参数 这里用的是列表形式 可以一次性传入多个LIC文件
log.info("上传的信息:Lics=={}", Lics.length);
if (Lics.length > 0) {
for (MultipartFile Lic : Lics) {
String res = "";
try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(Lic.getInputStream()))) {
String lineTxt;
while ((lineTxt = bufferedReader.readLine()) != null) {
res = res + lineTxt;
}
}
log.info("文件中的信息是:{}", res);//res就是目前的这个乱码 下面要想办法解密并且add到数据库 要用到Reportservice层的代码
ReportReq data = new ReportReq();
data.setLicTxt(res);//目前这个data里面只有Lictxt这一条属性
//要解析这个lictxt
String tmp = reportDataService.decryptLicense(res);//tmp是json串 要把里面属性转到一个pojo中去 LicenseInfo就是对应的pojo
LicenseInfo info = objectMapper.readValue(tmp, LicenseInfo.class);
// Map Jsonmap = JacksonUtil.strToObj(tmp, Map.class);
// Integer num=(Integer) Jsonmap.get("RunningNum");
Integer num = info.getRunningNum();
data.setTotalDomains(num);
data.setRunningDomains(num);
data.setUserNum(num);
data.setCreateTime(new Date());//再插入现在的时间
data.setTeminalNum(num);//这个TeminalNum以前的例子和这三个属性是不同的 可能需要修改
//上传的lic文件,没有主机信息,给默认数字
data.setTotalHosts(3);
data.setRunningHosts(3);
data.setReportTime(new Date());
reportDataService.report(data);//有时候上传siteId 有时候不上传siteId 不上传siteId的时候从licTxt中解析出来也可以
}
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(Lic.getInputStream()))
//inputStreamReader是Reader的子类,可以将inputStream(字节流)转换成Reader(字符流)
//当处理纯文本问题时 转换成字符流效率更高 而且能指定编码格式 如utf-8,gbk,gb2312
//把inputStream字节流用inputStreamReader读取然后再用包装流BufferedReader读取
{“GPUStatus”:1,“HardwareInfo”:[“00b721d0-500a-11e9-94ff-0894ef7b3ffb”],“UserName”:“南京云玑信息内部测试161节点”,“ExpirationDate”:“2023/2/24”,“RunningNum”:201,“HostName”:“ocloud161”,“MacAddr”:“9E-F0-EB-BE-31-08”,“Account”:“root”,“DiskSeq”:“00b721d0-500a-11e9-94ff-0894ef7b3ffb”,“GenerationTime”:“2022/2/24 18:26”}
用java基础里的io流的知识点 由于是文本文件 所以用字符流Reader和Writer好一点
用try可以达到运行完关闭流的目的
把json从json形式变成Key-value形式的哈希表或者变成一个pojo就可以提取其中具体的一条数据
要有这个@JsonProperty注解
@Data
public class LicenseInfo {//这个LicenseInfo对应解析出来的所有json串
@JsonProperty("HardwareInfo")//起别名
private List<String> HardwareInfo;
@JsonProperty("RunningNum")
private Integer RunningNum;
@JsonProperty("ExpirationDate")
@JsonFormat(pattern = "yyyy/M/d", timezone = "GMT+8")
private Date ExpirationDate;
@JsonProperty("UserName")
private String UserName;
@JsonProperty("HostName")
private String HostName;
@JsonProperty("MacAddr")
private String MacAddr;
@JsonProperty("Account")
private String Account;
@JsonProperty("DiskSeq")
private String DiskSeq;
@JsonProperty("GenerationTime")
@JsonFormat(pattern = "yyyy/M/d HH:mm", timezone = "GMT+8")
private Date GenerationTime;
}
{“GPUStatus”:1,“HardwareInfo”:[“00b721d0-500a-11e9-94ff-0894ef7b3ffb”],“UserName”:“南京云玑信息内部测试161节点”,“ExpirationDate”:“2023/2/24”,“RunningNum”:201,“HostName”:“ocloud161”,“MacAddr”:“9E-F0-EB-BE-31-08”,“Account”:“root”,“DiskSeq”:“00b721d0-500a-11e9-94ff-0894ef7b3ffb”,“GenerationTime”:“2022/2/24 18:26”}
有一个不确定是 teminal_num是否是要和running_num一致
3、局点地理信息可配置
判断小地球亮不亮
除了查到前端显示的三条数据 还要返回city longitude latitude 让前端判断这三条属性中是否有一个为空 一旦有空的小地球变成灰色
用mybatis的动态SQL 使用if判断语句 可以直接查出参数为空的情况
<select id="queryCustomer" resultType="com.ocloud.report.manager.dto.InfoDto">
SELECT
A.site_id siteId,
A.site_name siteName,
A.user_num userNum,
A.lic_create_date licCreateDate,
C.city city,
C.longitude longitude,
C.latitude latitude
FROM
report A,site_info C,
( SELECT site_id, MAX( report_time ) report_time FROM report GROUP BY site_id ) B
<where>
A.site_id = B.site_id
AND A.report_time = B.report_time
AND A.site_id=C.site_id
<if test="siteName!=null and siteName!=''">
AND A.site_Name LIKE concat('%',concat(#{siteName},'%'))
</if>
ORDER BY A.user_num DESC
</where>
</select>
点开小地球出现具体信息 并更新
显示三个信息
<select id ="querySiteInfoBySiteId" resultType="com.ocloud.report.manager.dto.SiteInfoDto">
SELECT
A.site_id siteId,
A.city,
A.longitude,
A.latitude
FROM
site_info A
where site_id=#{siteId}
</select>
更新这三条信息
<update id="updateSite" parameterType="com.ocloud.report.manager.dto.SiteInfoDto">
update `site-report`.site_info
set city=#{city},longitude=#{longitude},latitude=#{latitude}
where site_id=#{siteId}
</update>
4、可查询客户信息
一个搜索功能 通过like 模糊查询
<select id="queryCustomer" resultType="com.ocloud.report.manager.entity.ReportEntity">
SELECT * FROM
(SELECT
A.site_id siteId,
A.site_name siteName,
A.user_num userNum,
A.lic_create_date licCreateDate,
C.small_earth smallEarth
FROM
report A,site_info C,
( SELECT site_id, MAX( report_time ) report_time FROM report GROUP BY site_id ) B
WHERE
A.site_id = B.site_id
AND A.report_time = B.report_time
AND A.site_id=C.site_id
ORDER BY A.user_num DESC) D
<where>
<if test="siteName!=null">
siteName LIKE concat('%',concat(#{siteName},'%'));
</if>
</where>
</select>
5、可查看某局点详细信息
数据库中必须确保site_id的唯一性 不然会有冲突
显示所有信息
<select id="queryInfoBySiteId" resultType="com.ocloud.report.manager.entity.ReportEntity">
SELECT
A.*
FROM report A,( SELECT site_id, MAX( report_time ) report_time FROM report GROUP BY site_id ) B
WHERE A.site_id=#{siteId} and A.site_id = B.site_id
AND A.report_time = B.report_time
</select>
6、备份并导入当前数据库信息\用备份数据恢复数据库信息
IO流
HttpServletResponse response
bw.write(chars, 0, len);
MultipartHttpServletRequest request
mysqldump命令
用mysqldump -u root -pPassword -T 目标目录 dbname table [option];
执行CMD命令
Util.getShellCommandResult(commands);
插入数据库时 先自动备份一份 自动备份的sql在服务器中
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-px6cOwIx-1651731859218)(C:\Users\柴锦文\AppData\Roaming\Typora\typora-user-images\image-20220428095502252.png)]
修改一个BUG.导入LIC后 另一个表不自动更新 导致无法查询到
本来想用左连接进行查询 但是发现会把问题搞得更复杂
SELECT
A.site_id siteId,
A.site_name siteName,
A.user_num userNum,
A.lic_create_date licCreateDate,
C.city city,
C.longitude longitude,
C.latitude latitude
FROM
report A,site_info C,
( SELECT site_id, MAX( report_time ) report_time FROM report GROUP BY site_id ) B
<where>
A.site_id = B.site_id
AND A.report_time = B.report_time
AND A.site_id=C.site_id
<if test="siteName!=null and siteName!=''">
AND A.site_Name LIKE concat('%',concat(#{siteName},'%'))
</if>
ORDER BY A.user_num DESC
</where>
想改成
SELECT * FROM
(SELECT
A.site_id siteId,
A.site_name siteName,
A.user_num userNum,
A.lic_create_date licCreateDate,
A.report_time reportTime,
C.city city,
C.longitude longitude,
C.latitude latitude
FROM
report A LEFT JOIN site_info C
ON
A.site_id=C.site_id
ORDER BY A.user_num DESC
) B
GROUP BY siteId
但是没法计算MAX( report_time ) report_time 而且害怕导致奇怪的错误
所以换了一种办法
每次插入新的lic时 遍历一遍site_info表 看看新插入的siteid在这个表里是否已经存在 如果不存在 再特地插入一下