From 84630b0c853a196e75a19b01ede23a4dcfb42250 Mon Sep 17 00:00:00 2001 From: blankk <2649084208@qq.com> Date: Tue, 28 Jun 2022 17:37:44 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../camera/controller/CameraController.java | 7 ++ .../code/camera/mapper/CameraMapper.java | 2 + .../code/camera/service/ICameraService.java | 2 + .../service/impl/CameraServiceImpl.java | 5 + .../controller/ScStationInfoController.java | 108 ++++++++++++++++++ .../sctaationinfo/domain/ScStationInfo.java | 70 ++++++++++++ .../mapper/ScStationInfoMapper.java | 19 +++ .../service/IScStationInfoService.java | 24 ++++ .../impl/ScStationInfoServiceImpl.java | 37 ++++++ .../resources/mapper/camera/CameraMapper.xml | 11 ++ .../scStationInfo/ScStationInfoMapper.xml | 7 ++ 11 files changed, 292 insertions(+) create mode 100644 ruoyi-code/src/main/java/com/ruoyi/code/sctaationinfo/controller/ScStationInfoController.java create mode 100644 ruoyi-code/src/main/java/com/ruoyi/code/sctaationinfo/domain/ScStationInfo.java create mode 100644 ruoyi-code/src/main/java/com/ruoyi/code/sctaationinfo/mapper/ScStationInfoMapper.java create mode 100644 ruoyi-code/src/main/java/com/ruoyi/code/sctaationinfo/service/IScStationInfoService.java create mode 100644 ruoyi-code/src/main/java/com/ruoyi/code/sctaationinfo/service/impl/ScStationInfoServiceImpl.java create mode 100644 ruoyi-code/src/main/resources/mapper/scStationInfo/ScStationInfoMapper.xml diff --git a/ruoyi-code/src/main/java/com/ruoyi/code/camera/controller/CameraController.java b/ruoyi-code/src/main/java/com/ruoyi/code/camera/controller/CameraController.java index adb06c7..7256a26 100644 --- a/ruoyi-code/src/main/java/com/ruoyi/code/camera/controller/CameraController.java +++ b/ruoyi-code/src/main/java/com/ruoyi/code/camera/controller/CameraController.java @@ -141,5 +141,12 @@ public class CameraController extends BaseController return R.ok().put("data",cameraService.getCameraList()); } + /** + * 根据站点表的id查询摄像头信息 + */ + @RequestMapping("/cameraBySid/{sid}") + public R getCameraBySid(@PathVariable("sid") Long sid) { + return R.ok().put("data",cameraService.getCameraBySid(sid)); + } } diff --git a/ruoyi-code/src/main/java/com/ruoyi/code/camera/mapper/CameraMapper.java b/ruoyi-code/src/main/java/com/ruoyi/code/camera/mapper/CameraMapper.java index d107453..7c3675e 100644 --- a/ruoyi-code/src/main/java/com/ruoyi/code/camera/mapper/CameraMapper.java +++ b/ruoyi-code/src/main/java/com/ruoyi/code/camera/mapper/CameraMapper.java @@ -17,4 +17,6 @@ public interface CameraMapper extends BaseMapper { List queryCameraList(); + + Camera queryCameraBYSid(Long sid); } diff --git a/ruoyi-code/src/main/java/com/ruoyi/code/camera/service/ICameraService.java b/ruoyi-code/src/main/java/com/ruoyi/code/camera/service/ICameraService.java index c5b1346..7e93d91 100644 --- a/ruoyi-code/src/main/java/com/ruoyi/code/camera/service/ICameraService.java +++ b/ruoyi-code/src/main/java/com/ruoyi/code/camera/service/ICameraService.java @@ -27,4 +27,6 @@ public interface ICameraService extends IService void outline(String loginID); List getCameraList(); + + Camera getCameraBySid(Long sid); } diff --git a/ruoyi-code/src/main/java/com/ruoyi/code/camera/service/impl/CameraServiceImpl.java b/ruoyi-code/src/main/java/com/ruoyi/code/camera/service/impl/CameraServiceImpl.java index 8fc8d57..2693209 100644 --- a/ruoyi-code/src/main/java/com/ruoyi/code/camera/service/impl/CameraServiceImpl.java +++ b/ruoyi-code/src/main/java/com/ruoyi/code/camera/service/impl/CameraServiceImpl.java @@ -96,4 +96,9 @@ public class CameraServiceImpl extends ServiceImpl impleme public List getCameraList() { return baseMapper.queryCameraList(); } + + @Override + public Camera getCameraBySid(Long sid) { + return baseMapper.queryCameraBYSid(sid); + } } diff --git a/ruoyi-code/src/main/java/com/ruoyi/code/sctaationinfo/controller/ScStationInfoController.java b/ruoyi-code/src/main/java/com/ruoyi/code/sctaationinfo/controller/ScStationInfoController.java new file mode 100644 index 0000000..5b87a60 --- /dev/null +++ b/ruoyi-code/src/main/java/com/ruoyi/code/sctaationinfo/controller/ScStationInfoController.java @@ -0,0 +1,108 @@ +package com.ruoyi.code.sctaationinfo.controller; + +import java.util.List; +import java.util.Arrays; +import java.util.Map; +import javax.servlet.http.HttpServletResponse; +import javax.annotation.Resource; + +import com.ruoyi.code.camera.domain.Camera; +import com.ruoyi.code.sctaationinfo.domain.ScStationInfo; +import com.ruoyi.code.sctaationinfo.service.IScStationInfoService; +import com.ruoyi.common.core.page.R; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +/** + * 水尺-测站信息Controller + * + * @author ruoyi + * @date 2022-06-28 + */ +@RestController +@RequestMapping("/system/info") +public class ScStationInfoController extends BaseController +{ + @Resource + private IScStationInfoService scStationInfoService; + + /** + * 查询列表 + */ + @PreAuthorize("@ss.hasPermi('system:info:list')") + @RequestMapping("/list") + public R list(@RequestParam Map params){ + return scStationInfoService.queryPage(params); + } + + /** + * 获取详细信息 + */ + @RequestMapping("/info/{id}") + @PreAuthorize("@ss.hasPermi('system:info:query')") + public R info(@PathVariable("id") Long id){ + ScStationInfo scStationInfo = scStationInfoService.getById(id); + + return R.ok().put("data", scStationInfo); + } + + + /** + * 导出列表 + */ + @PreAuthorize("@ss.hasPermi('system:info:export')") + @Log(title = "列表", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, ScStationInfo scStationInfo) + { + List list = scStationInfoService.list(); + ExcelUtil util = new ExcelUtil(ScStationInfo.class); + util.exportExcel(response, list, "列表数据"); + } + + /** + * 新增 + */ + @RequestMapping("/add") + @Log(title = "ScStationInfo", businessType = BusinessType.INSERT) + @PreAuthorize("@ss.hasPermi('system:info:add')") + public R add(@RequestBody ScStationInfo scStationInfo){ + scStationInfoService.save(scStationInfo); + return R.ok(); + } + + /** + * 修改 + */ + @RequestMapping("/edit") + @PreAuthorize("@ss.hasPermi('system:info:edit')") + @Log(title = "ScStationInfo", businessType = BusinessType.UPDATE) + public R edit(@RequestBody ScStationInfo scStationInfo){ + scStationInfoService.updateById(scStationInfo); + return R.ok(); + } + + /** + * 删除 + */ + @RequestMapping("/delete/{ids}") + @PreAuthorize("@ss.hasPermi('system:info:remove')") + @Log(title = "ScStationInfo", businessType = BusinessType.DELETE) + public R delete(@PathVariable Long[] ids){ + scStationInfoService.removeByIds(Arrays.asList(ids)); + return R.ok(); + } + +} diff --git a/ruoyi-code/src/main/java/com/ruoyi/code/sctaationinfo/domain/ScStationInfo.java b/ruoyi-code/src/main/java/com/ruoyi/code/sctaationinfo/domain/ScStationInfo.java new file mode 100644 index 0000000..0641975 --- /dev/null +++ b/ruoyi-code/src/main/java/com/ruoyi/code/sctaationinfo/domain/ScStationInfo.java @@ -0,0 +1,70 @@ +package com.ruoyi.code.sctaationinfo.domain; + +import java.math.BigDecimal; + +import com.baomidou.mybatisplus.annotation.*; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.ruoyi.common.annotation.Excel; +import java.io.Serializable; +import lombok.Data; + + +/** + * 水尺-测站信息对象 sc_station_info + * + * @author ruoyi + * @date 2022-06-28 + */ +@Data +@TableName("sc_station_info") +public class ScStationInfo implements Serializable +{ + private static final long serialVersionUID = 1L; + + /** 测站id */ + @TableId(type = IdType.INPUT) + private Long id; + + /** 测站名称 */ + private String stnm; + + /** 经度 */ + private BigDecimal longitude; + + /** 纬度 */ + private BigDecimal latitude; + + /** 测站状态: 0正常,1信道故障,5站点关闭 */ + private String status; + + /** 测站编码 */ + private String staid; + + /** 河流 */ + private String rvnm; + + /** 水系 */ + private String hnnm; + + /** 流域 */ + private String bsnm; + + /** 站址 */ + private String stlc; + + /** 测站编码 */ + private String isState; + + /** 保证水位 */ + private BigDecimal bzsw; + + /** 摄像头编号 */ + @TableField(updateStrategy = FieldStrategy.IGNORED) + private String cameraSn; + + /** 删除标识0未删除,1已删除 */ + private String delFlag; + + +} diff --git a/ruoyi-code/src/main/java/com/ruoyi/code/sctaationinfo/mapper/ScStationInfoMapper.java b/ruoyi-code/src/main/java/com/ruoyi/code/sctaationinfo/mapper/ScStationInfoMapper.java new file mode 100644 index 0000000..ea9d312 --- /dev/null +++ b/ruoyi-code/src/main/java/com/ruoyi/code/sctaationinfo/mapper/ScStationInfoMapper.java @@ -0,0 +1,19 @@ +package com.ruoyi.code.sctaationinfo.mapper; + +import java.util.List; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ruoyi.code.camera.domain.Camera; +import com.ruoyi.code.sctaationinfo.domain.ScStationInfo; +import org.apache.ibatis.annotations.Mapper; + + +/** + * Mapper接口 + * + * @author ruoyi + * @date 2022-06-28 + */ +@Mapper +public interface ScStationInfoMapper extends BaseMapper +{ +} diff --git a/ruoyi-code/src/main/java/com/ruoyi/code/sctaationinfo/service/IScStationInfoService.java b/ruoyi-code/src/main/java/com/ruoyi/code/sctaationinfo/service/IScStationInfoService.java new file mode 100644 index 0000000..700593b --- /dev/null +++ b/ruoyi-code/src/main/java/com/ruoyi/code/sctaationinfo/service/IScStationInfoService.java @@ -0,0 +1,24 @@ +package com.ruoyi.code.sctaationinfo.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.code.camera.domain.Camera; +import com.ruoyi.code.sctaationinfo.domain.ScStationInfo; +import com.ruoyi.common.core.page.R; + +import java.util.List; +import java.util.Map; + +/** + * Service接口 + * + * @author ruoyi + * @date 2022-06-28 + */ +public interface IScStationInfoService extends IService +{ + /** + * 查询 + */ + R queryPage(Map params); + +} diff --git a/ruoyi-code/src/main/java/com/ruoyi/code/sctaationinfo/service/impl/ScStationInfoServiceImpl.java b/ruoyi-code/src/main/java/com/ruoyi/code/sctaationinfo/service/impl/ScStationInfoServiceImpl.java new file mode 100644 index 0000000..0c90105 --- /dev/null +++ b/ruoyi-code/src/main/java/com/ruoyi/code/sctaationinfo/service/impl/ScStationInfoServiceImpl.java @@ -0,0 +1,37 @@ +package com.ruoyi.code.sctaationinfo.service.impl; + +import java.util.List; +import java.util.Map; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.code.camera.domain.Camera; +import com.ruoyi.code.sctaationinfo.domain.ScStationInfo; +import com.ruoyi.code.sctaationinfo.mapper.ScStationInfoMapper; +import com.ruoyi.code.sctaationinfo.service.IScStationInfoService; +import com.ruoyi.common.core.page.R; +import com.ruoyi.common.utils.Query; +import org.springframework.stereotype.Service; + + +/** + * Service业务层处理 + * + * @author ruoyi + * @date 2022-06-28 + */ +@Service("scStationInfoService") +public class ScStationInfoServiceImpl extends ServiceImpl implements IScStationInfoService +{ + @Override + public R queryPage(Map params) { + IPage page = this.page( + new Query().getPage(params), + new QueryWrapper() + ); + + return R.ok().put("count", page.getTotal()).put("data", page.getRecords()); + } + + +} diff --git a/ruoyi-code/src/main/resources/mapper/camera/CameraMapper.xml b/ruoyi-code/src/main/resources/mapper/camera/CameraMapper.xml index c38d671..77da428 100644 --- a/ruoyi-code/src/main/resources/mapper/camera/CameraMapper.xml +++ b/ruoyi-code/src/main/resources/mapper/camera/CameraMapper.xml @@ -9,4 +9,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" select camera_sn from sc_station_info ) + + diff --git a/ruoyi-code/src/main/resources/mapper/scStationInfo/ScStationInfoMapper.xml b/ruoyi-code/src/main/resources/mapper/scStationInfo/ScStationInfoMapper.xml new file mode 100644 index 0000000..3705467 --- /dev/null +++ b/ruoyi-code/src/main/resources/mapper/scStationInfo/ScStationInfoMapper.xml @@ -0,0 +1,7 @@ + + + + + From 95a1b587e12cac370b70d8f7568a04bc02c95b48 Mon Sep 17 00:00:00 2001 From: 4670101279 Date: Thu, 30 Jun 2022 10:52:07 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=BC=80=E5=8F=91?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 8 +- ruoyi-admin/pom.xml | 7 +- .../src/main/resources/application.yml | 1 + ruoyi-api/pom.xml | 32 + .../api/app/StationDataApiController.java | 38 + .../com/ruoyi/api/app/TestApiController.java | 19 + .../ruoyi/api/app/WaterDataApiController.java | 37 + .../api/controller/AbstractApiController.java | 43 ++ .../api/controller/YhAppApiController.java | 107 +++ .../controller/YhAppInfoApiController.java | 82 +++ .../api/controller/YhAppInfoController.java | 109 +++ .../com/ruoyi/api/domain/YhAppApiEntity.java | 50 ++ .../ruoyi/api/domain/YhAppInfoApiEntity.java | 33 + .../com/ruoyi/api/domain/YhAppInfoEntity.java | 66 ++ .../ruoyi/api/domain/YhAppInfoStnmEntity.java | 32 + .../java/com/ruoyi/api/dto/MarketAuthDto.java | 15 + .../java/com/ruoyi/api/dto/StationData.java | 35 + .../com/ruoyi/api/mapper/YhAppApiMapper.java | 18 + .../ruoyi/api/mapper/YhAppInfoApiMapper.java | 14 + .../com/ruoyi/api/mapper/YhAppInfoMapper.java | 14 + .../ruoyi/api/mapper/YhAppInfoStnmMapper.java | 14 + .../java/com/ruoyi/api/params/SignParams.java | 19 + .../ruoyi/api/params/StationDataParams.java | 12 + .../com/ruoyi/api/params/WaterDataParams.java | 18 + .../com/ruoyi/api/service/CommonService.java | 116 +++ .../api/service/StationDataApiService.java | 49 ++ .../ruoyi/api/service/YhAppApiService.java | 20 + .../api/service/YhAppInfoApiService.java | 19 + .../ruoyi/api/service/YhAppInfoService.java | 17 + .../api/service/YhAppInfoStnmService.java | 17 + .../api/service/impl/YhAppApiServiceImpl.java | 35 + .../service/impl/YhAppInfoApiServiceImpl.java | 42 ++ .../service/impl/YhAppInfoServiceImpl.java | 29 + .../impl/YhAppInfoStnmServiceImpl.java | 29 + .../com/ruoyi/api/util/HttpServletUtil.java | 38 + .../resources/mapper/api/YhAppApiMapper.xml | 15 + .../mapper/api/YhAppInfoApiMapper.xml | 7 + .../resources/mapper/api/YhAppInfoMapper.xml | 7 + .../code/camera/controller/ApiController.java | 51 ++ .../camera/controller/CameraController.java | 23 +- .../code/camera/scheduled/RegisterServer.java | 12 +- .../sctaationinfo/domain/ScStationInfo.java | 2 + .../mapper/ScStationInfoMapper.java | 8 +- .../impl/ScStationInfoServiceImpl.java | 4 +- .../src/main/java/utils/RegisterUtil.java | 13 +- .../scStationInfo/ScStationInfoMapper.xml | 12 + ruoyi-common/pom.xml | 6 + .../ruoyi/common/utils/ClassReflection.java | 36 + .../java/com/ruoyi/common/utils/sm3/SM3.java | 359 ++++++++++ .../com/ruoyi/common/utils/sm3/SM3Digest.java | 134 ++++ .../com/ruoyi/common/utils/sm3/SM3Utils.java | 23 + .../java/com/ruoyi/common/utils/sm3/SM4.java | 344 +++++++++ .../com/ruoyi/common/utils/sm3/SM4Utils.java | 187 +++++ .../ruoyi/common/utils/sm3/SM4_Context.java | 17 + .../java/com/ruoyi/common/utils/sm3/Util.java | 662 ++++++++++++++++++ .../common/validator/ValidatorUtils.java | 84 +++ .../framework/config/SecurityConfig.java | 3 +- 57 files changed, 3225 insertions(+), 18 deletions(-) create mode 100644 ruoyi-api/pom.xml create mode 100644 ruoyi-api/src/main/java/com/ruoyi/api/app/StationDataApiController.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/api/app/TestApiController.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/api/app/WaterDataApiController.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/api/controller/AbstractApiController.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/api/controller/YhAppApiController.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/api/controller/YhAppInfoApiController.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/api/controller/YhAppInfoController.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/api/domain/YhAppApiEntity.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/api/domain/YhAppInfoApiEntity.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/api/domain/YhAppInfoEntity.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/api/domain/YhAppInfoStnmEntity.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/api/dto/MarketAuthDto.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/api/dto/StationData.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/api/mapper/YhAppApiMapper.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/api/mapper/YhAppInfoApiMapper.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/api/mapper/YhAppInfoMapper.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/api/mapper/YhAppInfoStnmMapper.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/api/params/SignParams.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/api/params/StationDataParams.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/api/params/WaterDataParams.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/api/service/CommonService.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/api/service/StationDataApiService.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/api/service/YhAppApiService.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/api/service/YhAppInfoApiService.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/api/service/YhAppInfoService.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/api/service/YhAppInfoStnmService.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/api/service/impl/YhAppApiServiceImpl.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/api/service/impl/YhAppInfoApiServiceImpl.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/api/service/impl/YhAppInfoServiceImpl.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/api/service/impl/YhAppInfoStnmServiceImpl.java create mode 100644 ruoyi-api/src/main/java/com/ruoyi/api/util/HttpServletUtil.java create mode 100644 ruoyi-api/src/main/resources/mapper/api/YhAppApiMapper.xml create mode 100644 ruoyi-api/src/main/resources/mapper/api/YhAppInfoApiMapper.xml create mode 100644 ruoyi-api/src/main/resources/mapper/api/YhAppInfoMapper.xml create mode 100644 ruoyi-code/src/main/java/com/ruoyi/code/camera/controller/ApiController.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/ClassReflection.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/sm3/SM3.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/sm3/SM3Digest.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/sm3/SM3Utils.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/sm3/SM4.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/sm3/SM4Utils.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/sm3/SM4_Context.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/sm3/Util.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/validator/ValidatorUtils.java diff --git a/pom.xml b/pom.xml index 75d7753..bf97bea 100644 --- a/pom.xml +++ b/pom.xml @@ -186,12 +186,17 @@ ${ruoyi.version} - com.ruoyi ruoyi-code ${ruoyi.version} + + + com.ruoyi + ruoyi-api + ${ruoyi.version} + @@ -203,6 +208,7 @@ ruoyi-generator ruoyi-common ruoyi-code + ruoyi-api pom diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml index aa1da91..144df4e 100644 --- a/ruoyi-admin/pom.xml +++ b/ruoyi-admin/pom.xml @@ -61,12 +61,17 @@ ruoyi-generator - com.ruoyi ruoyi-code + + com.ruoyi + ruoyi-api + + + diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index 0b23548..9909e76 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -135,3 +135,4 @@ xss: # port: 8020 # username: admin # password: admin123 +serverip: 172.16.46.58 diff --git a/ruoyi-api/pom.xml b/ruoyi-api/pom.xml new file mode 100644 index 0000000..3a07168 --- /dev/null +++ b/ruoyi-api/pom.xml @@ -0,0 +1,32 @@ + + + + ruoyi + com.ruoyi + 3.8.1 + + 4.0.0 + + ruoyi-api + + + ruoyi-api + + + + + + + com.ruoyi + ruoyi-common + + + + com.ruoyi + ruoyi-code + + + + diff --git a/ruoyi-api/src/main/java/com/ruoyi/api/app/StationDataApiController.java b/ruoyi-api/src/main/java/com/ruoyi/api/app/StationDataApiController.java new file mode 100644 index 0000000..188d2c9 --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/api/app/StationDataApiController.java @@ -0,0 +1,38 @@ +package com.ruoyi.api.app; + +import com.ruoyi.api.controller.AbstractApiController; +import com.ruoyi.api.params.StationDataParams; +import com.ruoyi.api.service.StationDataApiService; +import com.ruoyi.common.core.page.R; +import com.ruoyi.common.validator.ValidatorUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; + + +/** + * 系统对外接口-检测信息 + */ +@RestController +@RequestMapping("/api") +@Slf4j +public class StationDataApiController extends AbstractApiController { + + @Resource + private StationDataApiService stationDataApiService; + + /** + * 测站数据查询 + */ + @PostMapping("v1/station_data/query") + public R query(@RequestBody StationDataParams params) { + log.info("[测站数据查询接口查询参数为{}]", params); + ValidatorUtils.validateV2(params); + return stationDataApiService.query(params,getMarketAuthDto()); + } + +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/api/app/TestApiController.java b/ruoyi-api/src/main/java/com/ruoyi/api/app/TestApiController.java new file mode 100644 index 0000000..c199c3a --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/api/app/TestApiController.java @@ -0,0 +1,19 @@ +package com.ruoyi.api.app; + +import com.ruoyi.common.core.page.R; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + + +@RestController +@RequestMapping("/api") +public class TestApiController { + + @PostMapping("/test") + public R query() { + return R.ok(); + } + +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/api/app/WaterDataApiController.java b/ruoyi-api/src/main/java/com/ruoyi/api/app/WaterDataApiController.java new file mode 100644 index 0000000..8232188 --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/api/app/WaterDataApiController.java @@ -0,0 +1,37 @@ +package com.ruoyi.api.app; + +import com.ruoyi.api.controller.AbstractApiController; +import com.ruoyi.api.params.WaterDataParams; +import com.ruoyi.common.core.page.R; +import com.ruoyi.common.validator.ValidatorUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + + +/** + * 系统对外接口-检测信息 + */ +@RestController +@RequestMapping("/api") +@Slf4j +public class WaterDataApiController extends AbstractApiController { + + + /** + * 水位数据查询 + * + * @param params + * @return + */ + @PostMapping("v1/water_data/query") + public R query(@RequestBody WaterDataParams params) { + log.info("[水位数据查询接口查询参数为{}]", params); + ValidatorUtils.validateV2(params); + System.out.println(params); + return R.ok(); + } + +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/api/controller/AbstractApiController.java b/ruoyi-api/src/main/java/com/ruoyi/api/controller/AbstractApiController.java new file mode 100644 index 0000000..b72de75 --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/api/controller/AbstractApiController.java @@ -0,0 +1,43 @@ +package com.ruoyi.api.controller; + +import com.ruoyi.api.domain.YhAppInfoEntity; +import com.ruoyi.api.dto.MarketAuthDto; +import com.ruoyi.api.params.SignParams; +import com.ruoyi.api.service.CommonService; +import com.ruoyi.api.util.HttpServletUtil; +import com.ruoyi.common.validator.ValidatorUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.RequestHeader; + +import javax.annotation.Resource; + +/** + * ApiController公共组件 + */ +@Slf4j +public abstract class AbstractApiController { + + @Resource + private CommonService commonService; + + @ModelAttribute + public void init(@RequestHeader(value = "appid", required = false) String appid, + @RequestHeader(value = "timemillis", required = false) String timemillis, + @RequestHeader(value = "digest", required = false) String digest) { + SignParams signParams = new SignParams(); + signParams.setAppid(appid); + signParams.setTimemillis(timemillis); + signParams.setDigest(digest); + log.info("[api接收到的验证数据为{}]", signParams); + ValidatorUtils.validateV2(signParams); + YhAppInfoEntity appInfo = commonService.checkDigest(signParams); + HttpServletUtil.setAppInfo(appInfo); + commonService.authPermission(appInfo); + } + + protected MarketAuthDto getMarketAuthDto() { + return commonService.getMarketAuthDto(HttpServletUtil.getAppInfo()); + } + +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/api/controller/YhAppApiController.java b/ruoyi-api/src/main/java/com/ruoyi/api/controller/YhAppApiController.java new file mode 100644 index 0000000..a4d2ca1 --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/api/controller/YhAppApiController.java @@ -0,0 +1,107 @@ +package com.ruoyi.api.controller; + +import com.ruoyi.api.domain.YhAppApiEntity; +import com.ruoyi.api.domain.YhAppInfoApiEntity; +import com.ruoyi.api.service.YhAppApiService; +import com.ruoyi.api.service.YhAppInfoApiService; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ruoyi.common.core.page.R; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + + +/** + * 对外接口表 + * + */ +@RestController +@RequestMapping("yhappapi") +public class YhAppApiController { + @Autowired + private YhAppApiService yhAppApiService; + @Autowired + private YhAppInfoApiService yhAppInfoApiService; + + /** + * 全部列表 + * @return + */ + @RequestMapping("/allList") + //@RequiresPermissions("app:yhappapi:list") + public List allList(@RequestParam Map params){ + QueryWrapper qw = new QueryWrapper<>(); + String appInfoId = (String) params.get("appInfoId"); + if (StringUtils.isNotBlank(appInfoId)) { + List apiIdList = yhAppInfoApiService.list( + new QueryWrapper().eq("app_info_id", appInfoId) + ).stream().map(YhAppInfoApiEntity::getAppApiId).collect(Collectors.toList()); + if (apiIdList.isEmpty()) { + apiIdList.add(-1L); + } + qw.in("id", apiIdList); + } + List list = yhAppApiService.list(qw); + return list; + } + + /** + * 列表 + */ + @RequestMapping("/list") + //@RequiresPermissions("app:yhappapi:list") + public R list(@RequestParam Map params){ + + return yhAppApiService.queryPage(params); + } + + + /** + * 信息 + */ + @RequestMapping("/info/{id}") + //@RequiresPermissions("app:yhappapi:info") + public R info(@PathVariable("id") Long id){ + YhAppApiEntity yhAppApi = yhAppApiService.getById(id); + + return R.ok().put("yhAppApi", yhAppApi); + } + + /** + * 保存 + */ + @RequestMapping("/save") + //@RequiresPermissions("app:yhappapi:save") + public R save(@RequestBody YhAppApiEntity yhAppApi){ + yhAppApiService.save(yhAppApi); + + return R.ok(); + } + + /** + * 修改 + */ + @RequestMapping("/update") + //@RequiresPermissions("app:yhappapi:update") + public R update(@RequestBody YhAppApiEntity yhAppApi){ + yhAppApiService.updateById(yhAppApi); + + return R.ok(); + } + + /** + * 删除 + */ + @RequestMapping("/delete") + //@RequiresPermissions("app:yhappapi:delete") + public R delete(@RequestBody Long id){ + yhAppApiService.removeById(id); + + return R.ok(); + } + +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/api/controller/YhAppInfoApiController.java b/ruoyi-api/src/main/java/com/ruoyi/api/controller/YhAppInfoApiController.java new file mode 100644 index 0000000..89b8478 --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/api/controller/YhAppInfoApiController.java @@ -0,0 +1,82 @@ +package com.ruoyi.api.controller; + +import com.ruoyi.api.domain.YhAppInfoApiEntity; +import com.ruoyi.api.service.YhAppInfoApiService; +import com.ruoyi.common.core.page.R; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Arrays; +import java.util.Map; + + + +/** + * app应用-接口关联表 + * + */ +@RestController +@RequestMapping("yhappinfoapi") +public class YhAppInfoApiController { + @Autowired + private YhAppInfoApiService yhAppInfoApiService; + + /** + * 列表 + */ + @RequestMapping("/list") + //@RequiresPermissions("app:yhappinfoapi:list") + public R list(@RequestParam Map params){ + return yhAppInfoApiService.queryPage(params); + } + + + /** + * 信息 + */ + @RequestMapping("/info/{id}") + //@RequiresPermissions("app:yhappinfoapi:info") + public R info(@PathVariable("id") Long id){ + YhAppInfoApiEntity yhAppInfoApi = yhAppInfoApiService.getById(id); + + return R.ok().put("yhAppInfoApi", yhAppInfoApi); + } + + /** + * 保存 + */ + @RequestMapping("/save") + //@RequiresPermissions("app:yhappinfoapi:save") + public R save(YhAppInfoApiEntity yhAppInfoApi){ + yhAppInfoApiService.save(yhAppInfoApi); + + return R.ok(); + } + + /** + * 修改 + */ + @RequestMapping("/update") + //@RequiresPermissions("app:yhappinfoapi:update") + public R update(YhAppInfoApiEntity yhAppInfoApi){ + yhAppInfoApiService.updateById(yhAppInfoApi); + + return R.ok(); + } + + /** + * 删除 + */ + @RequestMapping("/delete") + //@RequiresPermissions("app:yhappinfoapi:delete") + public R delete(String ids){ + String[] idsArr = ids.split(","); + yhAppInfoApiService.removeByIds(Arrays.asList(idsArr)); + + return R.ok(); + } + +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/api/controller/YhAppInfoController.java b/ruoyi-api/src/main/java/com/ruoyi/api/controller/YhAppInfoController.java new file mode 100644 index 0000000..9524ea1 --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/api/controller/YhAppInfoController.java @@ -0,0 +1,109 @@ +package com.ruoyi.api.controller; + +import com.ruoyi.api.domain.YhAppInfoEntity; +import com.ruoyi.api.service.YhAppInfoApiService; +import com.ruoyi.api.service.YhAppInfoService; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ruoyi.common.core.page.R; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; + + + +/** + * app基本信息表 + * + */ +@RestController +@RequestMapping("yhappinfo") +public class YhAppInfoController { + @Autowired + private YhAppInfoService yhAppInfoService; + @Autowired + private YhAppInfoApiService yhAppInfoApiService; + + /** + * 列表 + */ + @RequestMapping("/list") + //@RequiresPermissions("app:yhappinfo:list") + public R list(@RequestParam Map params){ + return yhAppInfoService.queryPage(params); + } + + /** + * 全部列表 + */ + @RequestMapping("/getAllList") + //@RequiresPermissions("app:yhappinfo:list") + public R getAllList(@RequestParam Map params){ + String note = (String) params.get("note"); + List list = yhAppInfoService.list( + new QueryWrapper().like(StringUtils.isNotBlank(note), "note", note) + ); + return R.ok().put("data", list); + } + + + /** + * 信息 + */ + @RequestMapping("/info/{id}") + //@RequiresPermissions("app:yhappinfo:info") + public R info(@PathVariable("id") Long id){ + YhAppInfoEntity yhAppInfo = yhAppInfoService.getById(id); + + return R.ok().put("yhAppInfo", yhAppInfo); + } + + /** + * 保存 + */ + @RequestMapping("/save") + //@RequiresPermissions("app:yhappinfo:save") + public R save(@RequestBody YhAppInfoEntity yhAppInfo){ + yhAppInfoService.save(yhAppInfo); + //更新app对应的接口权限 + if (StringUtils.isNotBlank(yhAppInfo.getApiIdStr())) { + Long appInfoId = yhAppInfo.getId(); + String[] apiIdArr = yhAppInfo.getApiIdStr().split(","); + yhAppInfoApiService.updateAppInfoApi(appInfoId, apiIdArr); + } + + return R.ok(); + } + + /** + * 修改 + */ + @RequestMapping("/update") + //@RequiresPermissions("app:yhappinfo:update") + public R update(@RequestBody YhAppInfoEntity yhAppInfo){ + yhAppInfoService.updateById(yhAppInfo); + //更新app对应的接口权限 + if (StringUtils.isNotBlank(yhAppInfo.getApiIdStr())) { + Long appInfoId = yhAppInfo.getId(); + String[] apiIdArr = yhAppInfo.getApiIdStr().split(","); + yhAppInfoApiService.updateAppInfoApi(appInfoId, apiIdArr); + } + + return R.ok(); + } + + /** + * 删除 + */ + @RequestMapping("/delete") + //@RequiresPermissions("app:yhappinfo:delete") + public R delete(@RequestBody Long[] ids){ + yhAppInfoService.removeByIds(Arrays.asList(ids)); + + return R.ok(); + } + +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/api/domain/YhAppApiEntity.java b/ruoyi-api/src/main/java/com/ruoyi/api/domain/YhAppApiEntity.java new file mode 100644 index 0000000..400744d --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/api/domain/YhAppApiEntity.java @@ -0,0 +1,50 @@ +package com.ruoyi.api.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 对外接口表 + * + */ +@Data +@TableName("yh_app_api") +public class YhAppApiEntity implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 主键自增 + */ + @TableId(type = IdType.INPUT) + private Long id; + /** + * api请求路径 + */ + private String uri; + /** + * 名称 + */ + private String name; + /** + * 创建时间 + */ + private Date createTime; + /** + * 父级ID + */ + private Long parentId; + /** + * 类型 1:目录 2:接口 + */ + private String type; + /** + * 状态 0.正常 1.禁用 + */ + private String status; + +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/api/domain/YhAppInfoApiEntity.java b/ruoyi-api/src/main/java/com/ruoyi/api/domain/YhAppInfoApiEntity.java new file mode 100644 index 0000000..2b18ea1 --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/api/domain/YhAppInfoApiEntity.java @@ -0,0 +1,33 @@ +package com.ruoyi.api.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; + +/** + * app应用-接口关联表 + * + */ +@Data +@TableName("yh_app_info_api") +public class YhAppInfoApiEntity implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 主键自增 + */ + @TableId(type = IdType.INPUT) + private Long id; + /** + * yh_app_info外键 + */ + private Long appInfoId; + /** + * yh_app_api外键 + */ + private Long appApiId; + +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/api/domain/YhAppInfoEntity.java b/ruoyi-api/src/main/java/com/ruoyi/api/domain/YhAppInfoEntity.java new file mode 100644 index 0000000..052d089 --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/api/domain/YhAppInfoEntity.java @@ -0,0 +1,66 @@ +package com.ruoyi.api.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * app基本信息表 + * + */ +@Data +@TableName("yh_app_info") +public class YhAppInfoEntity implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 唯一标识 + */ + @TableId(type = IdType.INPUT) + private Long id; + /** + * yh_organization的id + */ + private Long yhOrgId; + /** + * 应用id + */ + private String appid; + /** + * 秘钥 + */ + private String appSecret; + /** + * 状态 0.正常 1.禁用 + */ + private String status; + /** + * 删除状态 0.正常 1.删除 + */ + @TableLogic + private String isDel; + /** + * 添加时间 + */ + private Date addtime; + /** + * 添加人 + */ + private Long adder; + /** + * 应用名称 + */ + private String appName; + /** + * 备注 + */ + private String note; + /** + * apiId列表,逗号分隔 + */ + @TableField(exist = false) + private String apiIdStr; + +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/api/domain/YhAppInfoStnmEntity.java b/ruoyi-api/src/main/java/com/ruoyi/api/domain/YhAppInfoStnmEntity.java new file mode 100644 index 0000000..46e6f7b --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/api/domain/YhAppInfoStnmEntity.java @@ -0,0 +1,32 @@ +package com.ruoyi.api.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; + +/** + * app应用-市场关联表 + * + */ +@Data +@TableName("yh_app_info_stnm") +public class YhAppInfoStnmEntity implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 主键自增 + */ + @TableId + private Long id; + /** + * yh_app_info外键 + */ + private Long appInfoId; + /** + * 站点id + */ + private Long stnmId; + +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/api/dto/MarketAuthDto.java b/ruoyi-api/src/main/java/com/ruoyi/api/dto/MarketAuthDto.java new file mode 100644 index 0000000..be0a34e --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/api/dto/MarketAuthDto.java @@ -0,0 +1,15 @@ +package com.ruoyi.api.dto; + +import lombok.Data; + +import java.util.Set; + +@Data +public class MarketAuthDto { + + /** + * 可查看数据的设备列表 + */ + private Set queryList; + +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/api/dto/StationData.java b/ruoyi-api/src/main/java/com/ruoyi/api/dto/StationData.java new file mode 100644 index 0000000..f6c4f25 --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/api/dto/StationData.java @@ -0,0 +1,35 @@ +package com.ruoyi.api.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +public class StationData implements Serializable +{ + private static final long serialVersionUID = 1L; + + private Long id; + + /** 测站名称 */ + private String stnm; + + /** 经度 */ + private BigDecimal longitude; + + /** 纬度 */ + private BigDecimal latitude; + + /** 河流 */ + private String rvnm; + + /** 水系 */ + private String hnnm; + + /** 流域 */ + private String bsnm; + + /** 站址 */ + private String stlc; +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/api/mapper/YhAppApiMapper.java b/ruoyi-api/src/main/java/com/ruoyi/api/mapper/YhAppApiMapper.java new file mode 100644 index 0000000..2ef809a --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/api/mapper/YhAppApiMapper.java @@ -0,0 +1,18 @@ +package com.ruoyi.api.mapper; + +import com.ruoyi.api.domain.YhAppApiEntity; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 对外接口表 + * + */ +@Mapper +public interface YhAppApiMapper extends BaseMapper { + + List getListByAppid(@Param("appid") String appid); +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/api/mapper/YhAppInfoApiMapper.java b/ruoyi-api/src/main/java/com/ruoyi/api/mapper/YhAppInfoApiMapper.java new file mode 100644 index 0000000..c19f01b --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/api/mapper/YhAppInfoApiMapper.java @@ -0,0 +1,14 @@ +package com.ruoyi.api.mapper; + +import com.ruoyi.api.domain.YhAppInfoApiEntity; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * app应用-接口关联表 + * + */ +@Mapper +public interface YhAppInfoApiMapper extends BaseMapper { + +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/api/mapper/YhAppInfoMapper.java b/ruoyi-api/src/main/java/com/ruoyi/api/mapper/YhAppInfoMapper.java new file mode 100644 index 0000000..d2f72b9 --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/api/mapper/YhAppInfoMapper.java @@ -0,0 +1,14 @@ +package com.ruoyi.api.mapper; + +import com.ruoyi.api.domain.YhAppInfoEntity; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * app基本信息表 + * + */ +@Mapper +public interface YhAppInfoMapper extends BaseMapper { + +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/api/mapper/YhAppInfoStnmMapper.java b/ruoyi-api/src/main/java/com/ruoyi/api/mapper/YhAppInfoStnmMapper.java new file mode 100644 index 0000000..c0ba508 --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/api/mapper/YhAppInfoStnmMapper.java @@ -0,0 +1,14 @@ +package com.ruoyi.api.mapper; + +import com.ruoyi.api.domain.YhAppInfoStnmEntity; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * app应用-测站关联表 + * + */ +@Mapper +public interface YhAppInfoStnmMapper extends BaseMapper { + +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/api/params/SignParams.java b/ruoyi-api/src/main/java/com/ruoyi/api/params/SignParams.java new file mode 100644 index 0000000..45f3f40 --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/api/params/SignParams.java @@ -0,0 +1,19 @@ +package com.ruoyi.api.params; + +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; + +@Data +public class SignParams { + + @NotBlank(message = "appid不能为空") + private String appid; + @NotBlank(message = "timemillis不能为空") + @Length(min = 13, max = 13, message = "请传13位时间戳") + private String timemillis; + @NotBlank(message = "digest不能为空") + private String digest; + +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/api/params/StationDataParams.java b/ruoyi-api/src/main/java/com/ruoyi/api/params/StationDataParams.java new file mode 100644 index 0000000..94bb153 --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/api/params/StationDataParams.java @@ -0,0 +1,12 @@ +package com.ruoyi.api.params; + +import lombok.Data; + +@Data +public class StationDataParams { + + private Long id; + + private String stnm; + +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/api/params/WaterDataParams.java b/ruoyi-api/src/main/java/com/ruoyi/api/params/WaterDataParams.java new file mode 100644 index 0000000..6521ce5 --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/api/params/WaterDataParams.java @@ -0,0 +1,18 @@ +package com.ruoyi.api.params; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.math.BigDecimal; + +@Data +public class WaterDataParams { + + private Long stnmId; + + @NotBlank(message = "开始时间不能为空") + private String startTime; + + @NotBlank(message = "结束时间不能为空") + private String endTime; +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/api/service/CommonService.java b/ruoyi-api/src/main/java/com/ruoyi/api/service/CommonService.java new file mode 100644 index 0000000..6335025 --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/api/service/CommonService.java @@ -0,0 +1,116 @@ +package com.ruoyi.api.service; + +import com.ruoyi.api.domain.YhAppApiEntity; +import com.ruoyi.api.domain.YhAppInfoEntity; +import com.ruoyi.api.domain.YhAppInfoStnmEntity; +import com.ruoyi.api.dto.MarketAuthDto; +import com.ruoyi.api.params.SignParams; +import com.ruoyi.api.util.HttpServletUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ruoyi.common.exception.RYException; +import com.ruoyi.common.utils.sm3.SM3Utils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +@Service +public class CommonService { + + @Resource + private YhAppInfoService yhAppInfoService; + @Resource + private YhAppApiService yhAppApiService; + @Resource + private YhAppInfoStnmService yhAppInfoStnmService; + + + /** + * 验证签名 + * + * @param signParams + * @return appInfo对象 + */ + public YhAppInfoEntity checkDigest(SignParams signParams) { + String appid = signParams.getAppid(); + String timemillis = signParams.getTimemillis(); + String digest = signParams.getDigest(); + //5分钟内访问有效,1000为1秒 + Date now = new Date(); + long diff = now.getTime() - (new Long(timemillis)); + if (diff > (1000 * 60 * 5)) { + throw new RYException("请求已经过期,请在5分钟内发起请求", 12); + } + //通过appid进行查询数据库表yh_app_info查出appSecret再进行加密 + YhAppInfoEntity yhAppInfoEntity = yhAppInfoService.getOne( + new QueryWrapper().eq("appid", appid) + ); + if (yhAppInfoEntity == null) { + throw new RYException("身份认证失败,无此appid的身份信息", 10); + } + String userStatus = yhAppInfoEntity.getStatus(); + String appSecret = yhAppInfoEntity.getAppSecret(); + if ("1".equals(userStatus)) { + throw new RYException("此appid的身份信息存在异常,已被禁用", 12); + } + if (StringUtils.isEmpty(appSecret)) { + throw new RYException("此appid的身份无秘钥,请联系管理员确认", 12); + } + //进行加密,验签 + // String sign=MD5.MD5_16bit(appid + appSecret + timemillis); + String sign = SM3Utils.encode(appid + appSecret + timemillis); + System.out.println(sign); + if (!digest.equals(sign)) { + throw new RYException("签名验证出错!", 11); + } + return yhAppInfoEntity; + } + + /** + * 验证应用的接口权限 + * + * @param appInfo + */ + public void authPermission(YhAppInfoEntity appInfo) { + String appid = appInfo.getAppid(); + String uri = HttpServletUtil.getRequest().getServletPath(); + List apiList = yhAppApiService.getListByAppid(appid); + for (YhAppApiEntity yhAppApiEntity : apiList) { + if (uri.equals(yhAppApiEntity.getUri()) && "0".equals(yhAppApiEntity.getStatus())) { + return; + } + } + throw new RYException("无此接口权限", 12); + } + + /** + * 获取应用可访问的市场ID列表 + * + * @param yhAppInfoEntity + * @return + */ + public MarketAuthDto getMarketAuthDto(YhAppInfoEntity yhAppInfoEntity) { + MarketAuthDto marketAuthDto = new MarketAuthDto(); + //填充该用户可访问的测炸列表 + + Set marketListSpecial = new HashSet<>(); + List appStnmList = yhAppInfoStnmService.list( + new QueryWrapper().eq("app_info_id", yhAppInfoEntity.getId()) + ); + if (!appStnmList.isEmpty()) { + marketListSpecial = appStnmList.stream() + .map(YhAppInfoStnmEntity::getStnmId) + .collect(Collectors.toSet()); + } else { + marketListSpecial.add(-1L); + } + marketAuthDto.setQueryList(marketListSpecial); + return marketAuthDto; + } + +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/api/service/StationDataApiService.java b/ruoyi-api/src/main/java/com/ruoyi/api/service/StationDataApiService.java new file mode 100644 index 0000000..86f658b --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/api/service/StationDataApiService.java @@ -0,0 +1,49 @@ +package com.ruoyi.api.service; + +import com.ruoyi.api.dto.MarketAuthDto; +import com.ruoyi.api.dto.StationData; +import com.ruoyi.api.params.StationDataParams; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ruoyi.code.sctaationinfo.domain.ScStationInfo; +import com.ruoyi.code.sctaationinfo.service.IScStationInfoService; +import com.ruoyi.common.core.page.R; +import com.ruoyi.common.utils.ClassReflection; +import com.ruoyi.common.utils.StringUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; + +@Service +public class StationDataApiService { + + @Resource + private IScStationInfoService scStationInfoService; + + public R query(StationDataParams params, MarketAuthDto marketAuthDto) { + Long id = params.getId(); + String stnm = params.getStnm(); + + List list = scStationInfoService.list( + new QueryWrapper() + .in("id", marketAuthDto.getQueryList()) + .eq(id != null, "id", id) + .like(StringUtils.isNotBlank(stnm),"stnm", stnm) + ); + List data = new ArrayList<>(); + StationData ss; + try { + for (ScStationInfo scStationInfo : list) { + ss = new StationData(); + ClassReflection.reflectionAttr(scStationInfo,ss); + data.add(ss); + } + } catch (Exception ignored) { + + } + + return R.ok().put("data", data); + } + +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/api/service/YhAppApiService.java b/ruoyi-api/src/main/java/com/ruoyi/api/service/YhAppApiService.java new file mode 100644 index 0000000..1989769 --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/api/service/YhAppApiService.java @@ -0,0 +1,20 @@ +package com.ruoyi.api.service; + +import com.ruoyi.api.domain.YhAppApiEntity; +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.common.core.page.R; + +import java.util.List; +import java.util.Map; + +/** + * 对外接口表 + * + */ +public interface YhAppApiService extends IService { + + R queryPage(Map params); + + List getListByAppid(String appid); +} + diff --git a/ruoyi-api/src/main/java/com/ruoyi/api/service/YhAppInfoApiService.java b/ruoyi-api/src/main/java/com/ruoyi/api/service/YhAppInfoApiService.java new file mode 100644 index 0000000..899e6a1 --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/api/service/YhAppInfoApiService.java @@ -0,0 +1,19 @@ +package com.ruoyi.api.service; + +import com.ruoyi.api.domain.YhAppInfoApiEntity; +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.common.core.page.R; + +import java.util.Map; + +/** + * app应用-接口关联表 + * + */ +public interface YhAppInfoApiService extends IService { + + R queryPage(Map params); + + void updateAppInfoApi(Long appInfoId, String[] apiIdArr); +} + diff --git a/ruoyi-api/src/main/java/com/ruoyi/api/service/YhAppInfoService.java b/ruoyi-api/src/main/java/com/ruoyi/api/service/YhAppInfoService.java new file mode 100644 index 0000000..f19394f --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/api/service/YhAppInfoService.java @@ -0,0 +1,17 @@ +package com.ruoyi.api.service; + +import com.ruoyi.api.domain.YhAppInfoEntity; +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.common.core.page.R; + +import java.util.Map; + +/** + * app基本信息表 + * + */ +public interface YhAppInfoService extends IService { + + R queryPage(Map params); +} + diff --git a/ruoyi-api/src/main/java/com/ruoyi/api/service/YhAppInfoStnmService.java b/ruoyi-api/src/main/java/com/ruoyi/api/service/YhAppInfoStnmService.java new file mode 100644 index 0000000..251563e --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/api/service/YhAppInfoStnmService.java @@ -0,0 +1,17 @@ +package com.ruoyi.api.service; + +import com.ruoyi.api.domain.YhAppInfoStnmEntity; +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.common.core.page.R; + +import java.util.Map; + +/** + * app应用-市场关联表 + * + */ +public interface YhAppInfoStnmService extends IService { + + R queryPage(Map params); +} + diff --git a/ruoyi-api/src/main/java/com/ruoyi/api/service/impl/YhAppApiServiceImpl.java b/ruoyi-api/src/main/java/com/ruoyi/api/service/impl/YhAppApiServiceImpl.java new file mode 100644 index 0000000..f11e6ac --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/api/service/impl/YhAppApiServiceImpl.java @@ -0,0 +1,35 @@ +package com.ruoyi.api.service.impl; + +import com.ruoyi.api.mapper.YhAppApiMapper; +import com.ruoyi.api.domain.YhAppApiEntity; +import com.ruoyi.api.service.YhAppApiService; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.common.core.page.R; +import com.ruoyi.common.utils.Query; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + + +@Service("yhAppApiService") +public class YhAppApiServiceImpl extends ServiceImpl implements YhAppApiService { + + @Override + public R queryPage(Map params) { + IPage page = this.page( + new Query().getPage(params), + new QueryWrapper() + ); + + return R.ok().put("count", page.getTotal()).put("data", page.getRecords()); + } + + @Override + public List getListByAppid(String appid) { + return baseMapper.getListByAppid(appid); + } + +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/api/service/impl/YhAppInfoApiServiceImpl.java b/ruoyi-api/src/main/java/com/ruoyi/api/service/impl/YhAppInfoApiServiceImpl.java new file mode 100644 index 0000000..5f5aaef --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/api/service/impl/YhAppInfoApiServiceImpl.java @@ -0,0 +1,42 @@ +package com.ruoyi.api.service.impl; + +import com.ruoyi.api.mapper.YhAppInfoApiMapper; +import com.ruoyi.api.domain.YhAppInfoApiEntity; +import com.ruoyi.api.service.YhAppInfoApiService; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.common.core.page.R; +import com.ruoyi.common.utils.Query; +import org.springframework.stereotype.Service; + +import java.util.Map; + + +@Service("yhAppInfoApiService") +public class YhAppInfoApiServiceImpl extends ServiceImpl implements YhAppInfoApiService { + + @Override + public R queryPage(Map params) { + IPage page = this.page( + new Query().getPage(params), + new QueryWrapper() + ); + + return R.ok().put("count", page.getTotal()).put("data", page.getRecords()); + } + + @Override + public void updateAppInfoApi(Long appInfoId, String[] apiIdArr) { + //先删除旧的关系 + this.remove(new QueryWrapper().eq("app_info_id", appInfoId)); + //添加新的关系 + for (String apiId : apiIdArr) { + YhAppInfoApiEntity appInfoApiEntity = new YhAppInfoApiEntity(); + appInfoApiEntity.setAppInfoId(appInfoId); + appInfoApiEntity.setAppApiId(Long.valueOf(apiId)); + this.save(appInfoApiEntity); + } + } + +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/api/service/impl/YhAppInfoServiceImpl.java b/ruoyi-api/src/main/java/com/ruoyi/api/service/impl/YhAppInfoServiceImpl.java new file mode 100644 index 0000000..3a7889c --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/api/service/impl/YhAppInfoServiceImpl.java @@ -0,0 +1,29 @@ +package com.ruoyi.api.service.impl; + +import com.ruoyi.api.mapper.YhAppInfoMapper; +import com.ruoyi.api.domain.YhAppInfoEntity; +import com.ruoyi.api.service.YhAppInfoService; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.common.core.page.R; +import com.ruoyi.common.utils.Query; +import org.springframework.stereotype.Service; + +import java.util.Map; + + +@Service("yhAppInfoService") +public class YhAppInfoServiceImpl extends ServiceImpl implements YhAppInfoService { + + @Override + public R queryPage(Map params) { + IPage page = this.page( + new Query().getPage(params), + new QueryWrapper() + ); + + return R.ok().put("count", page.getTotal()).put("data", page.getRecords()); + } + +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/api/service/impl/YhAppInfoStnmServiceImpl.java b/ruoyi-api/src/main/java/com/ruoyi/api/service/impl/YhAppInfoStnmServiceImpl.java new file mode 100644 index 0000000..862d8b6 --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/api/service/impl/YhAppInfoStnmServiceImpl.java @@ -0,0 +1,29 @@ +package com.ruoyi.api.service.impl; + +import com.ruoyi.api.mapper.YhAppInfoStnmMapper; +import com.ruoyi.api.domain.YhAppInfoStnmEntity; +import com.ruoyi.api.service.YhAppInfoStnmService; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.common.core.page.R; +import com.ruoyi.common.utils.Query; +import org.springframework.stereotype.Service; + +import java.util.Map; + + +@Service("yhAppInfoStnmService") +public class YhAppInfoStnmServiceImpl extends ServiceImpl implements YhAppInfoStnmService { + + @Override + public R queryPage(Map params) { + IPage page = this.page( + new Query().getPage(params), + new QueryWrapper() + ); + + return R.ok().put("count", page.getTotal()).put("data", page.getRecords()); + } + +} diff --git a/ruoyi-api/src/main/java/com/ruoyi/api/util/HttpServletUtil.java b/ruoyi-api/src/main/java/com/ruoyi/api/util/HttpServletUtil.java new file mode 100644 index 0000000..001e3fc --- /dev/null +++ b/ruoyi-api/src/main/java/com/ruoyi/api/util/HttpServletUtil.java @@ -0,0 +1,38 @@ +package com.ruoyi.api.util; + +import com.ruoyi.api.domain.YhAppInfoEntity; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.http.HttpServletRequest; + +public class HttpServletUtil { + + public static HttpServletRequest getRequest() { + return ((ServletRequestAttributes) (RequestContextHolder.currentRequestAttributes())).getRequest(); + } + + public static void setRequestAttr(String attrName, Object value) { + getRequest().setAttribute(attrName, value); + } + + public static Object getRequestAttr(String attrName) { + return getRequest().getAttribute(attrName); + } + + public static void setAppInfo(YhAppInfoEntity appInfo) { + setRequestAttr("appInfo", appInfo); + } + + public static YhAppInfoEntity getAppInfo() { + return (YhAppInfoEntity) getRequestAttr("appInfo"); + } + + public static void setApiLogId(Long apiLogId) { + setRequestAttr("apiLogId", apiLogId); + } + + public static Long getApiLogId() { + return (Long) getRequestAttr("apiLogId"); + } +} diff --git a/ruoyi-api/src/main/resources/mapper/api/YhAppApiMapper.xml b/ruoyi-api/src/main/resources/mapper/api/YhAppApiMapper.xml new file mode 100644 index 0000000..1adfea0 --- /dev/null +++ b/ruoyi-api/src/main/resources/mapper/api/YhAppApiMapper.xml @@ -0,0 +1,15 @@ + + + + + + + + + diff --git a/ruoyi-api/src/main/resources/mapper/api/YhAppInfoApiMapper.xml b/ruoyi-api/src/main/resources/mapper/api/YhAppInfoApiMapper.xml new file mode 100644 index 0000000..71d1db9 --- /dev/null +++ b/ruoyi-api/src/main/resources/mapper/api/YhAppInfoApiMapper.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ruoyi-api/src/main/resources/mapper/api/YhAppInfoMapper.xml b/ruoyi-api/src/main/resources/mapper/api/YhAppInfoMapper.xml new file mode 100644 index 0000000..eaa401a --- /dev/null +++ b/ruoyi-api/src/main/resources/mapper/api/YhAppInfoMapper.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ruoyi-code/src/main/java/com/ruoyi/code/camera/controller/ApiController.java b/ruoyi-code/src/main/java/com/ruoyi/code/camera/controller/ApiController.java new file mode 100644 index 0000000..dcdc3ea --- /dev/null +++ b/ruoyi-code/src/main/java/com/ruoyi/code/camera/controller/ApiController.java @@ -0,0 +1,51 @@ +package com.ruoyi.code.camera.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ruoyi.code.camera.domain.Camera; +import com.ruoyi.code.camera.service.ICameraService; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.page.R; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.sun.jna.NativeLong; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; +import utils.CameraUtil; +import utils.RegisterUtil; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 摄像机Controller + * + * @author ruoyi + * @date 2022-06-21 + */ +@RestController +@RequestMapping("/api") +public class ApiController extends BaseController +{ + @Resource + private ICameraService cameraService; + + @RequestMapping("/camera/heart") + public R heart(@RequestParam Map params){ + String serialNo = (String)params.get("SerialNo"); + if(StringUtils.isNotBlank(serialNo)){ + Camera camera = cameraService.getOne(new QueryWrapper().eq("devsn",serialNo.trim())); + if(camera != null){ + camera.setUpdateTime(new Date()); + cameraService.updateById(camera); + } + } + return R.ok(); + } + +} diff --git a/ruoyi-code/src/main/java/com/ruoyi/code/camera/controller/CameraController.java b/ruoyi-code/src/main/java/com/ruoyi/code/camera/controller/CameraController.java index 7256a26..ce27cd1 100644 --- a/ruoyi-code/src/main/java/com/ruoyi/code/camera/controller/CameraController.java +++ b/ruoyi-code/src/main/java/com/ruoyi/code/camera/controller/CameraController.java @@ -4,11 +4,13 @@ import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.page.R; import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.IPUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.code.camera.domain.Camera; import com.ruoyi.code.camera.service.ICameraService; import com.sun.jna.NativeLong; +import org.springframework.beans.factory.annotation.Value; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; import utils.CameraUtil; @@ -33,6 +35,9 @@ public class CameraController extends BaseController @Resource private ICameraService cameraService; + @Value("${serverip}") + private String serverIp; + /** * 查询列表 */ @@ -125,12 +130,18 @@ public class CameraController extends BaseController @RequestMapping("showVideo/{id}") - public void showVideo(@PathVariable Long id){ - Camera c = cameraService.getById(id); - System.out.println("show loginID:"+c.getLoginId()); - RegisterUtil window = new RegisterUtil(); - window.m_frame.setVisible(true); - window.showVideo(new NativeLong(Long.parseLong(c.getLoginId()))); + public R showVideo(@PathVariable Long id){ + //解析ip地址,非服务器ip禁止打开视频 + String ip = IPUtils.getLocalIpAddress(); + if(serverIp.equals(ip)) { + Camera c = cameraService.getById(id); + System.out.println("show loginID:" + c.getLoginId()); + RegisterUtil window = new RegisterUtil(); + window.m_frame.setVisible(true); + window.showVideo(new NativeLong(Long.parseLong(c.getLoginId()))); + return R.ok(); + } + return R.error("请在服务器上查看视频"); } /** diff --git a/ruoyi-code/src/main/java/com/ruoyi/code/camera/scheduled/RegisterServer.java b/ruoyi-code/src/main/java/com/ruoyi/code/camera/scheduled/RegisterServer.java index 013b006..474738c 100644 --- a/ruoyi-code/src/main/java/com/ruoyi/code/camera/scheduled/RegisterServer.java +++ b/ruoyi-code/src/main/java/com/ruoyi/code/camera/scheduled/RegisterServer.java @@ -10,6 +10,7 @@ import com.ruoyi.common.utils.IPUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.stereotype.Component; @@ -26,6 +27,15 @@ import java.util.List; @Configuration @EnableScheduling public class RegisterServer { + private static String sercer_ip = ""; + + @Autowired + private Environment env; + + @PostConstruct + public void config() { + sercer_ip = env.getProperty("serverip"); + } @Autowired private ICameraService cameraService; @@ -36,7 +46,7 @@ public class RegisterServer { private void start(){ String ip = IPUtils.getLocalIpAddress(); - if("172.16.46.58".equals(ip)){ + if(sercer_ip.equals(ip)){ R result = cameraService.register(); if("0".equals(result.get("code").toString())){ System.out.println("主动注册服务已启动"); diff --git a/ruoyi-code/src/main/java/com/ruoyi/code/sctaationinfo/domain/ScStationInfo.java b/ruoyi-code/src/main/java/com/ruoyi/code/sctaationinfo/domain/ScStationInfo.java index 0641975..aff369b 100644 --- a/ruoyi-code/src/main/java/com/ruoyi/code/sctaationinfo/domain/ScStationInfo.java +++ b/ruoyi-code/src/main/java/com/ruoyi/code/sctaationinfo/domain/ScStationInfo.java @@ -66,5 +66,7 @@ public class ScStationInfo implements Serializable /** 删除标识0未删除,1已删除 */ private String delFlag; + @TableField(exist = false) + private String cameraName; } diff --git a/ruoyi-code/src/main/java/com/ruoyi/code/sctaationinfo/mapper/ScStationInfoMapper.java b/ruoyi-code/src/main/java/com/ruoyi/code/sctaationinfo/mapper/ScStationInfoMapper.java index ea9d312..553b71c 100644 --- a/ruoyi-code/src/main/java/com/ruoyi/code/sctaationinfo/mapper/ScStationInfoMapper.java +++ b/ruoyi-code/src/main/java/com/ruoyi/code/sctaationinfo/mapper/ScStationInfoMapper.java @@ -1,10 +1,13 @@ package com.ruoyi.code.sctaationinfo.mapper; -import java.util.List; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.ruoyi.code.camera.domain.Camera; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.code.sctaationinfo.domain.ScStationInfo; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.Map; /** @@ -16,4 +19,5 @@ import org.apache.ibatis.annotations.Mapper; @Mapper public interface ScStationInfoMapper extends BaseMapper { + IPage queryPage(Page page, @Param("params") Map params); } diff --git a/ruoyi-code/src/main/java/com/ruoyi/code/sctaationinfo/service/impl/ScStationInfoServiceImpl.java b/ruoyi-code/src/main/java/com/ruoyi/code/sctaationinfo/service/impl/ScStationInfoServiceImpl.java index 0c90105..7265504 100644 --- a/ruoyi-code/src/main/java/com/ruoyi/code/sctaationinfo/service/impl/ScStationInfoServiceImpl.java +++ b/ruoyi-code/src/main/java/com/ruoyi/code/sctaationinfo/service/impl/ScStationInfoServiceImpl.java @@ -25,9 +25,9 @@ public class ScStationInfoServiceImpl extends ServiceImpl params) { - IPage page = this.page( + IPage page = baseMapper.queryPage( new Query().getPage(params), - new QueryWrapper() + params ); return R.ok().put("count", page.getTotal()).put("data", page.getRecords()); diff --git a/ruoyi-code/src/main/java/utils/RegisterUtil.java b/ruoyi-code/src/main/java/utils/RegisterUtil.java index 827e0ea..64ebea1 100644 --- a/ruoyi-code/src/main/java/utils/RegisterUtil.java +++ b/ruoyi-code/src/main/java/utils/RegisterUtil.java @@ -29,10 +29,7 @@ import javax.annotation.PostConstruct; import javax.annotation.Resource; import javax.swing.*; import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; +import java.awt.event.*; import java.util.List; import java.util.*; @@ -150,6 +147,14 @@ public class RegisterUtil implements ActionListener { m_frame.setLocation(x, y); // m_frame.setBounds(100, 100, 1400, 1100); + m_frame.addWindowListener(new WindowAdapter() { + @Override + public void windowClosing(WindowEvent e) { + stopPlay(); + System.out.println("停止播放视频"); + } + }); + //按关闭按钮,隐藏页面 m_frame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); m_frame.getContentPane().setLayout(null); diff --git a/ruoyi-code/src/main/resources/mapper/scStationInfo/ScStationInfoMapper.xml b/ruoyi-code/src/main/resources/mapper/scStationInfo/ScStationInfoMapper.xml index 3705467..30e47c8 100644 --- a/ruoyi-code/src/main/resources/mapper/scStationInfo/ScStationInfoMapper.xml +++ b/ruoyi-code/src/main/resources/mapper/scStationInfo/ScStationInfoMapper.xml @@ -4,4 +4,16 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> + diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml index fd6e81a..e1306d6 100644 --- a/ruoyi-common/pom.xml +++ b/ruoyi-common/pom.xml @@ -143,6 +143,12 @@ jna 1.0 + + + org.bouncycastle + bcprov-jdk16 + 1.46 + diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/ClassReflection.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/ClassReflection.java new file mode 100644 index 0000000..15acf9d --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/ClassReflection.java @@ -0,0 +1,36 @@ +package com.ruoyi.common.utils; + +import java.lang.reflect.Field; + +public class ClassReflection { + + /** + * @param class1 from 用于赋值的实体类 + * @param class2 to 需要待赋值的实体类 + * 描述:反射实体类赋值 + */ + public static void reflectionAttr(Object class1, Object class2) throws Exception { + Class clazz1 = class1.getClass(); + Class clazz2 = class2.getClass(); + // 获取两个实体类的所有属性 + Field[] fields1 = clazz1.getDeclaredFields(); + Field[] fields2 = clazz2.getDeclaredFields(); + // 遍历class1Bean,获取逐个属性值,然后遍历class2Bean查找是否有相同的属性,如有相同则赋值 + for (Field f1 : fields1) { + if (f1.getName().equals("serialVersionUID")) + continue; + //设置访问权限 + f1.setAccessible(true); + Object value = f1.get(class1); + for (Field f2 : fields2) { + //字段名称相同、字段类型相同,进行赋值 + if (f1.getName().equals(f2.getName()) + && f1.getType().getName().equals(f2.getType().getName())) { + //设置访问权限 + f2.setAccessible(true); + f2.set(class2, value); + } + } + } + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/sm3/SM3.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/sm3/SM3.java new file mode 100644 index 0000000..23f9dcf --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/sm3/SM3.java @@ -0,0 +1,359 @@ +package com.ruoyi.common.utils.sm3; + + +public class SM3 +{ + /*public static final byte[] iv = { 0x2C, (byte) 0x91, (byte) 0xB4, 0x01, + (byte) 0xFC, 0x64, (byte) 0xB2, (byte) 0xCE, 0x7C, 0x4E, + (byte) 0xAE, (byte) 0xFB, (byte) 0xB1, 0x3B, (byte) 0xB6, + (byte) 0xD3, 0x17, 0x60, (byte) 0xB6, 0x35, (byte) 0xF3, 0x6F, + 0x13, (byte) 0xEB, (byte) 0xC8, 0x77, (byte) 0xE9, (byte) 0xA0, + (byte) 0xC2, 0x76, (byte) 0xA8, 0x17 };*/ + + public static final byte[] iv = { 0x73, (byte) 0x80, 0x16, 0x6f, 0x49, + 0x14, (byte) 0xb2, (byte) 0xb9, 0x17, 0x24, 0x42, (byte) 0xd7, + (byte) 0xda, (byte) 0x8a, 0x06, 0x00, (byte) 0xa9, 0x6f, 0x30, + (byte) 0xbc, (byte) 0x16, 0x31, 0x38, (byte) 0xaa, (byte) 0xe3, + (byte) 0x8d, (byte) 0xee, 0x4d, (byte) 0xb0, (byte) 0xfb, 0x0e, + 0x4e }; + + public static int[] Tj = new int[64]; + + static + { + for (int i = 0; i < 16; i++) + { + Tj[i] = 0x79cc4519; + } + + for (int i = 16; i < 64; i++) + { + Tj[i] = 0x7a879d8a; + } + } + + public static byte[] CF(byte[] V, byte[] B) + { + int[] v, b; + v = convert(V); + b = convert(B); + return convert(CF(v, b)); + } + + private static int[] convert(byte[] arr) + { + int[] out = new int[arr.length / 4]; + byte[] tmp = new byte[4]; + for (int i = 0; i < arr.length; i += 4) + { + System.arraycopy(arr, i, tmp, 0, 4); + out[i / 4] = bigEndianByteToInt(tmp); + } + return out; + } + + private static byte[] convert(int[] arr) + { + byte[] out = new byte[arr.length * 4]; + byte[] tmp = null; + for (int i = 0; i < arr.length; i++) + { + tmp = bigEndianIntToByte(arr[i]); + System.arraycopy(tmp, 0, out, i * 4, 4); + } + return out; + } + + public static int[] CF(int[] V, int[] B) + { + int a, b, c, d, e, f, g, h; + int ss1, ss2, tt1, tt2; + a = V[0]; + b = V[1]; + c = V[2]; + d = V[3]; + e = V[4]; + f = V[5]; + g = V[6]; + h = V[7]; + + /*System.out.println("IV: "); + System.out.print(Integer.toHexString(a)+" "); + System.out.print(Integer.toHexString(b)+" "); + System.out.print(Integer.toHexString(c)+" "); + System.out.print(Integer.toHexString(d)+" "); + System.out.print(Integer.toHexString(e)+" "); + System.out.print(Integer.toHexString(f)+" "); + System.out.print(Integer.toHexString(g)+" "); + System.out.print(Integer.toHexString(h)+" "); + System.out.println(""); + System.out.println(""); + + System.out.println("填充后的消息: "); + for(int i=0; i= 0 && j <= 15) + { + return FF1j(X, Y, Z); + } + else + { + return FF2j(X, Y, Z); + } + } + + private static int GGj(int X, int Y, int Z, int j) + { + if (j >= 0 && j <= 15) + { + return GG1j(X, Y, Z); + } + else + { + return GG2j(X, Y, Z); + } + } + + // 逻辑位运算函数 + private static int FF1j(int X, int Y, int Z) + { + int tmp = X ^ Y ^ Z; + return tmp; + } + + private static int FF2j(int X, int Y, int Z) + { + int tmp = ((X & Y) | (X & Z) | (Y & Z)); + return tmp; + } + + private static int GG1j(int X, int Y, int Z) + { + int tmp = X ^ Y ^ Z; + return tmp; + } + + private static int GG2j(int X, int Y, int Z) + { + int tmp = (X & Y) | (~X & Z); + return tmp; + } + + private static int P0(int X) + { + int y = rotateLeft(X, 9); + y = bitCycleLeft(X, 9); + int z = rotateLeft(X, 17); + z = bitCycleLeft(X, 17); + int t = X ^ y ^ z; + return t; + } + + private static int P1(int X) + { + int t = X ^ bitCycleLeft(X, 15) ^ bitCycleLeft(X, 23); + return t; + } + + /** + * 对最后一个分组字节数据padding + * + * @param in + * @param bLen + * 分组个数 + * @return + */ + public static byte[] padding(byte[] in, int bLen) + { + int k = 448 - (8 * in.length + 1) % 512; + if (k < 0) + { + k = 960 - (8 * in.length + 1) % 512; + } + k += 1; + byte[] padd = new byte[k / 8]; + padd[0] = (byte) 0x80; + long n = in.length * 8 + bLen * 512; + byte[] out = new byte[in.length + k / 8 + 64 / 8]; + int pos = 0; + System.arraycopy(in, 0, out, 0, in.length); + pos += in.length; + System.arraycopy(padd, 0, out, pos, padd.length); + pos += padd.length; + byte[] tmp = back(Util.longToBytes(n)); + System.arraycopy(tmp, 0, out, pos, tmp.length); + return out; + } + + /** + * 字节数组逆序 + * + * @param in + * @return + */ + private static byte[] back(byte[] in) + { + byte[] out = new byte[in.length]; + for (int i = 0; i < out.length; i++) + { + out[i] = in[out.length - i - 1]; + } + + return out; + } + + public static int rotateLeft(int x, int n) + { + return (x << n) | (x >> (32 - n)); + } + + private static int bitCycleLeft(int n, int bitLen) + { + bitLen %= 32; + byte[] tmp = bigEndianIntToByte(n); + int byteLen = bitLen / 8; + int len = bitLen % 8; + if (byteLen > 0) + { + tmp = byteCycleLeft(tmp, byteLen); + } + + if (len > 0) + { + tmp = bitSmall8CycleLeft(tmp, len); + } + + return bigEndianByteToInt(tmp); + } + + private static byte[] bitSmall8CycleLeft(byte[] in, int len) + { + byte[] tmp = new byte[in.length]; + int t1, t2, t3; + for (int i = 0; i < tmp.length; i++) + { + t1 = (byte) ((in[i] & 0x000000ff) << len); + t2 = (byte) ((in[(i + 1) % tmp.length] & 0x000000ff) >> (8 - len)); + t3 = (byte) (t1 | t2); + tmp[i] = (byte) t3; + } + + return tmp; + } + + private static byte[] byteCycleLeft(byte[] in, int byteLen) + { + byte[] tmp = new byte[in.length]; + System.arraycopy(in, byteLen, tmp, 0, in.length - byteLen); + System.arraycopy(in, 0, tmp, in.length - byteLen, byteLen); + return tmp; + } + + /*private static void print(int[] arr) + { + for (int i = 0; i < arr.length; i++) + { + System.out.print(Integer.toHexString(arr[i]) + " "); + if ((i + 1) % 16 == 0) + { + System.out.println(); + } + } + System.out.println(); + }*/ +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/sm3/SM3Digest.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/sm3/SM3Digest.java new file mode 100644 index 0000000..85453d2 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/sm3/SM3Digest.java @@ -0,0 +1,134 @@ +package com.ruoyi.common.utils.sm3; + +public class SM3Digest +{ + /** SM3值的长度 */ + private static final int BYTE_LENGTH = 32; + + /** SM3分组长度 */ + private static final int BLOCK_LENGTH = 64; + + /** 缓冲区长度 */ + private static final int BUFFER_LENGTH = BLOCK_LENGTH * 1; + + /** 缓冲区 */ + private byte[] xBuf = new byte[BUFFER_LENGTH]; + + /** 缓冲区偏移量 */ + private int xBufOff; + + /** 初始向量 */ + private byte[] V = SM3.iv.clone(); + + private int cntBlock = 0; + + public SM3Digest() { + } + + public SM3Digest(SM3Digest t) + { + System.arraycopy(t.xBuf, 0, this.xBuf, 0, t.xBuf.length); + this.xBufOff = t.xBufOff; + System.arraycopy(t.V, 0, this.V, 0, t.V.length); + } + + /** + * SM3结果输出 + * + * @param out 保存SM3结构的缓冲区 + * @param outOff 缓冲区偏移量 + * @return + */ + public int doFinal(byte[] out, int outOff) + { + byte[] tmp = doFinal(); + System.arraycopy(tmp, 0, out, 0, tmp.length); + return BYTE_LENGTH; + } + + public void reset() + { + xBufOff = 0; + cntBlock = 0; + V = SM3.iv.clone(); + } + + /** + * 明文输入 + * + * @param in + * 明文输入缓冲区 + * @param inOff + * 缓冲区偏移量 + * @param len + * 明文长度 + */ + public void update(byte[] in, int inOff, int len) + { + int partLen = BUFFER_LENGTH - xBufOff; + int inputLen = len; + int dPos = inOff; + if (partLen < inputLen) + { + System.arraycopy(in, dPos, xBuf, xBufOff, partLen); + inputLen -= partLen; + dPos += partLen; + doUpdate(); + while (inputLen > BUFFER_LENGTH) + { + System.arraycopy(in, dPos, xBuf, 0, BUFFER_LENGTH); + inputLen -= BUFFER_LENGTH; + dPos += BUFFER_LENGTH; + doUpdate(); + } + } + + System.arraycopy(in, dPos, xBuf, xBufOff, inputLen); + xBufOff += inputLen; + } + + private void doUpdate() + { + byte[] B = new byte[BLOCK_LENGTH]; + for (int i = 0; i < BUFFER_LENGTH; i += BLOCK_LENGTH) + { + System.arraycopy(xBuf, i, B, 0, B.length); + doHash(B); + } + xBufOff = 0; + } + + private void doHash(byte[] B) + { + byte[] tmp = SM3.CF(V, B); + System.arraycopy(tmp, 0, V, 0, V.length); + cntBlock++; + } + + private byte[] doFinal() + { + byte[] B = new byte[BLOCK_LENGTH]; + byte[] buffer = new byte[xBufOff]; + System.arraycopy(xBuf, 0, buffer, 0, buffer.length); + byte[] tmp = SM3.padding(buffer, cntBlock); + for (int i = 0; i < tmp.length; i += BLOCK_LENGTH) + { + System.arraycopy(tmp, i, B, 0, B.length); + doHash(B); + } + return V; + } + + public void update(byte in) + { + byte[] buffer = new byte[] { in }; + update(buffer, 0, 1); + } + + public int getDigestSize() + { + return BYTE_LENGTH; + } + + +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/sm3/SM3Utils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/sm3/SM3Utils.java new file mode 100644 index 0000000..76a3c3c --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/sm3/SM3Utils.java @@ -0,0 +1,23 @@ +package com.ruoyi.common.utils.sm3; + +import org.bouncycastle.util.encoders.Hex; + +import java.io.IOException; + +public class SM3Utils { + + public static void main(String[] args) throws IOException { + String plainText = "test" + "qawsedrftg" + "1656492199425"; + System.out.println(encode(plainText)); + } + + public static String encode(String plainText) { + byte[] md = new byte[32]; + byte[] msg1 = plainText.getBytes(); + SM3Digest sm3 = new SM3Digest(); + sm3.update(msg1, 0, msg1.length); + sm3.doFinal(md, 0); + String s = new String(Hex.encode(md)); + return s; + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/sm3/SM4.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/sm3/SM4.java new file mode 100644 index 0000000..b54efba --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/sm3/SM4.java @@ -0,0 +1,344 @@ +package com.ruoyi.common.utils.sm3; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; + +public class SM4 +{ + public static final int SM4_ENCRYPT = 1; + + public static final int SM4_DECRYPT = 0; + + private long GET_ULONG_BE(byte[] b, int i) + { + long n = (long)(b[i] & 0xff) << 24 | (long)((b[i + 1] & 0xff) << 16) | (long)((b[i + 2] & 0xff) << 8) | (long)(b[i + 3] & 0xff) & 0xffffffffL; + return n; + } + + private void PUT_ULONG_BE(long n, byte[] b, int i) + { + b[i] = (byte)(int)(0xFF & n >> 24); + b[i + 1] = (byte)(int)(0xFF & n >> 16); + b[i + 2] = (byte)(int)(0xFF & n >> 8); + b[i + 3] = (byte)(int)(0xFF & n); + } + + private long SHL(long x, int n) + { + return (x & 0xFFFFFFFF) << n; + } + + private long ROTL(long x, int n) + { + return SHL(x, n) | x >> (32 - n); + } + + private void SWAP(long[] sk, int i) + { + long t = sk[i]; + sk[i] = sk[(31 - i)]; + sk[(31 - i)] = t; + } + + public static final byte[] SboxTable = { (byte) 0xd6, (byte) 0x90, (byte) 0xe9, (byte) 0xfe, + (byte) 0xcc, (byte) 0xe1, 0x3d, (byte) 0xb7, 0x16, (byte) 0xb6, + 0x14, (byte) 0xc2, 0x28, (byte) 0xfb, 0x2c, 0x05, 0x2b, 0x67, + (byte) 0x9a, 0x76, 0x2a, (byte) 0xbe, 0x04, (byte) 0xc3, + (byte) 0xaa, 0x44, 0x13, 0x26, 0x49, (byte) 0x86, 0x06, + (byte) 0x99, (byte) 0x9c, 0x42, 0x50, (byte) 0xf4, (byte) 0x91, + (byte) 0xef, (byte) 0x98, 0x7a, 0x33, 0x54, 0x0b, 0x43, + (byte) 0xed, (byte) 0xcf, (byte) 0xac, 0x62, (byte) 0xe4, + (byte) 0xb3, 0x1c, (byte) 0xa9, (byte) 0xc9, 0x08, (byte) 0xe8, + (byte) 0x95, (byte) 0x80, (byte) 0xdf, (byte) 0x94, (byte) 0xfa, + 0x75, (byte) 0x8f, 0x3f, (byte) 0xa6, 0x47, 0x07, (byte) 0xa7, + (byte) 0xfc, (byte) 0xf3, 0x73, 0x17, (byte) 0xba, (byte) 0x83, + 0x59, 0x3c, 0x19, (byte) 0xe6, (byte) 0x85, 0x4f, (byte) 0xa8, + 0x68, 0x6b, (byte) 0x81, (byte) 0xb2, 0x71, 0x64, (byte) 0xda, + (byte) 0x8b, (byte) 0xf8, (byte) 0xeb, 0x0f, 0x4b, 0x70, 0x56, + (byte) 0x9d, 0x35, 0x1e, 0x24, 0x0e, 0x5e, 0x63, 0x58, (byte) 0xd1, + (byte) 0xa2, 0x25, 0x22, 0x7c, 0x3b, 0x01, 0x21, 0x78, (byte) 0x87, + (byte) 0xd4, 0x00, 0x46, 0x57, (byte) 0x9f, (byte) 0xd3, 0x27, + 0x52, 0x4c, 0x36, 0x02, (byte) 0xe7, (byte) 0xa0, (byte) 0xc4, + (byte) 0xc8, (byte) 0x9e, (byte) 0xea, (byte) 0xbf, (byte) 0x8a, + (byte) 0xd2, 0x40, (byte) 0xc7, 0x38, (byte) 0xb5, (byte) 0xa3, + (byte) 0xf7, (byte) 0xf2, (byte) 0xce, (byte) 0xf9, 0x61, 0x15, + (byte) 0xa1, (byte) 0xe0, (byte) 0xae, 0x5d, (byte) 0xa4, + (byte) 0x9b, 0x34, 0x1a, 0x55, (byte) 0xad, (byte) 0x93, 0x32, + 0x30, (byte) 0xf5, (byte) 0x8c, (byte) 0xb1, (byte) 0xe3, 0x1d, + (byte) 0xf6, (byte) 0xe2, 0x2e, (byte) 0x82, 0x66, (byte) 0xca, + 0x60, (byte) 0xc0, 0x29, 0x23, (byte) 0xab, 0x0d, 0x53, 0x4e, 0x6f, + (byte) 0xd5, (byte) 0xdb, 0x37, 0x45, (byte) 0xde, (byte) 0xfd, + (byte) 0x8e, 0x2f, 0x03, (byte) 0xff, 0x6a, 0x72, 0x6d, 0x6c, 0x5b, + 0x51, (byte) 0x8d, 0x1b, (byte) 0xaf, (byte) 0x92, (byte) 0xbb, + (byte) 0xdd, (byte) 0xbc, 0x7f, 0x11, (byte) 0xd9, 0x5c, 0x41, + 0x1f, 0x10, 0x5a, (byte) 0xd8, 0x0a, (byte) 0xc1, 0x31, + (byte) 0x88, (byte) 0xa5, (byte) 0xcd, 0x7b, (byte) 0xbd, 0x2d, + 0x74, (byte) 0xd0, 0x12, (byte) 0xb8, (byte) 0xe5, (byte) 0xb4, + (byte) 0xb0, (byte) 0x89, 0x69, (byte) 0x97, 0x4a, 0x0c, + (byte) 0x96, 0x77, 0x7e, 0x65, (byte) 0xb9, (byte) 0xf1, 0x09, + (byte) 0xc5, 0x6e, (byte) 0xc6, (byte) 0x84, 0x18, (byte) 0xf0, + 0x7d, (byte) 0xec, 0x3a, (byte) 0xdc, 0x4d, 0x20, 0x79, + (byte) 0xee, 0x5f, 0x3e, (byte) 0xd7, (byte) 0xcb, 0x39, 0x48 }; + + public static final int[] FK = { 0xa3b1bac6, 0x56aa3350, 0x677d9197, 0xb27022dc }; + + public static final int[] CK = { 0x00070e15,0x1c232a31,0x383f464d,0x545b6269, + 0x70777e85,0x8c939aa1,0xa8afb6bd,0xc4cbd2d9, + 0xe0e7eef5,0xfc030a11,0x181f262d,0x343b4249, + 0x50575e65,0x6c737a81,0x888f969d,0xa4abb2b9, + 0xc0c7ced5,0xdce3eaf1,0xf8ff060d,0x141b2229, + 0x30373e45,0x4c535a61,0x686f767d,0x848b9299, + 0xa0a7aeb5,0xbcc3cad1,0xd8dfe6ed,0xf4fb0209, + 0x10171e25,0x2c333a41,0x484f565d,0x646b7279 }; + + private byte sm4Sbox(byte inch) + { + int i = inch & 0xFF; + byte retVal = SboxTable[i]; + return retVal; + } + + private long sm4Lt(long ka) + { + long bb = 0L; + long c = 0L; + byte[] a = new byte[4]; + byte[] b = new byte[4]; + PUT_ULONG_BE(ka, a, 0); + b[0] = sm4Sbox(a[0]); + b[1] = sm4Sbox(a[1]); + b[2] = sm4Sbox(a[2]); + b[3] = sm4Sbox(a[3]); + bb = GET_ULONG_BE(b, 0); + c = bb ^ ROTL(bb, 2) ^ ROTL(bb, 10) ^ ROTL(bb, 18) ^ ROTL(bb, 24); + return c; + } + + private long sm4F(long x0, long x1, long x2, long x3, long rk) + { + return x0 ^ sm4Lt(x1 ^ x2 ^ x3 ^ rk); + } + + private long sm4CalciRK(long ka) + { + long bb = 0L; + long rk = 0L; + byte[] a = new byte[4]; + byte[] b = new byte[4]; + PUT_ULONG_BE(ka, a, 0); + b[0] = sm4Sbox(a[0]); + b[1] = sm4Sbox(a[1]); + b[2] = sm4Sbox(a[2]); + b[3] = sm4Sbox(a[3]); + bb = GET_ULONG_BE(b, 0); + rk = bb ^ ROTL(bb, 13) ^ ROTL(bb, 23); + return rk; + } + + private void sm4_setkey(long[] SK, byte[] key) + { + long[] MK = new long[4]; + long[] k = new long[36]; + int i = 0; + MK[0] = GET_ULONG_BE(key, 0); + MK[1] = GET_ULONG_BE(key, 4); + MK[2] = GET_ULONG_BE(key, 8); + MK[3] = GET_ULONG_BE(key, 12); + k[0] = MK[0] ^ (long) FK[0]; + k[1] = MK[1] ^ (long) FK[1]; + k[2] = MK[2] ^ (long) FK[2]; + k[3] = MK[3] ^ (long) FK[3]; + for (; i < 32; i++) + { + k[(i + 4)] = (k[i] ^ sm4CalciRK(k[(i + 1)] ^ k[(i + 2)] ^ k[(i + 3)] ^ (long) CK[i])); + SK[i] = k[(i + 4)]; + } + } + + private void sm4_one_round(long[] sk, byte[] input, byte[] output) + { + int i = 0; + long[] ulbuf = new long[36]; + ulbuf[0] = GET_ULONG_BE(input, 0); + ulbuf[1] = GET_ULONG_BE(input, 4); + ulbuf[2] = GET_ULONG_BE(input, 8); + ulbuf[3] = GET_ULONG_BE(input, 12); + while (i < 32) + { + ulbuf[(i + 4)] = sm4F(ulbuf[i], ulbuf[(i + 1)], ulbuf[(i + 2)], ulbuf[(i + 3)], sk[i]); + i++; + } + PUT_ULONG_BE(ulbuf[35], output, 0); + PUT_ULONG_BE(ulbuf[34], output, 4); + PUT_ULONG_BE(ulbuf[33], output, 8); + PUT_ULONG_BE(ulbuf[32], output, 12); + } + + private byte[] padding(byte[] input, int mode) + { + if (input == null) + { + return null; + } + + byte[] ret = (byte[]) null; + if (mode == SM4_ENCRYPT) + { + int p = 16 - input.length % 16; + ret = new byte[input.length + p]; + System.arraycopy(input, 0, ret, 0, input.length); + for (int i = 0; i < p; i++) + { + ret[input.length + i] = (byte) p; + } + } + else + { + int p = input[input.length - 1]; + ret = new byte[input.length - p]; + System.arraycopy(input, 0, ret, 0, input.length - p); + } + return ret; + } + + public void sm4_setkey_enc(SM4_Context ctx, byte[] key) throws Exception + { + if (ctx == null) + { + throw new Exception("ctx is null!"); + } + + if (key == null || key.length != 16) + { + throw new Exception("key error!"); + } + + ctx.mode = SM4_ENCRYPT; + sm4_setkey(ctx.sk, key); + } + + public void sm4_setkey_dec(SM4_Context ctx, byte[] key) throws Exception + { + if (ctx == null) + { + throw new Exception("ctx is null!"); + } + + if (key == null || key.length != 16) + { + throw new Exception("key error!"); + } + + int i = 0; + ctx.mode = SM4_DECRYPT; + sm4_setkey(ctx.sk, key); + for (i = 0; i < 16; i++) + { + SWAP(ctx.sk, i); + } + } + + public byte[] sm4_crypt_ecb(SM4_Context ctx, byte[] input) throws Exception + { + if (input == null) + { + throw new Exception("input is null!"); + } + + if ((ctx.isPadding) && (ctx.mode == SM4_ENCRYPT)) + { + input = padding(input, SM4_ENCRYPT); + } + + int length = input.length; + ByteArrayInputStream bins = new ByteArrayInputStream(input); + ByteArrayOutputStream bous = new ByteArrayOutputStream(); + for(; length > 0; length -= 16) + { + byte[] in = new byte[16]; + byte[] out = new byte[16]; + bins.read(in); + sm4_one_round(ctx.sk, in, out); + bous.write(out); + } + + byte[] output = bous.toByteArray(); + if (ctx.isPadding && ctx.mode == SM4_DECRYPT) + { + output = padding(output, SM4_DECRYPT); + } + bins.close(); + bous.close(); + return output; + } + + public byte[] sm4_crypt_cbc(SM4_Context ctx, byte[] iv, byte[] input) throws Exception + { + if (iv == null || iv.length != 16) + { + throw new Exception("iv error!"); + } + + if (input == null) + { + throw new Exception("input is null!"); + } + + if (ctx.isPadding && ctx.mode == SM4_ENCRYPT) + { + input = padding(input, SM4_ENCRYPT); + } + + int i = 0; + int length = input.length; + ByteArrayInputStream bins = new ByteArrayInputStream(input); + ByteArrayOutputStream bous = new ByteArrayOutputStream(); + if (ctx.mode == SM4_ENCRYPT) + { + for(; length > 0; length -= 16) + { + byte[] in = new byte[16]; + byte[] out = new byte[16]; + byte[] out1 = new byte[16]; + + bins.read(in); + for (i = 0; i < 16; i++) + { + out[i] = ((byte) (in[i] ^ iv[i])); + } + sm4_one_round(ctx.sk, out, out1); + System.arraycopy(out1, 0, iv, 0, 16); + bous.write(out1); + } + } + else + { + byte[] temp = new byte[16]; + for(; length > 0; length -= 16) + { + byte[] in = new byte[16]; + byte[] out = new byte[16]; + byte[] out1 = new byte[16]; + + bins.read(in); + System.arraycopy(in, 0, temp, 0, 16); + sm4_one_round(ctx.sk, in, out); + for (i = 0; i < 16; i++) + { + out1[i] = ((byte) (out[i] ^ iv[i])); + } + System.arraycopy(temp, 0, iv, 0, 16); + bous.write(out1); + } + } + + byte[] output = bous.toByteArray(); + if (ctx.isPadding && ctx.mode == SM4_DECRYPT) + { + output = padding(output, SM4_DECRYPT); + } + bins.close(); + bous.close(); + return output; + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/sm3/SM4Utils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/sm3/SM4Utils.java new file mode 100644 index 0000000..71c17df --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/sm3/SM4Utils.java @@ -0,0 +1,187 @@ +package com.ruoyi.common.utils.sm3; + +import sun.misc.BASE64Decoder; +import sun.misc.BASE64Encoder; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class SM4Utils +{ + public String getSecretKey() { + return secretKey; + } + + public void setSecretKey(String secretKey) { + this.secretKey = secretKey; + } + + public boolean isHexString() { + return hexString; + } + + public void setHexString(boolean hexString) { + this.hexString = hexString; + } + + private String secretKey = ""; + + public String getIv() { + return iv; + } + + public void setIv(String iv) { + this.iv = iv; + } + + private String iv = ""; + + private boolean hexString = false; + + public SM4Utils() + { + } + + public String encryptData_ECB(String plainText) + { + try + { + SM4_Context ctx = new SM4_Context(); + ctx.isPadding = true; + ctx.mode = SM4.SM4_ENCRYPT; + + byte[] keyBytes; + if (hexString) + { + keyBytes = Util.hexStringToBytes(secretKey); + } + else + { + keyBytes = secretKey.getBytes(); + } + + SM4 sm4 = new SM4(); + sm4.sm4_setkey_enc(ctx, keyBytes); + byte[] encrypted = sm4.sm4_crypt_ecb(ctx, plainText.getBytes("GBK")); + String cipherText = new BASE64Encoder().encode(encrypted); + if (cipherText != null && cipherText.trim().length() > 0) + { + Pattern p = Pattern.compile("\\s*|\t|\r|\n"); + Matcher m = p.matcher(cipherText); + cipherText = m.replaceAll(""); + } + return cipherText; + } + catch (Exception e) + { + e.printStackTrace(); + return null; + } + } + + public String decryptData_ECB(String cipherText) + { + try + { + SM4_Context ctx = new SM4_Context(); + ctx.isPadding = true; + ctx.mode = SM4.SM4_DECRYPT; + + byte[] keyBytes; + if (hexString) + { + keyBytes = Util.hexStringToBytes(secretKey); + } + else + { + keyBytes = secretKey.getBytes(); + } + + SM4 sm4 = new SM4(); + sm4.sm4_setkey_dec(ctx, keyBytes); + byte[] decrypted = sm4.sm4_crypt_ecb(ctx, new BASE64Decoder().decodeBuffer(cipherText)); + return new String(decrypted, "GBK"); + } + catch (Exception e) + { + e.printStackTrace(); + return null; + } + } + + public String encryptData_CBC(String plainText) + { + try + { + SM4_Context ctx = new SM4_Context(); + ctx.isPadding = true; + ctx.mode = SM4.SM4_ENCRYPT; + + byte[] keyBytes; + byte[] ivBytes; + if (hexString) + { + keyBytes = Util.hexStringToBytes(secretKey); + ivBytes = Util.hexStringToBytes(iv); + } + else + { + keyBytes = secretKey.getBytes(); + ivBytes = iv.getBytes(); + } + + SM4 sm4 = new SM4(); + sm4.sm4_setkey_enc(ctx, keyBytes); + byte[] encrypted = sm4.sm4_crypt_cbc(ctx, ivBytes, plainText.getBytes("GBK")); + String cipherText = new BASE64Encoder().encode(encrypted); + if (cipherText != null && cipherText.trim().length() > 0) + { + Pattern p = Pattern.compile("\\s*|\t|\r|\n"); + Matcher m = p.matcher(cipherText); + cipherText = m.replaceAll(""); + } + return cipherText; + } + catch (Exception e) + { + e.printStackTrace(); + return null; + } + } + + public String decryptData_CBC(String cipherText) + { + try + { + SM4_Context ctx = new SM4_Context(); + ctx.isPadding = true; + ctx.mode = SM4.SM4_DECRYPT; + + byte[] keyBytes; + byte[] ivBytes; + if (hexString) + { + keyBytes = Util.hexStringToBytes(secretKey); + ivBytes = Util.hexStringToBytes(iv); + } + else + { + keyBytes = secretKey.getBytes(); + ivBytes = iv.getBytes(); + } + + SM4 sm4 = new SM4(); + sm4.sm4_setkey_dec(ctx, keyBytes); + byte[] decrypted = sm4.sm4_crypt_cbc(ctx, ivBytes, new BASE64Decoder().decodeBuffer(cipherText)); + return new String(decrypted, "GBK"); + } + catch (Exception e) + { + e.printStackTrace(); + return null; + } + } + + + +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/sm3/SM4_Context.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/sm3/SM4_Context.java new file mode 100644 index 0000000..95cb87e --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/sm3/SM4_Context.java @@ -0,0 +1,17 @@ +package com.ruoyi.common.utils.sm3; + +public class SM4_Context +{ + public int mode; + + public long[] sk; + + public boolean isPadding; + + public SM4_Context() + { + this.mode = 1; + this.isPadding = true; + this.sk = new long[32]; + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/sm3/Util.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/sm3/Util.java new file mode 100644 index 0000000..bd20f8c --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/sm3/Util.java @@ -0,0 +1,662 @@ +package com.ruoyi.common.utils.sm3; + +import java.math.BigInteger; + +public class Util +{ + /** + * 整形转换成网络传输的字节流(字节数组)型数据 + * + * @param num 一个整型数据 + * @return 4个字节的自己数组 + */ + public static byte[] intToBytes(int num) + { + byte[] bytes = new byte[4]; + bytes[0] = (byte) (0xff & (num >> 0)); + bytes[1] = (byte) (0xff & (num >> 8)); + bytes[2] = (byte) (0xff & (num >> 16)); + bytes[3] = (byte) (0xff & (num >> 24)); + return bytes; + } + + /** + * 四个字节的字节数据转换成一个整形数据 + * + * @param bytes 4个字节的字节数组 + * @return 一个整型数据 + */ + public static int byteToInt(byte[] bytes) + { + int num = 0; + int temp; + temp = (0x000000ff & (bytes[0])) << 0; + num = num | temp; + temp = (0x000000ff & (bytes[1])) << 8; + num = num | temp; + temp = (0x000000ff & (bytes[2])) << 16; + num = num | temp; + temp = (0x000000ff & (bytes[3])) << 24; + num = num | temp; + return num; + } + + /** + * 长整形转换成网络传输的字节流(字节数组)型数据 + * + * @param num 一个长整型数据 + * @return 4个字节的自己数组 + */ + public static byte[] longToBytes(long num) + { + byte[] bytes = new byte[8]; + for (int i = 0; i < 8; i++) + { + bytes[i] = (byte) (0xff & (num >> (i * 8))); + } + + return bytes; + } + + /** + * 大数字转换字节流(字节数组)型数据 + * + * @param n + * @return + */ + public static byte[] byteConvert32Bytes(BigInteger n) + { + byte tmpd[] = (byte[])null; + if(n == null) + { + return null; + } + + if(n.toByteArray().length == 33) + { + tmpd = new byte[32]; + System.arraycopy(n.toByteArray(), 1, tmpd, 0, 32); + } + else if(n.toByteArray().length == 32) + { + tmpd = n.toByteArray(); + } + else + { + tmpd = new byte[32]; + for(int i = 0; i < 32 - n.toByteArray().length; i++) + { + tmpd[i] = 0; + } + System.arraycopy(n.toByteArray(), 0, tmpd, 32 - n.toByteArray().length, n.toByteArray().length); + } + return tmpd; + } + + /** + * 换字节流(字节数组)型数据转大数字 + * + * @param b + * @return + */ + public static BigInteger byteConvertInteger(byte[] b) + { + if (b[0] < 0) + { + byte[] temp = new byte[b.length + 1]; + temp[0] = 0; + System.arraycopy(b, 0, temp, 1, b.length); + return new BigInteger(temp); + } + return new BigInteger(b); + } + + /** + * 根据字节数组获得值(十六进制数字) + * + * @param bytes + * @return + */ + public static String getHexString(byte[] bytes) + { + return getHexString(bytes, true); + } + + /** + * 根据字节数组获得值(十六进制数字) + * + * @param bytes + * @param upperCase + * @return + */ + public static String getHexString(byte[] bytes, boolean upperCase) + { + String ret = ""; + for (int i = 0; i < bytes.length; i++) + { + ret += Integer.toString((bytes[i] & 0xff) + 0x100, 16).substring(1); + } + return upperCase ? ret.toUpperCase() : ret; + } + + /** + * 打印十六进制字符串 + * + * @param bytes + */ + public static void printHexString(byte[] bytes) + { + for (int i = 0; i < bytes.length; i++) + { + String hex = Integer.toHexString(bytes[i] & 0xFF); + if (hex.length() == 1) + { + hex = '0' + hex; + } + System.out.print("0x" + hex.toUpperCase() + ","); + } + System.out.println(""); + } + + /** + * Convert hex string to byte[] + * + * @param hexString + * the hex string + * @return byte[] + */ + public static byte[] hexStringToBytes(String hexString) + { + if (hexString == null || hexString.equals("")) + { + return null; + } + + hexString = hexString.toUpperCase(); + int length = hexString.length() / 2; + char[] hexChars = hexString.toCharArray(); + byte[] d = new byte[length]; + for (int i = 0; i < length; i++) + { + int pos = i * 2; + d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1])); + } + return d; + } + + /** + * Convert char to byte + * + * @param c + * char + * @return byte + */ + public static byte charToByte(char c) + { + return (byte) "0123456789ABCDEF".indexOf(c); + } + + /** + * 用于建立十六进制字符的输出的小写字符数组 + */ + private static final char[] DIGITS_LOWER = {'0', '1', '2', '3', '4', '5', + '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; + + /** + * 用于建立十六进制字符的输出的大写字符数组 + */ + private static final char[] DIGITS_UPPER = {'0', '1', '2', '3', '4', '5', + '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; + + /** + * 将字节数组转换为十六进制字符数组 + * + * @param data byte[] + * @return 十六进制char[] + */ + public static char[] encodeHex(byte[] data) { + return encodeHex(data, true); + } + + /** + * 将字节数组转换为十六进制字符数组 + * + * @param data byte[] + * @param toLowerCase true 传换成小写格式 , false 传换成大写格式 + * @return 十六进制char[] + */ + public static char[] encodeHex(byte[] data, boolean toLowerCase) { + return encodeHex(data, toLowerCase ? DIGITS_LOWER : DIGITS_UPPER); + } + + /** + * 将字节数组转换为十六进制字符数组 + * + * @param data byte[] + * @param toDigits 用于控制输出的char[] + * @return 十六进制char[] + */ + protected static char[] encodeHex(byte[] data, char[] toDigits) { + int l = data.length; + char[] out = new char[l << 1]; + // two characters form the hex value. + for (int i = 0, j = 0; i < l; i++) { + out[j++] = toDigits[(0xF0 & data[i]) >>> 4]; + out[j++] = toDigits[0x0F & data[i]]; + } + return out; + } + + /** + * 将字节数组转换为十六进制字符串 + * + * @param data byte[] + * @return 十六进制String + */ + public static String encodeHexString(byte[] data) { + return encodeHexString(data, true); + } + + /** + * 将字节数组转换为十六进制字符串 + * + * @param data byte[] + * @param toLowerCase true 传换成小写格式 , false 传换成大写格式 + * @return 十六进制String + */ + public static String encodeHexString(byte[] data, boolean toLowerCase) { + return encodeHexString(data, toLowerCase ? DIGITS_LOWER : DIGITS_UPPER); + } + + /** + * 将字节数组转换为十六进制字符串 + * + * @param data byte[] + * @param toDigits 用于控制输出的char[] + * @return 十六进制String + */ + protected static String encodeHexString(byte[] data, char[] toDigits) { + return new String(encodeHex(data, toDigits)); + } + + /** + * 将十六进制字符数组转换为字节数组 + * + * @param data 十六进制char[] + * @return byte[] + * @throws RuntimeException 如果源十六进制字符数组是一个奇怪的长度,将抛出运行时异常 + */ + public static byte[] decodeHex(char[] data) { + int len = data.length; + + if ((len & 0x01) != 0) { + throw new RuntimeException("Odd number of characters."); + } + + byte[] out = new byte[len >> 1]; + + // two characters form the hex value. + for (int i = 0, j = 0; j < len; i++) { + int f = toDigit(data[j], j) << 4; + j++; + f = f | toDigit(data[j], j); + j++; + out[i] = (byte) (f & 0xFF); + } + + return out; + } + + /** + * 将十六进制字符转换成一个整数 + * + * @param ch 十六进制char + * @param index 十六进制字符在字符数组中的位置 + * @return 一个整数 + * @throws RuntimeException 当ch不是一个合法的十六进制字符时,抛出运行时异常 + */ + protected static int toDigit(char ch, int index) { + int digit = Character.digit(ch, 16); + if (digit == -1) { + throw new RuntimeException("Illegal hexadecimal character " + ch + + " at index " + index); + } + return digit; + } + + /** + * 数字字符串转ASCII码字符串 + * + * @param String + * 字符串 + * @return ASCII字符串 + */ + public static String StringToAsciiString(String content) { + String result = ""; + int max = content.length(); + for (int i = 0; i < max; i++) { + char c = content.charAt(i); + String b = Integer.toHexString(c); + result = result + b; + } + return result; + } + + /** + * 十六进制转字符串 + * + * @param hexString + * 十六进制字符串 + * @param encodeType + * 编码类型4:Unicode,2:普通编码 + * @return 字符串 + */ + public static String hexStringToString(String hexString, int encodeType) { + String result = ""; + int max = hexString.length() / encodeType; + for (int i = 0; i < max; i++) { + char c = (char) hexStringToAlgorism(hexString + .substring(i * encodeType, (i + 1) * encodeType)); + result += c; + } + return result; + } + + /** + * 十六进制字符串装十进制 + * + * @param hex + * 十六进制字符串 + * @return 十进制数值 + */ + public static int hexStringToAlgorism(String hex) { + hex = hex.toUpperCase(); + int max = hex.length(); + int result = 0; + for (int i = max; i > 0; i--) { + char c = hex.charAt(i - 1); + int algorism = 0; + if (c >= '0' && c <= '9') { + algorism = c - '0'; + } else { + algorism = c - 55; + } + result += Math.pow(16, max - i) * algorism; + } + return result; + } + + /** + * 十六转二进制 + * + * @param hex + * 十六进制字符串 + * @return 二进制字符串 + */ + public static String hexStringToBinary(String hex) { + hex = hex.toUpperCase(); + String result = ""; + int max = hex.length(); + for (int i = 0; i < max; i++) { + char c = hex.charAt(i); + switch (c) { + case '0': + result += "0000"; + break; + case '1': + result += "0001"; + break; + case '2': + result += "0010"; + break; + case '3': + result += "0011"; + break; + case '4': + result += "0100"; + break; + case '5': + result += "0101"; + break; + case '6': + result += "0110"; + break; + case '7': + result += "0111"; + break; + case '8': + result += "1000"; + break; + case '9': + result += "1001"; + break; + case 'A': + result += "1010"; + break; + case 'B': + result += "1011"; + break; + case 'C': + result += "1100"; + break; + case 'D': + result += "1101"; + break; + case 'E': + result += "1110"; + break; + case 'F': + result += "1111"; + break; + } + } + return result; + } + + /** + * ASCII码字符串转数字字符串 + * + * @param String + * ASCII字符串 + * @return 字符串 + */ + public static String AsciiStringToString(String content) { + String result = ""; + int length = content.length() / 2; + for (int i = 0; i < length; i++) { + String c = content.substring(i * 2, i * 2 + 2); + int a = hexStringToAlgorism(c); + char b = (char) a; + String d = String.valueOf(b); + result += d; + } + return result; + } + + /** + * 将十进制转换为指定长度的十六进制字符串 + * + * @param algorism + * int 十进制数字 + * @param maxLength + * int 转换后的十六进制字符串长度 + * @return String 转换后的十六进制字符串 + */ + public static String algorismToHexString(int algorism, int maxLength) { + String result = ""; + result = Integer.toHexString(algorism); + + if (result.length() % 2 == 1) { + result = "0" + result; + } + return patchHexString(result.toUpperCase(), maxLength); + } + + /** + * 字节数组转为普通字符串(ASCII对应的字符) + * + * @param bytearray + * byte[] + * @return String + */ + public static String byteToString(byte[] bytearray) { + String result = ""; + char temp; + + int length = bytearray.length; + for (int i = 0; i < length; i++) { + temp = (char) bytearray[i]; + result += temp; + } + return result; + } + + /** + * 二进制字符串转十进制 + * + * @param binary + * 二进制字符串 + * @return 十进制数值 + */ + public static int binaryToAlgorism(String binary) { + int max = binary.length(); + int result = 0; + for (int i = max; i > 0; i--) { + char c = binary.charAt(i - 1); + int algorism = c - '0'; + result += Math.pow(2, max - i) * algorism; + } + return result; + } + + /** + * 十进制转换为十六进制字符串 + * + * @param algorism + * int 十进制的数字 + * @return String 对应的十六进制字符串 + */ + public static String algorismToHEXString(int algorism) { + String result = ""; + result = Integer.toHexString(algorism); + + if (result.length() % 2 == 1) { + result = "0" + result; + + } + result = result.toUpperCase(); + + return result; + } + + /** + * HEX字符串前补0,主要用于长度位数不足。 + * + * @param str + * String 需要补充长度的十六进制字符串 + * @param maxLength + * int 补充后十六进制字符串的长度 + * @return 补充结果 + */ + static public String patchHexString(String str, int maxLength) { + String temp = ""; + for (int i = 0; i < maxLength - str.length(); i++) { + temp = "0" + temp; + } + str = (temp + str).substring(0, maxLength); + return str; + } + + /** + * 将一个字符串转换为int + * + * @param s + * String 要转换的字符串 + * @param defaultInt + * int 如果出现异常,默认返回的数字 + * @param radix + * int 要转换的字符串是什么进制的,如16 8 10. + * @return int 转换后的数字 + */ + public static int parseToInt(String s, int defaultInt, int radix) { + int i = 0; + try { + i = Integer.parseInt(s, radix); + } catch (NumberFormatException ex) { + i = defaultInt; + } + return i; + } + + /** + * 将一个十进制形式的数字字符串转换为int + * + * @param s + * String 要转换的字符串 + * @param defaultInt + * int 如果出现异常,默认返回的数字 + * @return int 转换后的数字 + */ + public static int parseToInt(String s, int defaultInt) { + int i = 0; + try { + i = Integer.parseInt(s); + } catch (NumberFormatException ex) { + i = defaultInt; + } + return i; + } + + /** + * 十六进制串转化为byte数组 + * + * @return the array of byte + */ + public static byte[] hexToByte(String hex) + throws IllegalArgumentException { + if (hex.length() % 2 != 0) { + throw new IllegalArgumentException(); + } + char[] arr = hex.toCharArray(); + byte[] b = new byte[hex.length() / 2]; + for (int i = 0, j = 0, l = hex.length(); i < l; i++, j++) { + String swap = "" + arr[i++] + arr[i]; + int byteint = Integer.parseInt(swap, 16) & 0xFF; + b[j] = new Integer(byteint).byteValue(); + } + return b; + } + + /** + * 字节数组转换为十六进制字符串 + * + * @param b + * byte[] 需要转换的字节数组 + * @return String 十六进制字符串 + */ + public static String byteToHex(byte b[]) { + if (b == null) { + throw new IllegalArgumentException( + "Argument b ( byte array ) is null! "); + } + String hs = ""; + String stmp = ""; + for (int n = 0; n < b.length; n++) { + stmp = Integer.toHexString(b[n] & 0xff); + if (stmp.length() == 1) { + hs = hs + "0" + stmp; + } else { + hs = hs + stmp; + } + } + return hs.toUpperCase(); + } + + public static byte[] subByte(byte[] input, int startIndex, int length) { + byte[] bt = new byte[length]; + for (int i = 0; i < length; i++) { + bt[i] = input[i + startIndex]; + } + return bt; + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/validator/ValidatorUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/validator/ValidatorUtils.java new file mode 100644 index 0000000..648a8d6 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/validator/ValidatorUtils.java @@ -0,0 +1,84 @@ +/** + * Copyright (c) 2016-2019 人人开源 All rights reserved. + *

+ * https://www.renren.io + *

+ * 版权所有,侵权必究! + */ + +package com.ruoyi.common.validator; + + +import com.ruoyi.common.exception.RYException; + +import javax.validation.ConstraintViolation; +import javax.validation.Validation; +import javax.validation.Validator; +import java.util.Set; + +/** + * hibernate-validator校验工具类 + *

+ * 参考文档:http://docs.jboss.org/hibernate/validator/5.4/reference/en-US/html_single/ + * + * @author Mark sunlightcs@gmail.com + */ +public class ValidatorUtils { + private static Validator validator; + + static { + validator = Validation.buildDefaultValidatorFactory().getValidator(); + } + + /** + * 校验对象 + * + * @param object 待校验对象 + * @param groups 待校验的组 + * @throws RYException 校验不通过,则报RYException异常 + */ + public static void validateEntity(Object object, Class... groups) + throws RYException { + Set> constraintViolations = validator.validate(object, groups); + if (!constraintViolations.isEmpty()) { + ConstraintViolation constraint = (ConstraintViolation) constraintViolations.iterator().next(); + throw new RYException(constraint.getMessage()); + } + } + + /** + * 校验对象,版本2 + * + * @param object 待校验对象 + * @param groups 待校验的组 + * @throws RYException 校验不通过,则报RYException异常 + */ + public static void validateV2(Object object, Class... groups) + throws RYException { + validateV2(0, object, groups); + } + + /** + * 校验对象,版本2 + * + * @param i 第几条校验 + * @param object 待校验对象 + * @param groups 待校验的组 + * @throws RYException 校验不通过,则报RYException异常 + */ + public static void validateV2(int i, Object object, Class... groups) + throws RYException { + Set> validateSet = validator.validate(object, groups); + if (!validateSet.isEmpty()) { + String messages = validateSet.stream() + .map(ConstraintViolation::getMessage) + .reduce((m1, m2) -> m1 + ";" + m2) + .orElse("参数输入有误!"); + + if (i > 0) { + messages = "第" + i + "条数据:" + messages; + } + throw new RYException(messages, 11); + } + } +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java index dd1dfa3..0a60c11 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java @@ -97,7 +97,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter // 过滤请求 .authorizeRequests() // 对于登录login 注册register 验证码captchaImage 允许匿名访问 - .antMatchers("/login", "/register", "/captchaImage","/api/**").anonymous() + .antMatchers("/login", "/register", "/captchaImage").anonymous() .antMatchers( HttpMethod.GET, "/", @@ -112,6 +112,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter .antMatchers("/webjars/**").anonymous() .antMatchers("/*/api-docs").anonymous() .antMatchers("/druid/**").anonymous() + .antMatchers("/api/**").anonymous() // 除上面外的所有请求全部需要鉴权认证 .anyRequest().authenticated() .and()