From a44022b6258481eaf1fc044e161deec7476a8c74 Mon Sep 17 00:00:00 2001 From: "Crystal.Sea" Date: Thu, 12 Nov 2020 07:24:22 +0800 Subject: [PATCH] v 2.3.0 GA --- README.md | 2 +- ReleaseNotes.txt | 30 ++- gradle.properties | 2 +- .../java/org/maxkey/domain/ExcelImport.java | 11 + .../java/org/maxkey/domain/Organizations.java | 12 ++ .../service/OrganizationsService.java | 199 +++++++++++++++++- .../persistence/service/UserInfoService.java | 148 +++++++------ .../src/test/resources/application.properties | 24 +-- .../adapter/TokenBasedJWTAdapter.java | 2 +- .../adapter/TokenBasedJWTHS256Adapter.java | 2 +- .../contorller/OrganizationsController.java | 17 +- .../web/contorller/UserInfoController.java | 12 -- .../resources/messages/message.properties | 11 + .../resources/messages/message_en.properties | 14 +- .../messages/message_zh_CN.properties | 11 + .../template/excel/Orgs_Import_Template.xlsx | Bin 0 -> 10277 bytes .../template/excel/Users_Import_Template.xlsx | Bin 0 -> 10866 bytes .../templates/views/orgs/orgsImport.ftl | 67 ++++++ .../templates/views/orgs/orgsList.ftl | 6 +- .../views/userinfo/changeUserinfoStatus.ftl | 64 ------ .../templates/views/userinfo/userUpdate.ftl | 9 +- .../templates/views/userinfo/usersImport.ftl | 25 ++- .../templates/views/userinfo/usersList.ftl | 6 +- 23 files changed, 490 insertions(+), 184 deletions(-) create mode 100644 maxkey-web-manage/src/main/resources/static/template/excel/Orgs_Import_Template.xlsx create mode 100644 maxkey-web-manage/src/main/resources/static/template/excel/Users_Import_Template.xlsx create mode 100644 maxkey-web-manage/src/main/resources/templates/views/orgs/orgsImport.ftl delete mode 100644 maxkey-web-manage/src/main/resources/templates/views/userinfo/changeUserinfoStatus.ftl diff --git a/README.md b/README.md index a705a0613..7099603a6 100644 --- a/README.md +++ b/README.md @@ -89,7 +89,7 @@ 当前版本百度网盘下载, 历史版本 | 版本 | 日期 | 下载地址 | 提取码 | | --------| :----- | :---- | :----: | -| v 2.2.0 GA | 2020/09/24 | 链接下载 | **0y9o** | +| v 2.3.0 GA | 2020/11/11 | 链接下载 | **h3zw** | # Roadmap diff --git a/ReleaseNotes.txt b/ReleaseNotes.txt index dd17057ed..d38257e65 100644 --- a/ReleaseNotes.txt +++ b/ReleaseNotes.txt @@ -1,28 +1,36 @@ -MaxKey v 2.3.0 GA 2020/11/** +MaxKey v 2.3.0 GA 2020/11/12 *(MAXKEY-200901) 基于spring session的集群会话共享功能 *(MAXKEY-200902) 单点注销功能,应用可以配置为NONE/BACK_CHANNEL/FRONT_CHANNEL三种方式,支持CAS/SAML/Default *(MAXKEY-200903) 用户在线实时更新功能 - *(MAXKEY-200904) 批量Excel用户导入功能 - *(MAXKEY-200905) 用户注册功能 - *(MAXKEY-200906) 用户状态修改 - *(MAXKEY-200907) 用户详情显示问题 - *(MAXKEY-200908) 应用修改时数字大于4为长度格式化问题 + *(MAXKEY-200904) 定制用户模板,实现批量Excel用户导入功能 + *(MAXKEY-200905) 定制机构模板,实现批量Excel机构导入功能 + *(MAXKEY-200906) 用户注册功能 + *(MAXKEY-200907) 用户状态修改 + *(MAXKEY-200908) 用户详情显示问题 + *(MAXKEY-200909) 应用修改时数字大于4为长度格式化问题 *(MAXKEY-200910) 注销后,点击重新登陆跳转问题 *(MAXKEY-200911) 增加SP登录跳转功能,支持knox的认证 *(MAXKEY-200912) 构建脚本的优化和更新 - *(MAXKEY-200913) 权限控制 RoleAdministrators + *(MAXKEY-200913) 管理员权限控制 RoleAdministrators *(MAXKEY-200914) 社交账号登录优化 *(MAXKEY-200915) 列表界面中未”选择“情况下,弹出界面错误 *(MAXKEY-200916) jib(docker) 支持 ,感谢https://github.com/alanland - *(MAXKEY-200916) 登录过程的优化 - *(MAXKEY-200917) 认证的优化,支持@Principal的注入 - *(MAXKEY-200918) 应用单点登录时,用户访问权限控制 - *(MAXKEY-200920) 依赖jar引用、更新和升级 + *(MAXKEY-200917) 登录过程的优化 + *(MAXKEY-200918) 认证的优化,支持@Principal的注入 + *(MAXKEY-200919) 应用单点登录时,用户访问权限控制 + *(MAXKEY-200920) maxkey-mgt 项目配置文件的验证码启用不启用配置未生效 + *(MAXKEY-200921) 登录图标改进 + *(MAXKEY-200922) 官方网站的优化 + *(MAXKEY-200923) 依赖jar引用、更新和升级 druid 1.2.1 JustAuth 1.15.8 simple-http 1.0.3 spring-session 2.3.1.RELEASE druid-spring-boot-starter 1.2.1 + xmlbeans 3.0.1 + commons-compress 1.20 + poi 4.1.2 + commons-collections4 4.4 MaxKey v 2.2.0 GA 2020/09/24 *(MAXKEY-200801) 官方网站内容调整,初步增加英文版支持,增加新闻、合作伙伴及与CAS等开源产品对比 diff --git a/gradle.properties b/gradle.properties index 8279d3078..cdf27ee5c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ group =maxkey.top -version =2.2.0.RELEASE +version =2.3.0.RELEASE vendor =https://www.maxkey.top author =shimingxy #Version For use jar diff --git a/maxkey-core/src/main/java/org/maxkey/domain/ExcelImport.java b/maxkey-core/src/main/java/org/maxkey/domain/ExcelImport.java index 06aff3170..9fd5e68ee 100644 --- a/maxkey-core/src/main/java/org/maxkey/domain/ExcelImport.java +++ b/maxkey-core/src/main/java/org/maxkey/domain/ExcelImport.java @@ -44,6 +44,9 @@ public class ExcelImport extends JpaBaseDomain { @JsonIgnore protected MultipartFile excelFile; + + + String updateExist; public ExcelImport() { super(); @@ -57,6 +60,14 @@ public class ExcelImport extends JpaBaseDomain { this.id = id; } + public String getUpdateExist() { + return updateExist; + } + + public void setUpdateExist(String updateExist) { + this.updateExist = updateExist; + } + public MultipartFile getExcelFile() { return excelFile; } diff --git a/maxkey-core/src/main/java/org/maxkey/domain/Organizations.java b/maxkey-core/src/main/java/org/maxkey/domain/Organizations.java index df64c3113..5c2804487 100644 --- a/maxkey-core/src/main/java/org/maxkey/domain/Organizations.java +++ b/maxkey-core/src/main/java/org/maxkey/domain/Organizations.java @@ -80,6 +80,8 @@ public class Organizations extends JpaBaseDomain implements Serializable { private String sortIndex; @Column private String description; + + private String status; public Organizations() { // TODO Auto-generated constructor stub @@ -286,6 +288,16 @@ public class Organizations extends JpaBaseDomain implements Serializable { public void setSortIndex(String sortIndex) { this.sortIndex = sortIndex; } + + + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } @Override public String toString() { diff --git a/maxkey-persistence/src/main/java/org/maxkey/persistence/service/OrganizationsService.java b/maxkey-persistence/src/main/java/org/maxkey/persistence/service/OrganizationsService.java index e35357290..4c51d3eaa 100644 --- a/maxkey-persistence/src/main/java/org/maxkey/persistence/service/OrganizationsService.java +++ b/maxkey-persistence/src/main/java/org/maxkey/persistence/service/OrganizationsService.java @@ -17,7 +17,22 @@ package org.maxkey.persistence.service; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.TreeSet; +import java.util.stream.Collectors; + import org.apache.mybatis.jpa.persistence.JpaBaseService; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellType; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.maxkey.domain.Organizations; import org.maxkey.identity.kafka.KafkaIdentityAction; import org.maxkey.identity.kafka.KafkaIdentityTopic; @@ -25,6 +40,10 @@ import org.maxkey.identity.kafka.KafkaProvisioningService; import org.maxkey.persistence.mapper.OrganizationsMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; +import org.springframework.web.multipart.MultipartFile; + +import com.google.common.collect.Lists; @Service public class OrganizationsService extends JpaBaseService{ @@ -71,5 +90,183 @@ public class OrganizationsService extends JpaBaseService{ } return false; } - + + public boolean importing(MultipartFile file) { + if(file ==null){ + return false; + } + InputStream is = null; + Workbook wb = null; + List orgsList = null; + try { + is = file.getInputStream(); + + String xls = ".xls"; + String xlsx = ".xlsx"; + int columnSize = 46; + orgsList = Lists.newArrayList(); + if (file.getOriginalFilename().toLowerCase().endsWith(xls)) { + wb = new HSSFWorkbook(is); + } else if (file.getOriginalFilename().toLowerCase().endsWith(xlsx)) { + wb = new XSSFWorkbook(is); + } else { + throw new RuntimeException("maxKey用户导入没有Excel类型"); + } + + int sheetSize = wb.getNumberOfSheets(); + //遍历sheet页 + for (int i = 0; i < sheetSize; i++) { + Sheet sheet = wb.getSheetAt(i); + + int rowSize = sheet.getLastRowNum() + 1; + //遍历行 + for (int j = 1; j < rowSize; j++) { + Row row = sheet.getRow(j); + //略过空行和前3行 + if (row == null || j <3 ) { + continue; + } else { + //其他行是数据行 + Organizations organization =new Organizations(); + + for (int k = 0; k < columnSize; k++) { + if (k == 0) { + // 上级编码 + Cell cell = row.getCell(k); + organization.setParentId(getValue(cell)); + } else if (k == 1) { + // 上级名称 + Cell cell = row.getCell(k); + organization.setParentName(getValue(cell)); + } else if (k == 2) { + // 机构编码 + Cell cell = row.getCell(k); + organization.setId(getValue(cell)); + } else if (k == 3) { + // 机构名称 + Cell cell = row.getCell(k); + organization.setName(getValue(cell)); + } else if (k == 4) { + // 机构全称 + Cell cell = row.getCell(k); + organization.setFullName(getValue(cell)); + } else if (k == 5) { + // 编码路径 + Cell cell = row.getCell(k); + organization.setCodePath(getValue(cell)); + } else if (k == 6) { + // 名称路径 + Cell cell = row.getCell(k); + organization.setNamePath(getValue(cell)); + } else if (k == 7) { + // 机构类型 + Cell cell = row.getCell(k); + organization.setType(getValue(cell)); + } else if (k == 8) { + // 所属分支机构 + Cell cell = row.getCell(k); + organization.setDivision(getValue(cell)); + } else if (k == 9) { + // 级别 + Cell cell = row.getCell(k); + String level=getValue(cell); + organization.setLevel(level.equals("") ? "1" : level); + } else if (k == 10) { + // 排序 + Cell cell = row.getCell(k); + String sortIndex=getValue(cell); + organization.setSortIndex(sortIndex.equals("") ? "1" : sortIndex); + } else if (k == 11) { + // 联系人 + Cell cell = row.getCell(k); + organization.setContact(getValue(cell)); + } else if (k == 12) { + // 联系电话 + Cell cell = row.getCell(k); + organization.setPhone(getValue(cell)); + }else if (k == 13) { + // 邮箱 + Cell cell = row.getCell(k); + organization.setEmail(getValue(cell)); + }else if (k == 14) { + // 传真 + Cell cell = row.getCell(k); + organization.setFax(getValue(cell)); + }else if (k == 24) { + // 工作-国家 + Cell cell = row.getCell(k); + organization.setCountry(getValue(cell)); + }else if (k == 25) { + // 工作-省 + Cell cell = row.getCell(k); + organization.setRegion(getValue(cell)); + }else if (k == 26) { + // 工作-城市 + Cell cell = row.getCell(k); + organization.setLocality(getValue(cell)); + }else if (k == 27) { + // 工作-地址 + Cell cell = row.getCell(k); + organization.setLocality(getValue(cell)); + }else if (k == 28) { + // 邮编 + Cell cell = row.getCell(k); + organization.setPostalCode(getValue(cell)); + }else if (k == 29) { + // 详细描述 + Cell cell = row.getCell(k); + organization.setDescription(getValue(cell)); + } + } + organization.setStatus("1"); + orgsList.add(organization); + } + + } + } + // 数据去重 + if(CollectionUtils.isEmpty(orgsList)){ + orgsList = orgsList.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(o -> o.getId()))), ArrayList::new)); + } + + } catch (IOException e) { + e.printStackTrace(); + }finally { + if (is != null) { + try { + is.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if(wb != null) { + try { + wb.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + return batchInsert(orgsList); + } + + /** + * 根据数据格式返回数据 + * + * @param cell + * @return + */ + public static String getValue(Cell cell) { + if (cell == null) { + return ""; + } else if (cell.getCellType() == CellType.BOOLEAN) { + return String.valueOf(cell.getBooleanCellValue()); + } else if (cell.getCellType() == CellType.NUMERIC) { + cell.setBlank(); + return String.valueOf(cell.getStringCellValue().trim()); + } else { + return String.valueOf(cell.getStringCellValue().trim()); + } + } } diff --git a/maxkey-persistence/src/main/java/org/maxkey/persistence/service/UserInfoService.java b/maxkey-persistence/src/main/java/org/maxkey/persistence/service/UserInfoService.java index 670cf8ab4..c2fbd18cf 100644 --- a/maxkey-persistence/src/main/java/org/maxkey/persistence/service/UserInfoService.java +++ b/maxkey-persistence/src/main/java/org/maxkey/persistence/service/UserInfoService.java @@ -90,7 +90,6 @@ public class UserInfoService extends JpaBaseService { */ @Override public UserInfoMapper getMapper() { - // TODO Auto-generated method stub return (UserInfoMapper)super.getMapper(); } @@ -357,10 +356,11 @@ public class UserInfoService extends JpaBaseService { return false; } InputStream is = null; + Workbook wb = null; List userInfoList = null; try { is = file.getInputStream(); - Workbook wb; + String xls = ".xls"; String xlsx = ".xlsx"; int columnSize = 46; @@ -382,15 +382,14 @@ public class UserInfoService extends JpaBaseService { //遍历行 for (int j = 1; j < rowSize; j++) { Row row = sheet.getRow(j); - //略过空行和第一行 - if (row == null || j <2 ) { + //略过空行和前3行 + if (row == null || j <3 ) { continue; } else { //其他行是数据行 UserInfo userInfo = new UserInfo(); userInfo.setCreatedDate(DateUtils.formatDateTime(new Date())); - int rangeType = -1; for (int k = 0; k < columnSize; k++) { if (k == 0) { // 登录账号 @@ -401,61 +400,62 @@ public class UserInfoService extends JpaBaseService { Cell cell = row.getCell(k); userInfo.setPassword(getValue(cell)); } else if (k == 2) { - // 员工编码 - Cell cell = row.getCell(k); - userInfo.setEmployeeNumber(getValue(cell)); - } else if (k == 3) { - // 用户类型 - Cell cell = row.getCell(k); - userInfo.setUserType(getValue(cell)); - } else if (k == 4) { - // 用户名 + // 用户显示 Cell cell = row.getCell(k); userInfo.setDisplayName(getValue(cell)); - } else if (k == 5) { + } else if (k == 3) { // 姓 Cell cell = row.getCell(k); userInfo.setFamilyName(getValue(cell)); - } else if (k == 6) { + } else if (k == 4) { // 名 Cell cell = row.getCell(k); userInfo.setGivenName(getValue(cell)); - } else if (k == 7) { + } else if (k == 5) { // 中间名 Cell cell = row.getCell(k); userInfo.setMiddleName(getValue(cell)); - } else if (k == 8) { + } else if (k == 6) { // 昵称 Cell cell = row.getCell(k); userInfo.setNickName(getValue(cell)); - } else if (k == 9) { + } else if (k == 7) { // 性别 Cell cell = row.getCell(k); - userInfo.setGender(Integer.valueOf(getValue(cell))); - } else if (k == 10) { - // AD域账号 - Cell cell = row.getCell(k); - userInfo.setWindowsAccount(getValue(cell)); - } else if (k == 11) { - // 出生日期 - Cell cell = row.getCell(k); - userInfo.setBirthDate(getValue(cell)); - } else if (k == 12) { + String gender = getValue(cell); + userInfo.setGender(gender.equals("")? 1 : Integer.valueOf(getValue(cell))); + } else if (k == 8) { // 语言偏好 Cell cell = row.getCell(k); userInfo.setPreferredLanguage(getValue(cell)); - } else if (k == 13) { + } else if (k == 9) { // 时区 Cell cell = row.getCell(k); userInfo.setTimeZone(getValue(cell)); - }else if (k == 14) { + } else if (k == 10) { + // 用户类型 + Cell cell = row.getCell(k); + userInfo.setUserType(getValue(cell)); + } else if (k == 11) { + // 员工编码 + Cell cell = row.getCell(k); + userInfo.setEmployeeNumber(getValue(cell)); + } else if (k == 12) { + // AD域账号 + Cell cell = row.getCell(k); + userInfo.setWindowsAccount(getValue(cell)); + }else if (k == 13) { // 所属机构 Cell cell = row.getCell(k); userInfo.setOrganization(getValue(cell)); - }else if (k == 15) { + }else if (k == 14) { // 分支机构 Cell cell = row.getCell(k); userInfo.setDivision(getValue(cell)); + }else if (k == 15) { + // 部门编号 + Cell cell = row.getCell(k); + userInfo.setDepartmentId(getValue(cell)); }else if (k == 16) { // 部门名称 Cell cell = row.getCell(k); @@ -528,54 +528,58 @@ public class UserInfoService extends JpaBaseService { // 证件号码 Cell cell = row.getCell(k); userInfo.setIdCardNo(getValue(cell)); - }else if (k == 34) { + } else if (k == 34) { + // 出生日期 + Cell cell = row.getCell(k); + userInfo.setBirthDate(getValue(cell)); + }else if (k == 35) { // 婚姻状态 todo 现在数据字段类型是 tinyint // Cell cell = row.getCell(k); // userInfo.setMarried(getValue(cell)); - }else if (k == 35) { + }else if (k == 36) { // 开始工作时间 Cell cell = row.getCell(k); userInfo.setStartWorkDate(getValue(cell)); - }else if (k == 36) { - // 国家 - Cell cell = row.getCell(k); - userInfo.setHomeCountry(getValue(cell)); }else if (k == 37) { - // 省 - Cell cell = row.getCell(k); - userInfo.setHomeRegion(getValue(cell)); - }else if (k == 38) { - // 城市 - Cell cell = row.getCell(k); - userInfo.setHomeLocality(getValue(cell)); - }else if (k == 39) { - // 家庭地址 - Cell cell = row.getCell(k); - userInfo.setHomeStreetAddress(getValue(cell)); - }else if (k == 40) { - // 家庭邮编 - Cell cell = row.getCell(k); - userInfo.setHomePostalCode(getValue(cell)); - }else if (k == 41) { - // 家庭传真 - Cell cell = row.getCell(k); - userInfo.setHomeFax(getValue(cell)); - }else if (k == 42) { - // 家庭电话 - Cell cell = row.getCell(k); - userInfo.setHomePhoneNumber(getValue(cell)); - }else if (k == 43) { - // 家庭邮箱 - Cell cell = row.getCell(k); - userInfo.setHomeEmail(getValue(cell)); - }else if (k == 44) { // 个人主页 Cell cell = row.getCell(k); userInfo.setWebSite(getValue(cell)); - }else if (k == 45) { + }else if (k == 38) { // 即时通讯 Cell cell = row.getCell(k); userInfo.setDefineIm(getValue(cell)); + }else if (k == 39) { + // 国家 + Cell cell = row.getCell(k); + userInfo.setHomeCountry(getValue(cell)); + }else if (k == 40) { + // 省 + Cell cell = row.getCell(k); + userInfo.setHomeRegion(getValue(cell)); + }else if (k == 41) { + // 城市 + Cell cell = row.getCell(k); + userInfo.setHomeLocality(getValue(cell)); + }else if (k == 42) { + // 家庭地址 + Cell cell = row.getCell(k); + userInfo.setHomeStreetAddress(getValue(cell)); + }else if (k == 43) { + // 家庭邮编 + Cell cell = row.getCell(k); + userInfo.setHomePostalCode(getValue(cell)); + }else if (k == 44) { + // 家庭传真 + Cell cell = row.getCell(k); + userInfo.setHomeFax(getValue(cell)); + }else if (k == 45) { + // 家庭电话 + Cell cell = row.getCell(k); + userInfo.setHomePhoneNumber(getValue(cell)); + }else if (k == 46) { + // 家庭邮箱 + Cell cell = row.getCell(k); + userInfo.setHomeEmail(getValue(cell)); } } userInfo.setStatus(1); @@ -595,7 +599,13 @@ public class UserInfoService extends JpaBaseService { try { is.close(); } catch (IOException e) { - // TODO Auto-generated catch block + e.printStackTrace(); + } + } + if(wb != null) { + try { + wb.close(); + } catch (IOException e) { e.printStackTrace(); } } @@ -617,7 +627,7 @@ public class UserInfoService extends JpaBaseService { } else if (cell.getCellType() == CellType.BOOLEAN) { return String.valueOf(cell.getBooleanCellValue()); } else if (cell.getCellType() == CellType.NUMERIC) { - cell.setCellType(CellType.STRING); + cell.setBlank(); return String.valueOf(cell.getStringCellValue().trim()); } else { return String.valueOf(cell.getStringCellValue().trim()); diff --git a/maxkey-persistence/src/test/resources/application.properties b/maxkey-persistence/src/test/resources/application.properties index 9de09bf7d..c65c56764 100644 --- a/maxkey-persistence/src/test/resources/application.properties +++ b/maxkey-persistence/src/test/resources/application.properties @@ -24,7 +24,7 @@ spring.servlet.multipart.max-file-size=4194304 #server.servlet.encoding.force=true #datasource spring.datasource.username=root -spring.datasource.password=root +spring.datasource.password=maxkey spring.datasource.url=jdbc:mysql://localhost/maxkey?autoReconnect=true&characterEncoding=UTF-8&serverTimezone=UTC spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.type=com.alibaba.druid.pool.DruidDataSource @@ -69,24 +69,24 @@ spring.messages.encoding=UTF-8 spring.main.banner-mode=log spring.main.allow-bean-definition-overriding=true -###########【Kafka集群】########### +###########\u3010Kafka\u96c6\u7fa4\u3011########### spring.kafka.bootstrap-servers=localhost:9092 -###########【初始化生产者配置】########### -# 重试次数 +###########\u3010\u521d\u59cb\u5316\u751f\u4ea7\u8005\u914d\u7f6e\u3011########### +# \u91cd\u8bd5\u6b21\u6570 spring.kafka.producer.retries=0 -# 应答级别:多少个分区副本备份完成时向生产者发送ack确认(可选0、1、all/-1) +# \u5e94\u7b54\u7ea7\u522b:\u591a\u5c11\u4e2a\u5206\u533a\u526f\u672c\u5907\u4efd\u5b8c\u6210\u65f6\u5411\u751f\u4ea7\u8005\u53d1\u9001ack\u786e\u8ba4(\u53ef\u90090\u30011\u3001all/-1) spring.kafka.producer.acks=1 -# 批量大小 +# \u6279\u91cf\u5927\u5c0f spring.kafka.producer.batch-size=16384 -# 提交延时 +# \u63d0\u4ea4\u5ef6\u65f6 spring.kafka.producer.properties.linger.ms=0 -# 当生产端积累的消息达到batch-size或接收到消息linger.ms后,生产者就会将消息提交给kafka -# linger.ms为0表示每接收到一条消息就提交给kafka,这时候batch-size其实就没用了 +# \u5f53\u751f\u4ea7\u7aef\u79ef\u7d2f\u7684\u6d88\u606f\u8fbe\u5230batch-size\u6216\u63a5\u6536\u5230\u6d88\u606flinger.ms\u540e,\u751f\u4ea7\u8005\u5c31\u4f1a\u5c06\u6d88\u606f\u63d0\u4ea4\u7ed9kafka +# linger.ms\u4e3a0\u8868\u793a\u6bcf\u63a5\u6536\u5230\u4e00\u6761\u6d88\u606f\u5c31\u63d0\u4ea4\u7ed9kafka,\u8fd9\u65f6\u5019batch-size\u5176\u5b9e\u5c31\u6ca1\u7528\u4e86 -# 生产端缓冲区大小 +# \u751f\u4ea7\u7aef\u7f13\u51b2\u533a\u5927\u5c0f spring.kafka.producer.buffer-memory = 33554432 -# Kafka提供的序列化和反序列化类 +# Kafka\u63d0\u4f9b\u7684\u5e8f\u5217\u5316\u548c\u53cd\u5e8f\u5217\u5316\u7c7b spring.kafka.producer.key-serializer=org.apache.kafka.common.serialization.StringSerializer spring.kafka.producer.value-serializer=org.apache.kafka.common.serialization.StringSerializer -# 自定义分区器 +# \u81ea\u5b9a\u4e49\u5206\u533a\u5668 # spring.kafka.producer.properties.partitioner.class=com.felix.kafka.producer.CustomizePartitioner diff --git a/maxkey-protocols/maxkey-protocol-tokenbased/src/main/java/org/maxkey/authz/token/endpoint/adapter/TokenBasedJWTAdapter.java b/maxkey-protocols/maxkey-protocol-tokenbased/src/main/java/org/maxkey/authz/token/endpoint/adapter/TokenBasedJWTAdapter.java index 1f46a07b7..9f2107b77 100644 --- a/maxkey-protocols/maxkey-protocol-tokenbased/src/main/java/org/maxkey/authz/token/endpoint/adapter/TokenBasedJWTAdapter.java +++ b/maxkey-protocols/maxkey-protocol-tokenbased/src/main/java/org/maxkey/authz/token/endpoint/adapter/TokenBasedJWTAdapter.java @@ -69,7 +69,7 @@ public class TokenBasedJWTAdapter extends AbstractAuthorizeAdapter { .claim("user_id", userInfo.getId()) .claim("external_id", userInfo.getId()) .claim("locale", userInfo.getLocale()) - .claim(WebConstants.ONLINE_TICKET_NAME, authentication.getOnlineTicket()) + .claim(WebConstants.ONLINE_TICKET_NAME, authentication.getOnlineTicket().getTicketId()) .claim("kid", jwtSignerService.getDefaultSignerKeyId()) .build(); diff --git a/maxkey-protocols/maxkey-protocol-tokenbased/src/main/java/org/maxkey/authz/token/endpoint/adapter/TokenBasedJWTHS256Adapter.java b/maxkey-protocols/maxkey-protocol-tokenbased/src/main/java/org/maxkey/authz/token/endpoint/adapter/TokenBasedJWTHS256Adapter.java index 358ee4441..7de272d2f 100644 --- a/maxkey-protocols/maxkey-protocol-tokenbased/src/main/java/org/maxkey/authz/token/endpoint/adapter/TokenBasedJWTHS256Adapter.java +++ b/maxkey-protocols/maxkey-protocol-tokenbased/src/main/java/org/maxkey/authz/token/endpoint/adapter/TokenBasedJWTHS256Adapter.java @@ -69,7 +69,7 @@ public class TokenBasedJWTHS256Adapter extends AbstractAuthorizeAdapter { .claim("email", userInfo.getWorkEmail()) .claim("name", userInfo.getUsername()) .claim("user_id", userInfo.getId()) - .claim(WebConstants.ONLINE_TICKET_NAME, authentication.getOnlineTicket()) + .claim(WebConstants.ONLINE_TICKET_NAME, authentication.getOnlineTicket().getTicketId()) .claim("external_id", userInfo.getId()) .claim("locale", userInfo.getLocale()) .claim("kid", "SYMMETRIC-KEY") diff --git a/maxkey-web-manage/src/main/java/org/maxkey/web/contorller/OrganizationsController.java b/maxkey-web-manage/src/main/java/org/maxkey/web/contorller/OrganizationsController.java index ee539c1fa..689a4e914 100644 --- a/maxkey-web-manage/src/main/java/org/maxkey/web/contorller/OrganizationsController.java +++ b/maxkey-web-manage/src/main/java/org/maxkey/web/contorller/OrganizationsController.java @@ -21,13 +21,17 @@ import java.util.HashMap; import java.util.List; import org.apache.mybatis.jpa.persistence.JpaPageResults; +import org.maxkey.constants.ConstantsOperateMessage; +import org.maxkey.domain.ExcelImport; import org.maxkey.domain.Organizations; import org.maxkey.persistence.service.OrganizationsService; import org.maxkey.web.WebContext; import org.maxkey.web.component.TreeNode; import org.maxkey.web.component.TreeNodeList; import org.maxkey.web.message.Message; +import org.maxkey.web.message.MessageScope; import org.maxkey.web.message.MessageType; +import org.maxkey.web.message.OperateType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -195,7 +199,18 @@ public class OrganizationsController { public ModelAndView orgUsersList() { return new ModelAndView("orgs/orgUsersList"); } - + @RequestMapping(value = "/import") + public ModelAndView importing(@ModelAttribute("excelImportFile")ExcelImport excelImportFile) { + ModelAndView modelAndView=new ModelAndView("/orgs/orgsImport"); + + if (excelImportFile.getExcelFile() != null && !excelImportFile.getExcelFile().isEmpty() && organizationsService.importing(excelImportFile.getExcelFile())) { + new Message(WebContext.getI18nValue(ConstantsOperateMessage.INSERT_SUCCESS), null, MessageType.success, OperateType.add, MessageScope.DB); + }else { + new Message(WebContext.getI18nValue(ConstantsOperateMessage.INSERT_ERROR), MessageType.error); + } + + return modelAndView; + } diff --git a/maxkey-web-manage/src/main/java/org/maxkey/web/contorller/UserInfoController.java b/maxkey-web-manage/src/main/java/org/maxkey/web/contorller/UserInfoController.java index 4bbad8adb..c56011476 100644 --- a/maxkey-web-manage/src/main/java/org/maxkey/web/contorller/UserInfoController.java +++ b/maxkey-web-manage/src/main/java/org/maxkey/web/contorller/UserInfoController.java @@ -272,18 +272,6 @@ public class UserInfoController { } } - @ResponseBody - @RequestMapping(value="/changeUserinfoStatus") - public Message changeUserinfoStatus( @ModelAttribute("userInfo")UserInfo userInfo) { - _logger.debug(userInfo.getId()); - if(userInfoService.update(userInfo)) { - return new Message(WebContext.getI18nValue(ConstantsOperateMessage.UPDATE_SUCCESS),MessageType.success); - - } else { - return new Message(WebContext.getI18nValue(ConstantsOperateMessage.UPDATE_ERROR),MessageType.error); - } - } - @RequestMapping(value = "/import") public ModelAndView importing(@ModelAttribute("excelImportFile")ExcelImport excelImportFile) { ModelAndView modelAndView=new ModelAndView("/userinfo/usersImport"); diff --git a/maxkey-web-manage/src/main/resources/messages/message.properties b/maxkey-web-manage/src/main/resources/messages/message.properties index a2aefdb54..ce6af876b 100644 --- a/maxkey-web-manage/src/main/resources/messages/message.properties +++ b/maxkey-web-manage/src/main/resources/messages/message.properties @@ -50,6 +50,8 @@ common.text.status.invalid=\u65e0\u6548 common.text.status.expired=\u8fc7\u671f common.text.status.delete=\u5220\u9664 common.text.description=\u63cf\u8ff0 +common.text.yes=\u662f +common.text.no=\u5426 main.rpt.newuser=\u5f53\u6708\u65b0\u7528\u6237 main.rpt.activeuser=\u672c\u6708\u6d3b\u8dc3\u7528\u6237 @@ -447,6 +449,7 @@ button.text.delete.member=\u5220\u9664\u6210\u5458 button.text.generate=\u751f\u6210 button.text.view=\u67e5\u770b button.text.hidden=\u9690\u85cf +button.text.import=\u5bfc\u5165 log.loginhistory.id=\u7f16\u53f7 log.loginhistory.sessionId=\u4f1a\u8bdd @@ -487,6 +490,14 @@ message.action.update.success=\u66f4\u65b0\u64cd\u4f5c\u6210\u529f message.action.update.error=\u66f4\u65b0\u64cd\u4f5c\u5931\u8d25 message.action.delete.success=\u5220\u9664\u64cd\u4f5c\u6210\u529f message.action.delete.error=\u5220\u9664\u64cd\u4f5c\u5931\u8d25 +message.action.import.success=\u6279\u91cf\u5bfc\u5165\u6210\u529f +message.action.import.error=\u6279\u91cf\u5bfc\u5165\u5931\u8d25 + +import.title=\u6279\u91cf\u5bfc\u5165\u6570\u636e +import.file.select=\u9009\u62e9\u5bfc\u5165\u6587\u4ef6 +import.template.download=\u4e0b\u8f7d\u6a21\u677f +import.update.exist=\u66f4\u65b0\u5b58\u5728\u6570\u636e +import.tip=\u63d0\u793a\uff1a\u4ec5\u5141\u8bb8\u5bfc\u5165\u201cxls\u201d\u6216\u8005\u201cxlsx\u201d\u683c\u5f0f\u7684\u6587\u4ef6 navs.system=\u7cfb\u7edf navs.home=\u9996\u9875 diff --git a/maxkey-web-manage/src/main/resources/messages/message_en.properties b/maxkey-web-manage/src/main/resources/messages/message_en.properties index 8f8962726..b191bdc1f 100644 --- a/maxkey-web-manage/src/main/resources/messages/message_en.properties +++ b/maxkey-web-manage/src/main/resources/messages/message_en.properties @@ -50,6 +50,8 @@ common.text.status.invalid=invalid common.text.status.expired=expired common.text.status.delete=delete common.text.description=description +common.text.yes=yes +common.text.no=no main.rpt.newuser=New Users/Month @@ -441,11 +443,12 @@ button.text.search=Search button.text.expandsearch=Expand button.text.collapsesearch=Collapse button.text.cancel=Cancel -button.text.add.member=Ddd member +button.text.add.member=Add member button.text.delete.member=Delete member button.text.generate=Generate button.text.view=View button.text.hidden=Hidden +button.text.import=Import log.loginhistory.id=id @@ -487,6 +490,15 @@ message.action.update.success=Update Success message.action.update.error=Update Error message.action.delete.success=Delete Success message.action.delete.error=Delete Error +message.action.import.success=Import Success +message.action.import.error=Import Error + +import.title=Batch Import Data +import.file.select=Import File +import.template.download=Download Template +import.update.exist=Update Exist Data +import.tip=Tip\uff1aolny Import \u201cxls\u201d or \u201cxlsx\u201d file\u3002 + navs.system=System navs.home=Home diff --git a/maxkey-web-manage/src/main/resources/messages/message_zh_CN.properties b/maxkey-web-manage/src/main/resources/messages/message_zh_CN.properties index a2aefdb54..ce6af876b 100644 --- a/maxkey-web-manage/src/main/resources/messages/message_zh_CN.properties +++ b/maxkey-web-manage/src/main/resources/messages/message_zh_CN.properties @@ -50,6 +50,8 @@ common.text.status.invalid=\u65e0\u6548 common.text.status.expired=\u8fc7\u671f common.text.status.delete=\u5220\u9664 common.text.description=\u63cf\u8ff0 +common.text.yes=\u662f +common.text.no=\u5426 main.rpt.newuser=\u5f53\u6708\u65b0\u7528\u6237 main.rpt.activeuser=\u672c\u6708\u6d3b\u8dc3\u7528\u6237 @@ -447,6 +449,7 @@ button.text.delete.member=\u5220\u9664\u6210\u5458 button.text.generate=\u751f\u6210 button.text.view=\u67e5\u770b button.text.hidden=\u9690\u85cf +button.text.import=\u5bfc\u5165 log.loginhistory.id=\u7f16\u53f7 log.loginhistory.sessionId=\u4f1a\u8bdd @@ -487,6 +490,14 @@ message.action.update.success=\u66f4\u65b0\u64cd\u4f5c\u6210\u529f message.action.update.error=\u66f4\u65b0\u64cd\u4f5c\u5931\u8d25 message.action.delete.success=\u5220\u9664\u64cd\u4f5c\u6210\u529f message.action.delete.error=\u5220\u9664\u64cd\u4f5c\u5931\u8d25 +message.action.import.success=\u6279\u91cf\u5bfc\u5165\u6210\u529f +message.action.import.error=\u6279\u91cf\u5bfc\u5165\u5931\u8d25 + +import.title=\u6279\u91cf\u5bfc\u5165\u6570\u636e +import.file.select=\u9009\u62e9\u5bfc\u5165\u6587\u4ef6 +import.template.download=\u4e0b\u8f7d\u6a21\u677f +import.update.exist=\u66f4\u65b0\u5b58\u5728\u6570\u636e +import.tip=\u63d0\u793a\uff1a\u4ec5\u5141\u8bb8\u5bfc\u5165\u201cxls\u201d\u6216\u8005\u201cxlsx\u201d\u683c\u5f0f\u7684\u6587\u4ef6 navs.system=\u7cfb\u7edf navs.home=\u9996\u9875 diff --git a/maxkey-web-manage/src/main/resources/static/template/excel/Orgs_Import_Template.xlsx b/maxkey-web-manage/src/main/resources/static/template/excel/Orgs_Import_Template.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..d5b390dac2b140388a6d4525e831d8d4bcd1bb27 GIT binary patch literal 10277 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 T#0LQYWXO*e;>J7FKmYw79{!EJ literal 0 HcmV?d00001 diff --git a/maxkey-web-manage/src/main/resources/static/template/excel/Users_Import_Template.xlsx b/maxkey-web-manage/src/main/resources/static/template/excel/Users_Import_Template.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..7dadfc1d44491e9aa702494cc6a24514af1e25c5 GIT binary patch literal 10866 zcmeHtgHv|G>RF`R!TB-t+yE+4HTLHM5lEfpB;L1OO5M0H6Yh@&t_8!T43HoQ{Cb3Q-OFT22IQB$j{Y1Q`8=Bl{pbi`suoe9Vcv++euc(;QFtx%vyr!&wHk!TU;=$PaErV6SsK=KNDa z|FLb#Ope$e?kzz`jv-hUi-7M<2iRw1j^(i1$Un|r^AH{r-X>ziO!M--%a{kGxEd11 zRq&sq!TF=@i#wRlT||*xmqIWWKjey1EGPfKAbo)H?C}u@Q2q~^)~d79oI!n00eTe` zN>hCYu(cx_>(BH5==opF$-n&dvUtUpUF>KfM>2Pz{g*R~u~=gAuA(wus9yQ_$u3~l zM(2S@7u)E`uwIb_0;PRheC`Gzi-OU+{ZtpLTxF3scmgzauH_*qH*cL08R;C7rQVjU zbYr{BoX=dONz1u2xU{@uENv*xksny1k(&A;QH3?eszHK`TR;{-K(he-RP|2FbzctnQHHo^KIiE$PQKkbw zwY$EFb^EDAdK>P&7mHFxzbZ8s&egLq=|0-*b6@Qmt{+1m+`D;@yGr|y2Ld7~ioZi6 z*565jth+KW3nfSm0sw#swTzoJo2#9Jm64sD)z3IqrVg>qW5@E=w|IoP{t(beD@vFUfTH6o-<4*?6}RK~m~T=#+W~yp{>2XQa0=(=uT@1%#dVAc4~9 zq&TA|K)&^r8NlXw{>w9CNaqy;JYzB~ZQc(C4dH=_;#||&h*Ljw4h`r_Lk`lMYYDWS zNqTjTc4+hh)AJ(R_%fRkmvDFLfX{T+k=$`Tn!I@2M3DHVNw}#i^f7O2h7J?*GSoB; zC&v~(eD=7bv2chg&Y)Nd>lj|7uB`l`;(-F{;eY3Vzi?v8DfCJclm{dLBp4_M{)`oW zWx~JX1`ITb{3TrQtutO9Y*JD7?iaNs;}t&arY?M6;VfJjCMHclSyU zP%+*+;x-D$_cLeW@oru*&=QB{6;ex_HBN?bS&p(hKeKckCm)2)n?p70em6mC`{e;O z_4SnRpPFtwHi|m`!V^?Gn6nWL-NvZ(qQ*;sLpMRd zfhYot?qy>R*TH7Wi5l%hR`O4fMW;!If&F>0wyOwq{&ZT7v~jnj_^25vlAJ}VU#>B8>=x#g1qxfNp0Cm{zEAEhNqO)q z+~pD)vS~k5VQ9MS3hnhRy>-c8uw~iVdWb zvgU+;ul|gD{?VnU4c*Q4THf`3vj5?;bf5(+_GVEv$}`gW90=wSEQA=n1g`02zvojS z9cGV4DtR1ESS4M^>h-nQ4wHr;Y%wa`keq*dlu>eX9ETQb=tVfHto}n;^Rb!zN{#UP zR_~He(o{0p@O?Q%6zQw405lTHdBdNSq zg;W+4)-M-^R2~#I2Ne}TVcSsgDJbj;D(r)Km4|I4#jhW}MQmb()alPWV+Cu4Fd8!t zDKF4fGbIw!iz~AZ^1>(U1CHtCuo*MX>3}W5GAE~<)#j&Yv zNAansx5TiiU0Cs{a<}BLseLM--)u`^Q-|1sb3%!l)PlltJSD@3Jd~jW>7N5t=)ep* zKoOUWU_f!jf4a)>s(Miz6fDA;b3MdJP?hlbf;1-pja17a#u0pOS?Qu(7Fz_B3lgRuzfd7)vpa)}&h)A>3X?Hf^a?wyw_TiIK*7d7-c9YEdNI?(Z?rUG;#j?s~vW z52*BlN^iX`$tW^XjKH#tZAOMFC1-Rm@@k3SFu_0U2n0@H4yM$q0Ayk zZ};;c;G1lG%?`M5FjE$Fx3^Ok4L>$e7Ul5bD$WK75(k9EZ+y!R@N_pH@6eM=%+VEn za;Tn*g-^avg_g9v(pqaahk5ws7J+=>2osIJVUL2u$^J;>Sw6*A4m>dC5>8=BH-AXe zwCyaXx5zxXRk7j$1`l453n^)d+Lr|MjgO1NAve>9X5#*q^))$S-ejoa;c`564s9J0 zFB+Fxg}z!Mpe-mr&(qXrXCQa=Eq}&coZT&A{pt$MSg-#)XIJ)(kd~}0$0t*t0{kib ztj-@xaxC+s#48%~3WDrD?TE2-15c5br8y`_D}mV=+AvT|n;u&dFt zk8QhTBbX*uZw6L+iqA3DpD@t(D4t;Qh9cv!;G~MZ7C+7TFcpBW(%G(`_0l{t&%*n? zOSi}kG?n;!SWp!4V-A95(tadAD?@*T1t)W`4VdkZ^B)mmUu(<`!j0F8Irm7peW+bW z`we3kug;p@DxuDN0Yhk#+omcs8sA2!l|S=|JG_&aJFM7NKuymsNqt&OK!-y z;l&P~O7d#Vm(GQjs>f@y*@?`sw*lmpFR!2MHdJ9nwpb>;%qIR}W$mx##%-(>0JmUz zy2~ZLwak+<)3g;l0~a^#teWTt5%^4;W?%-=Yr3`C0;1G^T&^}0`;5CoLP~%lAXF|3 zr~f0&bd)%kobV>C`V`xTSvQoLby>9Ud^$^KvF(kdXD~Ltfc5h)IX6uED1kc`dgo~) zed$WxBF9~ay=}0{Rneqeh%1x}S84#Rw00Rs)~2!S*~9Zd*i!!!`N$)m&r8L`ZX>?N zk&ZmEBEU~C8hw3HMaZPEB%xzI;mYoOt#@933>P|iT5Ol>NZjBfp31(gAAf_zoqKN1 z6HA;I`r1w4ICR8grCCDsxpj%W3y1N?Idv;!kM3$J04SDPR8_i+z%7JMxd%JfBm;XZ zY}lBg8D5S!)b!IKdJDo`iip16$FOXnC@!l3)YRj0x`DoxgeYc-z82&+dgv$iJ7nzG z39=KV4n~?}xlR>2%{SK&U+Bv5`nEpnjnFOY(HV8--c?GQ&;7|e5&f+vz1j#XJ(pwp z4-a=em`iu(L!6P9wjsUzUJ^LNA0Sr?jeR&o?}J62nAw?eL|}6;E2FitR3KvUlDl~Z z7o*R1nIch`WV3NEcbvp^oP$P_12jEa@#ztcQ#t01)1CwBP4u;cq=%erj|6pg8$6Ld ze7lKJwgkCV>iSjUqz^IlB8+^&D}Wt&8xc&CRizfilIJNChCOTiY=Fp&b43uOgo$k> zBV}TZr)uFOgVR4WD21hJ)4h4+KV>}4y(=ut8F#ErX-Os0IgPXiqm7a{ryHXzcJ4<( zg$Yv?_cA$+HU%*? z?Px7x6zer3u*5FRU2IZ5={}$kkwSawVAl)Y($@7(nE(4o*trdVbN2Ty_K%_?hk0NR z!Y-?7Av5pz{g?3v4@b0~vtPW<#q=yW`&}A^HA>G-wv4=`7=*ByBHlG zMT%UTzF_^GfJ2u+2MFXDi>-e9jII?#EgU`pOK|?Y_B`XX^E^WUwb!ux)B71ZBK_lX z7qp@ERK-&v%W}HQyhb;B(4Y(3Tus-5*!p&**5McK!x<%)iiSNMcoe866)Gkjv2t$c+*D7|z_$~>vbJY`N&x~v#e7m?yyl@B+D1L~VidWF;3 z^x{=Mq;e!9UqkzA@#0YDU#RIlHQ&u}U8uxvcb|h};Xg#XxUo-T&UR_g-KFLa1%3|i zKOub3O9aQgosbqB1y)GVYXk-%W$-0}$Tcv0)zG=rNpc%zb}5l4SQ@$e2m7Qj;%(`O z$4uR*&uXk#o=sk}FnCqqe=QokTkM#OXQ5i8|8cfJJOy^a6b*+Td5^Z7XwQ4{abqF_ zhqr41NlVL@kgib74sUEEzDH(c%5s4c}qcDeZ9jsJfm9HtCEO@n|0OF zqlfiXEUXXohTe0wHJ*kAi`y7XK5erlHF=d9JE1C{MfRmdONG34`OQ%FT}k68Ftn2@ z2_*4F&OrCCzf7L(omVXF*CF^^T2w{($8DXcbi;O*x*a^C{!`Ej;^ph>2Lb@J(E1Ph zpFzvf$=w?4_;Ud>tT7S;;l^qu+!jD;wmLT+s6v*2xh3sS#^1;v$Tmg{JS{U73#=i zh4sV~j+;a7TEc!yyiGpSfCM6PnZP%6`o8$jcia0%Vz9t4aCSyDY9(*@loAePg40n| za50#IWAR_JClyRh$1gWeP^b_8&~rU}mFh4}RaUZ37K<{(b2~pOp>8Z$pQz%@uGwEw zJyRNw8eWf9T=&M0v-Es(vR<2yh-1>zh4H=YM3|T!pn@hMz;s=BvEZ|lJvTMX$y#jl z_}hEjC7o-T{Pwu@nBB7+5F?yMbW*sG2FH6C74m=?QdXbkk8c9dF12N+n`;l*f#IPU zpg}m?N!3{Xu#7l+-8iMSd%L#g$9v3j_2r0aar*PxcF-4%Qih;6sN{-yG@S3Xc9Sp- zN70hVlhG5^`)mm^%*;x^p|KL%(z7;ZjWqwLgK>Ro+&72FKTIh@&7dj?dTD5Mz6KFT z7u~GPYBDEo!8A|7p%4@id<>Lge{V&wktAErT+bn=HmmpLBXVz@ezqVz%YZQ#Pn-)~ zkTc^L)umrK;o)%0ow-ggsN0dr1jE~+coWNOM?$t+CWmq{K3U-YlLUI3P7dDwB53d_ zD}0}V#_Dm;nf$idc#~1S%eY6#;G-E{P5Adtt(%a@9EW6n~X%+c?8313g_l@hl-1$`9LpdWqVbK%bVJ=3`2)!`|Sl@ zGXIm5sN`m9@>)=5*YrHH>=G>4+tjR5sp)ea%ahRydW;@3TBQ1Z^`Gl`QdSI)Yz!x?YUAx=)z8u(}FfjDu7n;HC?gE$@_A*Xdr#lx7mCc7wvr* zVHpX+(UWfikc2j3FvoiZ{+mrPl$xT2l!t{DG@)4~vkEgr$L31HQ!VqNoGrV}jvIc3 zF67JOI5vveAI*p81p}c>l1!Zp6b{c#%o&409cLmL_8|(qYq#9jr2j;DW+U06WN5W( z4H*Ey`xoWS4IRKHYEBLowq}1YzwGs*5{W2YtKFpQ+;B@pt;H0VpM~}NvkJlkptS+M zYFfem`1WG%S5@VzrxDt4p8f_pnzHZ%todx8IX^c`_F+g2l@Wp)*S#{1?!3)L5eQzd zF->|t|JcVx1czz5<(J=CNf6$#LFsmS(=&`qxg+C`4VDbF#47v9uZgtSMmX*a;?OTf z6vfNwR@3_0rSiOD`?I!KFq+n6{9E{{tN}2zH>OUTE3J;-qp^P7*x2Ww8!k#2T#F|m zdb~{)tIB@CTEL2deoBcqZkz)^nV=!Pyj&dO%xFXDXTXd7bU@a%Ng$+%`gJVyszlBc z@d**jwCrX?owe>LvQI5rfQ6me!nzY_;3_QvjKf@EZRC$O+`JG@k>2vL%r&{5FLblk z4bH%#(}sD%eqrJUbvoL}M4sSRoI3di9>$>0(sCkNn^%{;4O!{mU2epZrcdM`JEp`h z4g?n=IICu3EoBrX%z&pZnq$2}+iBkPy$IW9@|;&z6g&cA3>cH~yf-;IU_#f~Bm1rb zR4=1Dcw7}aOFYyzIXQU}2{syQc)y^pI0`$;I@8PcoPKwo_T3UYJQBjKQ6!X(5|bGp z!p(CI-qU{ve>Nf4+0M5rOq=l}=k2Wd}<)*A16aceqI?xDtZk%VH3`r!0YY{FQjZWEV7&4`XoJD@LZ?$ zYmQOX<*1Ead?1a!pup|E&DmJj^ZhKdN)-ycz5Ra(#WG$PFVPun5MpWJEG8|0yfX&JD^v@pcPq~KmGV;&GuhqxIc@yzlw2xlyHOIbwqTs<4IluAH>}} z6TSwciL3EYH>hs`jc(=cB zxQ-+pFDtRMInhU~VN)1)q2>E@um>8&1)N#IT;I*<%=~C&XwWompnM} zGZNi%y~wok#(*od86G;lfO7Tk79e6`?<0i%`xiLSV&tC|u!mCE3GAQ-c5?d3Wwzfw zbFdm&*rFI6o7kHkn?b7s2KFX0#{DKT2&-O{V<}VsnfL5OemS^6m-hb7VV6)U$?a7G49ic{EgB1IRji(?=inID8SPXi7nxTj9$Cnv zVkd$9bxI6|8txx#o0O^NFAcS=4s@o(hV}(a?2MHi?Cc%cjO`r2|Jvp8zjgrBbYAf) z@?GqB!AtOu;sc)Pg^M8}b-*McKCCi^*5GwpbZ!gT+{K3$i!U>S68-XreAkDKDJFY? zC4p@0uetf9K@lo|_dH^|-Z5_m72N`1_fiSUY`NCAkqF8o_e!Jc6L}Ca6{Z5-;#e=s z&Z~akEOw|UAkul`Z^V6qanPe@jOX}ZdC>sA3p{|Kf7{%NLWVocu>kCHq0YrsJx2cK z^WFo16qADhKd+@g9pKxH5moIgOq7_WChKZ_uTa$BSht+V+lcvEskdS;mzCV;>JF~W zh9WCeMf~Hf-rE}88OQ{ukR$A)yUatJ+MndrL>DSS)a*dMtFzLot6q?~ zvf$JxSNL=#hh+b$RxVq$%Jbdbb=)BwMh(V2ay)Cq@DD?4G*w~3FC>6ZX;4#8UekmS zZ^_P%7jsd4i&MRxW60;SZTQ5Pw=%hRi$HcVB`C61DQQoeNN;G@kI<(TdGws6JK+=iZS#x)JVj){c5?PnUdM-Fc#0yUk4eFN#6xo5-~vPl zyPp@^TA+fB;&XenP)WRp%(Pb$hvFwAszCJ>C_dg!D z>^fvAEWLSc$@@0*GA_{Z$hch)fQZPUK}>-Jll7K4)U7arpWnabKkTAYmj6$H|J>2@ zZ^fUo2uhN_?C<$q@%LR0zf^~z)!N_oJp8WwpY7passO+^G$jAOo5jE5{N6MCg#<+V zzdzz{9mL;JelIcqLLq^s0MK9ad%^j4fZvzVp6P8uUd6bz|RjQ{`u literal 0 HcmV?d00001 diff --git a/maxkey-web-manage/src/main/resources/templates/views/orgs/orgsImport.ftl b/maxkey-web-manage/src/main/resources/templates/views/orgs/orgsImport.ftl new file mode 100644 index 000000000..eddb7870c --- /dev/null +++ b/maxkey-web-manage/src/main/resources/templates/views/orgs/orgsImport.ftl @@ -0,0 +1,67 @@ + + + + <#include "../layout/header.ftl"/> + <#include "../layout/common.cssjs.ftl"/> + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
<@locale code="import.file.select" /> + +
+ <@locale code="import.template.download" /> +
<@locale code="import.update.exist" /> + +
+ <@locale code="import.tip" /> +
+ + "/> + "/> + +
+
+ + \ No newline at end of file diff --git a/maxkey-web-manage/src/main/resources/templates/views/orgs/orgsList.ftl b/maxkey-web-manage/src/main/resources/templates/views/orgs/orgsList.ftl index 895fc8170..ac4580908 100644 --- a/maxkey-web-manage/src/main/resources/templates/views/orgs/orgsList.ftl +++ b/maxkey-web-manage/src/main/resources/templates/views/orgs/orgsList.ftl @@ -183,7 +183,11 @@ $(function () { -
+
+ " + wurl="<@base/>/orgs/import" wwidth="400px" wheight="250px" /> + " wurl="<@base/>/orgs/forwardAdd" wwidth="620" diff --git a/maxkey-web-manage/src/main/resources/templates/views/userinfo/changeUserinfoStatus.ftl b/maxkey-web-manage/src/main/resources/templates/views/userinfo/changeUserinfoStatus.ftl deleted file mode 100644 index 5776a0676..000000000 --- a/maxkey-web-manage/src/main/resources/templates/views/userinfo/changeUserinfoStatus.ftl +++ /dev/null @@ -1,64 +0,0 @@ - - - - <#include "../layout/header.ftl"/> - <#include "../layout/common.cssjs.ftl"/> - - - - - - -
- - - - - - - - - - - - - - - - - - - -
<@locale code="userinfo.displayName" /> : - - - -
<@locale code="userinfo.username" /> : - - -
<@locale code="userinfo.status" />: - -
- - "/> - -
-
- - \ No newline at end of file diff --git a/maxkey-web-manage/src/main/resources/templates/views/userinfo/userUpdate.ftl b/maxkey-web-manage/src/main/resources/templates/views/userinfo/userUpdate.ftl index 7ed13697e..e7e692dff 100644 --- a/maxkey-web-manage/src/main/resources/templates/views/userinfo/userUpdate.ftl +++ b/maxkey-web-manage/src/main/resources/templates/views/userinfo/userUpdate.ftl @@ -50,9 +50,14 @@ - <@locale code="login.text.password" />: + <@locale code="userinfo.status" />: - + diff --git a/maxkey-web-manage/src/main/resources/templates/views/userinfo/usersImport.ftl b/maxkey-web-manage/src/main/resources/templates/views/userinfo/usersImport.ftl index 12ed4eba0..a725f13ed 100644 --- a/maxkey-web-manage/src/main/resources/templates/views/userinfo/usersImport.ftl +++ b/maxkey-web-manage/src/main/resources/templates/views/userinfo/usersImport.ftl @@ -28,16 +28,35 @@ - + - + + + + + + + + + + diff --git a/maxkey-web-manage/src/main/resources/templates/views/userinfo/usersList.ftl b/maxkey-web-manage/src/main/resources/templates/views/userinfo/usersList.ftl index fcc035151..0fdf514a3 100644 --- a/maxkey-web-manage/src/main/resources/templates/views/userinfo/usersList.ftl +++ b/maxkey-web-manage/src/main/resources/templates/views/userinfo/usersList.ftl @@ -201,12 +201,12 @@ $(function () {
<@locale code="userinfo.displayName" /> :<@locale code="import.file.select" />
+ <@locale code="import.template.download" /> +
<@locale code="import.update.exist" /> + +
+ <@locale code="import.tip" /> +
- "/> + "/> + "/>
" /> - " wurl="<@base/>/userinfo/forwardChangePassword" wwidth="600px" wheight="250px" /> - " + " wurl="<@base/>/userinfo/import" wwidth="400px" wheight="250px" />