增加操作员管理功能
diff --git a/backend/build.gradle b/backend/build.gradle
index 631933b..684619c 100644
--- a/backend/build.gradle
+++ b/backend/build.gradle
@@ -74,7 +74,7 @@
compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.9.1'
compile group: 'log4j', name: 'log4j', version: '1.2.17'
- compile group: 'com.supwisdom', name: 'payapi-sdk', version: '1.0.26-5-gf114ee1'
+ compile group: 'com.supwisdom', name: 'payapi-sdk', version: '1.0.28-1-g7415df3'
implementation 'org.hamcrest:hamcrest:2.1'
}
diff --git a/backend/src/main/java/com/supwisdom/dlpay/framework/dao/OperatorDao.java b/backend/src/main/java/com/supwisdom/dlpay/framework/dao/OperatorDao.java
index 28cc18e..ed4e68a 100644
--- a/backend/src/main/java/com/supwisdom/dlpay/framework/dao/OperatorDao.java
+++ b/backend/src/main/java/com/supwisdom/dlpay/framework/dao/OperatorDao.java
@@ -1,12 +1,13 @@
package com.supwisdom.dlpay.framework.dao;
import com.supwisdom.dlpay.framework.domain.TOperator;
+import com.supwisdom.dlpay.portal.dao.OperatorRepository;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.stereotype.Repository;
@Repository
-public interface OperatorDao extends JpaRepository<TOperator, String>, JpaSpecificationExecutor<TOperator> {
+public interface OperatorDao extends JpaRepository<TOperator, String>, JpaSpecificationExecutor<TOperator>, OperatorRepository {
TOperator findByOpercode(String opercode);
TOperator findByOperid(String operid);
diff --git a/backend/src/main/java/com/supwisdom/dlpay/framework/domain/TOperator.java b/backend/src/main/java/com/supwisdom/dlpay/framework/domain/TOperator.java
index be38fed..ba7e07e 100644
--- a/backend/src/main/java/com/supwisdom/dlpay/framework/domain/TOperator.java
+++ b/backend/src/main/java/com/supwisdom/dlpay/framework/domain/TOperator.java
@@ -75,6 +75,9 @@
private String jti;
@Transient
+ private String rolename;
+
+ @Transient
private Collection<? extends GrantedAuthority> authorities; //权限
public TOperator() {
@@ -200,6 +203,14 @@
this.authorities = authorities;
}
+ public String getRolename() {
+ return rolename;
+ }
+
+ public void setRolename(String rolename) {
+ this.rolename = rolename;
+ }
+
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return this.authorities;
diff --git a/backend/src/main/java/com/supwisdom/dlpay/framework/service/OperatorDetailService.java b/backend/src/main/java/com/supwisdom/dlpay/framework/service/OperatorDetailService.java
index 4c31b55..eebda6d 100644
--- a/backend/src/main/java/com/supwisdom/dlpay/framework/service/OperatorDetailService.java
+++ b/backend/src/main/java/com/supwisdom/dlpay/framework/service/OperatorDetailService.java
@@ -1,8 +1,12 @@
package com.supwisdom.dlpay.framework.service;
import com.supwisdom.dlpay.framework.domain.TOperator;
+import com.supwisdom.dlpay.framework.jpa.page.Pagination;
+import com.supwisdom.dlpay.portal.bean.OperatorSearchBean;
import com.supwisdom.dlpay.portal.domain.TBResource;
+import com.supwisdom.dlpay.portal.domain.TBRole;
import org.springframework.security.core.userdetails.UserDetailsService;
+import org.springframework.transaction.annotation.Transactional;
import java.util.List;
@@ -11,5 +15,22 @@
TOperator saveOper(TOperator operator);
+ TOperator saveOrUpdateOper(TOperator operator);
+
+ Boolean checkExistOper(String opercode, String operid);
+
+ void resetPassword(String operid);
+
+ String switchStatus(String operid, String status);
+
List<TBResource> getResByRoleId(String roleId);
+
+ @Transactional(readOnly = true)
+ List<TBRole> getAllRoles();
+
+ @Transactional(readOnly = true)
+ Pagination getOperatorList(OperatorSearchBean bean);
+
+ @Transactional(readOnly = true)
+ TBRole findRoleById(String roleId);
}
diff --git a/backend/src/main/java/com/supwisdom/dlpay/framework/service/impl/OperatorDetailServiceImpl.java b/backend/src/main/java/com/supwisdom/dlpay/framework/service/impl/OperatorDetailServiceImpl.java
index d2e1153..6df8991 100644
--- a/backend/src/main/java/com/supwisdom/dlpay/framework/service/impl/OperatorDetailServiceImpl.java
+++ b/backend/src/main/java/com/supwisdom/dlpay/framework/service/impl/OperatorDetailServiceImpl.java
@@ -2,18 +2,30 @@
import com.supwisdom.dlpay.framework.dao.OperatorDao;
import com.supwisdom.dlpay.framework.domain.TOperator;
+import com.supwisdom.dlpay.framework.jpa.page.Pagination;
import com.supwisdom.dlpay.framework.service.OperatorDetailService;
+import com.supwisdom.dlpay.framework.tenant.TenantContext;
+import com.supwisdom.dlpay.framework.util.DateUtil;
+import com.supwisdom.dlpay.framework.util.StringUtil;
+import com.supwisdom.dlpay.framework.util.TradeDict;
+import com.supwisdom.dlpay.mobile.exception.PortalBusinessException;
+import com.supwisdom.dlpay.portal.bean.OperatorSearchBean;
import com.supwisdom.dlpay.portal.dao.ResourceDao;
+import com.supwisdom.dlpay.portal.dao.RoleDao;
import com.supwisdom.dlpay.portal.domain.TBResource;
+import com.supwisdom.dlpay.portal.domain.TBRole;
+import com.supwisdom.dlpay.portal.util.PortalConstant;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
+import java.util.Optional;
@Service
public class OperatorDetailServiceImpl implements OperatorDetailService {
@@ -21,6 +33,8 @@
private OperatorDao operatorDao;
@Autowired
private ResourceDao resourceDao;
+ @Autowired
+ private RoleDao roleDao;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
@@ -46,6 +60,60 @@
}
@Override
+ public Boolean checkExistOper(String opercode, String operid) {
+ TOperator oper = operatorDao.findByOpercode(opercode.trim());
+ if (null != oper && StringUtil.isEmpty(operid)) {
+ return true;
+ }
+ return null != oper && !StringUtil.isEmpty(operid) && !operid.trim().equals(oper.getOperid());
+ }
+
+ @Override
+ public void resetPassword(String operid) {
+ TOperator operator = operatorDao.findByOperid(operid);
+ if (null == operator) {
+ throw new PortalBusinessException("该管理员账号不存在");
+ }
+ BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
+ operator.setOperpwd(encoder.encode(PortalConstant.OPERPWD_DEFAULT));
+ operatorDao.save(operator);
+ }
+
+ @Override
+ public String switchStatus(String operid, String status) {
+ TOperator operator = operatorDao.findByOperid(operid);
+ if (null == operator) {
+ throw new PortalBusinessException("该管理员账号不存在");
+ }
+ operator.setStatus(status);
+ operatorDao.save(operator);
+ return operator.getStatus();
+ }
+
+ @Override
+ public TOperator saveOrUpdateOper(TOperator operator) {
+ if (StringUtil.isEmpty(operator.getOperid())){
+ operator.setOpendate(DateUtil.getNow("yyyyMMdd"));
+ operator.setStatus(TradeDict.STATUS_NORMAL);
+ operator.setOpertype(PortalConstant.OPERTYPE_DEFAULT);
+ operator.setTenantId(TenantContext.getTenantSchema());
+ BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
+ operator.setOperpwd(encoder.encode(PortalConstant.OPERPWD_DEFAULT));
+ return operatorDao.save(operator);
+ }else {
+ TOperator op = operatorDao.findByOperid(operator.getOperid());
+ if (op == null) {
+ throw new PortalBusinessException("未找到待修改的管理员信息");
+ }
+ op.setOpername(operator.getOpername());
+ op.setRoleid(operator.getRoleid());
+ op.setMobile(operator.getMobile());
+ op.setEmail(operator.getEmail());
+ return operatorDao.save(op);
+ }
+ }
+
+ @Override
public List<TBResource> getResByRoleId(String roleId) {
List<TBResource> rootResource = resourceDao.findRootListByRole(roleId);
for (TBResource resource : rootResource) {
@@ -54,4 +122,19 @@
}
return rootResource;
}
+
+ @Override
+ public List<TBRole> getAllRoles() {
+ return roleDao.findAll();
+ }
+
+ @Override
+ public Pagination getOperatorList(OperatorSearchBean bean) {
+ return operatorDao.getOperatorList(bean);
+ }
+
+ @Override
+ public TBRole findRoleById(String roleId) {
+ return roleDao.findById(roleId).orElse(null);
+ }
}
diff --git a/backend/src/main/java/com/supwisdom/dlpay/portal/dao/impl/OperatorRepositoryImpl.java b/backend/src/main/java/com/supwisdom/dlpay/portal/dao/impl/OperatorRepositoryImpl.java
new file mode 100644
index 0000000..93ca48a
--- /dev/null
+++ b/backend/src/main/java/com/supwisdom/dlpay/portal/dao/impl/OperatorRepositoryImpl.java
@@ -0,0 +1,44 @@
+package com.supwisdom.dlpay.portal.dao.impl;
+
+import com.supwisdom.dlpay.framework.domain.TOperator;
+import com.supwisdom.dlpay.framework.jpa.BaseRepository;
+import com.supwisdom.dlpay.framework.jpa.Finder;
+import com.supwisdom.dlpay.framework.jpa.page.Pagination;
+import com.supwisdom.dlpay.framework.util.StringUtil;
+import com.supwisdom.dlpay.portal.bean.OperatorSearchBean;
+import com.supwisdom.dlpay.portal.dao.OperatorRepository;
+import org.hibernate.transform.Transformers;
+import org.jetbrains.annotations.NotNull;
+
+public class OperatorRepositoryImpl extends BaseRepository implements OperatorRepository {
+ @NotNull
+ @Override
+ public Pagination getOperatorList(@NotNull OperatorSearchBean bean) {
+ String opername = bean.getOpername();
+ String opercode = bean.getOpercode();
+ String status = bean.getStatus();
+ int pageno = bean.getPageno();
+ int pagesize = bean.getPagesize();
+ StringBuilder sql = new StringBuilder("select o.operid,o.opercode,o.opername,o.email,o.mobile,o.opendate,o.status,o.roleid,r.rolename from tb_operator o left join tb_role r on o.roleid = r.roleid where 1=1");
+ if (!StringUtil.isEmpty(opername)) {
+ sql.append(" and o.opername like :opername");
+ }
+ if (!StringUtil.isEmpty(opercode)) {
+ sql.append(" and o.opercode like :opercode");
+ }
+ if (!StringUtil.isEmpty(status)) {
+ sql.append(" and o.status=:status");
+ }
+ Finder f = Finder.create(sql.toString());
+ if (!StringUtil.isEmpty(opername)) {
+ f.setParameter("opername", "%" + opername.trim() + "%");
+ }
+ if (!StringUtil.isEmpty(opercode)) {
+ f.setParameter("opercode", "%" + opercode.trim() + "%");
+ }
+ if (!StringUtil.isEmpty(status)) {
+ f.setParameter("status", status);
+ }
+ return findNative(f, Transformers.aliasToBean(TOperator.class), pageno, pagesize);
+ }
+}
diff --git a/backend/src/main/java/com/supwisdom/dlpay/portal/util/PortalConstant.java b/backend/src/main/java/com/supwisdom/dlpay/portal/util/PortalConstant.java
index 21fc3a6..d738d2a 100644
--- a/backend/src/main/java/com/supwisdom/dlpay/portal/util/PortalConstant.java
+++ b/backend/src/main/java/com/supwisdom/dlpay/portal/util/PortalConstant.java
@@ -4,6 +4,9 @@
public static final String YES = "1";
public static final String NO = "0";
+ public static final String OPERPWD_DEFAULT = "123456";
+ public static final String OPERTYPE_DEFAULT = "oper";
+
public static final String SYSPARA_IMAGESERVER_URL = "imageserver.url.image";
public static final String SYSPARA_IMAGE_MAXSIZE = "imagemaxsize";
public static final String SYSPARA_IMAGE_MINISIZE = "minimagesize";
diff --git a/backend/src/main/kotlin/com/supwisdom/dlpay/mobile/MobileApi.kt b/backend/src/main/kotlin/com/supwisdom/dlpay/mobile/MobileApi.kt
index 22b08fc..71aed08 100644
--- a/backend/src/main/kotlin/com/supwisdom/dlpay/mobile/MobileApi.kt
+++ b/backend/src/main/kotlin/com/supwisdom/dlpay/mobile/MobileApi.kt
@@ -722,7 +722,15 @@
return JsonResult.error("用户不存在,请注册")
}
if (!user.userid.isNullOrEmpty()) {
- val response = userProxy.signbxy(user.userid, agree, user.phone)
+ val response = userProxy.signbxy(SignBxyParam().apply {
+ this.userid = user.userid
+ this.code = agree
+ this.phone = user.phone
+ this.uid = user.uid
+ this.rsaprivate = user.rsaprivate
+ this.rsapublic = user.rsapublic
+ this.secertkey = user.secertkey
+ })
if (response.retcode != 0) {
logger.error { "用户签约失败:${response.retmsg}" }
return JsonResult.error("签约失败,${response.retmsg}")
diff --git a/backend/src/main/kotlin/com/supwisdom/dlpay/portal/OperLoginHandler.kt b/backend/src/main/kotlin/com/supwisdom/dlpay/portal/OperLoginHandler.kt
index 7d4d4e6..7ac0a95 100644
--- a/backend/src/main/kotlin/com/supwisdom/dlpay/portal/OperLoginHandler.kt
+++ b/backend/src/main/kotlin/com/supwisdom/dlpay/portal/OperLoginHandler.kt
@@ -16,6 +16,7 @@
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.http.HttpStatus
import org.springframework.security.authentication.BadCredentialsException
+import org.springframework.security.authentication.DisabledException
import org.springframework.security.authentication.LockedException
import org.springframework.security.core.Authentication
import org.springframework.security.core.AuthenticationException
@@ -93,6 +94,7 @@
val errmsg = when (exception) {
is BadCredentialsException -> "账号或密码错误"
is LockedException -> "账户被锁定"
+ is DisabledException -> "账户已被注销,请联系管理员"
else -> exception.message!!
}
response.status = HttpStatus.OK.value()
diff --git a/backend/src/main/kotlin/com/supwisdom/dlpay/portal/PortalApi.kt b/backend/src/main/kotlin/com/supwisdom/dlpay/portal/PortalApi.kt
index 23d7284..35bfe6e 100644
--- a/backend/src/main/kotlin/com/supwisdom/dlpay/portal/PortalApi.kt
+++ b/backend/src/main/kotlin/com/supwisdom/dlpay/portal/PortalApi.kt
@@ -101,12 +101,14 @@
return try {
val p = SecurityContextHolder.getContext().authentication
val oper = operatorDetailService.findByOperid(p.name)
+ val role = operatorDetailService.findRoleById(oper.roleid)
+ ?: return JsonResult.error("操作员的角色不存在")
val data = HashMap<String, String>()
val url = systemUtilService.getBusinessValue(PortalConstant.SYSPARA_IMAGE_URLPUSH)
val mapKey = systemUtilService.getBusinessValue(PortalConstant.SYSPARA_PORTAL_AMAPKEY)
val mapUrl = systemUtilService.getBusinessValue(PortalConstant.SYSPARA_PORTAL_AMAPURL)
data["name"] = oper.opername
- data["roles"] = "admin"
+ data["roles"] = role.rolecode
data["url"] = url
data["mapkey"] = mapKey
data["mapurl"] = mapUrl
@@ -119,7 +121,7 @@
}
@RequestMapping("/user/updateinfo")
- fun updateUserInfo(@RequestBody bean:TOperator): JsonResult?{
+ fun updateUserInfo(@RequestBody bean: TOperator): JsonResult? {
return try {
val p = SecurityContextHolder.getContext().authentication
val oper = operatorDetailService.findByOperid(p.name)
@@ -151,6 +153,7 @@
}
}
+
@RequestMapping("/user/resource")
fun getUserResource(): JsonResult? {
return try {
@@ -555,4 +558,83 @@
JsonResult.error("切换网点是否开启异常")
}
}
+
+ /**
+ * 获取所有角色
+ */
+ @RequestMapping(value = ["/role/all"], method = [RequestMethod.GET])
+ fun getAllRoles(): JsonResult? {
+ return try {
+ val list = operatorDetailService.allRoles
+ return JsonResult.ok().put("list", list)
+ } catch (e: Exception) {
+ logger.error { e.message }
+ JsonResult.error("查询所有角色失败")
+ }
+ }
+
+ @RequestMapping(value = ["/operator/list"], method = [RequestMethod.GET])
+ fun getOperatorList(bean: OperatorSearchBean): JsonResult? {
+ return try {
+ val page = operatorDetailService.getOperatorList(bean)
+ if (page.list == null || page.list.size == 0) {
+ return JsonResult.ok().put("msg", "无数据")
+ }
+ return JsonResult.ok().put("page", page)
+ } catch (e: Exception) {
+ logger.error { e.message }
+ JsonResult.error("查询操作员列表失败")
+ }
+ }
+
+ @RequestMapping(value = ["/operator/save"], method = [RequestMethod.POST])
+ fun saveOutlets(@RequestBody operatorParam: TOperator): JsonResult? {
+ return try {
+ if (operatorDetailService.checkExistOper(operatorParam.opercode, operatorParam.operid)) {
+ return JsonResult.error("管理员账号重复,请更换")
+ }
+ val operator = TOperator()
+ operator.opercode = operatorParam.opercode
+ operator.opername = operatorParam.opername
+ operator.roleid = operatorParam.roleid
+ operator.mobile = operatorParam.mobile
+ operator.email = operatorParam.email
+ operator.operid = operatorParam.operid
+ operator.thirdadmin = if ("yes".equals(operatorParam.thirdadmin, ignoreCase = true)) "yes" else "no"
+ operatorDetailService.saveOrUpdateOper(operator)
+ JsonResult.ok()
+ } catch (e: Exception) {
+ logger.error { e.message }
+ JsonResult.error("保存管理员异常")
+ }
+ }
+
+ /**
+ * 重置管理员密码
+ */
+ @RequestMapping(value = ["/operator/resetpwd/{operid}"], method = [RequestMethod.POST])
+ fun resetPassword(@PathVariable operid:String): JsonResult? {
+ return try {
+ operatorDetailService.resetPassword(operid)
+ JsonResult.ok()
+ } catch (e: Exception) {
+ logger.error { e.message }
+ JsonResult.error("重置管理员密码异常")
+ }
+ }
+
+ /**
+ * 设置管理员状态
+ */
+ @RequestMapping(value = ["/operator/switchstatus/{operid}"], method = [RequestMethod.POST])
+ fun switchStatus(@PathVariable(value = "operid") operid: String,
+ @RequestParam(value = "status") status: String): JsonResult? {
+ return try {
+ val result = operatorDetailService.switchStatus(operid, status)
+ JsonResult.ok().put("result", result)
+ } catch (e: Exception) {
+ logger.error { e.message }
+ JsonResult.error("设置管理员状态异常")
+ }
+ }
}
\ No newline at end of file
diff --git a/backend/src/main/kotlin/com/supwisdom/dlpay/portal/bean/OperatorSearchBean.kt b/backend/src/main/kotlin/com/supwisdom/dlpay/portal/bean/OperatorSearchBean.kt
new file mode 100644
index 0000000..cfb75b1
--- /dev/null
+++ b/backend/src/main/kotlin/com/supwisdom/dlpay/portal/bean/OperatorSearchBean.kt
@@ -0,0 +1,9 @@
+package com.supwisdom.dlpay.portal.bean
+
+class OperatorSearchBean {
+ var opercode: String = ""
+ var opername: String = ""
+ var status: String = ""
+ var pageno: Int = 0
+ var pagesize: Int = 10
+}
\ No newline at end of file
diff --git a/backend/src/main/kotlin/com/supwisdom/dlpay/portal/dao/OperatorRepository.kt b/backend/src/main/kotlin/com/supwisdom/dlpay/portal/dao/OperatorRepository.kt
new file mode 100644
index 0000000..78b5369
--- /dev/null
+++ b/backend/src/main/kotlin/com/supwisdom/dlpay/portal/dao/OperatorRepository.kt
@@ -0,0 +1,8 @@
+package com.supwisdom.dlpay.portal.dao
+
+import com.supwisdom.dlpay.framework.jpa.page.Pagination
+import com.supwisdom.dlpay.portal.bean.OperatorSearchBean
+
+interface OperatorRepository {
+ fun getOperatorList(bean:OperatorSearchBean):Pagination
+}
\ No newline at end of file
diff --git a/backend/src/main/kotlin/com/supwisdom/dlpay/portal/dao/RoleDao.kt b/backend/src/main/kotlin/com/supwisdom/dlpay/portal/dao/RoleDao.kt
new file mode 100644
index 0000000..c5b553d
--- /dev/null
+++ b/backend/src/main/kotlin/com/supwisdom/dlpay/portal/dao/RoleDao.kt
@@ -0,0 +1,9 @@
+package com.supwisdom.dlpay.portal.dao
+
+import com.supwisdom.dlpay.portal.domain.TBRole
+import org.springframework.data.jpa.repository.JpaRepository
+import org.springframework.stereotype.Repository
+
+@Repository
+interface RoleDao : JpaRepository<TBRole, String>{
+}
\ No newline at end of file
diff --git a/backend/src/main/kotlin/com/supwisdom/dlpay/security.kt b/backend/src/main/kotlin/com/supwisdom/dlpay/security.kt
index b993822..0d67838 100644
--- a/backend/src/main/kotlin/com/supwisdom/dlpay/security.kt
+++ b/backend/src/main/kotlin/com/supwisdom/dlpay/security.kt
@@ -281,6 +281,8 @@
return
}
TenantContext.setTenantSchema(tenantId)
+ }else{
+ TenantContext.setTenantSchema(Constants.DEFAULT_TENANTID)
}
val auth = UsernamePasswordAuthenticationToken(claims[Constants.JWT_CLAIM_UID], null,
(claims[Constants.JWT_CLAIM_AUTHORITIES] as ArrayList<*>)
diff --git a/backend/src/main/resources/data-postgresql.sql b/backend/src/main/resources/data-postgresql.sql
index 8b708c6..9880a3d 100644
--- a/backend/src/main/resources/data-postgresql.sql
+++ b/backend/src/main/resources/data-postgresql.sql
@@ -37,6 +37,8 @@
INSERT INTO "tb_resource"("resid", "isleaf", "ordernum", "parentid", "resname", "respath", "showflag", "icon") VALUES ('4665765bf07d455486f2a5215dd97380', '1', 5, 'f066939ecbf64da3a54fa93d56e4391b', '文章管理', '/article/list', '1', NULL);
INSERT INTO "tb_resource"("resid", "isleaf", "ordernum", "parentid", "resname", "respath", "showflag", "icon") VALUES ('80e0326446a643069bc8d26c132d45ea', '1', 7, 'f066939ecbf64da3a54fa93d56e4391b', '咨询问答管理', '/advisory/index', '1', NULL);
INSERT INTO "tb_resource"("resid", "isleaf", "ordernum", "parentid", "resname", "respath", "showflag", "icon") VALUES ('7e60ec8e741441fe9a2f351b5ab8c965', '1', 8, 'f066939ecbf64da3a54fa93d56e4391b', '网点管理', '/outlets/index', '1', NULL);
+INSERT INTO "tb_resource"("resid", "isleaf", "ordernum", "parentid", "resname", "respath", "showflag", "icon") VALUES ('67291cc80fc148ceb939d98554977bc3', '1', 9, 'f066939ecbf64da3a54fa93d56e4391b', '角色管理', '/role/index', '1', NULL);
+
INSERT INTO "tb_operator"("operid", "closedate", "email", "mobile", "opendate", "opercode", "opername", "operpwd", "opertype", "sex", "status", "tenantid", "thirdadmin", "jti", "roleid") VALUES ('LOR2IwRkbOjp+sVG9KR2BpHZbwGKepS4', '20500101', NULL, NULL, '20190101', 'system', '系统管理员', '$2a$10$Ex9xp11.vCaD8D0a7ahiUOKqDij1TcCUBwRAmrqXeDvAkmzLibn4.', 'oper', NULL, 'normal', '{tenantid}', 'no', 'QwC1ln7rReYmBOhq57op6Q', '20497f2fa27a44f7841492288ab75d88');
@@ -52,6 +54,8 @@
INSERT INTO "tb_role_resource"("id", "addtime", "resid", "roleid") VALUES ('460d7f0b57eb4dcfb73fb1b51ad37f4f', '20200827142245', '99604b8d18b34417befe051a3720cbed', '20497f2fa27a44f7841492288ab75d88');
INSERT INTO "tb_role_resource"("id", "addtime", "resid", "roleid") VALUES ('49cb562956534d7dbf54b762b2b6af0d', '20200921162433', '80e0326446a643069bc8d26c132d45ea', '20497f2fa27a44f7841492288ab75d88');
INSERT INTO "tb_role_resource"("id", "addtime", "resid", "roleid") VALUES ('5f78e1eea840497c8b991323fab4541d', '20200923170348', '7e60ec8e741441fe9a2f351b5ab8c965', '20497f2fa27a44f7841492288ab75d88');
+INSERT INTO "tb_role_resource"("id", "addtime", "resid", "roleid") VALUES ('bb2f8e1a9aa74732bf1f35828ef8a87b', '20201027172455', '67291cc80fc148ceb939d98554977bc3', '20497f2fa27a44f7841492288ab75d88');
+