实习期间在springboot+springmvc+mybatis管理项目中实现的几个接口功能

这篇博客介绍了系统管理中的一些关键操作,包括使用MD5加密解密实现密码修改,通过Mapper接口更新数据。同时,讲解了lic文件的导入过程,涉及文件读取、JSON解析及数据库存储。还提到了局点地理信息配置,如何通过MyBatis的动态SQL查询和更新数据。此外,讨论了客户信息查询功能和数据库备份恢复的实现策略。
摘要由CSDN通过智能技术生成

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在这个表里是否已经存在 如果不存在 再特地插入一下

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值