巡检系统相关记录

记录第一个项目遇到的问题及解决方案

  • 环境
  • 问题及难点
    • 将一条信息插入数据库,并获取到这条数据的自增id
    • 获取到的用户/场站列表中有被逻辑删除的项(状态为"删除"),不应该被显示出来
    • 在controller中return "error" 不会跳转到error.jsp页面
    • select后.get()可能会报空指针异常
    • 获取当前操作用户的id
    • 进行某些操作后需要返回到之前页面
    • 各种格式转化
    • 发送APP推送
    • Mybatis plus的增删改查(一条)
    • for循环里将每条数据依次insert速度慢
    • APP接口的标准写法
    • 对多个表进行操作时,如果某个操作出错,所有表的数据回滚
    • 系统融合问题
    • 字符串判断错误
  • 项目改进方向

环境

这里只列出我自己接触的部分
持久层框架:Mybatis plus + 前端框架: layui + APP框架:APICloud

问题及难点

将一条信息插入数据库,并获取到这条数据的自增id

网上的解决方法:1. select max(id) from tablename 2.SELECT LAST_INSERT_ID() 函数
实际解决方法:使用Mybatis plus : insert 后主键会自动 set 到实体的 ID 字段,所以只需要 getId() 就好

获取到的用户/场站列表中有被逻辑删除的项(状态为"删除"),不应该被显示出来

网上的解决方法:1.修改select的查询条件,因为项目中采用多个中间表表示数据间的关系,涉及到的多表联查比较麻烦(其实就是我不会。。)所以没有采用本方法
实际解决方法:将获取到的所有用户/场站id存入List中,用for循环判断当前id对应的状态是否为"删除",为"删除"时,将List对应的项删除。注意List.remove(i)时会导致列表长度变化,应在循环体中i - -。

//这个方法好像也是对的
Iterator<String> it = list.iterator();
while(it.hasNext()){
    String x = it.next();
    if(x.equals("del")){
        it.remove();
    }
}

在controller中return “error” 不会跳转到error.jsp页面

原因:猜测是因为error为系统保留字段
解决方法:return “error1” 就可以了

select后.get()可能会报空指针异常

原因:select可能取到的值为空而不是预想的实体,null的get()会报空指针异常
解决方法:1.select后判断返回值是否为空,不为空时再用get方法 2.用try catch

获取当前操作用户的id

在登陆时用户信息会保存在session中

// TbUserController中的登陆部分
request.getSession().setAttribute("TB_USER",tbUser);

获取当前操作的用户id,可以先获取到session,将session强转为user实体,然后用get()方法取得用户id

// 函数参数部分需要HttpServletRequest request
HttpSession session = request.getSession(true);
TbUser user=(TbUser)session.getAttribute("TB_USER");
int id = user.getUserId();

进行某些操作后需要返回到之前页面

原方法:jsp页面添加一个返回按钮,点击退回

onclick="javascript:history.go(-1);

这样的问题是返回的页面并不会刷新

解决方法:在controller中重定向 return “redirect: (目标页面路径)”

各种格式转化

 Integer.parseInt()// String 转 int
 JSONObject.toJSONString()// String 转 JSON

发送APP推送

前提是引入个推(个信?)的各种包

PushUtil.pushOne("标题", "内容","设备id");//推送给某个用户
PushUtil.pushAll("标题", "内容");//推送给所有用户

Mybatis plus的增删改查(一条)

ITbTaskService.insert(task);//增
ITbTaskService.deleteById(id);//删
ITbTaskService.updateById(task);//改
ITbTaskService.selectOne(new EntityWrapper<TbTask>().eq("task_id",taskId))//查

for循环里将每条数据依次insert速度慢

优化方法:将所有数据存入一个list中,然后insertBatch(list)
实测插入速度增加一倍(但是整个操作仍然很慢,是for循环赋值的时间太长?)

APP接口的标准写法

	/**
     * 用户登录,成功返回用户信息
     * @param userName 账号
     * @param userPassword 密码
     * @param request
     * @return
     */
    @ApiOperation(value="APP用户登录,成功返回用户信息",notes="APP用户登录,成功返回用户信息")
    @GetMapping(value="/login")
    @ApiImplicitParams({
            @ApiImplicitParam(name="userName",value="手机号",dataType="string", paramType = "query",example="15771335697",required = true),
            @ApiImplicitParam(name="userPassword",value="密码",dataType="string", paramType = "query",example="123456",required = true)})
    public ResultEntity findByUserNameAPP(String userName, String userPassword, HttpServletRequest request){
    	//这里写登陆判断,成功时返回对应user实体
        return ResultEntity.success(user);
    }

对多个表进行操作时,如果某个操作出错,所有表的数据回滚

@Transactional //在函数前加这个注释

系统融合问题

本来我们做的巡检系统有自己的登陆、消息、用户管理模块,现在要集成在门户系统上 ,登陆要由门户系统验证,待办事项需要推送到门户首页,用户增删会导致门户登陆出错。目前无解决方案,以后项目设计阶段需要注意!

字符串判断错误

不要用==,用equal()

项目改进方向

1.完善与其他系统对接的接口
2.加快新建巡检任务时的速度
3.改进任务审核模块(审核流程可视化)
4.增加审核时的详情展示页面
5.改进分页及搜索的索引范围、展示顺序
6.新增厂站时自动关联/新建甲方账户
7.对站点信息进行补充(服务期限、自动获取当前缴费情况)
8.对异常数据进行分析,获取有价值信息

你可能感兴趣的:(自用)