diff --git a/src/main/java/com/genersoft/iot/vmp/conf/GlobalExceptionHandler.java b/src/main/java/com/genersoft/iot/vmp/conf/GlobalExceptionHandler.java index 3cbd5207..5e29ff42 100644 --- a/src/main/java/com/genersoft/iot/vmp/conf/GlobalExceptionHandler.java +++ b/src/main/java/com/genersoft/iot/vmp/conf/GlobalExceptionHandler.java @@ -52,6 +52,16 @@ public class GlobalExceptionHandler { public WVPResult exceptionHandler(HttpRequestMethodNotSupportedException e) { return WVPResult.fail(ErrorCode.ERROR400); } + /** + * 断言异常处理 + * @param e 异常 + * @return 统一返回结果 + */ + @ExceptionHandler(IllegalArgumentException.class) + @ResponseStatus(HttpStatus.OK) + public WVPResult exceptionHandler(IllegalArgumentException e) { + return WVPResult.fail(ErrorCode.ERROR100.getCode(), e.getMessage()); + } /** @@ -60,7 +70,7 @@ public class GlobalExceptionHandler { * @return 统一返回结果 */ @ExceptionHandler(ControllerException.class) - @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) + @ResponseStatus(HttpStatus.OK) public ResponseEntity> exceptionHandler(ControllerException e) { return new ResponseEntity<>(WVPResult.fail(e.getCode(), e.getMsg()), HttpStatus.OK); } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/controller/CommonChannelController.java b/src/main/java/com/genersoft/iot/vmp/gb28181/controller/CommonChannelController.java index b8a9df52..e444051a 100755 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/controller/CommonChannelController.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/controller/CommonChannelController.java @@ -5,6 +5,7 @@ import com.genersoft.iot.vmp.gb28181.bean.CommonGBChannel; import com.genersoft.iot.vmp.gb28181.bean.DeviceType; import com.genersoft.iot.vmp.gb28181.bean.IndustryCodeType; import com.genersoft.iot.vmp.gb28181.bean.NetworkIdentificationType; +import com.genersoft.iot.vmp.gb28181.controller.bean.ChannelToRegionParam; import com.genersoft.iot.vmp.gb28181.service.IGbChannelService; import com.genersoft.iot.vmp.media.service.IMediaServerService; import com.genersoft.iot.vmp.storager.IRedisCatchStorage; @@ -15,6 +16,7 @@ import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.Assert; import org.springframework.util.ObjectUtils; import org.springframework.web.bind.annotation.*; @@ -97,4 +99,19 @@ public class CommonChannelController { } return channelService.queryList(page, count, query, online, hasCivilCode); } + + @Operation(summary = "通道设置行政区划", security = @SecurityRequirement(name = JwtUtils.HEADER)) + @PostMapping("/region/add") + public void addChannelToRegion(@RequestBody ChannelToRegionParam param){ + Assert.notEmpty(param.getChannelIds(),"通道ID不可为空"); + Assert.hasLength(param.getCivilCode(),"未添加行政区划"); + channelService.addChannelToRegion(param.getCivilCode(), param.getChannelIds()); + } + + @Operation(summary = "通道删除行政区划", security = @SecurityRequirement(name = JwtUtils.HEADER)) + @PostMapping("/region/delete") + public void deleteChannelToRegion(@RequestBody ChannelToRegionParam param){ + Assert.isTrue(param.getChannelIds().isEmpty() && ObjectUtils.isEmpty(param.getCivilCode()),"参数异常"); + channelService.deleteChannelToRegion(param.getCivilCode(), param.getChannelIds()); + } } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/controller/RegionController.java b/src/main/java/com/genersoft/iot/vmp/gb28181/controller/RegionController.java index 0a2ef6ee..77c67d00 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/controller/RegionController.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/controller/RegionController.java @@ -12,6 +12,7 @@ import io.swagger.v3.oas.annotations.tags.Tag; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.Assert; import org.springframework.util.ObjectUtils; import org.springframework.web.bind.annotation.*; @@ -76,11 +77,11 @@ public class RegionController { } @Operation(summary = "删除区域") - @Parameter(name = "regionDeviceId", description = "区域编码", required = true) + @Parameter(name = "deviceId", description = "区域编码", required = true) @ResponseBody @DeleteMapping("/delete") public void delete(String deviceId){ - assert !ObjectUtils.isEmpty(deviceId); + Assert.hasLength(deviceId, "区域编码(deviceId)不需要存在"); boolean result = regionService.deleteByDeviceId(deviceId); if (!result) { throw new ControllerException(ErrorCode.ERROR100.getCode(), "移除失败"); diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/controller/bean/ChannelToRegionParam.java b/src/main/java/com/genersoft/iot/vmp/gb28181/controller/bean/ChannelToRegionParam.java new file mode 100644 index 00000000..32505b23 --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/controller/bean/ChannelToRegionParam.java @@ -0,0 +1,13 @@ +package com.genersoft.iot.vmp.gb28181.controller.bean; + +import lombok.Data; + +import java.util.List; + +@Data +public class ChannelToRegionParam { + + private String civilCode; + private List channelIds; + +} diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/dao/CommonGBChannelMapper.java b/src/main/java/com/genersoft/iot/vmp/gb28181/dao/CommonGBChannelMapper.java index 79a65246..45afc5f2 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/dao/CommonGBChannelMapper.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/dao/CommonGBChannelMapper.java @@ -7,6 +7,7 @@ import com.genersoft.iot.vmp.gb28181.dao.provider.ChannelProvider; import org.apache.ibatis.annotations.*; import org.springframework.stereotype.Repository; +import java.util.Collection; import java.util.List; @Mapper @@ -290,7 +291,7 @@ public interface CommonGBChannelMapper { @SelectProvider(type = ChannelProvider.class, method = "queryByIds") - List queryByIds(List commonGBChannelList); + List queryByIds(Collection ids); @Delete(value = {" "}) int removeCivilCode(List allChildren); + + + @Update(value = {" "}) + int updateRegion(@Param("civilCode") String civilCode, @Param("channelList") List channelList); + + @SelectProvider(type = ChannelProvider.class, method = "queryByIdsOrCivilCode") + List queryByIdsOrCivilCode(@Param("civilCode") String civilCode, @Param("ids") List ids); } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/dao/provider/ChannelProvider.java b/src/main/java/com/genersoft/iot/vmp/gb28181/dao/provider/ChannelProvider.java index 8131e462..a7dde9ab 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/dao/provider/ChannelProvider.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/dao/provider/ChannelProvider.java @@ -1,5 +1,9 @@ package com.genersoft.iot.vmp.gb28181.dao.provider; +import com.genersoft.iot.vmp.gb28181.bean.CommonGBChannel; + +import java.util.Collection; +import java.util.List; import java.util.Map; public class ChannelProvider { @@ -93,20 +97,64 @@ public class ChannelProvider { } public String queryInListByStatus(Map params ){ - return " " ; + StringBuilder sqlBuild = new StringBuilder(); + sqlBuild.append(getBaseSelectSql()); + sqlBuild.append("where gb_status=#{status} and id in ( "); + + List commonGBChannelList = (List)params.get("ids"); + boolean first = true; + for (CommonGBChannel channel : commonGBChannelList) { + if (!first) { + sqlBuild.append(","); + } + sqlBuild.append(channel.getGbId()); + first = false; + } + sqlBuild.append(" )"); + return sqlBuild.toString() ; } public String queryByIds(Map params ){ - return " " ; + StringBuilder sqlBuild = new StringBuilder(); + sqlBuild.append(getBaseSelectSql()); + sqlBuild.append("where id in ( "); + + Collection ids = (Collection)params.get("ids"); + boolean first = true; + for (Integer id : ids) { + if (!first) { + sqlBuild.append(","); + } + sqlBuild.append(id); + first = false; + } + sqlBuild.append(" )"); + return sqlBuild.toString() ; + } + + public String queryByIdsOrCivilCode(Map params ){ + StringBuilder sqlBuild = new StringBuilder(); + sqlBuild.append(getBaseSelectSql()); + sqlBuild.append("where "); + if (params.get("civilCode") != null) { + sqlBuild.append(" gb_civil_code = #{civilCode} "); + if (params.get("ids") != null) { + sqlBuild.append(" OR "); + } + } + if (params.get("ids") != null) { + sqlBuild.append(" id in ( "); + Collection ids = (Collection)params.get("ids"); + boolean first = true; + for (Integer id : ids) { + if (!first) { + sqlBuild.append(","); + } + sqlBuild.append(id); + first = false; + } + sqlBuild.append(" )"); + } + return sqlBuild.toString() ; } } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/service/IGbChannelService.java b/src/main/java/com/genersoft/iot/vmp/gb28181/service/IGbChannelService.java index 7ae7c451..0dccebc7 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/service/IGbChannelService.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/service/IGbChannelService.java @@ -3,6 +3,7 @@ package com.genersoft.iot.vmp.gb28181.service; import com.genersoft.iot.vmp.gb28181.bean.*; import com.github.pagehelper.PageInfo; +import java.util.Collection; import java.util.List; public interface IGbChannelService { @@ -13,7 +14,7 @@ public interface IGbChannelService { int delete(int gbId); - void delete(List commonGBChannelList); + void delete(Collection ids); int update(CommonGBChannel commonGBChannel); @@ -44,4 +45,8 @@ public interface IGbChannelService { PageInfo queryList(int page, int count, String query, Boolean online, Boolean hasCivilCode); void removeCivilCode(List allChildren); + + void addChannelToRegion(String civilCode, List channelIds); + + void deleteChannelToRegion(String civilCode, List channelIds); } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/DeviceChannelServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/DeviceChannelServiceImpl.java index a73b87e3..556cf67e 100755 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/DeviceChannelServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/DeviceChannelServiceImpl.java @@ -29,6 +29,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; import org.springframework.util.ObjectUtils; @@ -279,8 +280,8 @@ public class DeviceChannelServiceImpl implements IDeviceChannelService { @Override public void updateChannelStreamIdentification(DeviceChannel channel) { - assert !ObjectUtils.isEmpty(channel.getId()); - assert !ObjectUtils.isEmpty(channel.getStreamIdentification()); + Assert.isTrue(channel.getId() > 0, "通道ID必须存在"); + Assert.hasLength(channel.getStreamIdentification(), "码流标识必须存在"); if (ObjectUtils.isEmpty(channel.getStreamIdentification())) { log.info("[重置通道码流类型] 设备: {}, 码流: {}", channel.getDeviceId(), channel.getStreamIdentification()); }else { diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/GbChannelServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/GbChannelServiceImpl.java index aadc5db3..c014be95 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/GbChannelServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/GbChannelServiceImpl.java @@ -16,6 +16,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.List; @@ -67,8 +68,8 @@ public class GbChannelServiceImpl implements IGbChannelService { } @Override - public void delete(List commonGBChannelList) { - List channelListInDb = commonGBChannelMapper.queryByIds(commonGBChannelList); + public void delete(Collection ids) { + List channelListInDb = commonGBChannelMapper.queryByIds(ids); if (channelListInDb.isEmpty()) { return; } @@ -331,4 +332,40 @@ public class GbChannelServiceImpl implements IGbChannelService { // TODO 是否需要通知上级, 或者等添加新的行政区划时发送更新通知 } + + @Override + public void addChannelToRegion(String civilCode, List channelIds) { + List channelList = commonGBChannelMapper.queryByIds(channelIds); + if (channelList.isEmpty()) { + throw new ControllerException(ErrorCode.ERROR100.getCode(), "所有通道Id不存在"); + } + int result = commonGBChannelMapper.updateRegion(civilCode, channelList); + // 发送通知 + if (result > 0) { + try { + // 发送catalog + eventPublisher.catalogEventPublish(null, channelList, CatalogEvent.UPDATE); + }catch (Exception e) { + log.warn("[多个通道添加行政区划] 发送失败,数量:{}", channelList.size(), e); + } + } + } + + @Override + public void deleteChannelToRegion(String civilCode, List channelIds) { + List channelList = commonGBChannelMapper.queryByIdsOrCivilCode(civilCode, channelIds); + if (channelList.isEmpty()) { + throw new ControllerException(ErrorCode.ERROR100.getCode(), "所有通道Id不存在"); + } + int result = commonGBChannelMapper.updateRegion(civilCode, channelList); + // 发送通知 + if (result > 0) { + try { + // 发送catalog + eventPublisher.catalogEventPublish(null, channelList, CatalogEvent.UPDATE); + }catch (Exception e) { + log.warn("[多个通道添加行政区划] 发送失败,数量:{}", channelList.size(), e); + } + } + } } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/RegionServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/RegionServiceImpl.java index 318a1c9c..b34830bb 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/RegionServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/RegionServiceImpl.java @@ -17,6 +17,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DuplicateKeyException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.Assert; import org.springframework.util.ObjectUtils; import java.util.*; @@ -41,8 +42,8 @@ public class RegionServiceImpl implements IRegionService { @Override public void add(Region region) { - assert region.getName() != null; - assert region.getDeviceId() != null; + Assert.hasLength(region.getName(), "名称必须存在"); + Assert.hasLength(region.getDeviceId(), "国标编号必须存在"); if (ObjectUtils.isEmpty(region.getParentDeviceId().trim())) { region.setParentDeviceId(null); } @@ -95,7 +96,7 @@ public class RegionServiceImpl implements IRegionService { @Override public PageInfo queryChildRegionList(String regionParentId, int page, int count) { - assert regionParentId != null; + Assert.hasLength(regionParentId, "上级行政区划编号必须存在"); PageHelper.startPage(page, count); List all = regionMapper.getChildren(regionParentId); return new PageInfo<>(all); diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/CloudRecordServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/CloudRecordServiceImpl.java index 05542baf..9b861807 100644 --- a/src/main/java/com/genersoft/iot/vmp/service/impl/CloudRecordServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/service/impl/CloudRecordServiceImpl.java @@ -26,6 +26,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.event.EventListener; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; +import org.springframework.util.Assert; import java.time.LocalDate; import java.time.ZoneOffset; @@ -121,8 +122,8 @@ public class CloudRecordServiceImpl implements ICloudRecordService { public String addTask(String app, String stream, MediaServer mediaServerItem, String startTime, String endTime, String callId, String remoteHost, boolean filterMediaServer) { // 参数校验 - assert app != null; - assert stream != null; + Assert.notNull(app,"应用名为NULL"); + Assert.notNull(stream,"流ID为NULL"); if (mediaServerItem.getRecordAssistPort() == 0) { throw new ControllerException(ErrorCode.ERROR100.getCode(), "为配置Assist服务"); } diff --git a/src/main/java/com/genersoft/iot/vmp/streamProxy/service/impl/StreamProxyServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/streamProxy/service/impl/StreamProxyServiceImpl.java index 1e7a3ab8..2c6384b2 100755 --- a/src/main/java/com/genersoft/iot/vmp/streamProxy/service/impl/StreamProxyServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/streamProxy/service/impl/StreamProxyServiceImpl.java @@ -33,6 +33,7 @@ import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import org.springframework.transaction.TransactionDefinition; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.Assert; import org.springframework.util.ObjectUtils; import java.util.ArrayList; @@ -174,7 +175,7 @@ public class StreamProxyServiceImpl implements IStreamProxyService { } private void delete(StreamProxy streamProxy) { - assert streamProxy != null; + Assert.notNull(streamProxy, "代理不可为NULL"); if (streamProxy.getPulling() != null && streamProxy.getPulling()) { stopProxy(streamProxy); } diff --git a/src/main/java/com/genersoft/iot/vmp/streamPush/service/impl/StreamPushServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/streamPush/service/impl/StreamPushServiceImpl.java index 6d99b200..c7194311 100755 --- a/src/main/java/com/genersoft/iot/vmp/streamPush/service/impl/StreamPushServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/streamPush/service/impl/StreamPushServiceImpl.java @@ -35,6 +35,7 @@ import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import org.springframework.transaction.TransactionDefinition; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.Assert; import org.springframework.util.ObjectUtils; import java.util.*; @@ -247,8 +248,9 @@ public class StreamPushServiceImpl implements IStreamPushService { @Override @Transactional public boolean update(StreamPush streamPush) { + Assert.notNull(streamPush, "推流信息不可为NULL"); + Assert.isTrue(streamPush.getId() > 0, "推流信息ID必须存在"); log.info("[更新推流]:id: {}, app: {}, stream: {}, ", streamPush.getId(), streamPush.getApp(), streamPush.getStream()); - assert streamPush.getId() != null; StreamPush streamPushInDb = streamPushMapper.select(streamPush.getId()); if (!streamPushInDb.getApp().equals(streamPush.getApp()) || !streamPushInDb.getStream().equals(streamPush.getStream())) { // app或者stream变化 @@ -602,6 +604,6 @@ public class StreamPushServiceImpl implements IStreamPushService { } }); streamPushMapper.batchDel(streamPushList); - gbChannelService.delete(commonGBChannelList); + gbChannelService.delete(ids); } } diff --git a/web_src/src/components/common/RegionTree.vue b/web_src/src/components/common/RegionTree.vue index 08d08235..9534fa59 100755 --- a/web_src/src/components/common/RegionTree.vue +++ b/web_src/src/components/common/RegionTree.vue @@ -4,9 +4,10 @@
行政区划
- + 显示编号
@@ -28,9 +29,9 @@ {{''}} - - {{ node.label }}({{ node.data.id }}) - {{ node.label }} + + {{ node.label }}-{{ node.data.id }} + {{ node.label }} @@ -51,6 +52,7 @@ export default { }, data() { return { + showCode: false, searchSrt: "", chooseId: "", // props: { @@ -201,9 +203,11 @@ export default { disabled: false, onClick: () => { this.$axios({ - method: "delete", - url: "/api/platform/catalog/relation/del", - data: data + method: "post", + url: `/api/common/channel/region/delete`, + data: { + channelIds: [data.id] + } }).then((res) => { console.log("移除成功") node.parent.loaded = false diff --git a/web_src/src/components/region.vue b/web_src/src/components/region.vue index 12f040ac..db7ebf54 100755 --- a/web_src/src/components/region.vue +++ b/web_src/src/components/region.vue @@ -54,8 +54,8 @@ @@ -93,7 +93,7 @@ export default { searchSrt: "", channelType: "", online: "", - hasCivilCode: "", + hasCivilCode: "false", winHeight: window.innerHeight - 180, currentPage: 1, count: 15, @@ -150,7 +150,7 @@ export default { this.multipleSelection = val; }, selectable: function (row, rowIndex) { - if (row.civilCode) { + if (row.gbCivilCode) { return false }else { return true @@ -159,15 +159,36 @@ export default { add: function (row) { if (!this.regionId) { this.$message.info("请选择左侧行政区划节点") + return; } - console.log(this.regionId) - console.log(this.multipleSelection) let channels = [] for (let i = 0; i < this.multipleSelection.length; i++) { channels.push(this.multipleSelection[i].gbId) } - console.log(channels) + if (channels.length === 0) { + this.$message.info("请选择右侧通道") + return; + } + this.loading = true + this.$axios({ + method: 'post', + url: `/api/common/channel/region/add`, + data: { + civilCode: this.regionId, + channelIds: channels + } + }).then((res)=> { + if (res.data.code === 0) { + this.$message.success("保存成功") + }else { + this.$message.error(res.data.msg) + } + this.loading = false + }).catch((error)=> { + this.$message.error(error) + this.loading = false + }); }, remove: function (row) { }, diff --git a/web_src/static/css/iconfont.css b/web_src/static/css/iconfont.css index 4636a730..c2e9f2a7 100644 --- a/web_src/static/css/iconfont.css +++ b/web_src/static/css/iconfont.css @@ -1,8 +1,8 @@ @font-face { font-family: "iconfont"; /* Project id 1291092 */ - src: url('iconfont.woff2?t=1673251105600') format('woff2'), - url('iconfont.woff?t=1673251105600') format('woff'), - url('iconfont.ttf?t=1673251105600') format('truetype'); + src: url('iconfont.woff2?t=1722327493746') format('woff2'), + url('iconfont.woff?t=1722327493746') format('woff'), + url('iconfont.ttf?t=1722327493746') format('truetype'); } .iconfont { @@ -13,6 +13,22 @@ -moz-osx-font-smoothing: grayscale; } +.icon-shexiangtou01:before { + content: "\e7e1"; +} + +.icon-Group-:before { + content: "\e7e2"; +} + +.icon-shexiangtou2:before { + content: "\e7e3"; +} + +.icon-shexiangtou3:before { + content: "\e7e4"; +} + .icon-slider:before { content: "\e7e0"; } diff --git a/web_src/static/css/iconfont.woff2 b/web_src/static/css/iconfont.woff2 index f1cb24cf..b94eebf0 100644 Binary files a/web_src/static/css/iconfont.woff2 and b/web_src/static/css/iconfont.woff2 differ