增加操作员管理功能
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');
+