diff --git a/yanzhu-api/yanzhu-api-system/src/main/java/com/yanzhu/system/api/RemoteUserService.java b/yanzhu-api/yanzhu-api-system/src/main/java/com/yanzhu/system/api/RemoteUserService.java index f37eb62f..374f9882 100644 --- a/yanzhu-api/yanzhu-api-system/src/main/java/com/yanzhu/system/api/RemoteUserService.java +++ b/yanzhu-api/yanzhu-api-system/src/main/java/com/yanzhu/system/api/RemoteUserService.java @@ -61,6 +61,6 @@ public interface RemoteUserService @PostMapping("/user/register") public R registerUserInfo(@RequestBody SysUser sysUser, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); - @PutMapping("/user/register") + @PutMapping("/user") public R updateUserInfo(@RequestBody SysUser sysUser, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); } diff --git a/yanzhu-common/yanzhu-common-core/src/main/java/com/yanzhu/common/core/constant/CacheConstants.java b/yanzhu-common/yanzhu-common-core/src/main/java/com/yanzhu/common/core/constant/CacheConstants.java index 3dcc01c3..d8300778 100644 --- a/yanzhu-common/yanzhu-common-core/src/main/java/com/yanzhu/common/core/constant/CacheConstants.java +++ b/yanzhu-common/yanzhu-common-core/src/main/java/com/yanzhu/common/core/constant/CacheConstants.java @@ -77,4 +77,6 @@ public class CacheConstants * 项目管理 cache key */ public static final String PRO_PROJECT = "pro_project:"; + + public static final String UNI_AUTH = "pro_project_uni_auth2:"; } diff --git a/yanzhu-common/yanzhu-common-mapper/src/main/java/com/yanzhu/manage/domain/AttendanceCfg.java b/yanzhu-common/yanzhu-common-mapper/src/main/java/com/yanzhu/manage/domain/AttendanceCfg.java index 7a9c42a0..1528e8a3 100644 --- a/yanzhu-common/yanzhu-common-mapper/src/main/java/com/yanzhu/manage/domain/AttendanceCfg.java +++ b/yanzhu-common/yanzhu-common-mapper/src/main/java/com/yanzhu/manage/domain/AttendanceCfg.java @@ -118,6 +118,34 @@ public class AttendanceCfg extends BaseEntity return isDel; } + private String compName; + private String projectName; + private String vendorsName; + public String getProjectName() { + return projectName; + } + + public void setProjectName(String projectName) { + this.projectName = projectName; + } + + public String getVendorsName() { + return vendorsName; + } + + public void setVendorsName(String vendorsName) { + this.vendorsName = vendorsName; + } + + public String getCompName() { + return compName; + } + + public void setCompName(String compName) { + this.compName = compName; + } + + @Override public String toString() { return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) diff --git a/yanzhu-common/yanzhu-common-mapper/src/main/resources/mapper/manage/AttendanceCfgMapper.xml b/yanzhu-common/yanzhu-common-mapper/src/main/resources/mapper/manage/AttendanceCfgMapper.xml index 348a4390..3fbb41d8 100644 --- a/yanzhu-common/yanzhu-common-mapper/src/main/resources/mapper/manage/AttendanceCfgMapper.xml +++ b/yanzhu-common/yanzhu-common-mapper/src/main/resources/mapper/manage/AttendanceCfgMapper.xml @@ -18,28 +18,36 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + + - select id, com_id, project_id, vendors_code, vendors_parameter, enabled, state, remark, is_del, create_by, create_time, update_by, update_time from attendance_cfg + SELECT ac.id, ac.com_id, ac.project_id, ac.vendors_code, ac.vendors_parameter, ac.enabled, ac.state, ac.remark, ac.is_del, ac.create_by, ac.create_time, ac.update_by + , ac.update_time,dp.`dept_name` comp_name,pp.`project_name`,dic.`dict_label` vendors_name + FROM attendance_cfg ac + LEFT JOIN sys_dept dp ON ac.`com_id`=dp.`dept_id` + LEFT JOIN pro_project_info pp ON ac.`project_id`=pp.`id` + LEFT JOIN sys_dict_data dic ON ac.`vendors_code`=dic.`dict_value` AND dic.`dict_type`='attendance_vendors' diff --git a/yanzhu-modules/yanzhu-manage/pom.xml b/yanzhu-modules/yanzhu-manage/pom.xml index 9ce725b9..c26e8a01 100644 --- a/yanzhu-modules/yanzhu-manage/pom.xml +++ b/yanzhu-modules/yanzhu-manage/pom.xml @@ -89,6 +89,12 @@ 2.7.0 + + com.squareup.okhttp3 + okhttp + 4.9.3 + + com.yanzhu diff --git a/yanzhu-modules/yanzhu-manage/src/main/java/com/yanzhu/manage/service/IProProjectInfoSubdeptsUsersService.java b/yanzhu-modules/yanzhu-manage/src/main/java/com/yanzhu/manage/service/IProProjectInfoSubdeptsUsersService.java index b128f829..6a786c98 100644 --- a/yanzhu-modules/yanzhu-manage/src/main/java/com/yanzhu/manage/service/IProProjectInfoSubdeptsUsersService.java +++ b/yanzhu-modules/yanzhu-manage/src/main/java/com/yanzhu/manage/service/IProProjectInfoSubdeptsUsersService.java @@ -58,4 +58,6 @@ public interface IProProjectInfoSubdeptsUsersService * @return 结果 */ public int deleteProProjectInfoSubdeptsUsersById(Long id); + + } diff --git a/yanzhu-modules/yanzhu-manage/src/main/java/com/yanzhu/manage/service/IUniService.java b/yanzhu-modules/yanzhu-manage/src/main/java/com/yanzhu/manage/service/IUniService.java index a7043a11..c6837d39 100644 --- a/yanzhu-modules/yanzhu-manage/src/main/java/com/yanzhu/manage/service/IUniService.java +++ b/yanzhu-modules/yanzhu-manage/src/main/java/com/yanzhu/manage/service/IUniService.java @@ -1,6 +1,11 @@ package com.yanzhu.manage.service; -import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.yanzhu.manage.domain.ProProjectInfoSubdeptsUsers; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; /** * 宇泛服务封装 @@ -11,42 +16,42 @@ public interface IUniService { * @param data * @return */ - public String auth(JSON data); + public Map auth(long projectId) throws NoSuchAlgorithmException; /** * 人员接口-识别主体创建 * @param data * @return */ - public JSON admitCreate(JSON data); + public String admitCreate(JSONObject data); /** * 人员接口-识别主体更新 * @param data * @return */ - public JSON admitUpdate(JSON data); + public boolean admitUpdate(JSONObject data); /** * 人员接口-识别主体删除 * @param data * @return */ - public JSON admitDeletee(JSON data); + public boolean admitDeletee(JSONObject data); /** * 人员接口-查询识别主体详情 * @param data * @return */ - public JSON admitDetail(JSON data); + public JSONObject admitDetail(JSONObject data); /** * 人员接口-识别主体列表 * @param data * @return */ - public JSON admitPage(JSON data); + public JSONObject admitPage(JSONObject data); /** @@ -54,7 +59,7 @@ public interface IUniService { * @param data * @return */ - public JSON faceRegister(JSON data); + public JSONObject faceRegister(JSONObject data); @@ -63,56 +68,56 @@ public interface IUniService { * @param data * @return */ - public JSON faceDelete(JSON data); + public boolean faceDelete(JSONObject data); /** * 人员接口-人员照片信息查询 * @param data * @return */ - public JSON faceDetail(JSON data); + public JSONObject faceDetail(JSONObject data); /** * 设备接口-设备添加 * @param data * @return */ - public JSON deviceCreate(JSON data); + public JSONObject deviceCreate(JSONObject data); /** * 设备接口-设备更新 * @param data * @return */ - public JSON deviceUpdate(JSON data); + public JSONObject deviceUpdate(JSONObject data); /** * 设备接口-设备删除 * @param data * @return */ - public JSON deviceDelete(JSON data); + public JSONObject deviceDelete(JSONObject data); /** * 设备接口-设备详情 * @param data * @return */ - public JSON deviceDetail(JSON data); + public JSONObject deviceDetail(JSONObject data); /** * 授权接口-设备授权识别主体 * @param data * @return */ - public JSON authDevice(JSON data); + public JSONObject authDevice(JSONObject data); /** * 授权接口-设备修改识别主体权限 * @param data * @return */ - public JSON authDeviceUpdate(JSON data); + public JSONObject authDeviceUpdate(JSONObject data); /** @@ -120,6 +125,13 @@ public interface IUniService { * @param data * @return */ - public JSON authDeviceRevoke(JSON data); + public JSONObject authDeviceRevoke(JSONObject data); + + /** + * 同步宇泛的人员和头像 + * @param userId + * @param projectId + */ + public Long syncUniUser(Long userId, ProProjectInfoSubdeptsUsers proProjectInfoSubdeptsUsers); } diff --git a/yanzhu-modules/yanzhu-manage/src/main/java/com/yanzhu/manage/service/impl/ProProjectInfoSubdeptsUsersServiceImpl.java b/yanzhu-modules/yanzhu-manage/src/main/java/com/yanzhu/manage/service/impl/ProProjectInfoSubdeptsUsersServiceImpl.java index f1f1251d..7b943032 100644 --- a/yanzhu-modules/yanzhu-manage/src/main/java/com/yanzhu/manage/service/impl/ProProjectInfoSubdeptsUsersServiceImpl.java +++ b/yanzhu-modules/yanzhu-manage/src/main/java/com/yanzhu/manage/service/impl/ProProjectInfoSubdeptsUsersServiceImpl.java @@ -6,6 +6,7 @@ import com.yanzhu.common.core.utils.DateUtils; import com.yanzhu.manage.domain.ProProjectInfoSubdeptsUsers; import com.yanzhu.manage.mapper.ProProjectInfoSubdeptsUsersMapper; import com.yanzhu.manage.service.IProProjectInfoSubdeptsUsersService; +import com.yanzhu.manage.service.IUniService; import com.yanzhu.system.api.RemoteUserService; import com.yanzhu.system.api.domain.SysUser; import org.springframework.beans.factory.annotation.Autowired; @@ -28,6 +29,8 @@ public class ProProjectInfoSubdeptsUsersServiceImpl implements IProProjectInfoSu @Autowired private RemoteUserService remoteUserService; + @Autowired + private IUniService uniService; /** * 查询分包单位工人 * @@ -71,6 +74,7 @@ public class ProProjectInfoSubdeptsUsersServiceImpl implements IProProjectInfoSu }else{ remoteUserService.updateUserInfo(user,SecurityConstants.INNER).getData(); } + uniService.syncUniUser(user.getUserId(),proProjectInfoSubdeptsUsers); return proProjectInfoSubdeptsUsersMapper.insertProProjectInfoSubdeptsUsers(proProjectInfoSubdeptsUsers); } @@ -93,9 +97,12 @@ public class ProProjectInfoSubdeptsUsersServiceImpl implements IProProjectInfoSu }else{ remoteUserService.updateUserInfo(user,SecurityConstants.INNER).getData(); } + uniService.syncUniUser(user.getUserId(),proProjectInfoSubdeptsUsers); return proProjectInfoSubdeptsUsersMapper.updateProProjectInfoSubdeptsUsers(proProjectInfoSubdeptsUsers); } + + /** * 批量删除分包单位工人 * @@ -110,7 +117,7 @@ public class ProProjectInfoSubdeptsUsersServiceImpl implements IProProjectInfoSu /** * 删除分包单位工人信息 - * + * * @param id 分包单位工人主键 * @return 结果 */ diff --git a/yanzhu-modules/yanzhu-manage/src/main/java/com/yanzhu/manage/service/impl/UniServiceImpl.java b/yanzhu-modules/yanzhu-manage/src/main/java/com/yanzhu/manage/service/impl/UniServiceImpl.java new file mode 100644 index 00000000..6e2cd207 --- /dev/null +++ b/yanzhu-modules/yanzhu-manage/src/main/java/com/yanzhu/manage/service/impl/UniServiceImpl.java @@ -0,0 +1,268 @@ +package com.yanzhu.manage.service.impl; + + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONObject; +import com.alibaba.nacos.common.utils.MD5Utils; +import com.yanzhu.common.core.constant.CacheConstants; +import com.yanzhu.common.core.constant.SecurityConstants; +import com.yanzhu.common.core.utils.StringUtils; +import com.yanzhu.common.redis.service.RedisService; +import com.yanzhu.manage.domain.AttendanceCfg; +import com.yanzhu.manage.domain.ProProjectInfoSubdeptsUsers; +import com.yanzhu.manage.mapper.AttendanceCfgMapper; +import com.yanzhu.manage.service.IUniService; +import com.yanzhu.manage.utils.UniUtils; +import com.yanzhu.system.api.RemoteUserService; +import com.yanzhu.system.api.domain.SysUser; +import okhttp3.Request; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.http.HttpServletRequest; +import java.security.NoSuchAlgorithmException; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +@Service +public class UniServiceImpl implements IUniService{ + + @Autowired + private RedisService redisService; + + @Autowired + private AttendanceCfgMapper attendanceCfgMapper; + + @Autowired + private RemoteUserService remoteUserService; + + + @Override + public Map auth(long projectId) { + String cacheKey=CacheConstants.UNI_AUTH+projectId; + Map authMap = redisService.getCacheObject(cacheKey); + String authInfo="404"; + String projectGuid="404"; + if(authMap!=null){ + return authMap; + }else{ + authMap=new HashMap<>(); + } + AttendanceCfg where=new AttendanceCfg(); + where.setProjectId(projectId); + List list=attendanceCfgMapper.selectAttendanceCfgList(where); + if(list.size()>0){ + AttendanceCfg cfg=list.get(0); + if(cfg.getVendorsCode().equals("uni") && StringUtils.isNotEmpty(cfg.getVendorsParameter())){ + JSONObject json=JSON.parseObject(cfg.getVendorsParameter()); + String appKey=json.getString("AppKey"); + String appSecret=json.getString("AppSecret"); + projectGuid=json.getString("projectGuid"); + String timestamp=""+new Date().getTime(); + Map headerParams=new HashMap<>(); + headerParams.put("appKey",appKey); + headerParams.put("timestamp",timestamp); + String sign=appKey+timestamp+appSecret; + headerParams.put("sign", UniUtils.md5(sign).toLowerCase()); + Request request = new Request.Builder() + .url(UniUtils.getAuthUrl(projectGuid)) + .get().headers(UniUtils.setHeaderParams(headerParams)) + .build(); + String str=UniUtils.getResult(request); + JSONObject jo=JSON.parseObject(str); + String data= jo.getString("data"); + if(StringUtils.isNotEmpty(data)){ + authInfo=data; + authMap.put("token",authInfo); + authMap.put("projectGuid",projectGuid); + redisService.setCacheObject(cacheKey, authMap, 20l, TimeUnit.HOURS);//缓存20小时 + } + } + } + return authMap; + } + + @Override + public String admitCreate(JSONObject data) { + long projectId=data.getLong("projectId"); + data.remove("projectId"); + Request request=new Request.Builder() + .url(UniUtils.ADMITCREATE) + .post(UniUtils.toJsonBody(data)) + .headers(UniUtils.setHeaderParams(auth(projectId))) + .build(); + String res=UniUtils.getResult(request); + JSONObject jo=JSON.parseObject(res); + if(jo.getLong("result").intValue()==1){ + return jo.getJSONObject("data").getString("admitGuid"); + } + return null; + } + + @Override + public boolean admitUpdate(JSONObject data) { + long projectId=data.getLong("projectId"); + data.remove("projectId"); + Request request=new Request.Builder() + .url(UniUtils.ADMITUPDATE) + .post(UniUtils.toJsonBody(data)) + .headers(UniUtils.setHeaderParams(auth(projectId))) + .build(); + String res=UniUtils.getResult(request); + JSONObject jo=JSON.parseObject(res); + return jo.getLong("result").intValue()==1; + } + + @Override + public boolean admitDeletee(JSONObject data) { + long projectId=data.getLong("projectId"); + data.remove("projectId"); + Request request=new Request.Builder() + .url(UniUtils.ADMITDELETE) + .post(UniUtils.toJsonBody(data)) + .headers(UniUtils.setHeaderParams(auth(projectId))) + .build(); + String res=UniUtils.getResult(request); + JSONObject jo=JSON.parseObject(res); + return jo.getLong("result").intValue()==1; + } + + @Override + public JSONObject admitDetail(JSONObject data) { + return null; + } + + @Override + public JSONObject admitPage(JSONObject data) { + return null; + } + + @Override + public JSONObject faceRegister(JSONObject data) { + long projectId=data.getLong("projectId"); + data.remove("projectId"); + Request request=new Request.Builder() + .url(UniUtils.FACEREGISTER) + .post(UniUtils.toJsonBody(data)) + .headers(UniUtils.setHeaderParams(auth(projectId))) + .build(); + String res=UniUtils.getResult(request); + JSONObject jo=JSON.parseObject(res); + if(jo.getLong("result").intValue()==1){ + return jo.getJSONObject("data"); + } + return null; + } + + @Override + public boolean faceDelete(JSONObject data) { + long projectId=data.getLong("projectId"); + data.remove("projectId"); + Request request=new Request.Builder() + .url(UniUtils.FACEDELETE) + .post(UniUtils.toJsonBody(data)) + .headers(UniUtils.setHeaderParams(auth(projectId))) + .build(); + String res=UniUtils.getResult(request); + JSONObject jo=JSON.parseObject(res); + return jo.getLong("result").intValue()==1; + } + + @Override + public JSONObject faceDetail(JSONObject data) { + return null; + } + + @Override + public JSONObject deviceCreate(JSONObject data) { + return null; + } + + @Override + public JSONObject deviceUpdate(JSONObject data) { + return null; + } + + @Override + public JSONObject deviceDelete(JSONObject data) { + return null; + } + + @Override + public JSONObject deviceDetail(JSONObject data) { + return null; + } + + @Override + public JSONObject authDevice(JSONObject data) { + return null; + } + + @Override + public JSONObject authDeviceUpdate(JSONObject data) { + return null; + } + + @Override + public JSONObject authDeviceRevoke(JSONObject data) { + return null; + } + + @Override + public Long syncUniUser(Long userId, ProProjectInfoSubdeptsUsers prjUser) { + SysUser user=remoteUserService.getSysUserInfo(userId, SecurityConstants.INNER).getData(); + JSONObject jo=JSON.parseObject(user.getUserInfos()); + String admitGuid=jo.getString("admitGuid"); + JSONObject userJo=new JSONObject(); + userJo.put("projectId",prjUser.getProjectId()); + userJo.put("name",user.getUserName()); + userJo.put("phone",user.getPhonenumber()); + userJo.put("tag",prjUser.getActiveProjectName()); + userJo.put("cardNo",user.getUserId()); + userJo.put("idCardNo",user.getCardCode()); + userJo.put("password","123456"); + userJo.put("addition",""); + boolean hasUpdate=false; + if(StringUtils.isEmpty(admitGuid)){ + //未注册人员 + admitGuid=admitCreate(userJo); + jo.put("admitGuid",admitGuid); + hasUpdate=true; + }else{ + //已注册 + admitUpdate(userJo); + } + JSONObject faceJo=new JSONObject(); + faceJo.put("projectId",prjUser.getProjectId()); + faceJo.put("base64",""); + faceJo.put("admitGuid",admitGuid); + faceJo.put("url",user.getUserPicture()); + faceJo.put("faceTag",""); + HttpServletRequest request =((ServletRequestAttributes)RequestContextHolder.currentRequestAttributes()).getRequest(); + String url= request.getRemoteAddr(); + //注册图像 + JSONObject faceRes= faceRegister(faceJo); + if(faceRes!=null) { + jo.put("faceGuid", faceRes.getString("faceGuid")); + jo.put("uniFaceInfo", faceRes.toJSONString()); + hasUpdate=true; + } + user.setUserInfos(jo.toJSONString()); + if(hasUpdate){ + Long ret= remoteUserService.updateUserInfo(user,SecurityConstants.INNER).getData(); + if(ret==null){ + return 0l; + } + return ret.longValue(); + } + return 0l; + } + + +} diff --git a/yanzhu-modules/yanzhu-manage/src/main/java/com/yanzhu/manage/utils/UniUtils.java b/yanzhu-modules/yanzhu-manage/src/main/java/com/yanzhu/manage/utils/UniUtils.java new file mode 100644 index 00000000..5c576cad --- /dev/null +++ b/yanzhu-modules/yanzhu-manage/src/main/java/com/yanzhu/manage/utils/UniUtils.java @@ -0,0 +1,75 @@ +package com.yanzhu.manage.utils; + +import com.alibaba.fastjson2.JSONObject; +import com.alibaba.nacos.common.utils.MD5Utils; +import com.yanzhu.common.core.utils.StringUtils; +import okhttp3.*; + +import java.io.IOException; +import java.util.Map; + +public class UniUtils { + public static final String UNIBASE="http://wo-api.uni-ubi.com/"; + public static final String ADMITCREATE=UNIBASE+"v2/admit/create"; + public static final String ADMITUPDATE=UNIBASE+"v2/admit/update"; + public static final String ADMITDELETE=UNIBASE+"v2/admit/delete"; + public static final String ADMITDETAIL=UNIBASE+"v2/admit/detail"; + public static final String FACEREGISTER=UNIBASE+"v2/face/register"; + public static final String FACEDELETE=UNIBASE+"v2/face/delete"; + public static final String FACEDETAIL=UNIBASE+"v2/face/detail"; + + public static final String DEVICECREATE=UNIBASE+"v2/device/create"; + public static final String DEVICEUPATE=UNIBASE+"v2/device/update"; + public static final String DEVICEDELETE=UNIBASE+"v2/device/delete"; + public static final String DEVICEDETAIL=UNIBASE+"v2/device/detail"; + + public static final String AUTHDEVICE=UNIBASE+"v2/auth/device"; + public static final String AUTHDEVICEUPDATE=UNIBASE+"v2/auth/device/update"; + public static String getAuthUrl(String projectGuid){ + return UNIBASE+ "/v1/"+projectGuid+"/auth"; + } + + public static Headers setHeaderParams(Map headerParams) { + Headers headers = null; + Headers.Builder headersbuilder = new Headers.Builder(); + if (headerParams != null && headerParams.size() > 0) { + for (String key : headerParams.keySet()) { + if (!StringUtils.isEmpty(key) && !StringUtils.isEmpty(headerParams.get(key))) { + //如果参数不是null并且不是"",就拼接起来 + headersbuilder.add(key, headerParams.get(key)); + } + } + } + + headers = headersbuilder.build(); + return headers; + } + + public static String getResult(Request request) { + OkHttpClient client = new OkHttpClient(); + Response response; + try { + response = client.newCall(request).execute(); + if (response.body() != null) { + return response.body().string(); + } else { + return ""; + } + } catch (IOException e) { + e.printStackTrace(); + return ""; + } + } + + public static RequestBody toJsonBody(JSONObject data) { + return RequestBody.create(MediaType.parse("application/json"),data.toJSONString()); + } + + public static String md5(String data){ + try { + return MD5Utils.md5Hex(data.getBytes()); + }catch (Exception ex){ + return ""; + } + } +} diff --git a/yanzhu-ui-vue3/src/main.js b/yanzhu-ui-vue3/src/main.js index e435e1c8..31ef9b8a 100644 --- a/yanzhu-ui-vue3/src/main.js +++ b/yanzhu-ui-vue3/src/main.js @@ -57,6 +57,16 @@ app.config.globalProperties.handleTree = handleTree app.config.globalProperties.addDateRange = addDateRange app.config.globalProperties.selectDictLabel = selectDictLabel app.config.globalProperties.selectDictLabels = selectDictLabels +app.config.globalProperties.$tryToJson=(str,df)=>{ + try{ + if(!str){ + return df||{}; + } + return JSON.parse(str)||(df||{}); + }catch{ + return (df||{}); + } +} // 全局组件挂载 app.component('DictTag', DictTag) diff --git a/yanzhu-ui-vue3/src/views/manage/attendance_cfg/index.vue b/yanzhu-ui-vue3/src/views/manage/attendance_cfg/index.vue index 50f7a7bb..3c27e943 100644 --- a/yanzhu-ui-vue3/src/views/manage/attendance_cfg/index.vue +++ b/yanzhu-ui-vue3/src/views/manage/attendance_cfg/index.vue @@ -5,7 +5,8 @@ - + @@ -52,10 +53,14 @@ - - - - + + + + + + - +