作者 钟来

初始提交

正在显示 20 个修改的文件 包含 664 行增加53 行删除
... ... @@ -11,6 +11,7 @@ import org.springframework.context.annotation.ComponentScan;
"com.ruoyi.framework",
"com.ruoyi.generator",
"com.zhonglai.luhui.admin.config",
"com.zhonglai.luhui.admin.service",
"com.zhonglai.luhui.admin.controller",
"com.zhonglai.luhui.mqtt.comm.service.redis",
"com.zhonglai.luhui.mqtt.service.db.mode"
... ...
... ... @@ -177,27 +177,8 @@ public class IotDeviceControlController {
@ResponseBody
@PostMapping("/delIotTerminal/{imei}/{number}")
public String delIotTerminal(HttpServletResponse response,@PathVariable String imei,@PathVariable String number) {
IotDevice iotDevice = iotDeviceService.selectIotDeviceByClient_id(imei);
iIotTerminalService.deleteIotTerminalById(imei+"_"+number);
response.setCharacterEncoding("UTF-8");
if(StringUtils.isEmpty(iotDevice.getListen_service_ip()))
{
return JSONObject.toJSONString(new Message(MessageCode.DEFAULT_SUCCESS_CODE,"删除成功"));
}
String url = "http://"+iotDevice.getListen_service_ip()+"device/delIotTerminal/"+imei+"/"+number;
String str = null;
try {
str = HttpUtils.getResponseString(HttpUtils.postFromBody(url, builder -> {
}, formBody -> {
}));
} catch (IOException e) {
}
if(null != str)
{
return str;
}
return JSONObject.toJSONString(new Message(MessageCode.DEFAULT_SUCCESS_CODE,"删除成功"));
return iIotTerminalService.deleteIotTerminalById(imei,number);
}
@ApiOperation(value = "读取属性")
... ... @@ -323,5 +304,4 @@ public class IotDeviceControlController {
return response1.body().string();
}
}
... ...
... ... @@ -44,7 +44,7 @@ public class SysProfileController extends BaseController
@GetMapping
public AjaxResult profile()
{
SysLoginUser loginUser = getLoginUser();
SysLoginUser loginUser = (SysLoginUser) getLoginUser();
SysUser user = loginUser.getUser();
AjaxResult ajax = AjaxResult.success(user);
ajax.put("roleGroup", userService.selectUserRoleGroup(loginUser.getUsername()));
... ... @@ -60,7 +60,7 @@ public class SysProfileController extends BaseController
@PutMapping
public AjaxResult updateProfile(@RequestBody SysUser user)
{
SysLoginUser loginUser = getLoginUser();
SysLoginUser loginUser = (SysLoginUser) getLoginUser();
SysUser sysUser = loginUser.getUser();
user.setUserName(sysUser.getUserName());
if (StringUtils.isNotEmpty(user.getPhonenumber())
... ... @@ -96,7 +96,7 @@ public class SysProfileController extends BaseController
@PutMapping("/updatePwd")
public AjaxResult updatePwd(String oldPassword, String newPassword)
{
SysLoginUser loginUser = getLoginUser();
SysLoginUser loginUser = (SysLoginUser) getLoginUser();
String userName = loginUser.getUsername();
String password = loginUser.getPassword();
if (!SecurityUtils.matchesPassword(oldPassword, password))
... ... @@ -127,7 +127,7 @@ public class SysProfileController extends BaseController
{
if (!file.isEmpty())
{
SysLoginUser loginUser = getLoginUser();
SysLoginUser loginUser = (SysLoginUser) getLoginUser();
String avatar = FileUploadUtils.upload(RuoYiConfig.getAvatarPath(), file);
if (userService.updateUserAvatar(loginUser.getUsername(), avatar))
{
... ...
... ... @@ -127,7 +127,7 @@ public class SysRoleController extends BaseController
if (roleService.updateRole(role) > 0)
{
// 更新缓存用户权限
SysLoginUser loginUser = getLoginUser();
SysLoginUser loginUser = (SysLoginUser) getLoginUser();
if (StringUtils.isNotNull(loginUser.getUser()) && !loginUser.getUser().isAdmin())
{
loginUser.setPermissions(permissionService.getMenuPermission(loginUser.getUser()));
... ...
# 项目相关配置 jhlt: # 名称 name: zhonglai # 版本 version: 3.8.2 # 版权年份 copyrightYear: 2022 # 实例演示开关 demoEnabled: true # 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath) profile: D:/ruoyi/uploadPath # 获取ip地址开关 addressEnabled: false # 验证码类型 math 数组计算 char 字符验证 captchaType: math # 开发环境配置 server: # 服务器的HTTP端口,默认为8080 port: 8080 servlet: # 应用的访问路径 context-path: / tomcat: # tomcat的URI编码 uri-encoding: UTF-8 # 连接数满后的排队数,默认为100 accept-count: 1000 threads: # tomcat最大线程数,默认为200 max: 800 # Tomcat启动初始化的线程数,默认值10 min-spare: 100 # 日志配置 logging: level: com.ruoyi: debug org.springframework: warn # Spring配置 spring: # 资源信息 messages: # 国际化资源文件路径 basename: i18n/messages profiles: active: druid # 文件上传 servlet: multipart: # 单个文件大小 max-file-size: 10MB # 设置总上传的文件大小 max-request-size: 20MB # 服务模块 devtools: restart: # 热部署开关 enabled: true # redis 配置 redis: # 地址 host: 47.112.163.61 # 端口,默认为6379 port: 9527 # 数据库索引 database: 1 # 密码 password: Luhui586 # 连接超时时间 timeout: 10s lettuce: pool: # 连接池中的最小空闲连接 min-idle: 0 # 连接池中的最大空闲连接 max-idle: 8 # 连接池的最大数据库连接数 max-active: 8 # #连接池最大阻塞等待时间(使用负值表示没有限制) max-wait: -1ms # token配置 token: # 令牌自定义标识 header: Authorization # 令牌密钥 secret: abcdefghijklmnopqrstuvwxyz # 令牌有效期(默认30分钟) expireTime: 1440 # MyBatis配置 mybatis: # 搜索指定包别名 typeAliasesPackage: com.ruoyi.**.domain # 配置mapper的扫描,找到所有的mapper.xml映射文件 mapperLocations: classpath*:mapper/**/*Mapper.xml # 加载全局的配置文件 configLocation: classpath:mybatis/mybatis-config.xml # PageHelper分页插件 pagehelper: helperDialect: mysql supportMethodsArguments: true params: count=countSql # Swagger配置 swagger: # 是否开启swagger enabled: true # 请求前缀 pathMapping: /dev-api # 防止XSS攻击 xss: # 过滤开关 enabled: true # 排除链接(多个用逗号分隔) excludes: /system/notice # 匹配链接 urlPatterns: /system/*,/monitor/*,/tool/* mqtt: client: device_life: 180 sys: ## // 对于登录login 注册register 验证码captchaImage 允许匿名访问 antMatchers: /login,/register,/captchaImage,/getCacheObject,/v2/api-docs,/tool/gen/generatorCodeFromDb
\ No newline at end of file
# 项目相关配置 jhlt: # 名称 name: zhonglai # 版本 version: 3.8.2 # 版权年份 copyrightYear: 2022 # 实例演示开关 demoEnabled: true # 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath) profile: D:/ruoyi/uploadPath # 获取ip地址开关 addressEnabled: false # 验证码类型 math 数组计算 char 字符验证 captchaType: math # 开发环境配置 server: # 服务器的HTTP端口,默认为8080 port: 8080 servlet: # 应用的访问路径 context-path: / tomcat: # tomcat的URI编码 uri-encoding: UTF-8 # 连接数满后的排队数,默认为100 accept-count: 1000 threads: # tomcat最大线程数,默认为200 max: 800 # Tomcat启动初始化的线程数,默认值10 min-spare: 100 # 日志配置 logging: level: com.ruoyi: debug org.springframework: warn # Spring配置 spring: # 资源信息 messages: # 国际化资源文件路径 basename: i18n/messages profiles: active: druid # 文件上传 servlet: multipart: # 单个文件大小 max-file-size: 10MB # 设置总上传的文件大小 max-request-size: 20MB # 服务模块 devtools: restart: # 热部署开关 enabled: true # redis 配置 redis: # 地址 host: 47.112.163.61 # 端口,默认为6379 port: 9527 # 数据库索引 database: 1 # 密码 password: Luhui586 # 连接超时时间 timeout: 10s lettuce: pool: # 连接池中的最小空闲连接 min-idle: 0 # 连接池中的最大空闲连接 max-idle: 8 # 连接池的最大数据库连接数 max-active: 8 # #连接池最大阻塞等待时间(使用负值表示没有限制) max-wait: -1ms # token配置 token: # 令牌自定义标识 header: Authorization # 令牌密钥 secret: abcdefghijklmnopqrstuvwxyz # 令牌有效期(默认30分钟) expireTime: 1440 rediskey: lh-admin # MyBatis配置 mybatis: # 搜索指定包别名 typeAliasesPackage: com.ruoyi.**.domain # 配置mapper的扫描,找到所有的mapper.xml映射文件 mapperLocations: classpath*:mapper/**/*Mapper.xml # 加载全局的配置文件 configLocation: classpath:mybatis/mybatis-config.xml # PageHelper分页插件 pagehelper: helperDialect: mysql supportMethodsArguments: true params: count=countSql # Swagger配置 swagger: # 是否开启swagger enabled: true # 请求前缀 pathMapping: /dev-api # 防止XSS攻击 xss: # 过滤开关 enabled: true # 排除链接(多个用逗号分隔) excludes: /system/notice # 匹配链接 urlPatterns: /system/*,/monitor/*,/tool/* mqtt: client: device_life: 180 sys: ## // 对于登录login 注册register 验证码captchaImage 允许匿名访问 antMatchers: /login,/register,/captchaImage,/getCacheObject,/v2/api-docs,/tool/gen/generatorCodeFromDb
\ No newline at end of file
... ...
... ... @@ -110,7 +110,7 @@
生成的manifest中classpath的前缀,因为要把第三方jar放到lib目录下,所以classpath的前缀是lib/
-->
<classpathPrefix>lib/</classpathPrefix>
<mainClass>com.zhonglai.luhui.admin.AdminApplication</mainClass>
<mainClass>com.zhonglai.luhui.api.LhApiApplication</mainClass>
</manifest>
</archive>
</configuration>
... ...
package com.zhonglai.luhui.api.controller.iot;
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.domain.Message;
import com.ruoyi.common.core.domain.MessageCode;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.html.HttpUtils;
import com.ruoyi.system.domain.IotDevice;
import com.ruoyi.system.service.IIotDeviceService;
import com.ruoyi.system.service.IIotTerminalService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import okhttp3.Response;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
@Api(tags = "设备控制")
@Controller
@RequestMapping("/iot/iotDeviceControl")
public class IotDeviceControlController {
@Autowired
private IIotDeviceService iotDeviceService;
@Autowired
private IIotTerminalService iIotTerminalService;
private String getServiceAdrres(HttpServletResponse response,String imei) throws IOException {
IotDevice iotDevice = iotDeviceService.selectIotDeviceByClient_id(imei);
response.setCharacterEncoding("UTF-8");
if(StringUtils.isEmpty(iotDevice.getListen_service_ip()))
{
response.getWriter().print(new Message(MessageCode.DEFAULT_FAIL_CODE,"未找到设备监听服务地址"));
return null;
}
return "http://"+iotDevice.getListen_service_ip()+"device/control/"+imei;
}
@ApiOperation("固件版本更新")
@ApiImplicitParams({
@ApiImplicitParam(value = "主机imei",name = "imei"),
@ApiImplicitParam(value = "版本号",name = "firmwareVersion")
})
@PreAuthorize("@ss.hasPermi('iot:iotDeviceControl:firmwareUp')")
@Log(title = "设备控制", businessType = BusinessType.UPDATE)
@ResponseBody
@PostMapping("/firmwareUp/{imei}")
public String firmwareUp(HttpServletResponse response,@PathVariable String imei,String firmwareVersion,Integer code) throws IOException {
String url = getServiceAdrres(response,imei);
if(null == url)
{
return null;
}
Map<String,Object> map = new HashMap<>();
Map<String,Object> valueMap = new HashMap<>();
valueMap.put("firmwareVersion",firmwareVersion);
valueMap.put("code",code);
Response response1 = HttpUtils.postJsonBody(url, formBody -> {
formBody.put("0", valueMap);
});
return response1.body().string();
}
@ApiOperation("设备重启")
@ApiImplicitParams({
@ApiImplicitParam(value = "主机imei",name = "imei"),
@ApiImplicitParam(value = "restart 1重启,2复位,3恢复出厂值",name = "restart"),
})
@PreAuthorize("@ss.hasPermi('iot:iotDeviceControl:restart')")
@Log(title = "设备控制", businessType = BusinessType.UPDATE)
@ResponseBody
@PostMapping("/restart/{imei}/{restart}")
public String restart(HttpServletResponse response,@PathVariable String imei ,@PathVariable Integer restart) throws IOException {
String url = getServiceAdrres(response,imei);
if(null == url)
{
return null;
}
Map<String,Object> valueMap = new HashMap<>();
valueMap.put("restart",restart);
Response response1 = HttpUtils.postJsonBody(url, formBody -> {
formBody.put("0",valueMap);
});
return response1.body().string();
}
@ApiOperation("获取指定设备版本信息")
@ApiImplicitParams({
@ApiImplicitParam(value = "主机imei",name = "imei"),
})
@ResponseBody
@PostMapping("/getFirmwareVersion/{imei}")
public String getFirmwareVersion(HttpServletResponse response,@PathVariable String imei) throws IOException {
IotDevice iotDevice = iotDeviceService.selectIotDeviceByClient_id(imei);
response.setCharacterEncoding("UTF-8");
if(StringUtils.isEmpty(iotDevice.getListen_service_ip()))
{
response.getWriter().print(new Message(MessageCode.DEFAULT_FAIL_CODE,"未找到设备监听服务地址"));
return null;
}
String url = "http://"+iotDevice.getListen_service_ip()+"device/getFirmwareVersion/"+iotDevice.getMqtt_username();
Response response1 = HttpUtils.postFromBody(url, builder -> {
}, formBody -> {
});
return response1.body().string();
}
@ApiOperation("强行断开链接")
@ApiImplicitParams({
@ApiImplicitParam(value = "主机imei",name = "imei"),
})
@ResponseBody
@PostMapping("/closeSession/{imei}")
public String closeSession(HttpServletResponse response,@PathVariable String imei) throws IOException {
IotDevice iotDevice = iotDeviceService.selectIotDeviceByClient_id(imei);
response.setCharacterEncoding("UTF-8");
if(StringUtils.isEmpty(iotDevice.getListen_service_ip()))
{
response.getWriter().print(new Message(MessageCode.DEFAULT_FAIL_CODE,"未找到设备监听服务地址"));
return null;
}
String url = "http://"+iotDevice.getListen_service_ip()+"device/closeSession/"+imei;
Response response1 = HttpUtils.postFromBody(url, builder -> {
}, formBody -> {
});
return response1.body().string();
}
@ApiOperation("删除主机")
@ApiImplicitParams({
@ApiImplicitParam(value = "主机imei",name = "imei"),
})
@Transactional
@ResponseBody
@PostMapping("/delIotDevice/{imei}")
public String delIotDevice(HttpServletResponse response,@PathVariable String imei) {
IotDevice iotDevice = iotDeviceService.selectIotDeviceByClient_id(imei);
iotDeviceService.deleteIotDeviceByClient_id(imei);
iIotTerminalService.deleteIotTerminalByDeviceId(imei);
response.setCharacterEncoding("UTF-8");
if(StringUtils.isEmpty(iotDevice.getListen_service_ip()))
{
return JSONObject.toJSONString(new Message(MessageCode.DEFAULT_SUCCESS_CODE,"删除成功"));
}
String url = "http://"+iotDevice.getListen_service_ip()+"device/delIotDevice/"+imei;
try {
String str = HttpUtils.getResponseString(HttpUtils.postFromBody(url, builder -> {
}, formBody -> {
}));
if(null != str)
{
return str;
}
} catch (IOException e) {
}
return JSONObject.toJSONString(new Message(MessageCode.DEFAULT_SUCCESS_CODE,"删除成功"));
}
@ApiOperation("删除终端")
@ApiImplicitParams({
@ApiImplicitParam(value = "主机imei",name = "imei"),
})
@ResponseBody
@PostMapping("/delIotTerminal/{imei}/{number}")
public String delIotTerminal(@PathVariable String imei,@PathVariable String number) {
return iIotTerminalService.deleteIotTerminalById(imei,number);
}
@ApiOperation(value = "读取属性")
@ApiImplicitParams({
@ApiImplicitParam(value = "主机imei",name = "imei"),
@ApiImplicitParam(value = "传感器编号(0,1_1,10_1)",name = "sensor_number"),
@ApiImplicitParam(value = "属性集合(id1,id2,id3)",name = "attributes"),
})
@PreAuthorize("@ss.hasPermi('iot:iotDeviceControl:upSummary')")
@Log(title = "设备控制", businessType = BusinessType.UPDATE)
@ResponseBody
@PostMapping("/readAttribute/{imei}/{sensor_number}")
public String readAttribute(HttpServletResponse response,@PathVariable String imei,@PathVariable String sensor_number,String attributes) throws IOException {
IotDevice iotDevice = iotDeviceService.selectIotDeviceByClient_id(imei);
response.setCharacterEncoding("UTF-8");
if(StringUtils.isEmpty(iotDevice.getListen_service_ip()))
{
response.getWriter().print(new Message(MessageCode.DEFAULT_FAIL_CODE,"未找到设备监听服务地址"));
return null;
}
String url = "http://"+iotDevice.getListen_service_ip()+"device/read/"+imei;
Map<String,Object> map = new HashMap<>();
map.put(sensor_number,attributes);
Response response1 = HttpUtils.postJsonBody(url, jsonObject -> jsonObject.putAll(map));
return response1.body().string();
}
@ApiOperation(value = "设置主机自定义参数",notes = "自定义数据模型:\n" +
"{\n" +
" \t \"name\": \"wumei-smart\",\n" +
" \t \"chip\": \"esp8266\",\n" +
" \t \"author\": \"kerwincui\",\n" +
" \t \"version\": 1.2,\n" +
" \t \"createTime\": \"2022-06-06\"\n" +
" }")
@ApiImplicitParams({
@ApiImplicitParam(value = "主机imei",name = "imei"),
@ApiImplicitParam(value = "自定义数据json字符串",name = "summary")
})
@PreAuthorize("@ss.hasPermi('iot:iotDeviceControl:upSummary')")
@Log(title = "设备控制", businessType = BusinessType.UPDATE)
@ResponseBody
@PostMapping("/upSummary/{imei}")
public String upSummary(HttpServletResponse response,@PathVariable String imei,String summary) throws IOException {
String url = getServiceAdrres(response,imei);
if(null == url)
{
return null;
}
Map<String,Object> valueMap = new HashMap<>();
valueMap.put("summary",JSONObject.parseObject(summary));
Response response1 = HttpUtils.postJsonBody(url,formBody -> {
formBody.put("0", valueMap);
});
return response1.body().string();
}
@ApiOperation(value = "修改指定终端属性",notes = "配置参数模型:\n" +
"{\n" +
" \"id1\":\"value1\",\n" +
" \"id2\":\"value2\",\n" +
" \"id3\":\"value3\"\n" +
" }")
@ApiImplicitParams({
@ApiImplicitParam(value = "主机imei",name = "imei"),
@ApiImplicitParam(value = "终端编号(如:1_1)",name = "number"),
@ApiImplicitParam(value = "配置参数json字符串",name = "config")
})
@PreAuthorize("@ss.hasPermi('iot:iotDeviceControl:upTerminalConfig')")
@Log(title = "设备控制", businessType = BusinessType.UPDATE)
@ResponseBody
@PostMapping("/upTerminalConfig/{imei}/{number}")
public String upTerminalConfig(HttpServletResponse response, @PathVariable String imei,@PathVariable String number,@RequestBody Map<String,Object> config) throws IOException {
String url = getServiceAdrres(response,imei);
if(null == url)
{
return null;
}
Map<String,Object> map = new HashMap<>();
map.put(number,config);
Response response1 = HttpUtils.postJsonBody(url, jsonObject -> jsonObject.putAll(map));
return response1.body().string();
}
@ApiOperation(value = "批量修改终端属性",notes = "批量数据模型:\n" +
"{\n" +
" \"1\":{\n" +
" \"id1\":\"value1\",\n" +
" \"id2\":\"value2\",\n" +
" \"id3\":\"value3\"\n" +
" },\n" +
" \"3\":{\n" +
" \"id1\":\"value1\",\n" +
" \"id2\":\"value2\",\n" +
" \"id3\":\"value3\"\n" +
" },\n" +
" \"4\":{\n" +
" \"id1\":\"value1\",\n" +
" \"id2\":\"value2\",\n" +
" \"id3\":\"value3\"\n" +
" }\n" +
"}")
@ApiImplicitParam(value = "批量数据json字符串",name = "map")
@PreAuthorize("@ss.hasPermi('iot:iotDeviceControl:batchUpTerminalConfig')")
@Log(title = "设备控制", businessType = BusinessType.UPDATE)
@ResponseBody
@PostMapping("/batchUpTerminalConfig/{imei}")
public String batchUpTerminalConfig(HttpServletResponse response,@PathVariable String imei,@RequestBody Map<String,Object> map) throws IOException {
String url = getServiceAdrres(response,imei);
if(null == url)
{
return null;
}
Response response1 = HttpUtils.postJsonBody(url, builder -> {
}, formBody -> {
for (String key:map.keySet())
{
formBody.put(key, map.get(key));
}
});
return response1.body().string();
}
}
... ...
package com.zhonglai.luhui.api.controller.iot;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.system.domain.IotTerminal;
import com.ruoyi.system.domain.UserTerminalGroupRelation;
import com.ruoyi.system.service.IIotTerminalService;
import com.ruoyi.system.service.IUserTerminalGroupRelationService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.handler.UserRoleAuthorizationInterceptor;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
/**
* 终端Controller
*
* @author 钟来
* @date 2022-08-26
*/
@Api(tags = "终端")
@RestController
@RequestMapping("/iot/IotTerminal")
public class IotTerminalController extends BaseController
{
@Autowired
private IIotTerminalService iotTerminalService;
@Autowired
private IUserTerminalGroupRelationService userTerminalGroupRelationService;
@ApiOperation("查询终端列表")
@PreAuthorize("@ss.hasPermi('iot:IotTerminal:list')")
@GetMapping("/list")
public TableDataInfo list(IotTerminal iotTerminal)
{
startPage();
List<IotTerminal> list = iotTerminalService.selectIotTerminalList(iotTerminal);
return getDataTable(list);
}
@ApiOperation("获取终端详细信息")
@ApiImplicitParam(value = "终端id",name = "id")
@PreAuthorize("@ss.hasPermi('iot:IotTerminal:getInfo')")
@GetMapping(value = "/{id}")
public AjaxResult getInfo(@PathVariable("id") String id)
{
return AjaxResult.success(iotTerminalService.selectIotTerminalById(id));
}
@ApiOperation("根据网关获取未分配终端")
@ApiImplicitParam(value = "网关id",name = "imei")
@PreAuthorize("@ss.hasPermi('iot:IotTerminal:getListByDevice')")
@GetMapping(value = "/getListByDevice{imei}")
public AjaxResult getListByDevice(@PathVariable("imei") String imei)
{
List<IotTerminal> list = iotTerminalService.selectNotUserIotTerminalListByImei(imei);
return AjaxResult.success(list);
}
@ApiOperation("修改终端")
@ApiImplicitParams({
@ApiImplicitParam(value = "终端id",name = "id"),
@ApiImplicitParam(value = "终端名称",name = "name"),
})
@PreAuthorize("@ss.hasPermi('iot:IotTerminal:editName')")
@Log(title = "终端", businessType = BusinessType.UPDATE)
@PostMapping("/editName")
public AjaxResult editName(String id,String name)
{
IotTerminal iotTerminal = new IotTerminal();
iotTerminal.setName(name);
iotTerminal.setId(id);
iotTerminal.setUpdate_time(DateUtils.getNowTimeMilly());
return toAjax(iotTerminalService.updateIotTerminal(iotTerminal));
}
@ApiOperation("分组终端")
@ApiImplicitParams({
@ApiImplicitParam(value = "终端id集合",name = "ids"),
@ApiImplicitParam(value = "分组id",name = "iot_terminal_group_id"),
})
@PreAuthorize("@ss.hasPermi('iot:IotTerminal:groupTerminal')")
@Log(title = "终端", businessType = BusinessType.UPDATE)
@PostMapping("/groupTerminal")
public AjaxResult groupTerminal(Integer iot_terminal_group_id,@RequestBody List<String> ids)
{
Integer userid= getUserId().intValue();
List<UserTerminalGroupRelation> list = userTerminalGroupRelationService.selectListByTerminalIds(ids.toArray(new String[ids.size()]));
if( null != list && list.size() != 0) //判断是否有权限删除
{
StringBuffer iot_terminal_ids = new StringBuffer();
for (UserTerminalGroupRelation userTerminalGroupRelation:list)
{
if(userTerminalGroupRelation.getUser_info_id()-userid != 0)
{
iot_terminal_ids.append(userTerminalGroupRelation.getIot_terminal_id()+" ");
}
}
if(iot_terminal_ids.length()!=0)
{
return AjaxResult.error("无权操作设备"+iot_terminal_ids.toString());
}
}
return toAjax( userTerminalGroupRelationService.groupTerminal(iot_terminal_group_id,ids,userid));
}
}
... ...
... ... @@ -6,9 +6,12 @@ import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.login.service.LoginService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
... ... @@ -23,6 +26,10 @@ public class ApiLoginController extends BaseController {
private LoginService loginService;
@ApiOperation("账号密码登陆")
@ApiImplicitParams({
@ApiImplicitParam(value = "账号",name = "user"),
@ApiImplicitParam(value = "密码",name = "pass"),
})
@PostMapping("/userpassLogin")
public AjaxResult userpassLogin(String user,String pass)
{
... ... @@ -34,10 +41,10 @@ public class ApiLoginController extends BaseController {
}
@ApiOperation("鱼儿乐token登陆")
@ApiImplicitParam(value = "鱼儿乐token",name = "loginToken")
@PostMapping("/yu2leTokenLogin")
public AjaxResult yu2leTokenLogin(HttpServletRequest request)
public AjaxResult yu2leTokenLogin(@RequestHeader String loginToken)
{
String loginToken = request.getHeader(YU2LE_LOGIN_TOKEN_KEY);
if(StringUtils.isEmpty(loginToken))
{
return AjaxResult.error("请输入鱼儿乐令牌");
... ...
... ... @@ -3,7 +3,10 @@ package com.zhonglai.luhui.api.controller.user;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import com.ruoyi.common.utils.DateUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired;
... ... @@ -52,20 +55,6 @@ public class UserTerminalGroupController extends BaseController
return getDataTable(list);
}
/**
* 导出终端分组列表
*/
@ApiOperation("导出终端分组列表")
@PreAuthorize("@ss.hasPermi('user:UserTerminalGroup:export')")
@Log(title = "终端分组", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(HttpServletResponse response, UserTerminalGroup userTerminalGroup)
{
userTerminalGroup.setUser_info_id(getUserId().intValue());
List<UserTerminalGroup> list = userTerminalGroupService.selectUserTerminalGroupList(userTerminalGroup);
ExcelUtil<UserTerminalGroup> util = new ExcelUtil<UserTerminalGroup>(UserTerminalGroup.class);
util.exportExcel(response, list, "终端分组数据");
}
/**
* 获取终端分组详细信息
... ... @@ -87,6 +76,8 @@ public class UserTerminalGroupController extends BaseController
@PostMapping
public AjaxResult add(@RequestBody UserTerminalGroup userTerminalGroup)
{
userTerminalGroup.setUser_info_id(getUserId().intValue());
userTerminalGroup.setCreate_time(DateUtils.getNowTimeMilly());
return toAjax(userTerminalGroupService.insertUserTerminalGroup(userTerminalGroup));
}
... ... @@ -94,11 +85,18 @@ public class UserTerminalGroupController extends BaseController
* 修改终端分组
*/
@ApiOperation("修改终端分组")
@ApiImplicitParams({
@ApiImplicitParam(value = "分组名称",name = "name"),
@ApiImplicitParam(value = "分组id",name = "id"),
})
@PreAuthorize("@ss.hasPermi('user:UserTerminalGroup:edit')")
@Log(title = "终端分组", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody UserTerminalGroup userTerminalGroup)
public AjaxResult edit(String name,Integer id)
{
UserTerminalGroup userTerminalGroup = new UserTerminalGroup();
userTerminalGroup.setId(id);
userTerminalGroup.setName(name);
return toAjax(userTerminalGroupService.updateUserTerminalGroup(userTerminalGroup));
}
... ...
# 项目相关配置 jhlt: # 名称 name: zhonglai # 版本 version: 3.8.2 # 版权年份 copyrightYear: 2022 # 实例演示开关 demoEnabled: true # 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath) profile: D:/ruoyi/uploadPath # 获取ip地址开关 addressEnabled: false # 验证码类型 math 数组计算 char 字符验证 captchaType: math # 开发环境配置 server: # 服务器的HTTP端口,默认为8080 port: 8080 servlet: # 应用的访问路径 context-path: / tomcat: # tomcat的URI编码 uri-encoding: UTF-8 # 连接数满后的排队数,默认为100 accept-count: 1000 threads: # tomcat最大线程数,默认为200 max: 800 # Tomcat启动初始化的线程数,默认值10 min-spare: 100 # 日志配置 logging: level: com.ruoyi: debug org.springframework: warn # Spring配置 spring: # 资源信息 messages: # 国际化资源文件路径 basename: i18n/messages profiles: active: druid # 文件上传 servlet: multipart: # 单个文件大小 max-file-size: 10MB # 设置总上传的文件大小 max-request-size: 20MB # 服务模块 devtools: restart: # 热部署开关 enabled: true # redis 配置 redis: # 地址 host: 47.112.163.61 # 端口,默认为6379 port: 9527 # 数据库索引 database: 1 # 密码 password: Luhui586 # 连接超时时间 timeout: 10s lettuce: pool: # 连接池中的最小空闲连接 min-idle: 0 # 连接池中的最大空闲连接 max-idle: 8 # 连接池的最大数据库连接数 max-active: 8 # #连接池最大阻塞等待时间(使用负值表示没有限制) max-wait: -1ms # token配置 token: # 令牌自定义标识 header: Authorization # 令牌密钥 secret: abcdefghijklmnopqrstuvwxyz # 令牌有效期(默认30分钟) expireTime: 1440 rediskey: lh-api # MyBatis配置 mybatis: # 搜索指定包别名 typeAliasesPackage: com.ruoyi.**.domain # 配置mapper的扫描,找到所有的mapper.xml映射文件 mapperLocations: classpath*:mapper/**/*Mapper.xml # 加载全局的配置文件 configLocation: classpath:mybatis/mybatis-config.xml # PageHelper分页插件 pagehelper: helperDialect: mysql supportMethodsArguments: true params: count=countSql # Swagger配置 swagger: # 是否开启swagger enabled: true # 请求前缀 pathMapping: /dev-api # 防止XSS攻击 xss: # 过滤开关 enabled: true # 排除链接(多个用逗号分隔) excludes: /system/notice # 匹配链接 urlPatterns: /system/*,/monitor/*,/tool/* mqtt: client: device_life: 180 sys: ## // 对于登录login 注册register 验证码captchaImage 允许匿名访问 antMatchers: /login/ApiLogin/*
\ No newline at end of file
# 项目相关配置 jhlt: # 名称 name: zhonglai # 版本 version: 3.8.2 # 版权年份 copyrightYear: 2022 # 实例演示开关 demoEnabled: true # 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath) profile: D:/ruoyi/uploadPath # 获取ip地址开关 addressEnabled: false # 验证码类型 math 数组计算 char 字符验证 captchaType: math # 开发环境配置 server: # 服务器的HTTP端口,默认为8080 port: 18080 servlet: # 应用的访问路径 context-path: / tomcat: # tomcat的URI编码 uri-encoding: UTF-8 # 连接数满后的排队数,默认为100 accept-count: 1000 threads: # tomcat最大线程数,默认为200 max: 800 # Tomcat启动初始化的线程数,默认值10 min-spare: 100 # 日志配置 logging: level: com.ruoyi: debug org.springframework: warn # Spring配置 spring: # 资源信息 messages: # 国际化资源文件路径 basename: i18n/messages profiles: active: druid # 文件上传 servlet: multipart: # 单个文件大小 max-file-size: 10MB # 设置总上传的文件大小 max-request-size: 20MB # 服务模块 devtools: restart: # 热部署开关 enabled: true # redis 配置 redis: # 地址 host: 47.112.163.61 # 端口,默认为6379 port: 9527 # 数据库索引 database: 1 # 密码 password: Luhui586 # 连接超时时间 timeout: 10s lettuce: pool: # 连接池中的最小空闲连接 min-idle: 0 # 连接池中的最大空闲连接 max-idle: 8 # 连接池的最大数据库连接数 max-active: 8 # #连接池最大阻塞等待时间(使用负值表示没有限制) max-wait: -1ms # token配置 token: # 令牌自定义标识 header: Authorization # 令牌密钥 secret: abcdefghijklmnopqrstuvwxyz # 令牌有效期(默认30分钟) expireTime: 1440 rediskey: lh-api # MyBatis配置 mybatis: # 搜索指定包别名 typeAliasesPackage: com.ruoyi.**.domain # 配置mapper的扫描,找到所有的mapper.xml映射文件 mapperLocations: classpath*:mapper/**/*Mapper.xml # 加载全局的配置文件 configLocation: classpath:mybatis/mybatis-config.xml # PageHelper分页插件 pagehelper: helperDialect: mysql supportMethodsArguments: true params: count=countSql # Swagger配置 swagger: # 是否开启swagger enabled: true # 请求前缀 pathMapping: /dev-api # 防止XSS攻击 xss: # 过滤开关 enabled: true # 排除链接(多个用逗号分隔) excludes: /system/notice # 匹配链接 urlPatterns: /system/*,/monitor/*,/tool/* mqtt: client: device_life: 180 sys: ## // 对于登录login 注册register 验证码captchaImage 允许匿名访问 antMatchers: /login/ApiLogin/*
\ No newline at end of file
... ...
<?xml version="1.0" encoding="UTF-8"?>
<assembly>
<id>bin</id>
<!-- 最终打包成一个用于发布的zip文件 -->
<formats>
<format>zip</format>
</formats>
<!-- Adds dependencies to zip package under lib directory -->
<dependencySets>
<dependencySet>
<!--
不使用项目的artifact,第三方jar不要解压,打包进zip文件的lib目录
-->
<useProjectArtifact>false</useProjectArtifact>
<outputDirectory>lib</outputDirectory>
<unpack>false</unpack>
</dependencySet>
</dependencySets>
<fileSets>
<!-- 把项目相关的说明文件,打包进zip文件的根目录 -->
<fileSet>
<directory>${project.basedir}</directory>
<outputDirectory>/</outputDirectory>
<includes>
<include>README*</include>
<include>LICENSE*</include>
<include>NOTICE*</include>
</includes>
</fileSet>
<!-- 把项目的配置文件,打包进zip文件的config目录 -->
<fileSet>
<directory>${project.basedir}\src\main\resources\configs</directory>
<outputDirectory>../configs</outputDirectory>
<includes>
<include>*.properties</include>
</includes>
</fileSet>
<!-- 把项目的配置文件,提出来 -->
<fileSet>
<directory>${project.basedir}\src\main\resources</directory>
<outputDirectory>/</outputDirectory>
<includes>
<include>*.properties</include>
<include>*.yml</include>
</includes>
</fileSet>
<!-- 把项目的脚本文件目录( src/main/scripts )中的启动脚本文件,打包进zip文件的跟目录 -->
<fileSet>
<directory>${project.basedir}\bin</directory>
<outputDirectory></outputDirectory>
<includes>
<include>start.*</include>
<include>stop.*</include>
</includes>
</fileSet>
<!-- 把项目自己编译出来的jar文件,打包进zip文件的根目录 -->
<fileSet>
<directory>${project.build.directory}</directory>
<outputDirectory></outputDirectory>
<includes>
<include>*.jar</include>
</includes>
</fileSet>
</fileSets>
</assembly>
\ No newline at end of file
... ...
package com.ruoyi.system.mapper;
import java.util.List;
import java.util.Map;
import com.ruoyi.system.domain.IotTerminal;
/**
... ... @@ -59,4 +61,7 @@ public interface IotTerminalMapper
*/
public int deleteIotTerminalByIds(String[] ids);
int deleteIotTerminalByDeviceId(String deviceId);
List<IotTerminal> selectNotUserIotTerminalListByImei(String device_id);
}
... ...
... ... @@ -58,4 +58,6 @@ public interface UserTerminalGroupRelationMapper
* @return 结果
*/
public int deleteUserTerminalGroupRelationByIds(Integer[] ids);
List<UserTerminalGroupRelation> selectListByTerminalIds(String[] iot_terminal_ids);
}
... ...
package com.ruoyi.system.service;
import java.util.List;
import java.util.Map;
import com.ruoyi.system.domain.IotTerminal;
import org.springframework.web.bind.annotation.PathVariable;
/**
* nullService接口
... ... @@ -35,6 +38,8 @@ public interface IIotTerminalService
*/
public int insertIotTerminal(IotTerminal iotTerminal);
int addIotTerminals(Integer userId, List<String> ids);
/**
* 修改null
*
... ... @@ -54,10 +59,11 @@ public interface IIotTerminalService
/**
* 删除null信息
*
* @param id null主键
* @return 结果
*/
public int deleteIotTerminalById(String id);
public String deleteIotTerminalById(String imei, String number);
int deleteIotTerminalByDeviceId(String deviceId);
List<IotTerminal> selectNotUserIotTerminalListByImei(String device_id);
}
... ...
... ... @@ -2,6 +2,8 @@ package com.ruoyi.system.service;
import java.util.List;
import com.ruoyi.system.domain.UserTerminalGroupRelation;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
/**
* 终端分组关系Service接口
... ... @@ -58,4 +60,6 @@ public interface IUserTerminalGroupRelationService
* @return 结果
*/
public int deleteUserTerminalGroupRelationById(Integer id);
List<UserTerminalGroupRelation> selectListByTerminalIds(String[] iot_terminal_ids);
int groupTerminal(Integer iot_terminal_group_id, List<String> ids,Integer userId);
}
... ...
package com.ruoyi.system.service.impl;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.common.core.domain.Message;
import com.ruoyi.common.core.domain.MessageCode;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.html.HttpUtils;
import com.ruoyi.system.domain.IotDevice;
import com.ruoyi.system.service.IIotDeviceService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.system.mapper.IotTerminalMapper;
... ... @@ -20,7 +29,8 @@ public class IotTerminalServiceImpl implements IIotTerminalService
{
@Autowired
private IotTerminalMapper iotTerminalMapper;
@Autowired
private IIotDeviceService iotDeviceService;
/**
* 查询null
*
... ... @@ -57,6 +67,12 @@ public class IotTerminalServiceImpl implements IIotTerminalService
return iotTerminalMapper.insertIotTerminal(iotTerminal);
}
@Override
public int addIotTerminals(Integer userId, List<String> ids) {
return 0;
}
/**
* 修改null
*
... ... @@ -84,17 +100,41 @@ public class IotTerminalServiceImpl implements IIotTerminalService
/**
* 删除null信息
*
* @param id null主键
* @return 结果
*/
@Override
public int deleteIotTerminalById(String id)
public String deleteIotTerminalById(String imei, String number)
{
return iotTerminalMapper.deleteIotTerminalById(id);
IotDevice iotDevice = iotDeviceService.selectIotDeviceByClient_id(imei);
if(StringUtils.isEmpty(iotDevice.getListen_service_ip()))
{
return JSONObject.toJSONString(new Message(MessageCode.DEFAULT_SUCCESS_CODE,"删除成功"));
}
String url = "http://"+iotDevice.getListen_service_ip()+"device/delIotTerminal/"+imei+"/"+number;
String str = null;
try {
str = HttpUtils.getResponseString(HttpUtils.postFromBody(url, builder -> {
}, formBody -> {
}));
} catch (IOException e) {
}
iotTerminalMapper.deleteIotTerminalById(imei+"_"+number);
if(null != str)
{
return str;
}
return JSONObject.toJSONString(new Message(MessageCode.DEFAULT_SUCCESS_CODE,"删除成功"));
}
@Override
public int deleteIotTerminalByDeviceId(String deviceId) {
return iotTerminalMapper.deleteIotTerminalByDeviceId(deviceId);
}
@Override
public List<IotTerminal> selectNotUserIotTerminalListByImei(String device_id) {
return iotTerminalMapper.selectNotUserIotTerminalListByImei(device_id);
}
}
... ...
package com.ruoyi.system.service.impl;
import java.util.ArrayList;
import java.util.List;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.system.domain.UserTerminalGroup;
import com.ruoyi.system.service.IUserTerminalGroupService;
import com.ruoyi.system.service.PublicService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.system.mapper.UserTerminalGroupRelationMapper;
import com.ruoyi.system.domain.UserTerminalGroupRelation;
import com.ruoyi.system.service.IUserTerminalGroupRelationService;
import org.springframework.transaction.annotation.Transactional;
/**
* 终端分组关系Service业务层处理
... ... @@ -14,11 +21,16 @@ import com.ruoyi.system.service.IUserTerminalGroupRelationService;
* @date 2022-11-22
*/
@Service
public class UserTerminalGroupRelationServiceImpl implements IUserTerminalGroupRelationService
public class UserTerminalGroupRelationServiceImpl implements IUserTerminalGroupRelationService
{
@Autowired
private UserTerminalGroupRelationMapper userTerminalGroupRelationMapper;
@Autowired
private PublicService publicService;
@Autowired
private IUserTerminalGroupService userTerminalGroupService;
/**
* 查询终端分组关系
*
... ... @@ -90,4 +102,52 @@ public class UserTerminalGroupRelationServiceImpl implements IUserTerminalGroupR
{
return userTerminalGroupRelationMapper.deleteUserTerminalGroupRelationById(id);
}
@Override
public List<UserTerminalGroupRelation> selectListByTerminalIds(String[] iot_terminal_ids) {
return userTerminalGroupRelationMapper.selectListByTerminalIds(iot_terminal_ids);
}
@Override
@Transactional
public int groupTerminal(Integer iot_terminal_group_id, List<String> ids,Integer userId) {
UserTerminalGroup userTerminalGroup = null;
if(null != iot_terminal_group_id)
{
userTerminalGroup = userTerminalGroupService.selectUserTerminalGroupById(iot_terminal_group_id);
if(null == userTerminalGroup)
{
throw new RuntimeException("分组不存在");
}
}
List<UserTerminalGroupRelation > saveList = new ArrayList<>();
StringBuffer inids = new StringBuffer();
for(String id:ids)
{
if(inids.length() !=0)
{
inids.append(",");
}
inids.append("'"+id+"'");
UserTerminalGroupRelation userTerminalGroupRelation = new UserTerminalGroupRelation();
userTerminalGroupRelation.setIot_terminal_id(id);
userTerminalGroupRelation.setUser_info_id(userId);
userTerminalGroupRelation.setCreate_time(DateUtils.getNowTimeMilly());
if(null != userTerminalGroup)
{
userTerminalGroupRelation.setIot_terminal_group_id(userTerminalGroup.getId());
userTerminalGroupRelation.setIot_terminal_group_name(userTerminalGroup.getName());
}
saveList.add(userTerminalGroupRelation);
}
publicService.updateBySql("delete from user_terminal_group_relation where iot_terminal_id in("+inids.toString()+")");
if(null != saveList && saveList.size() != 0)
{
return publicService.insertAll(saveList);
}
return 0;
}
}
... ...
... ... @@ -98,4 +98,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
#{id}
</foreach>
</delete>
<select id="selectNotUserIotTerminalListByImei" parameterType="String" resultMap="IotTerminalResult">
SELECT a.* FROM `iot_terminal` a LEFT JOIN `user_terminal_group_relation` b ON a.`id`=b.`iot_terminal_id` WHERE b.user_info_id is not null AND a.`device_id`= #{device_id}
</select>
</mapper>
\ No newline at end of file
... ...
... ... @@ -68,4 +68,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
#{id}
</foreach>
</delete>
<select id="selectListByTerminalIds" parameterType="String" resultMap="UserTerminalGroupRelationResult">
select * from `user_terminal_group_relation` where iot_terminal_id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</select>
</mapper>
\ No newline at end of file
... ...