feat(): 增加负载服务配置页面

v1.0
DongZeLiang 2024-06-10 21:26:43 +08:00
parent 2d09c01505
commit 4fad375676
24 changed files with 548 additions and 33 deletions

View File

@ -4,6 +4,7 @@ import com.dtflys.forest.annotation.BaseRequest;
import com.dtflys.forest.annotation.JSONBody;
import com.dtflys.forest.annotation.Post;
import com.muyu.web.common.Result;
import com.muyu.web.config.properties.ServiceConfigProperties;
import com.muyu.web.domain.model.MqttServerModel;
import com.muyu.vehicle.api.req.VehicleConnectionReq;
@ -12,11 +13,16 @@ import com.muyu.vehicle.api.req.VehicleConnectionReq;
* @description:
* @Date 2023-11-28 10:20
*/
@BaseRequest(
baseURL = "${adminHost}"
)
public interface ClientAdmin {
@Post("${adminTopicUri}")
public Result<MqttServerModel> vehicleConnection(@JSONBody VehicleConnectionReq vehicleConnectionReq);
/**
*
* @param serviceConfigProperties
* @param vehicleConnectionReq
* @return
*/
@Post(
url = "{vehicleLoadUrl}"
)
public Result<MqttServerModel> getVehicleLoadAddr (ServiceConfigProperties serviceConfigProperties, @JSONBody VehicleConnectionReq vehicleConnectionReq);
}

View File

@ -0,0 +1,32 @@
package com.muyu.web.config;
import com.dtflys.forest.annotation.BindingVar;
import com.dtflys.forest.reflection.ForestMethod;
import com.muyu.web.config.properties.ServiceConfigProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Service;
/**
* @Author: DongZeLiang
* @date: 2024/6/10
* @Description: Forest
* @Version: 1.0
*/
@Service("forsetConfig")
public class ForsetConfig {
@Autowired
private ServiceConfigProperties serviceConfigProperties;
/**
* 使 @BindingVar
* baseUrl
* ForestMethod
*/
@BindingVar("vehicleLoadUrl")
public String getBaseUrl() {
return serviceConfigProperties.getLoadReqUrl();
}
}

View File

@ -0,0 +1,35 @@
package com.muyu.web.config;
import com.muyu.web.config.properties.ServiceConfigProperties;
import com.muyu.web.domain.ServerConfig;
import com.muyu.web.domain.model.ServerConfigModel;
import com.muyu.web.service.ServerConfigService;
import lombok.AllArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @Author: DongZeLiang
* @date: 2024/6/10
* @Description:
* @Version: 1.0
*/
@Configuration
public class LoadServerConfig {
/**
*
*/
private static final ServiceConfigProperties serviceConfigProperties = new ServiceConfigProperties();
@Bean
public ServiceConfigProperties serverConfig(ServerConfigService serverConfigService) {
return serviceConfigProperties.modelToProperties(serverConfigService.get());
}
public static void modelToProperties(ServerConfigModel serverConfigModel){
serviceConfigProperties.modelToProperties(serverConfigModel);
}
}

View File

@ -0,0 +1,66 @@
package com.muyu.web.config.properties;
import com.muyu.web.domain.model.ServerConfigModel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @Author: DongZeLiang
* @date: 2024/6/10
* @Description:
* @Version: 1.0
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ServiceConfigProperties {
/**
*
*/
private String host;
/**
*
*/
private String port;
/**
*
*/
private String loadUrl;
/**
*
*/
private String loadReqUrl;
/**
* MQTT
*/
private String mqttAddr;
/**
* MQTT
*/
private String mqttTopic;
/**
* MQTT
*/
private Integer mqttQos;
/**
*
* @param serverConfigModel
* @return
*/
public ServiceConfigProperties modelToProperties(ServerConfigModel serverConfigModel) {
this.host = serverConfigModel.getHost();
this.port = serverConfigModel.getPort();
this.loadUrl = serverConfigModel.getLoadUrl();
this.mqttAddr = serverConfigModel.getDefaultMqttAddr();
this.mqttTopic = serverConfigModel.getDefaultMqttTopic();
this.mqttQos = serverConfigModel.getDefaultMqttQos();
this.loadReqUrl = String.format("http://%s:%s%s", host, port, loadUrl.startsWith("/") ? loadUrl : "/" + loadUrl);
return this;
}
}

View File

@ -0,0 +1,37 @@
package com.muyu.web.controller;
import com.muyu.web.common.Result;
import com.muyu.web.domain.model.ServerConfigModel;
import com.muyu.web.domain.req.ServerConfigEditReq;
import com.muyu.web.domain.resp.ServerConfigResp;
import com.muyu.web.service.ServerConfigService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
* @Author: DongZeLiang
* @date: 2024/6/10
* @Description:
* @Version: 1.0
*/
@RestController
@RequestMapping("/vehicle/server/config")
public class ServerConfigController {
@Autowired
private ServerConfigService serverConfigService;
@GetMapping
public Result<ServerConfigResp> get() {
ServerConfigModel serverConfigModel = serverConfigService.get();
return Result.success(ServerConfigResp.modelBuild(serverConfigModel));
}
@PutMapping
public Result<String> edit(@RequestBody ServerConfigEditReq serverConfigReq) {
serverConfigService.edit(
ServerConfigModel.editReqBuild(serverConfigReq)
);
return Result.success();
}
}

View File

@ -1,8 +1,9 @@
package com.muyu.web.controller;
import com.muyu.web.common.Result;
import com.muyu.web.config.properties.ServiceConfigProperties;
import com.muyu.web.domain.model.MqttServerModel;
import org.springframework.beans.factory.annotation.Value;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@ -14,14 +15,10 @@ import org.springframework.web.bind.annotation.RestController;
*/
@RestController
@RequestMapping("/verify")
@AllArgsConstructor
public class VerifyController {
@Value("${mqtt.server.host}")
private String broker;
@Value("${mqtt.server.topic}")
private String topic;
private final ServiceConfigProperties serviceConfigProperties;
/**
@ -32,8 +29,8 @@ public class VerifyController {
public Result<MqttServerModel> vehicleConnection(){
return Result.success(
MqttServerModel.builder()
.broker(broker)
.topic(topic)
.broker(serviceConfigProperties.getMqttAddr())
.topic(serviceConfigProperties.getMqttTopic())
.build()
);
}

View File

@ -0,0 +1,65 @@
package com.muyu.web.domain;
import com.baomidou.mybatisplus.annotation.TableName;
import com.muyu.web.domain.model.ServerConfigModel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.function.Supplier;
/**
* @Author: DongZeLiang
* @date: 2024/6/10
* @Description:
* @Version: 1.0
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@TableName(value = "server_config")
public class ServerConfig {
/**
*
*/
private Integer id;
/**
*
*/
private String host;
/**
*
*/
private String port;
/**
*
*/
private String loadUrl;
/**
* MQTT
*/
private String defaultMqttAddr;
/**
* MQTT
*/
private String defaultMqttTopic;
/**
* MQTT
*/
private Integer defaultMqttQos;
public static ServerConfig modeBuild (ServerConfigModel serverConfigModel, Supplier<Integer> idKey) {
return builder()
.id(idKey.get())
.host(serverConfigModel.getHost())
.port(serverConfigModel.getPort())
.loadUrl(serverConfigModel.getLoadUrl())
.defaultMqttAddr(serverConfigModel.getDefaultMqttAddr())
.defaultMqttTopic(serverConfigModel.getDefaultMqttTopic())
.defaultMqttQos(serverConfigModel.getDefaultMqttQos())
.build();
}
}

View File

@ -0,0 +1,69 @@
package com.muyu.web.domain.model;
import com.baomidou.mybatisplus.annotation.TableName;
import com.muyu.web.domain.ServerConfig;
import com.muyu.web.domain.req.ServerConfigEditReq;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @Author: DongZeLiang
* @date: 2024/6/10
* @Description:
* @Version: 1.0
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ServerConfigModel {
/**
*
*/
private String host;
/**
*
*/
private String port;
/**
*
*/
private String loadUrl;
/**
* MQTT
*/
private String defaultMqttAddr;
/**
* MQTT
*/
private String defaultMqttTopic;
/**
* MQTT
*/
private Integer defaultMqttQos;
public static ServerConfigModel serverConfigBuild (ServerConfig serverConfig) {
return builder()
.host(serverConfig.getHost().trim())
.port(serverConfig.getPort())
.loadUrl(serverConfig.getLoadUrl().trim())
.defaultMqttAddr(serverConfig.getDefaultMqttAddr().trim())
.defaultMqttTopic(serverConfig.getDefaultMqttTopic().trim())
.defaultMqttQos(serverConfig.getDefaultMqttQos())
.build();
}
public static ServerConfigModel editReqBuild (ServerConfigEditReq serverConfigReq) {
return builder()
.host(serverConfigReq.getHost().trim())
.port(serverConfigReq.getPort())
.loadUrl(serverConfigReq.getLoadUrl().trim())
.defaultMqttAddr(serverConfigReq.getDefaultMqttAddr().trim())
.defaultMqttTopic(serverConfigReq.getDefaultMqttTopic().trim())
.defaultMqttQos(serverConfigReq.getDefaultMqttQos())
.build();
}
}

View File

@ -0,0 +1,45 @@
package com.muyu.web.domain.req;
import com.muyu.web.domain.model.ServerConfigModel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @Author: DongZeLiang
* @date: 2024/6/10
* @Description:
* @Version: 1.0
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ServerConfigEditReq {
/**
*
*/
private String host;
/**
*
*/
private String port;
/**
*
*/
private String loadUrl;
/**
* MQTT
*/
private String defaultMqttAddr;
/**
* MQTT
*/
private String defaultMqttTopic;
/**
* MQTT
*/
private Integer defaultMqttQos;
}

View File

@ -0,0 +1,58 @@
package com.muyu.web.domain.resp;
import com.baomidou.mybatisplus.annotation.TableName;
import com.muyu.web.domain.model.ServerConfigModel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @Author: DongZeLiang
* @date: 2024/6/10
* @Description:
* @Version: 1.0
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ServerConfigResp {
/**
*
*/
private String host;
/**
*
*/
private String port;
/**
*
*/
private String loadUrl;
/**
* MQTT
*/
private String defaultMqttAddr;
/**
* MQTT
*/
private String defaultMqttTopic;
/**
* MQTT
*/
private Integer defaultMqttQos;
public static ServerConfigResp modelBuild(ServerConfigModel serverConfigModel){
return builder()
.host(serverConfigModel.getHost())
.port(serverConfigModel.getPort())
.loadUrl(serverConfigModel.getLoadUrl())
.defaultMqttAddr(serverConfigModel.getDefaultMqttAddr())
.defaultMqttTopic(serverConfigModel.getDefaultMqttTopic())
.defaultMqttQos(serverConfigModel.getDefaultMqttQos())
.build();
}
}

View File

@ -2,11 +2,13 @@ package com.muyu.web.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.muyu.web.domain.PositionRouteInfo;
import org.apache.ibatis.annotations.Mapper;
/**
* @author DongZl
* @description: mapper
* @Date 2023-11-20 09:32
*/
@Mapper
public interface PositionRouteMapper extends BaseMapper<PositionRouteInfo> {
}

View File

@ -0,0 +1,15 @@
package com.muyu.web.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.muyu.web.domain.ServerConfig;
import org.apache.ibatis.annotations.Mapper;
/**
* @Author: DongZeLiang
* @date: 2024/6/10
* @Description: Mapper
* @Version: 1.0
*/
@Mapper
public interface ServerConfigMapper extends BaseMapper<ServerConfig> {
}

View File

@ -2,6 +2,7 @@ package com.muyu.web.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.muyu.web.domain.Vehicle;
import org.apache.ibatis.annotations.Mapper;
/**
* <p>
@ -11,6 +12,7 @@ import com.muyu.web.domain.Vehicle;
* @author DongZeLiang
* @since 2022-07-05
*/
@Mapper
public interface VehicleMapper extends BaseMapper<Vehicle> {
}

View File

@ -0,0 +1,26 @@
package com.muyu.web.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.muyu.web.domain.ServerConfig;
import com.muyu.web.domain.model.ServerConfigModel;
/**
* @Author: DongZeLiang
* @date: 2024/6/10
* @Description:
* @Version: 1.0
*/
public interface ServerConfigService extends IService<ServerConfig> {
/**
*
* @return
*/
ServerConfigModel get ();
/**
*
* @param serverConfigModel
*/
void edit (ServerConfigModel serverConfigModel);
}

View File

@ -0,0 +1,49 @@
package com.muyu.web.service.impl;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.muyu.web.config.LoadServerConfig;
import com.muyu.web.config.properties.ServiceConfigProperties;
import com.muyu.web.domain.ServerConfig;
import com.muyu.web.domain.model.ServerConfigModel;
import com.muyu.web.service.ServerConfigService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @Author: DongZeLiang
* @date: 2024/6/10
* @Description:
* @Version: 1.0
*/
@Service
public class ServerConfigServiceImpl extends ServiceImpl<BaseMapper<ServerConfig>, ServerConfig> implements ServerConfigService {
/**
* Key
*/
private final Integer key = 1;
/**
*
*
* @return
*/
@Override
public ServerConfigModel get () {
ServerConfig serverConfig = getById(key);
return ServerConfigModel.serverConfigBuild(serverConfig);
}
/**
*
*
* @param serverConfigModel
*/
@Override
public void edit (ServerConfigModel serverConfigModel) {
ServerConfig serverConfig = ServerConfig.modeBuild(serverConfigModel, () -> key);
updateById(serverConfig);
LoadServerConfig.modelToProperties(serverConfigModel);
}
}

View File

@ -2,6 +2,7 @@ package com.muyu.web.service.impl;
import com.muyu.web.common.PageList;
import com.muyu.web.common.Result;
import com.muyu.web.config.properties.ServiceConfigProperties;
import com.muyu.web.domain.Vehicle;
import com.muyu.web.domain.model.MqttServerModel;
import com.muyu.web.domain.model.PositionModel;
@ -46,6 +47,9 @@ public class VehicleInstanceServiceImpl implements VehicleInstanceService {
@Autowired
private ClientAdmin clientAdmin;
@Autowired
private ServiceConfigProperties serviceConfigProperties;
/**
*
*
@ -111,7 +115,8 @@ public class VehicleInstanceServiceImpl implements VehicleInstanceService {
.userName(MD5Util.encrypted(vin+timestamp))
.nonce(MD5Util.encrypted(UUID.randomUUID().toString().replace("-", "")))
.build();
Result<MqttServerModel> result = clientAdmin.vehicleConnection(connectionReq);
// 从负载均衡服务器获取配置信息
Result<MqttServerModel> result = clientAdmin.getVehicleLoadAddr(serviceConfigProperties, connectionReq);
if (result.getCode() != 200){
log.error("车辆:[{}],申请上线异常:[{}]", vin, result.getMsg());
throw new RuntimeException("远程服务器没有【"+vin+"】车辆");

View File

@ -1,6 +1,8 @@
server:
port: 81
spring:
main:
allow-circular-references: true
mvc:
static-path-pattern: /static/**
@ -17,7 +19,7 @@ spring:
enabled: true
settings:
# 开启h2 console 跟踪 方便调试 默认 false
trace: true
trace: false
# 允许console 远程访问 默认false
web-allow-others: true
# h2 访问路径上下文
@ -78,16 +80,4 @@ forest:
max-connections: 1000 # 连接池最大连接数
connect-timeout: 3000 # 连接超时时间,单位为毫秒
read-timeout: 3000 # 数据读取超时时间,单位为毫秒
variables:
adminHost: ${mqtt.admin.host}
adminTopicUri: ${mqtt.admin.topic-uri}
log-enabled: false
# 服务器配置
mqtt:
server:
host: tcp://fluxmq.muyu.icu:1883
topic: test1
admin:
host: http://127.0.0.1:${server.port}
topic-uri: /verify/vehicleConnection
log-enabled: true

File diff suppressed because one or more lines are too long

View File

@ -12,3 +12,13 @@ create table if not exists route_info (
`data` CLOB not null,
`create_time` datetime not null
) ;
create table if not exists server_config (
`id` int primary key not null,
`host` char(17) not null,
`port` int not null,
`load_url` char(128) not null,
`default_mqtt_addr` char(128) not null,
`default_mqtt_topic` char(128) not null,
`default_mqtt_qos` int not null
);

View File

@ -0,0 +1 @@
.el-col[data-v-1fac6224]{margin-top:20px}

View File

@ -1 +1 @@
<!DOCTYPE html><html><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge,chrome=1"><meta name=viewport content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"><link rel=icon href=/favicon.ico><title>车辆</title><link href=/static/css/app.63269458.css rel=preload as=style><link href=/static/css/chunk-elementUI.c1c3b808.css rel=preload as=style><link href=/static/css/chunk-libs.3dfb7769.css rel=preload as=style><link href=/static/js/app.4b247cb1.js rel=preload as=script><link href=/static/js/chunk-elementUI.2491fb2f.js rel=preload as=script><link href=/static/js/chunk-libs.2ec7c235.js rel=preload as=script><link href=/static/css/chunk-elementUI.c1c3b808.css rel=stylesheet><link href=/static/css/chunk-libs.3dfb7769.css rel=stylesheet><link href=/static/css/app.63269458.css rel=stylesheet></head><body><noscript><strong>We're sorry but 车辆 doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id=app></div><script>(function(e){function t(t){for(var r,o,u=t[0],i=t[1],f=t[2],l=0,s=[];l<u.length;l++)o=u[l],Object.prototype.hasOwnProperty.call(a,o)&&a[o]&&s.push(a[o][0]),a[o]=0;for(r in i)Object.prototype.hasOwnProperty.call(i,r)&&(e[r]=i[r]);d&&d(t);while(s.length)s.shift()();return c.push.apply(c,f||[]),n()}function n(){for(var e,t=0;t<c.length;t++){for(var n=c[t],r=!0,o=1;o<n.length;o++){var u=n[o];0!==a[u]&&(r=!1)}r&&(c.splice(t--,1),e=i(i.s=n[0]))}return e}var r={},o={runtime:0},a={runtime:0},c=[];function u(e){return i.p+"static/js/"+({}[e]||e)+"."+{"chunk-019c66da":"ded8571e","chunk-6f60c8f1":"f16bf298","chunk-4a014042":"2fe4ac72","chunk-cd3ab578":"ba31bb9e","chunk-22cea610":"fd8494c8","chunk-510f32e7":"792568de"}[e]+".js"}function i(t){if(r[t])return r[t].exports;var n=r[t]={i:t,l:!1,exports:{}};return e[t].call(n.exports,n,n.exports,i),n.l=!0,n.exports}i.e=function(e){var t=[],n={"chunk-4a014042":1,"chunk-cd3ab578":1,"chunk-22cea610":1,"chunk-510f32e7":1};o[e]?t.push(o[e]):0!==o[e]&&n[e]&&t.push(o[e]=new Promise((function(t,n){for(var r="static/css/"+({}[e]||e)+"."+{"chunk-019c66da":"31d6cfe0","chunk-6f60c8f1":"31d6cfe0","chunk-4a014042":"3328abfd","chunk-cd3ab578":"5a7a63c7","chunk-22cea610":"3c7f5ad9","chunk-510f32e7":"1510e3c5"}[e]+".css",a=i.p+r,c=document.getElementsByTagName("link"),u=0;u<c.length;u++){var f=c[u],l=f.getAttribute("data-href")||f.getAttribute("href");if("stylesheet"===f.rel&&(l===r||l===a))return t()}var s=document.getElementsByTagName("style");for(u=0;u<s.length;u++){f=s[u],l=f.getAttribute("data-href");if(l===r||l===a)return t()}var d=document.createElement("link");d.rel="stylesheet",d.type="text/css",d.onload=t,d.onerror=function(t){var r=t&&t.target&&t.target.src||a,c=new Error("Loading CSS chunk "+e+" failed.\n("+r+")");c.code="CSS_CHUNK_LOAD_FAILED",c.request=r,delete o[e],d.parentNode.removeChild(d),n(c)},d.href=a;var h=document.getElementsByTagName("head")[0];h.appendChild(d)})).then((function(){o[e]=0})));var r=a[e];if(0!==r)if(r)t.push(r[2]);else{var c=new Promise((function(t,n){r=a[e]=[t,n]}));t.push(r[2]=c);var f,l=document.createElement("script");l.charset="utf-8",l.timeout=120,i.nc&&l.setAttribute("nonce",i.nc),l.src=u(e);var s=new Error;f=function(t){l.onerror=l.onload=null,clearTimeout(d);var n=a[e];if(0!==n){if(n){var r=t&&("load"===t.type?"missing":t.type),o=t&&t.target&&t.target.src;s.message="Loading chunk "+e+" failed.\n("+r+": "+o+")",s.name="ChunkLoadError",s.type=r,s.request=o,n[1](s)}a[e]=void 0}};var d=setTimeout((function(){f({type:"timeout",target:l})}),12e4);l.onerror=l.onload=f,document.head.appendChild(l)}return Promise.all(t)},i.m=e,i.c=r,i.d=function(e,t,n){i.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},i.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(e,t){if(1&t&&(e=i(e)),8&t)return e;if(4&t&&"object"===typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(i.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)i.d(n,r,function(t){return e[t]}.bind(null,r));return n},i.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return i.d(t,"a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p="/",i.oe=function(e){throw console.error(e),e};var f=window["webpackJsonp"]=window["webpackJsonp"]||[],l=f.push.bind(f);f.push=t,f=f.slice();for(var s=0;s<f.length;s++)t(f[s]);var d=l;n()})([]);</script><script src=/static/js/chunk-elementUI.2491fb2f.js></script><script src=/static/js/chunk-libs.2ec7c235.js></script><script src=/static/js/app.4b247cb1.js></script></body></html>
<!DOCTYPE html><html><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge,chrome=1"><meta name=viewport content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"><link rel=icon href=/favicon.ico><title>车辆</title><link href=/static/css/app.63269458.css rel=preload as=style><link href=/static/css/chunk-elementUI.c1c3b808.css rel=preload as=style><link href=/static/css/chunk-libs.3dfb7769.css rel=preload as=style><link href=/static/js/app.a7bceb97.js rel=preload as=script><link href=/static/js/chunk-elementUI.2491fb2f.js rel=preload as=script><link href=/static/js/chunk-libs.2ec7c235.js rel=preload as=script><link href=/static/css/chunk-elementUI.c1c3b808.css rel=stylesheet><link href=/static/css/chunk-libs.3dfb7769.css rel=stylesheet><link href=/static/css/app.63269458.css rel=stylesheet></head><body><noscript><strong>We're sorry but 车辆 doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id=app></div><script>(function(e){function t(t){for(var r,o,u=t[0],i=t[1],f=t[2],l=0,s=[];l<u.length;l++)o=u[l],Object.prototype.hasOwnProperty.call(a,o)&&a[o]&&s.push(a[o][0]),a[o]=0;for(r in i)Object.prototype.hasOwnProperty.call(i,r)&&(e[r]=i[r]);d&&d(t);while(s.length)s.shift()();return c.push.apply(c,f||[]),n()}function n(){for(var e,t=0;t<c.length;t++){for(var n=c[t],r=!0,o=1;o<n.length;o++){var u=n[o];0!==a[u]&&(r=!1)}r&&(c.splice(t--,1),e=i(i.s=n[0]))}return e}var r={},o={runtime:0},a={runtime:0},c=[];function u(e){return i.p+"static/js/"+({}[e]||e)+"."+{"chunk-019c66da":"ded8571e","chunk-6f60c8f1":"f16bf298","chunk-4a014042":"2fe4ac72","chunk-cd3ab578":"ba31bb9e","chunk-e4980b30":"83907799","chunk-22cea610":"fd8494c8","chunk-510f32e7":"792568de"}[e]+".js"}function i(t){if(r[t])return r[t].exports;var n=r[t]={i:t,l:!1,exports:{}};return e[t].call(n.exports,n,n.exports,i),n.l=!0,n.exports}i.e=function(e){var t=[],n={"chunk-4a014042":1,"chunk-cd3ab578":1,"chunk-e4980b30":1,"chunk-22cea610":1,"chunk-510f32e7":1};o[e]?t.push(o[e]):0!==o[e]&&n[e]&&t.push(o[e]=new Promise((function(t,n){for(var r="static/css/"+({}[e]||e)+"."+{"chunk-019c66da":"31d6cfe0","chunk-6f60c8f1":"31d6cfe0","chunk-4a014042":"3328abfd","chunk-cd3ab578":"5a7a63c7","chunk-e4980b30":"27dfab27","chunk-22cea610":"3c7f5ad9","chunk-510f32e7":"1510e3c5"}[e]+".css",a=i.p+r,c=document.getElementsByTagName("link"),u=0;u<c.length;u++){var f=c[u],l=f.getAttribute("data-href")||f.getAttribute("href");if("stylesheet"===f.rel&&(l===r||l===a))return t()}var s=document.getElementsByTagName("style");for(u=0;u<s.length;u++){f=s[u],l=f.getAttribute("data-href");if(l===r||l===a)return t()}var d=document.createElement("link");d.rel="stylesheet",d.type="text/css",d.onload=t,d.onerror=function(t){var r=t&&t.target&&t.target.src||a,c=new Error("Loading CSS chunk "+e+" failed.\n("+r+")");c.code="CSS_CHUNK_LOAD_FAILED",c.request=r,delete o[e],d.parentNode.removeChild(d),n(c)},d.href=a;var h=document.getElementsByTagName("head")[0];h.appendChild(d)})).then((function(){o[e]=0})));var r=a[e];if(0!==r)if(r)t.push(r[2]);else{var c=new Promise((function(t,n){r=a[e]=[t,n]}));t.push(r[2]=c);var f,l=document.createElement("script");l.charset="utf-8",l.timeout=120,i.nc&&l.setAttribute("nonce",i.nc),l.src=u(e);var s=new Error;f=function(t){l.onerror=l.onload=null,clearTimeout(d);var n=a[e];if(0!==n){if(n){var r=t&&("load"===t.type?"missing":t.type),o=t&&t.target&&t.target.src;s.message="Loading chunk "+e+" failed.\n("+r+": "+o+")",s.name="ChunkLoadError",s.type=r,s.request=o,n[1](s)}a[e]=void 0}};var d=setTimeout((function(){f({type:"timeout",target:l})}),12e4);l.onerror=l.onload=f,document.head.appendChild(l)}return Promise.all(t)},i.m=e,i.c=r,i.d=function(e,t,n){i.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},i.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(e,t){if(1&t&&(e=i(e)),8&t)return e;if(4&t&&"object"===typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(i.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)i.d(n,r,function(t){return e[t]}.bind(null,r));return n},i.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return i.d(t,"a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p="/",i.oe=function(e){throw console.error(e),e};var f=window["webpackJsonp"]=window["webpackJsonp"]||[],l=f.push.bind(f);f.push=t,f=f.slice();for(var s=0;s<f.length;s++)t(f[s]);var d=l;n()})([]);</script><script src=/static/js/chunk-elementUI.2491fb2f.js></script><script src=/static/js/chunk-libs.2ec7c235.js></script><script src=/static/js/app.a7bceb97.js></script></body></html>

View File

@ -0,0 +1 @@
(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-e4980b30"],{"88aa":function(e,t,r){"use strict";r.r(t);var s=function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("div",{staticStyle:{margin:"10px"}},[r("el-row",{attrs:{gutter:20}},[r("el-col",{attrs:{span:24}},[r("el-switch",{staticStyle:{float:"left",margin:"10px 20px"},attrs:{"active-color":"#13ce66","inactive-color":"#ff4949","active-text":"开启修改","inactive-text":"只查看"},model:{value:e.isUpdate,callback:function(t){e.isUpdate=t},expression:"isUpdate"}}),e.isUpdate?r("el-button",{staticStyle:{float:"left"},on:{click:e.editServerConfig}},[e._v("提交并刷新配置")]):e._e()],1),r("el-col",{attrs:{xs:24,md:12}},[r("el-card",{staticClass:"box-card"},[r("div",{staticClass:"clearfix",attrs:{slot:"header"},slot:"header"},[r("span",[e._v("负载均衡服务器配置")])]),r("div",{staticClass:"text item"},[r("el-form",{ref:"form",attrs:{model:e.serverConfig,"label-width":"120px"}},[r("el-form-item",{attrs:{label:"负载服务地址"}},[r("el-input",{attrs:{disabled:!e.isUpdate},model:{value:e.serverConfig.host,callback:function(t){e.$set(e.serverConfig,"host",t)},expression:"serverConfig.host"}})],1),r("el-form-item",{attrs:{label:"负载服务端口"}},[r("el-input",{attrs:{disabled:!e.isUpdate},model:{value:e.serverConfig.port,callback:function(t){e.$set(e.serverConfig,"port",t)},expression:"serverConfig.port"}})],1),r("el-form-item",{attrs:{label:"负载服务API地址"}},[r("el-input",{attrs:{disabled:!e.isUpdate},model:{value:e.serverConfig.loadUrl,callback:function(t){e.$set(e.serverConfig,"loadUrl",t)},expression:"serverConfig.loadUrl"}})],1)],1)],1)])],1),r("el-col",{attrs:{xs:24,md:12}},[r("el-card",{staticClass:"box-card"},[r("div",{staticClass:"clearfix",attrs:{slot:"header"},slot:"header"},[r("span",[e._v("默认MQTT配置")])]),r("div",{staticClass:"text item"},[r("el-form",{ref:"form",attrs:{model:e.serverConfig,"label-width":"120px"}},[r("el-form-item",{attrs:{label:"MQTT默认地址"}},[r("el-input",{attrs:{disabled:!e.isUpdate},model:{value:e.serverConfig.defaultMqttAddr,callback:function(t){e.$set(e.serverConfig,"defaultMqttAddr",t)},expression:"serverConfig.defaultMqttAddr"}})],1),r("el-form-item",{attrs:{label:"MQTT默认主题"}},[r("el-input",{attrs:{disabled:!e.isUpdate},model:{value:e.serverConfig.defaultMqttTopic,callback:function(t){e.$set(e.serverConfig,"defaultMqttTopic",t)},expression:"serverConfig.defaultMqttTopic"}})],1),r("el-form-item",{attrs:{label:"MQTT交付级别"}},[r("el-input",{attrs:{disabled:!e.isUpdate},model:{value:e.serverConfig.defaultMqttQos,callback:function(t){e.$set(e.serverConfig,"defaultMqttQos",t)},expression:"serverConfig.defaultMqttQos"}})],1)],1)],1)])],1)],1)],1)},o=[],a=r("b775");function i(){return Object(a["a"])({url:"/vehicle/server/config",method:"get"})}function n(e){return Object(a["a"])({url:"/vehicle/server/config",method:"PUT",data:e})}var l={name:"ServerConfig",data:function(){return{isUpdate:!1,serverConfig:{host:null,port:null,loadUrl:null,defaultMqttAddr:null,defaultMqttTopic:null,defaultMqttQos:null}}},created:function(){this.getServerConfig()},methods:{getServerConfig:function(){var e=this;i().then((function(t){e.serverConfig=t.data}))},editServerConfig:function(){var e=this;n(this.serverConfig).then((function(t){e.$notify({title:"操作提示",message:t.msg,type:200===t.code?"success":"error"}),200===t.code&&(e.isUpdate=!1)}))}}},c=l,d=(r("8bce"),r("2877")),f=Object(d["a"])(c,s,o,!1,null,"1fac6224",null);t["default"]=f.exports},"8bce":function(e,t,r){"use strict";r("f557")},b775:function(e,t,r){"use strict";r("d3b7");var s=r("bc3a"),o=r.n(s),a=r("5c96"),i=r("4360"),n=r("5f87"),l=o.a.create({baseURL:"/",timeout:5e3});l.interceptors.request.use((function(e){return i["a"].getters.token&&(e.headers["X-Token"]=Object(n["a"])()),e}),(function(e){return console.log(e),Promise.reject(e)})),l.interceptors.response.use((function(e){var t=e.data;return 200!==t.code?(Object(a["Message"])({message:t.msg||"Error",type:"error",duration:5e3}),50008!==t.code&&50012!==t.code&&50014!==t.code||a["MessageBox"].confirm("You have been logged out, you can cancel to stay on this page, or log in again","Confirm logout",{confirmButtonText:"Re-Login",cancelButtonText:"Cancel",type:"warning"}).then((function(){i["a"].dispatch("user/resetToken").then((function(){location.reload()}))})),Promise.reject(new Error(t.msg||"Error"))):t}),(function(e){return console.log("err"+e),Object(a["Message"])({message:e.message,type:"error",duration:5e3}),Promise.reject(e)})),t["a"]=l},f557:function(e,t,r){}}]);

View File

@ -21,8 +21,8 @@ public class AdminTest {
@Test
public void vehicleConnTest(){
Result<String> result = clientAdmin.vehicleConnection(
VehicleConnectionReq.builder()
Result<String> result = clientAdmin.getVehicleLoadAddr(
serviceConfigProperties, VehicleConnectionReq.builder()
.vin("VIN1234567894")
.timestamp(String.valueOf(System.currentTimeMillis()))
.userName("156841600")