diff --git a/sec-api/src/main/java/com/imdroid/secapi/dto/GnssDevice.java b/sec-api/src/main/java/com/imdroid/secapi/dto/GnssDevice.java index 198feeab..311705d9 100644 --- a/sec-api/src/main/java/com/imdroid/secapi/dto/GnssDevice.java +++ b/sec-api/src/main/java/com/imdroid/secapi/dto/GnssDevice.java @@ -48,7 +48,4 @@ public class GnssDevice { private Double iposn; //初始位置 private Double iposd; //初始位置 - public String getObjectName(){ - return "gnssdevice"; - } } diff --git a/sec-api/src/main/java/com/imdroid/secapi/dto/OpLogMapper.java b/sec-api/src/main/java/com/imdroid/secapi/dto/OpLogMapper.java new file mode 100644 index 00000000..bccb4cde --- /dev/null +++ b/sec-api/src/main/java/com/imdroid/secapi/dto/OpLogMapper.java @@ -0,0 +1,13 @@ +package com.imdroid.secapi.dto; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * 用户配置,一个用户由name(手机号)唯一确定 + */ + +@Mapper +public interface OpLogMapper extends BaseMapper { + +} diff --git a/sec-api/src/main/java/com/imdroid/secapi/dto/OperationLog.java b/sec-api/src/main/java/com/imdroid/secapi/dto/OperationLog.java new file mode 100644 index 00000000..b65715e5 --- /dev/null +++ b/sec-api/src/main/java/com/imdroid/secapi/dto/OperationLog.java @@ -0,0 +1,31 @@ +package com.imdroid.secapi.dto; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelProperty; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.sql.Timestamp; + +//member name must be same as the field name in mysql +@Data +@TableName(value = "OperationLog") +public class OperationLog { + @TableId(value = "id", type = IdType.AUTO) + @ExcelIgnore + Long id; + @ExcelProperty("用户名") + String user_name; + @ExcelProperty("租户id") + Integer tenantid; + @ExcelProperty("时间") + Timestamp op_time; + @ExcelProperty("类型") + Short op_type; + @ExcelProperty("对象") + Short op_object; + @ExcelProperty("内容") + String content; +} diff --git a/sec-beidou/src/main/java/com/imdroid/beidou/controller/BasicController.java b/sec-beidou/src/main/java/com/imdroid/beidou/controller/BasicController.java index faaf5efd..bfee27de 100644 --- a/sec-beidou/src/main/java/com/imdroid/beidou/controller/BasicController.java +++ b/sec-beidou/src/main/java/com/imdroid/beidou/controller/BasicController.java @@ -26,4 +26,8 @@ public class BasicController { public Integer getTenantId(HttpSession session){ return (Integer) session.getAttribute(SessionUtils.SESSION_TENANT_ID); } + + public String getLoginUser(HttpSession session){ + return (String) session.getAttribute(SessionUtils.SESSION_CURRENT_USER); + } } diff --git a/sec-beidou/src/main/java/com/imdroid/beidou/controller/CmdLineController.java b/sec-beidou/src/main/java/com/imdroid/beidou/controller/CmdLineController.java index 55af070c..27c36559 100644 --- a/sec-beidou/src/main/java/com/imdroid/beidou/controller/CmdLineController.java +++ b/sec-beidou/src/main/java/com/imdroid/beidou/controller/CmdLineController.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.imdroid.beidou.common.HttpResult; +import com.imdroid.beidou.service.OpLogManager; import com.imdroid.secapi.client.HttpResp; import com.imdroid.secapi.client.RtcmClient; import com.imdroid.secapi.dto.*; @@ -29,6 +30,8 @@ public class CmdLineController extends BasicController{ DeviceCmdMapper deviceCmdMapper; @Autowired DeviceCacheCmdMapper cacheCmdMapper; + @Autowired + OpLogManager opLogManager; /**** 推送页面 *****/ @RequestMapping("/page/cmd_line") @@ -98,6 +101,10 @@ public class CmdLineController extends BasicController{ gnssMsg.setContent(cmd); msgMapper.insert(gnssMsg); + opLogManager.addLog(getLoginUser(session),getTenantId(session), + OpLogManager.OP_TYPE_CMD,OpLogManager.OP_OBJ_DEVICE, + deviceId + ": " + cmd); + return HttpResult.success(txInfo); } @@ -137,6 +144,13 @@ public class CmdLineController extends BasicController{ cacheCmd.setMsgtype(msgType); cacheCmdMapper.insert(cacheCmd); + if(cmd.length() >= 100) { + cmd = cmd.substring(0, 100)+"..."; + } + opLogManager.addLog(getLoginUser(session),getTenantId(session), + OpLogManager.OP_TYPE_CMD,OpLogManager.OP_OBJ_DEVICE, + deviceId + " cache cmd: " + cmd); + return HttpResult.success("OK"); } diff --git a/sec-beidou/src/main/java/com/imdroid/beidou/controller/GnssDeviceController.java b/sec-beidou/src/main/java/com/imdroid/beidou/controller/GnssDeviceController.java index f2455065..06833b7e 100644 --- a/sec-beidou/src/main/java/com/imdroid/beidou/controller/GnssDeviceController.java +++ b/sec-beidou/src/main/java/com/imdroid/beidou/controller/GnssDeviceController.java @@ -3,7 +3,9 @@ package com.imdroid.beidou.controller; import com.imdroid.beidou.common.Role; import com.imdroid.beidou.entity.TenantMapper; import com.imdroid.beidou.entity.Tenant; +import com.imdroid.beidou.service.OpLogManager; import com.imdroid.common.util.NumberUtils; +import com.imdroid.common.util.ObjUtil; import com.imdroid.secapi.client.RtcmClient; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -45,6 +47,8 @@ public class GnssDeviceController extends BasicController{ @Autowired RtcmClient rtcmClient; + @Autowired + OpLogManager opLogManager; /**** 推送页面 *****/ @RequestMapping("/page/gnss_dev_cfg") @@ -167,6 +171,15 @@ public class GnssDeviceController extends BasicController{ device.setId(old_device.getId()); device.setCreateuser(old_device.getCreateuser()); device.setCreatetime(old_device.getCreatetime()); + device.setUpdateuser(getLoginUser(session)); + device.setUpdatetime(old_device.getUpdatetime()); + device.setSyn(old_device.getSyn()); + opLogManager.addLog(getLoginUser(session),getTenantId(session), + OpLogManager.OP_TYPE_UPDATE, + OpLogManager.OP_OBJ_DEVICE, + device.getDeviceid()+" update: "+ObjUtil.compare(old_device,device)); + + device.setUpdatetime(LocalDateTime.now()); num = gnssDeviceMapper.updateById(device); } else{ @@ -174,7 +187,12 @@ public class GnssDeviceController extends BasicController{ device.setCreateuser((String) session.getAttribute("login_user")); device.setSyn(false); num = gnssDeviceMapper.insert(device); //id自增 + opLogManager.addLog(getLoginUser(session),getTenantId(session), + OpLogManager.OP_TYPE_ADD, + OpLogManager.OP_OBJ_DEVICE, + device.getDeviceid() + " create new"); } + if (num == 0) { return HttpResult.failed(); } else { @@ -262,10 +280,14 @@ public class GnssDeviceController extends BasicController{ @PostMapping("/gnss/device/delete") @ResponseBody - public String delete(@RequestParam String del_id) throws Exception { + public String delete(HttpSession session, @RequestParam String del_id) throws Exception { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("deviceid",del_id); int num = gnssDeviceMapper.delete(wrapper); + opLogManager.addLog(getLoginUser(session),getTenantId(session), + OpLogManager.OP_TYPE_DEL, + OpLogManager.OP_OBJ_DEVICE, + del_id + " deleted"); if (num == 0) { return HttpResult.failed(); } else{ diff --git a/sec-beidou/src/main/java/com/imdroid/beidou/controller/GnssGroupController.java b/sec-beidou/src/main/java/com/imdroid/beidou/controller/GnssGroupController.java index 377a6ce7..180761f8 100644 --- a/sec-beidou/src/main/java/com/imdroid/beidou/controller/GnssGroupController.java +++ b/sec-beidou/src/main/java/com/imdroid/beidou/controller/GnssGroupController.java @@ -4,6 +4,8 @@ import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.imdroid.beidou.common.HttpResult; +import com.imdroid.beidou.service.OpLogManager; +import com.imdroid.common.util.ObjUtil; import com.imdroid.secapi.client.RtcmClient; import com.imdroid.secapi.dto.*; import org.springframework.beans.factory.annotation.Autowired; @@ -23,6 +25,8 @@ public class GnssGroupController extends BasicController { GnssDeviceMapper deviceMapper; @Autowired RtcmClient rtcmClient; + @Autowired + OpLogManager opLogManager; /********* 推送页面 *********/ @RequestMapping("/page/table/gnss_add_group") @@ -60,7 +64,7 @@ public class GnssGroupController extends BasicController { @PostMapping("/gnss/group/update") @ResponseBody - public String update(@RequestBody JSONObject object) throws Exception { + public String update(HttpSession session, @RequestBody JSONObject object) throws Exception { int num = 0; GnssGroup group = JSONObject.toJavaObject(object,GnssGroup.class); GnssGroup oldGroup = gnssGroupMapper.selectById(group.getId()); @@ -69,10 +73,19 @@ public class GnssGroupController extends BasicController { //if(oldGroup != null && oldGroup.equals(group)) return HttpResult.ok(); if(null != oldGroup) { + group.setDevice_num(oldGroup.getDevice_num()); num = gnssGroupMapper.updateById(group); + opLogManager.addLog(getLoginUser(session),getTenantId(session), + OpLogManager.OP_TYPE_UPDATE, + OpLogManager.OP_OBJ_GROUP, + group.getName()+" changed:"+ObjUtil.compare(oldGroup,group)); } else{ num = gnssGroupMapper.insert(group); + opLogManager.addLog(getLoginUser(session),getTenantId(session), + OpLogManager.OP_TYPE_ADD, + OpLogManager.OP_OBJ_GROUP, + group.getName()); } if (num == 0) { return HttpResult.failed(); @@ -85,7 +98,7 @@ public class GnssGroupController extends BasicController { @PostMapping("/gnss/group/delete") @ResponseBody - public String delete(@RequestParam int del_id) throws Exception { + public String delete(HttpSession session, @RequestParam int del_id) throws Exception { GnssGroup group = gnssGroupMapper.selectById(del_id); if(group == null) return HttpResult.failed(); @@ -94,6 +107,10 @@ public class GnssGroupController extends BasicController { } int num = gnssGroupMapper.deleteById(del_id); + opLogManager.addLog(getLoginUser(session),getTenantId(session), + OpLogManager.OP_TYPE_DEL, + OpLogManager.OP_OBJ_GROUP, + group.getName()); if (num == 0) { return HttpResult.failed(); } else return HttpResult.ok(); @@ -116,14 +133,24 @@ public class GnssGroupController extends BasicController { @PostMapping("/gnss/group/update_calc") @ResponseBody - public String updateCalc(@RequestBody JSONObject object) { + public String updateCalc(HttpSession session, @RequestBody JSONObject object) { int num = 0; GnssGroupCalc group = JSONObject.toJavaObject(object,GnssGroupCalc.class); - if(null != gnssGroupCalcMapper.selectById(group.getId())) { + GnssGroupCalc oldGroup = gnssGroupCalcMapper.selectById(group.getId()); + if(null != oldGroup) { + group.setDevice_num(oldGroup.getDevice_num()); num = gnssGroupCalcMapper.updateById(group); + opLogManager.addLog(getLoginUser(session),getTenantId(session), + OpLogManager.OP_TYPE_UPDATE, + OpLogManager.OP_OBJ_GROUP, + group.getName()+" changed:"+ObjUtil.compare(oldGroup,group)); } else{ num = gnssGroupCalcMapper.insert(group); + opLogManager.addLog(getLoginUser(session),getTenantId(session), + OpLogManager.OP_TYPE_ADD, + OpLogManager.OP_OBJ_GROUP, + group.getName()); } if (num == 0) { return HttpResult.failed(); @@ -135,7 +162,7 @@ public class GnssGroupController extends BasicController { @PostMapping("/gnss/group/delete_calc") @ResponseBody - public String deleteCalc(@RequestParam int del_id) { + public String deleteCalc(HttpSession session, @RequestParam int del_id) { GnssGroupCalc group = gnssGroupCalcMapper.selectById(del_id); if(group == null) return HttpResult.failed(); @@ -144,6 +171,10 @@ public class GnssGroupController extends BasicController { } int num = gnssGroupCalcMapper.deleteById(del_id); + opLogManager.addLog(getLoginUser(session),getTenantId(session), + OpLogManager.OP_TYPE_DEL, + OpLogManager.OP_OBJ_GROUP, + group.getName()); if (num == 0) { return HttpResult.failed(); } else{ diff --git a/sec-beidou/src/main/java/com/imdroid/beidou/controller/LoginController.java b/sec-beidou/src/main/java/com/imdroid/beidou/controller/LoginController.java index 14f1e6c1..5f49a68a 100644 --- a/sec-beidou/src/main/java/com/imdroid/beidou/controller/LoginController.java +++ b/sec-beidou/src/main/java/com/imdroid/beidou/controller/LoginController.java @@ -10,6 +10,7 @@ import com.imdroid.beidou.entity.Tenant; import com.imdroid.beidou.entity.TenantMapper; import com.imdroid.beidou.entity.User; import com.imdroid.beidou.entity.UserMapper; +import com.imdroid.beidou.service.OpLogManager; import com.imdroid.beidou.utils.BCryptPasswordEncoderUtil; import com.imdroid.beidou.utils.WXUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -19,6 +20,7 @@ import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; import java.io.IOException; /** @@ -40,7 +42,8 @@ public class LoginController { @Autowired private BCryptPasswordEncoderUtil bCryptPasswordEncoderUtil; - + @Autowired + OpLogManager opLogManager; @RequestMapping("/login") public String login(){ return "/login"; @@ -61,6 +64,10 @@ public class LoginController { } Tenant tenant = tenantMapper.selectById(user.getTenantid()); SessionUtils.setCurrentUser(request, user, tenant); + opLogManager.addLog(user.getName(), user.getTenantid(), + OpLogManager.OP_TYPE_LOGIN, + OpLogManager.OP_OBJ_USER, + "login from wechat"); return HttpResult.success(buildMiniUser(user, tenant)); } else { @@ -74,6 +81,10 @@ public class LoginController { } Tenant tenant = tenantMapper.selectById(user.getTenantid()); SessionUtils.setCurrentUser(request, user, tenant); + opLogManager.addLog(user.getName(), user.getTenantid(), + OpLogManager.OP_TYPE_LOGIN, + OpLogManager.OP_OBJ_USER, + "login from web"); //response.sendRedirect("/index"); //发这条没用,会导致login.html收不到应答,也跳转不了 return HttpResult.success(null); } @@ -122,6 +133,13 @@ public class LoginController { @RequestMapping(value = "/do_logout") public String logout(HttpServletRequest request) throws IOException { + HttpSession session = request.getSession(); + opLogManager.addLog( + (String) session.getAttribute(SessionUtils.SESSION_CURRENT_USER), + (Integer) session.getAttribute(SessionUtils.SESSION_TENANT_ID), + OpLogManager.OP_TYPE_LOGOUT, + OpLogManager.OP_OBJ_USER, + "logout"); request.getSession().invalidate(); return "/login"; } diff --git a/sec-beidou/src/main/java/com/imdroid/beidou/controller/OpLogController.java b/sec-beidou/src/main/java/com/imdroid/beidou/controller/OpLogController.java new file mode 100644 index 00000000..e02206ce --- /dev/null +++ b/sec-beidou/src/main/java/com/imdroid/beidou/controller/OpLogController.java @@ -0,0 +1,80 @@ +package com.imdroid.beidou.controller; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.imdroid.beidou.service.CommonExcelService; +import com.imdroid.secapi.dto.OpLogMapper; +import com.imdroid.secapi.dto.OperationLog; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; + +/** + * 消息摘要 控制器 + */ +@Controller +@RequiredArgsConstructor +public class OpLogController extends BasicController implements CommonExcelService { + + private final OpLogMapper opLogMapper; + + /**** 推送页面 *****/ + @RequestMapping("/sys/oplog") + public String opLog(Model m, HttpSession session) { + initModel(m, session); + return "/page/operation_log"; + } + + + /**** 推送数据 *****/ + @RequestMapping("/sys/list_oplog") + @ResponseBody + public JSONObject listLog(HttpSession session, Integer page, Integer limit, String searchParams) { + return this.pageList(session, page, limit, searchParams); + } + + /** + * 导出excel + * + * @param session HttpSession + * @param request HttpServletRequest + * @param response HttpServletResponse + * @throws Exception + */ + @RequestMapping("/sys/oplog/export") + @ResponseBody + public void exportData(HttpSession session, HttpServletRequest request, HttpServletResponse response) throws Exception { + this.export(session, request, response); + } + + /** + * 获取实体类的class + * + * @return 实体类的class + */ + @Override + public Class getEntityClass() { + return OperationLog.class; + } + + /** + * 获取实体类对应的mybatis mapper + * + * @return 实体类对应的mybatis mapper + */ + @Override + public BaseMapper getMapper() { + return opLogMapper; + } + + @Override + public String getOrderByColumn() { + return "op_time"; + } +} diff --git a/sec-beidou/src/main/java/com/imdroid/beidou/controller/TenantController.java b/sec-beidou/src/main/java/com/imdroid/beidou/controller/TenantController.java index 9c793a0a..59773571 100644 --- a/sec-beidou/src/main/java/com/imdroid/beidou/controller/TenantController.java +++ b/sec-beidou/src/main/java/com/imdroid/beidou/controller/TenantController.java @@ -7,6 +7,8 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.imdroid.beidou.common.HttpResult; import com.imdroid.beidou.entity.Tenant; import com.imdroid.beidou.entity.TenantMapper; +import com.imdroid.beidou.service.OpLogManager; +import com.imdroid.common.util.ObjUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; @@ -14,14 +16,13 @@ import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpSession; import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; @Controller public class TenantController extends BasicController{ @Autowired TenantMapper tenantMapper; - + @Autowired + OpLogManager opLogManager; /**** 推送页面 *****/ @RequestMapping("/sys/tenant") public String listTenant(Model m, HttpSession session) { @@ -72,6 +73,11 @@ public class TenantController extends BasicController{ LocalDateTime now = LocalDateTime.now(); if(null != tenantOld) { tenantNew.setCreate_time(tenantOld.getCreate_time()); + tenantNew.setUpdate_time(tenantOld.getUpdate_time()); + opLogManager.addLog(getLoginUser(session),getTenantId(session), + OpLogManager.OP_TYPE_UPDATE, + OpLogManager.OP_OBJ_TENANT, + tenantNew.getName()+" changed:"+ObjUtil.compare(tenantOld,tenantNew)); tenantNew.setUpdate_time(now); num = tenantMapper.updateById(tenantNew); } @@ -83,7 +89,11 @@ public class TenantController extends BasicController{ tenantNew.setId(maxTenant.getId()+1); tenantNew.setCreate_time(now); tenantNew.setUpdate_time(now); - num = tenantMapper.insert(tenantNew); //id自增 + num = tenantMapper.insert(tenantNew); + opLogManager.addLog(getLoginUser(session),getTenantId(session), + OpLogManager.OP_TYPE_ADD, + OpLogManager.OP_OBJ_TENANT, + tenantNew.getName()+" create new"); } if (num == 0) { return HttpResult.failed(); @@ -94,10 +104,14 @@ public class TenantController extends BasicController{ @PostMapping("/sys/tenant/delete") @ResponseBody - public String delete(@RequestParam String name) throws Exception { + public String delete(HttpSession session, @RequestParam String name) throws Exception { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("name",name); int num = tenantMapper.delete(wrapper); + opLogManager.addLog(getLoginUser(session),getTenantId(session), + OpLogManager.OP_TYPE_ADD, + OpLogManager.OP_OBJ_TENANT, + name+" deleted"); if (num == 0) { return HttpResult.failed(); } else return HttpResult.ok(); diff --git a/sec-beidou/src/main/java/com/imdroid/beidou/controller/UserController.java b/sec-beidou/src/main/java/com/imdroid/beidou/controller/UserController.java index b16c7d64..5924ed46 100644 --- a/sec-beidou/src/main/java/com/imdroid/beidou/controller/UserController.java +++ b/sec-beidou/src/main/java/com/imdroid/beidou/controller/UserController.java @@ -5,11 +5,12 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.imdroid.beidou.common.HttpResult; -import com.imdroid.beidou.common.Role; import com.imdroid.beidou.entity.Tenant; import com.imdroid.beidou.entity.TenantMapper; import com.imdroid.beidou.entity.User; import com.imdroid.beidou.entity.UserMapper; +import com.imdroid.beidou.service.OpLogManager; +import com.imdroid.common.util.ObjUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; @@ -28,6 +29,8 @@ public class UserController extends BasicController { UserMapper userMapper; @Autowired TenantMapper tenantMapper; + @Autowired + OpLogManager opLogManager; /**** 推送页面 *****/ @RequestMapping("/sys/user/pwd") public String userPwd() { @@ -44,7 +47,10 @@ public class UserController extends BasicController { public String addUser(Model m, HttpSession session){ initModel(m, session); QueryWrapper queryWrapper = new QueryWrapper<>(); - if(loginRole.equals(Role.ADMIN)) queryWrapper.ne("id",Tenant.SAAS_PROVIDER_ID); + Integer tenantId = getTenantId(session); + if (tenantId != null && tenantId != Tenant.SAAS_PROVIDER_ID) { + queryWrapper.eq("id", tenantId); + } List tenants = tenantMapper.selectList(queryWrapper); m.addAttribute("tenant_list", tenants); @@ -55,7 +61,10 @@ public class UserController extends BasicController { public String editUser(Model m, HttpSession session){ initModel(m, session); QueryWrapper queryWrapper = new QueryWrapper<>(); - if(loginRole.equals(Role.ADMIN)) queryWrapper.ne("id",Tenant.SAAS_PROVIDER_ID); + Integer tenantId = getTenantId(session); + if (tenantId != null && tenantId != Tenant.SAAS_PROVIDER_ID) { + queryWrapper.eq("id", tenantId); + } List tenants = tenantMapper.selectList(queryWrapper); m.addAttribute("tenant_list", tenants); @@ -68,8 +77,10 @@ public class UserController extends BasicController { public JSONObject list(HttpSession session, int page, int limit, String searchParams) { Page pageable = new Page<>(page, limit); QueryWrapper queryWrapper = new QueryWrapper<>(); - if(loginRole.equals(Role.ADMIN)) queryWrapper.ne("role",Role.SUPER_ADMIN); - + Integer tenantId = getTenantId(session); + if (tenantId != null && tenantId != Tenant.SAAS_PROVIDER_ID) { + queryWrapper.eq("tenantid", tenantId); + } IPage cs = userMapper.selectPage(pageable, queryWrapper); JSONObject jsonObject = new JSONObject(); @@ -101,11 +112,21 @@ public class UserController extends BasicController { int num = 0; if(null != userOld) { userNew.setId(userOld.getId()); + userNew.setPwd(userOld.getPwd()); + userNew.setInit_pwd(userOld.getInit_pwd()); num = userMapper.updateById(userNew); + opLogManager.addLog(getLoginUser(session),getTenantId(session), + OpLogManager.OP_TYPE_UPDATE, + OpLogManager.OP_OBJ_USER, + userNew.getName()+" changed:"+ObjUtil.compare(userOld,userNew)); } else{ userNew.setPwd(new BCryptPasswordEncoder().encode(default_pwd)); num = userMapper.insert(userNew); //id自增 + opLogManager.addLog(getLoginUser(session),getTenantId(session), + OpLogManager.OP_TYPE_ADD, + OpLogManager.OP_OBJ_USER, + userNew.getName()+" create new"); } if (num == 0) { return HttpResult.failed(); @@ -116,10 +137,14 @@ public class UserController extends BasicController { @PostMapping("/sys/user/delete") @ResponseBody - public String delete(@RequestParam String name) throws Exception { + public String delete(HttpSession session, @RequestParam String name) throws Exception { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("name",name); int num = userMapper.delete(wrapper); + opLogManager.addLog(getLoginUser(session),getTenantId(session), + OpLogManager.OP_TYPE_DEL, + OpLogManager.OP_OBJ_USER, + name + " deleted"); if (num == 0) { return HttpResult.failed(); } else return HttpResult.ok(); @@ -150,6 +175,10 @@ public class UserController extends BasicController { flag = true; user.setPwd(pwdEncoder.encode(new_pwd)); user.setInit_pwd(false); + opLogManager.addLog(getLoginUser(session),getTenantId(session), + OpLogManager.OP_TYPE_UPDATE, + OpLogManager.OP_OBJ_USER, + " changed password"); userMapper.updateById(user); } diff --git a/sec-beidou/src/main/java/com/imdroid/beidou/controller/WarningController.java b/sec-beidou/src/main/java/com/imdroid/beidou/controller/WarningController.java index 20a857fb..d81137c6 100644 --- a/sec-beidou/src/main/java/com/imdroid/beidou/controller/WarningController.java +++ b/sec-beidou/src/main/java/com/imdroid/beidou/controller/WarningController.java @@ -7,6 +7,8 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.imdroid.beidou.common.HttpResult; import com.imdroid.beidou.service.CommonExcelService; +import com.imdroid.beidou.service.OpLogManager; +import com.imdroid.common.util.ObjUtil; import com.imdroid.secapi.client.RtcmClient; import com.imdroid.secapi.dto.*; import org.springframework.beans.factory.annotation.Autowired; @@ -30,7 +32,8 @@ public class WarningController extends BasicController implements CommonExcelSer WarningCfgMapper warningCfgMapper; @Autowired RtcmClient rtcmClient; - + @Autowired + OpLogManager opLogManager; public static final Map warningMap = new HashMap<>(); @PostConstruct @@ -104,7 +107,7 @@ public class WarningController extends BasicController implements CommonExcelSer @PostMapping("/warning/update") @ResponseBody - public String update(@RequestBody JSONObject object) throws Exception { + public String update(HttpSession session, @RequestBody JSONObject object) throws Exception { // 从请求参数中创建对象 WarningCfg cfg = JSONObject.toJavaObject(object, WarningCfg.class); cfg.setTypename(warningMap.get(cfg.getType())); @@ -114,10 +117,19 @@ public class WarningController extends BasicController implements CommonExcelSer QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("devicetype", cfg.getDevicetype()); queryWrapper.eq("type", cfg.getType()); - if (warningCfgMapper.selectCount(queryWrapper) == 0) { + WarningCfg oldCfg = warningCfgMapper.selectOne(queryWrapper); + if (oldCfg == null) { num = warningCfgMapper.insert(cfg); + opLogManager.addLog(getLoginUser(session),getTenantId(session), + OpLogManager.OP_TYPE_ADD, + OpLogManager.OP_OBJ_WARNING, + cfg.getTypename()+" create new"); } else { num = warningCfgMapper.update(cfg, queryWrapper); + opLogManager.addLog(getLoginUser(session),getTenantId(session), + OpLogManager.OP_TYPE_ADD, + OpLogManager.OP_OBJ_WARNING, + cfg.getTypename() +" update: " + ObjUtil.compare(oldCfg, cfg)); } if (num == 0) { @@ -131,8 +143,16 @@ public class WarningController extends BasicController implements CommonExcelSer @PostMapping("/warning/delete") @ResponseBody - public String delete(@RequestParam Integer del_id) throws Exception { - int num = warningCfgMapper.deleteById(del_id); + public String delete(HttpSession session, @RequestParam Integer del_id) throws Exception { + WarningCfg cfg = warningCfgMapper.selectById(del_id); + int num = 0; + if(cfg != null) { + num = warningCfgMapper.deleteById(del_id); + opLogManager.addLog(getLoginUser(session), getTenantId(session), + OpLogManager.OP_TYPE_ADD, + OpLogManager.OP_OBJ_WARNING, + del_id + " deleted"); + } if (num == 0) { return HttpResult.failed(); } else { diff --git a/sec-beidou/src/main/java/com/imdroid/beidou/service/OpLogManager.java b/sec-beidou/src/main/java/com/imdroid/beidou/service/OpLogManager.java new file mode 100644 index 00000000..420d7e15 --- /dev/null +++ b/sec-beidou/src/main/java/com/imdroid/beidou/service/OpLogManager.java @@ -0,0 +1,41 @@ +package com.imdroid.beidou.service; + +import com.imdroid.secapi.dto.OpLogMapper; +import com.imdroid.secapi.dto.OperationLog; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class OpLogManager { + public final static Short OP_TYPE_ADD = 1; + public final static Short OP_TYPE_UPDATE = 2; + public final static Short OP_TYPE_DEL = 3; + public final static Short OP_TYPE_CMD = 4; + + public final static Short OP_TYPE_LOGIN = 5; + public final static Short OP_TYPE_LOGOUT = 6; + + public final static Short OP_OBJ_USER = 3; + public final static Short OP_OBJ_TENANT = 4; + public final static Short OP_OBJ_DEVICE = 5; + public final static Short OP_OBJ_GROUP = 6; + public final static Short OP_OBJ_WARNING = 7; + public final static Short OP_OBJ_SYS = 8; + + @Autowired + OpLogMapper opLogMapper; + + public void addLog(String userName, Integer tenantId, Short type, Short obj, String content) + { + if(userName != null) { + OperationLog opLog = new OperationLog(); + opLog.setUser_name(userName); + opLog.setTenantid(tenantId); + opLog.setOp_type(type); + opLog.setOp_object(obj); + if(content.length()>256) content = content.substring(0,250)+"..."; + opLog.setContent(content); + opLogMapper.insert(opLog); + } + } +} diff --git a/sec-beidou/src/main/resources/application.properties b/sec-beidou/src/main/resources/application.properties index 9c6e1b50..22c57f7c 100644 --- a/sec-beidou/src/main/resources/application.properties +++ b/sec-beidou/src/main/resources/application.properties @@ -2,9 +2,9 @@ #spring.datasource.url=jdbc:mysql://192.168.101.54:3306/beidou?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=true #spring.datasource.username=beidou #spring.datasource.password=Passw0rd#123! -#spring.datasource.url=jdbc:mysql://127.0.0.1:3306/beidou?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=true -spring.datasource.url=jdbc:mysql://139.9.51.237:3306/beidou?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=true -spring.datasource.username=radmin +spring.datasource.url=jdbc:mysql://127.0.0.1:3306/beidou?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=true +#spring.datasource.url=jdbc:mysql://139.9.51.237:3306/beidou?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=true +spring.datasource.username=admin spring.datasource.password=DBMgr_2022 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.jpa.properties.hibernate.hbm2ddl.auto=update @@ -12,8 +12,8 @@ spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MYSQL5InnoDBDialec spring.jpa.show-sql=true spring.sql.init.mode=always -#spring.datasource.initialize=true -#spring.sql.init.schema-locations=classpath:db/schema.sql +spring.datasource.initialize=true +spring.sql.init.schema-locations=classpath:db/schema.sql #thymeleaf spring.thymeleaf.cache=false diff --git a/sec-beidou/src/main/resources/db/schema.sql b/sec-beidou/src/main/resources/db/schema.sql index 4316c727..ccf72fcb 100644 --- a/sec-beidou/src/main/resources/db/schema.sql +++ b/sec-beidou/src/main/resources/db/schema.sql @@ -288,4 +288,18 @@ CREATE TABLE IF NOT EXISTS `cachecmd` ( `msgtype` int default 0, `cmd` varchar(350) NOT NULL, PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; \ No newline at end of file +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +/*** + 操作日志 + */ +CREATE TABLE IF NOT EXISTS `OperationLog` ( + `id` bigint AUTO_INCREMENT, + `user_name` varchar(20) NOT NULL, + `tenantid` int NOT NULL, + `op_time` timestamp(3) DEFAULT CURRENT_TIMESTAMP(3), + `op_type` smallint DEFAULT NULL, + `op_object` smallint DEFAULT NULL, + `content` varchar(256) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; \ No newline at end of file diff --git a/sec-beidou/src/main/resources/static/api/init_super_admin.json b/sec-beidou/src/main/resources/static/api/init_super_admin.json index 424c3567..5f56cb00 100644 --- a/sec-beidou/src/main/resources/static/api/init_super_admin.json +++ b/sec-beidou/src/main/resources/static/api/init_super_admin.json @@ -156,6 +156,12 @@ "href": "sys/user", "icon": "fa fa-user", "target": "_self" + }, + { + "title": "操作日志", + "href": "sys/oplog", + "icon": "fa fa-book", + "target": "_self" } ] } diff --git a/sec-beidou/src/main/resources/static/api/init_sys_admin.json b/sec-beidou/src/main/resources/static/api/init_sys_admin.json index f91a0dd1..31fa2579 100644 --- a/sec-beidou/src/main/resources/static/api/init_sys_admin.json +++ b/sec-beidou/src/main/resources/static/api/init_sys_admin.json @@ -126,6 +126,12 @@ "href": "sys/user", "icon": "fa fa-user", "target": "_self" + }, + { + "title": "操作日志", + "href": "sys/oplog", + "icon": "fa fa-book", + "target": "_self" } ] } diff --git a/sec-beidou/src/main/resources/templates/page/fwd_agents.html b/sec-beidou/src/main/resources/templates/page/fwd_agents.html index dc6d6af1..52d3d54e 100644 --- a/sec-beidou/src/main/resources/templates/page/fwd_agents.html +++ b/sec-beidou/src/main/resources/templates/page/fwd_agents.html @@ -36,7 +36,8 @@ {field: 'fwd_device_num', title: '推送设备数'}, {field: 'result', title: '推送结果',templet: "
{{d.result==1?'成功':'失败'}}
"} ]], - limit: 10, + limits: [10, 20, 50], + limit: 10, page: true, skin: 'line' }); diff --git a/sec-beidou/src/main/resources/templates/page/fwd_records.html b/sec-beidou/src/main/resources/templates/page/fwd_records.html index aa680054..2ea87007 100644 --- a/sec-beidou/src/main/resources/templates/page/fwd_records.html +++ b/sec-beidou/src/main/resources/templates/page/fwd_records.html @@ -107,7 +107,8 @@ {field: 'fwd_group_id', title: '推送组'}, {field: 'result', title: '状态',templet: "
{{d.result==1?'成功':'失败'}}
"} ]], - limit: 10, + limits: [10, 20, 50, 100, 150], + limit: 10, page: true, skin: 'line' }); diff --git a/sec-beidou/src/main/resources/templates/page/gnss_data_calc.html b/sec-beidou/src/main/resources/templates/page/gnss_data_calc.html index 5eff1bb2..21045f79 100644 --- a/sec-beidou/src/main/resources/templates/page/gnss_data_calc.html +++ b/sec-beidou/src/main/resources/templates/page/gnss_data_calc.html @@ -157,8 +157,8 @@ cols: [ data_cols ], - limits: [10, 50, 100, 200, 300], - limit: 15, + limits: [20, 50, 100, 200, 300], + limit: 20, page: true, skin: 'line', done: function (result, curr, count) { diff --git a/sec-beidou/src/main/resources/templates/page/gnss_dev_cfg.html b/sec-beidou/src/main/resources/templates/page/gnss_dev_cfg.html index 494a3ead..e69d5526 100644 --- a/sec-beidou/src/main/resources/templates/page/gnss_dev_cfg.html +++ b/sec-beidou/src/main/resources/templates/page/gnss_dev_cfg.html @@ -115,8 +115,8 @@ cols: [ cfg_cols ], - limits: [10, 15, 20, 25, 50, 100], - limit: 15, + limits: [10, 20, 50, 100, 150], + limit: 10, page: true, skin: 'line' }); diff --git a/sec-beidou/src/main/resources/templates/page/gnss_group_cfg.html b/sec-beidou/src/main/resources/templates/page/gnss_group_cfg.html index c259d0e4..0fc825fc 100644 --- a/sec-beidou/src/main/resources/templates/page/gnss_group_cfg.html +++ b/sec-beidou/src/main/resources/templates/page/gnss_group_cfg.html @@ -76,8 +76,9 @@ cols: [ cfg_cols ], - limit: 10, - page: true, + limits: [10, 20, 50], + limit: 10, + page: true, skin: 'line' }); @@ -169,8 +170,8 @@ cols: [ cfg2_cols ], - limit: 10, - page: true, + limits: [10, 20, 50], + page: true, skin: 'line' }); diff --git a/sec-beidou/src/main/resources/templates/page/gnss_msg.html b/sec-beidou/src/main/resources/templates/page/gnss_msg.html index 2d893935..9b86b5ce 100644 --- a/sec-beidou/src/main/resources/templates/page/gnss_msg.html +++ b/sec-beidou/src/main/resources/templates/page/gnss_msg.html @@ -88,8 +88,8 @@ {field: 'tx', title: '收发', templet: "
{{d.tx==1?'发':'收'}}
"}, {field: 'content', title: '内容', width: '50%'} ]], - limits: [10, 15, 20, 25, 50, 100], - limit: 15, + limits: [10, 20, 50, 100, 150], + limit: 10, page: true, skin: 'line' }); diff --git a/sec-beidou/src/main/resources/templates/page/gnss_msg_status.html b/sec-beidou/src/main/resources/templates/page/gnss_msg_status.html index ead2d3c1..8ef47501 100644 --- a/sec-beidou/src/main/resources/templates/page/gnss_msg_status.html +++ b/sec-beidou/src/main/resources/templates/page/gnss_msg_status.html @@ -91,8 +91,8 @@ cols: [ cfg_cols ], - limits: [10, 15, 20, 25, 50, 100], - limit: 15, + limits: [10, 20, 50, 100, 150], + limit: 10, page: true, skin: 'line' }); diff --git a/sec-beidou/src/main/resources/templates/page/gnss_msg_trx.html b/sec-beidou/src/main/resources/templates/page/gnss_msg_trx.html index ad6a4046..87a980e6 100644 --- a/sec-beidou/src/main/resources/templates/page/gnss_msg_trx.html +++ b/sec-beidou/src/main/resources/templates/page/gnss_msg_trx.html @@ -104,8 +104,8 @@ cols: [ data_cols ], - limits: [10, 15, 20, 25, 50, 100], - limit: 15, + limits: [10, 20, 50, 100, 150], + limit: 10, page: true, skin: 'line' }); diff --git a/sec-beidou/src/main/resources/templates/page/gnss_status.html b/sec-beidou/src/main/resources/templates/page/gnss_status.html index fb2a56fc..5627332f 100644 --- a/sec-beidou/src/main/resources/templates/page/gnss_status.html +++ b/sec-beidou/src/main/resources/templates/page/gnss_status.html @@ -121,8 +121,8 @@ cols: [ cfg_cols ], - limits: [10, 15, 20, 25, 50, 100], - limit: 15, + limits: [10, 20, 50, 100, 150], + limit: 10, page: true, skin: 'line' }); diff --git a/sec-beidou/src/main/resources/templates/page/operation_log.html b/sec-beidou/src/main/resources/templates/page/operation_log.html new file mode 100644 index 00000000..e1406c5c --- /dev/null +++ b/sec-beidou/src/main/resources/templates/page/operation_log.html @@ -0,0 +1,155 @@ + + + + + 操作日志 + + + + + + + +
+
+ +
+ 搜索信息 +
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+ +
+
+
+ + +
+
+
+
+
+ +
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/sec-beidou/src/main/resources/templates/page/resend_records.html b/sec-beidou/src/main/resources/templates/page/resend_records.html index 92063b03..9927c410 100644 --- a/sec-beidou/src/main/resources/templates/page/resend_records.html +++ b/sec-beidou/src/main/resources/templates/page/resend_records.html @@ -96,7 +96,8 @@ {field: 'fwd_group_id', title: '推送组'}, {field: 'state', title: '状态',templet: '#stateTrans'} ]], - limit: 10, + limits: [10, 20, 50, 100, 150], + limit: 10, page: true, skin: 'line' }); diff --git a/sec-beidou/src/main/resources/templates/page/tenant_cfg.html b/sec-beidou/src/main/resources/templates/page/tenant_cfg.html index ee275f2e..dc22a7b3 100644 --- a/sec-beidou/src/main/resources/templates/page/tenant_cfg.html +++ b/sec-beidou/src/main/resources/templates/page/tenant_cfg.html @@ -48,8 +48,8 @@ {field: 'contact', title: '联系方式'}, {title: '操作', toolbar: '#currentTableBar', align: "center", minWidth: 120} ]], - limits: [10, 15, 20, 25, 50, 100], - limit: 15, + limits: [10, 20, 50, 100, 150], + limit: 10, page: true, skin: 'line' }); diff --git a/sec-beidou/src/main/resources/templates/page/user_cfg.html b/sec-beidou/src/main/resources/templates/page/user_cfg.html index 910d5288..58ca8cb7 100644 --- a/sec-beidou/src/main/resources/templates/page/user_cfg.html +++ b/sec-beidou/src/main/resources/templates/page/user_cfg.html @@ -78,8 +78,8 @@ {field: 'warning_enabled', title: '告警通知', templet: "
{{d.warning_enabled==1?'是':'否'}}
"}, {title: '操作', toolbar: '#currentTableBar', align: "center", minWidth: 120} ]], - limits: [10, 15, 20, 25, 50, 100], - limit: 15, + limits: [10, 20, 50, 100, 150], + limit: 10, page: true, skin: 'line' }); diff --git a/sec-beidou/src/main/resources/templates/page/warning.html b/sec-beidou/src/main/resources/templates/page/warning.html index 410ff7ee..3c5e6134 100644 --- a/sec-beidou/src/main/resources/templates/page/warning.html +++ b/sec-beidou/src/main/resources/templates/page/warning.html @@ -88,8 +88,8 @@ {field: 'code', title: '告警类型'}, {field: 'info', title: '告警内容', width: '35%'} ]], - limits: [10, 15, 20, 25, 50, 100], - limit: 15, + limits: [10, 20, 50, 100, 150], + limit: 10, page: true, skin: 'line' }); diff --git a/sec-common/src/main/java/com/imdroid/common/util/ObjUtil.java b/sec-common/src/main/java/com/imdroid/common/util/ObjUtil.java new file mode 100644 index 00000000..b995d576 --- /dev/null +++ b/sec-common/src/main/java/com/imdroid/common/util/ObjUtil.java @@ -0,0 +1,18 @@ +package com.imdroid.common.util; + +public class ObjUtil { + public static String compare(Object obj1, Object obj2){ + if(!obj1.getClass().equals(obj2.getClass())) return ""; + + String[] items = obj1.toString().split(",|:|\\s+"); + String[] items2 = obj2.toString().split(",|:|\\s+"); + String diff = ""; + for(int i=0; i"+items2[i].substring(items2[i].indexOf('=')+1)+","; + } + } + + return diff; + } +}