diff --git a/fastbee-common/src/main/java/com/fastbee/common/core/notify/AlertPushParams.java b/fastbee-common/src/main/java/com/fastbee/common/core/notify/AlertPushParams.java index 0cf1bff0..2ae67f81 100644 --- a/fastbee-common/src/main/java/com/fastbee/common/core/notify/AlertPushParams.java +++ b/fastbee-common/src/main/java/com/fastbee/common/core/notify/AlertPushParams.java @@ -2,6 +2,8 @@ package com.fastbee.common.core.notify; import lombok.Data; +import java.util.HashMap; +import java.util.Map; import java.util.Set; /** @@ -45,4 +47,9 @@ public class AlertPushParams { * 告警推送用户id */ private Set userIdSet; + + /** + * 告警推送参数 + */ + private Map deviceAlertParams = new HashMap<>(1); } diff --git a/fastbee-common/src/main/java/com/fastbee/common/core/thingsModel/SceneThingsModelItem.java b/fastbee-common/src/main/java/com/fastbee/common/core/thingsModel/SceneThingsModelItem.java index d2c633b8..af6e7f41 100644 --- a/fastbee-common/src/main/java/com/fastbee/common/core/thingsModel/SceneThingsModelItem.java +++ b/fastbee-common/src/main/java/com/fastbee/common/core/thingsModel/SceneThingsModelItem.java @@ -24,6 +24,11 @@ public class SceneThingsModelItem { */ private String value; + /** + * 物模型名称 + */ +// private String name; + /** * 类型:1=属性, 2=功能,3=事件, 4=设备升级,5=设备上线,6=设备下线 , */ diff --git a/fastbee-common/src/main/java/com/fastbee/common/core/thingsModel/ThingsModelSimpleItem.java b/fastbee-common/src/main/java/com/fastbee/common/core/thingsModel/ThingsModelSimpleItem.java index 5744fa02..696d9ada 100644 --- a/fastbee-common/src/main/java/com/fastbee/common/core/thingsModel/ThingsModelSimpleItem.java +++ b/fastbee-common/src/main/java/com/fastbee/common/core/thingsModel/ThingsModelSimpleItem.java @@ -26,6 +26,9 @@ public class ThingsModelSimpleItem { */ private String value; + /** + * 物模型名称 + */ private String name; /** diff --git a/fastbee-common/src/main/java/com/fastbee/common/core/thingsModel/ThingsModelValuesInput.java b/fastbee-common/src/main/java/com/fastbee/common/core/thingsModel/ThingsModelValuesInput.java index 51cf6000..7e7ae0ef 100644 --- a/fastbee-common/src/main/java/com/fastbee/common/core/thingsModel/ThingsModelValuesInput.java +++ b/fastbee-common/src/main/java/com/fastbee/common/core/thingsModel/ThingsModelValuesInput.java @@ -20,6 +20,9 @@ public class ThingsModelValuesInput { **/ private String deviceNumber; + /** + * 设备类型 + **/ private Integer deviceType; /** @@ -27,10 +30,6 @@ public class ThingsModelValuesInput { **/ private List thingsModelSimpleItem; - /** - * 原始消息数据包(用于判断设备上电触发回包等) - **/ - private Object sources; public Long getDeviceId() { return deviceId; @@ -63,12 +62,4 @@ public class ThingsModelValuesInput { public void setThingsModelValueRemarkItem(List thingsModelSimpleItem) { this.thingsModelSimpleItem = thingsModelSimpleItem; } - - public Object getSources() { - return sources; - } - - public void setSources(Object sources) { - this.sources = sources; - } } diff --git a/fastbee-iot-data/src/main/java/com/fastbee/iot/data/ruleEngine/SceneContext.java b/fastbee-iot-data/src/main/java/com/fastbee/iot/data/ruleEngine/SceneContext.java index 394925ae..7806a906 100644 --- a/fastbee-iot-data/src/main/java/com/fastbee/iot/data/ruleEngine/SceneContext.java +++ b/fastbee-iot-data/src/main/java/com/fastbee/iot/data/ruleEngine/SceneContext.java @@ -122,7 +122,7 @@ public class SceneContext { } } else { // 执行动作,延迟执行,线程休眠 delay x 1000毫秒 - Thread.sleep(scriptTemplate.getDelay() * 1000); + Thread.sleep(scriptTemplate.getDelay() * 1000L); if (scriptTemplate.getSource() == 4) { //存在相同未处理告警只记录 不触发告警通知和动作 if (checkDeviceAlerting(scriptTemplate.getSceneId(), requestId, this.deviceNum)) { @@ -520,6 +520,9 @@ public class SceneContext { } alertPushParams.setAddress(address); alertPushParams.setAlertTime(DateUtils.parseDateToStr(DateUtils.YY_MM_DD_HH_MM_SS, new Date())); + + // 设备告警参数 + alertPushParams.getDeviceAlertParams().put(sceneThingsModelItem.getId(), sceneThingsModelItem.getValue()); return alertPushParams; } diff --git a/fastbee-iot-data/src/main/java/com/fastbee/iot/data/service/impl/DataHandlerImpl.java b/fastbee-iot-data/src/main/java/com/fastbee/iot/data/service/impl/DataHandlerImpl.java index a08583cc..e9f68609 100644 --- a/fastbee-iot-data/src/main/java/com/fastbee/iot/data/service/impl/DataHandlerImpl.java +++ b/fastbee-iot-data/src/main/java/com/fastbee/iot/data/service/impl/DataHandlerImpl.java @@ -96,8 +96,6 @@ public class DataHandlerImpl implements IDataHandler { // 这里上报设备编号是转的大写,后面存缓存也是使用大写的,所以在查询物模型的值时添加把设备编号转大写后取值 input.setDeviceNumber(bo.getSerialNumber().toUpperCase()); input.setThingsModelValueRemarkItem(thingsModelSimpleItems); - // 传递原始消息数据包,用于判断设备上电触发回包等 - input.setSources(bo.getSources()); List result = deviceService.reportDeviceThingsModelValue(input, bo.getType(), bo.isShadow()); // 只有设备上报进入规则引擎流程 if (bo.isRuleEngine() && !bo.getSerialNumber().startsWith("server-")) { diff --git a/fastbee-iot-data/src/main/java/com/fastbee/iot/data/service/impl/RuleEngineHandler.java b/fastbee-iot-data/src/main/java/com/fastbee/iot/data/service/impl/RuleEngineHandler.java index 9bbeedc5..e9727519 100644 --- a/fastbee-iot-data/src/main/java/com/fastbee/iot/data/service/impl/RuleEngineHandler.java +++ b/fastbee-iot-data/src/main/java/com/fastbee/iot/data/service/impl/RuleEngineHandler.java @@ -47,7 +47,7 @@ public class RuleEngineHandler implements IRuleEngine { // 场景联动处理 this.sceneProcess(bo); } catch (Exception e) { - log.error("场景联动规则执行异常 message={}", e, e.getMessage()); + log.error("场景联动规则执行异常 message={}", e.getMessage(), e); } } diff --git a/fastbee-notify/fastbee-notify-core/src/main/java/com/fastbee/notify/core/service/impl/NotifySendServiceImpl.java b/fastbee-notify/fastbee-notify-core/src/main/java/com/fastbee/notify/core/service/impl/NotifySendServiceImpl.java index 8fefebc5..c605b882 100644 --- a/fastbee-notify/fastbee-notify-core/src/main/java/com/fastbee/notify/core/service/impl/NotifySendServiceImpl.java +++ b/fastbee-notify/fastbee-notify-core/src/main/java/com/fastbee/notify/core/service/impl/NotifySendServiceImpl.java @@ -163,6 +163,9 @@ public class NotifySendServiceImpl implements NotifySendService { map.put(variables.get(i), alertPushParams.getSerialNumber()); } else if (i == 2) { map.put(variables.get(i), alertPushParams.getAddress()); + } else if (i == 3) { + // 报警数值 变量id,告警值 / 变量id2,告警值2 / 变量id3,告警值3 + map.put(variables.get(i), alertPushParams.getDeviceAlertParams().toString()); } else { map.put(variables.get(i), alertPushParams.getAlertName()); } diff --git a/fastbee-open-api/src/main/java/com/fastbee/controller/wechat/WeChatController.java b/fastbee-open-api/src/main/java/com/fastbee/controller/wechat/WeChatController.java index 11d3befe..1a8f09e0 100644 --- a/fastbee-open-api/src/main/java/com/fastbee/controller/wechat/WeChatController.java +++ b/fastbee-open-api/src/main/java/com/fastbee/controller/wechat/WeChatController.java @@ -139,6 +139,17 @@ public class WeChatController { return weChatService.getWxBindMsg(wxBindMsgId); } + /** + * 获取微信服务号带参数二维码(用于绑定当前登录用户与服务号) + * + * @return 二维码信息(包含图片url) + */ + @ApiOperation("获取微信服务号绑定二维码") + @GetMapping("/getPublicAccountBindQr") + public AjaxResult getPublicAccountBindQr() { + return weChatService.getPublicAccountBindQr(); + } + @ApiOperation("微信公众号验证url") @GetMapping("/publicAccount/callback") public void checkUrl(HttpServletRequest request, HttpServletResponse response) throws IOException { @@ -151,7 +162,7 @@ public class WeChatController { // 随机字符串 String echostr = request.getParameter("echostr"); // token - String token = "fastbee"; + String token = "yackfastbeeiot"; boolean check = SignUtils.checkSignature(token, signature, timestamp, nonce); PrintWriter writer = response.getWriter(); if (check) { @@ -175,7 +186,7 @@ public class WeChatController { response.setContentType("text/html;charset=utf-8"); response.getWriter().write(responseStr); } catch (final IOException e) { - log.error("微信回调回复信息回写失败:xmlStr:{},responseStr:{},e:{}", xmlStr, responseStr, e); + log.error("微信回调回复信息回写失败:xmlStr:{},responseStr:{},e:", xmlStr, responseStr, e); } } diff --git a/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/SocialUserMapper.java b/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/SocialUserMapper.java index 29e633c3..25be1ed9 100644 --- a/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/SocialUserMapper.java +++ b/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/SocialUserMapper.java @@ -131,4 +131,13 @@ public interface SocialUserMapper { * @return java.util.List */ List listWechatPublicAccountOpenId(@Param("userIdList") List userIdList); + + /** + * 根据openId和来源查询绑定信息 + * + * @param openId 微信openId + * @param sourceClient 来源平台标识 + * @return com.fastbee.iot.domain.SocialUser + */ + SocialUser selectByOpenIdAndSourceClient(@Param("openId") String openId, @Param("sourceClient") String sourceClient); } diff --git a/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/ISocialUserService.java b/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/ISocialUserService.java index c2fe44d8..eee3ff22 100644 --- a/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/ISocialUserService.java +++ b/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/ISocialUserService.java @@ -126,4 +126,13 @@ public interface ISocialUserService { * @return java.util.List */ List listWechatPublicAccountOpenId(List userIdList); + + /** + * 根据openId和来源查询绑定信息 + * + * @param openId 微信openId + * @param sourceClient 来源平台标识 + * @return com.fastbee.iot.domain.SocialUser + */ + SocialUser selectByOpenIdAndSourceClient(String openId, String sourceClient); } diff --git a/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/SocialUserServiceImpl.java b/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/SocialUserServiceImpl.java index dedb096c..b086c682 100644 --- a/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/SocialUserServiceImpl.java +++ b/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/SocialUserServiceImpl.java @@ -164,4 +164,9 @@ public class SocialUserServiceImpl implements ISocialUserService { public List listWechatPublicAccountOpenId(List userIdList) { return socialUserMapper.listWechatPublicAccountOpenId(userIdList); } + + @Override + public SocialUser selectByOpenIdAndSourceClient(String openId, String sourceClient) { + return socialUserMapper.selectByOpenIdAndSourceClient(openId, sourceClient); + } } diff --git a/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/wechat/WeChatService.java b/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/wechat/WeChatService.java index 0392afc7..9f761c6f 100644 --- a/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/wechat/WeChatService.java +++ b/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/wechat/WeChatService.java @@ -73,4 +73,11 @@ public interface WeChatService { * @return msg */ AjaxResult getWxBindMsg(String wxBindMsgId); + + /** + * 获取微信服务号带参数二维码(用于绑定当前登录用户) + * + * @return 二维码ticket和url + */ + AjaxResult getPublicAccountBindQr(); } diff --git a/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/wechat/impl/WeChatCallbackServiceImpl.java b/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/wechat/impl/WeChatCallbackServiceImpl.java index a4f39de8..eb78cca8 100644 --- a/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/wechat/impl/WeChatCallbackServiceImpl.java +++ b/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/wechat/impl/WeChatCallbackServiceImpl.java @@ -46,7 +46,7 @@ public class WeChatCallbackServiceImpl implements WeChatCallbackService { Map map = XmlUtil.xmlToMap(xmlStr); wxCallBackXmlBO = JSONObject.parseObject(JSON.toJSONString(map), WxCallBackXmlBO.class); } catch (Exception e) { - log.error("微信回调传递的xml解析报错:{},{}", xmlStr, e); + log.error("微信回调传递的xml解析报错:{}", xmlStr, e); return ""; } if (ObjectUtil.isNull(wxCallBackXmlBO) || StringUtils.isEmpty(wxCallBackXmlBO.getMsgType())) { @@ -94,8 +94,9 @@ public class WeChatCallbackServiceImpl implements WeChatCallbackService { case "unsubscribe": resMsg = this.handleEventUnSubscribe(wxCallBackXmlBo); break; - // 扫描二维码 + // 已关注用户扫描带参数二维码 case "scan": + resMsg = this.handleEventScan(wxCallBackXmlBo); break; default: break; @@ -141,9 +142,98 @@ public class WeChatCallbackServiceImpl implements WeChatCallbackService { .setUnionId(weChatUserInfo.getUnionId()).setAccessToken(accessToken).setAvatar(weChatUserInfo.getHeadImgUrl()) .setNickname(weChatUserInfo.getNickname()).setUuid(IdUtils.randomUUID()).setCreateBy("System"); socialUser.setCreateTime(new Date()); + + // 解析带参数二维码中的 EventKey,格式为 qrscene_bind_用户ID + Long bindSysUserId = parseBindUserIdFromEventKey(wxCallBackXmlBo.getEventKey()); + if (bindSysUserId != null) { + socialUser.setSysUserId(bindSysUserId); + log.info("公众号关注事件:通过带参数二维码绑定用户,openId={},sysUserId={}", openId, bindSysUserId); + } + socialUserService.insertSocialUser(socialUser); // 返回消息 - return WechatUtils.responseText(wxCallBackXmlBo, socialPlatform.getRemark()); + String remark = socialPlatform.getRemark(); + if (bindSysUserId != null) { + remark = "绑定成功!" + (StringUtils.isNotEmpty(remark) ? remark : ""); + } + return WechatUtils.responseText(wxCallBackXmlBo, remark); + } + + /** + * 已关注用户扫描带参数二维码事件(SCAN事件) + * 用户已关注服务号,再扫描带参数二维码时触发,用于绑定系统用户 + */ + private String handleEventScan(WxCallBackXmlBO wxCallBackXmlBo) { + String openId = wxCallBackXmlBo.getFromUserName(); + // SCAN事件的 EventKey 不带 qrscene_ 前缀,直接就是场景值 + String eventKey = wxCallBackXmlBo.getEventKey(); + if (StringUtils.isEmpty(eventKey) || !eventKey.startsWith("bind_")) { + return ""; + } + Long bindSysUserId = parseBindUserIdFromSceneValue(eventKey); + if (bindSysUserId == null) { + return ""; + } + String sourceClient = SocialPlatformType.WECHAT_OPEN_PUBLIC_ACCOUNT.getSourceClient(); + // 查找该 openId 对应的公众号记录 + SocialUser existUser = socialUserService.selectByOpenIdAndSourceClient(openId, sourceClient); + if (existUser != null) { + if (existUser.getSysUserId() != null && !existUser.getSysUserId().equals(bindSysUserId)) { + log.info("公众号SCAN事件:该微信已绑定其他用户,openId={},已绑定sysUserId={},请求绑定sysUserId={}", + openId, existUser.getSysUserId(), bindSysUserId); + return WechatUtils.responseText(wxCallBackXmlBo, "该微信已绑定其他账号,请先解绑后重试"); + } + // 更新绑定 + SocialUser updateUser = new SocialUser(); + updateUser.setSocialUserId(existUser.getSocialUserId()); + updateUser.setSysUserId(bindSysUserId); + updateUser.setStatus("1"); + updateUser.setUpdateBy("System"); + socialUserService.updateSocialUser(updateUser); + log.info("公众号SCAN事件:已关注用户绑定成功,openId={},sysUserId={}", openId, bindSysUserId); + return WechatUtils.responseText(wxCallBackXmlBo, "绑定成功!"); + } + return ""; + } + + /** + * 从 EventKey 中解析绑定的用户ID + * subscribe事件:EventKey 格式为 qrscene_bind_用户ID + */ + private Long parseBindUserIdFromEventKey(String eventKey) { + if (StringUtils.isEmpty(eventKey)) { + return null; + } + // subscribe事件中,带参数二维码的 EventKey 格式为 qrscene_bind_用户ID + String prefix = "qrscene_bind_"; + if (eventKey.startsWith(prefix)) { + return parseUserId(eventKey.substring(prefix.length())); + } + // 兼容直接以 bind_ 开头的情况 + if (eventKey.startsWith("bind_")) { + return parseUserId(eventKey.substring("bind_".length())); + } + return null; + } + + /** + * 从场景值中解析绑定的用户ID + * SCAN事件:EventKey 直接就是场景值,格式为 bind_用户ID + */ + private Long parseBindUserIdFromSceneValue(String sceneValue) { + if (StringUtils.isEmpty(sceneValue) || !sceneValue.startsWith("bind_")) { + return null; + } + return parseUserId(sceneValue.substring("bind_".length())); + } + + private Long parseUserId(String userIdStr) { + try { + return Long.parseLong(userIdStr); + } catch (NumberFormatException e) { + log.warn("解析绑定用户ID失败,userIdStr={}", userIdStr); + return null; + } } } diff --git a/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/wechat/impl/WeChatServiceImpl.java b/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/wechat/impl/WeChatServiceImpl.java index ebd02bbf..4b9ab371 100644 --- a/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/wechat/impl/WeChatServiceImpl.java +++ b/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/wechat/impl/WeChatServiceImpl.java @@ -435,4 +435,54 @@ public class WeChatServiceImpl implements WeChatService { return error(errorMsg); } } + + /** + * 获取微信服务号带参数二维码(用于绑定当前登录用户) + * 通过微信带参数临时二维码,用户扫码关注后自动绑定 sysUserId + */ + @Override + public AjaxResult getPublicAccountBindQr() { + Long sysUserId = getUserId(); + if (sysUserId == null) { + throw new ServiceException("请先登录后重试!"); + } + // 查询服务号配置 + SocialPlatform socialPlatform = socialPlatformService.selectSocialPlatformByPlatform(SocialPlatformType.WECHAT_OPEN_PUBLIC_ACCOUNT.sourceClient); + if (socialPlatform == null) { + throw new ServiceException("请先配置微信公众号信息"); + } + // 获取accessToken + WeChatAppResult weChatAppResult = WechatUtils.getAccessToken(socialPlatform.getClientId(), socialPlatform.getSecretKey()); + if (weChatAppResult == null || StringUtils.isEmpty(weChatAppResult.getAccessToken())) { + throw new ServiceException("获取微信AccessToken失败,请检查公众号配置"); + } + // 调用微信带参数二维码接口,生成临时二维码,场景值为 bind_用户ID + String accessToken = weChatAppResult.getAccessToken(); + String qrUrl = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=" + accessToken; + cn.hutool.json.JSONObject sceneObj = new cn.hutool.json.JSONObject(); + sceneObj.set("scene_str", "bind_" + sysUserId); + cn.hutool.json.JSONObject actionInfo = new cn.hutool.json.JSONObject(); + actionInfo.set("scene", sceneObj); + cn.hutool.json.JSONObject reqBody = new cn.hutool.json.JSONObject(); + reqBody.set("expire_seconds", 604800); // 7天有效 + reqBody.set("action_name", "QR_STR_SCENE"); + reqBody.set("action_info", actionInfo); + + String response = com.fastbee.common.utils.http.HttpUtils.sendPost(qrUrl, reqBody.toString()); + cn.hutool.json.JSONObject respJson = cn.hutool.json.JSONUtil.parseObj(response); + String ticket = respJson.getStr("ticket"); + String qrCodeUrl = respJson.getStr("url"); + + if (StringUtils.isEmpty(ticket)) { + log.error("生成微信带参数二维码失败:{}", response); + throw new ServiceException("生成二维码失败:" + respJson.getStr("errmsg")); + } + + // 返回二维码图片地址(通过ticket换取) + cn.hutool.json.JSONObject result = new cn.hutool.json.JSONObject(); + result.set("qrCodeImgUrl", "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=" + ticket); + result.set("qrCodeUrl", qrCodeUrl); + result.set("ticket", ticket); + return success(result); + } } diff --git a/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/SocialUserMapper.xml b/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/SocialUserMapper.xml index a3b296f0..9327a421 100644 --- a/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/SocialUserMapper.xml +++ b/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/SocialUserMapper.xml @@ -151,6 +151,25 @@ and s.del_flag = 0 and s.`status` =1 and s.source_client = 'wechat_open_public_account' + UNION + select DISTINCT sys_user_id, open_id + from iot_social_user + where sys_user_id in + + #{userId} + + and source_client = 'wechat_open_public_account' + and status = 1 + and del_flag = 0 + and sys_user_id is not null + + + diff --git a/yack-web/src/api/system/user.js b/yack-web/src/api/system/user.js index 98cd31e1..0a360e6b 100644 --- a/yack-web/src/api/system/user.js +++ b/yack-web/src/api/system/user.js @@ -85,13 +85,20 @@ export function changeUserStatus(userId, status) { data: data, }); } -// 获取微信二维码 +// 获取微信二维码(开放平台网站应用) export function getLoginParam() { return request({ url: '/wechat/getWxBindQr', method: 'get', }); } +// 获取微信服务号绑定二维码 +export function getPublicAccountBindQr() { + return request({ + url: '/wechat/getPublicAccountBindQr', + method: 'get', + }); +} // 解除绑定 export function secureBind(data) { return request({ diff --git a/yack-web/src/views/system/user/profile/userInfo.vue b/yack-web/src/views/system/user/profile/userInfo.vue index 045a8d38..de02afd1 100644 --- a/yack-web/src/views/system/user/profile/userInfo.vue +++ b/yack-web/src/views/system/user/profile/userInfo.vue @@ -11,8 +11,11 @@ {{ $t('user.profile.index.894502-7') }} {{ $t('user.profile.index.894502-8') }} + + 关注服务号 + - +
请通过微信扫一扫,进行微信绑定。
@@ -24,6 +27,24 @@ {{ $t('close') }}
+ + +
+
请使用微信扫描下方二维码,关注服务号以接收告警等消息推送。
+
+
+ +
+ 服务号二维码 +
+ 二维码加载失败,请关闭后重试 +
+
+
+
+ {{ $t('close') }} +
+
@@ -46,7 +67,7 @@