mirror of
https://github.com/chatopera/cosin.git
synced 2025-07-24 08:31:45 +08:00
#373 add new organ rule
This commit is contained in:
parent
84ec251e31
commit
fee95c1e32
@ -37,10 +37,7 @@ import org.springframework.web.servlet.ModelAndView;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.validation.Valid;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* @author 程序猿DD
|
||||
@ -83,11 +80,16 @@ public class OrganController extends Handler {
|
||||
@Autowired
|
||||
private UserProxy userProxy;
|
||||
|
||||
private Collection<Organ> getOwnOragans(HttpServletRequest request) {
|
||||
Organ currentOrgan = super.getOrgan(request);
|
||||
return organProxy.findAllOrganByParentAndOrgi(currentOrgan, super.getOrgi()).values();
|
||||
}
|
||||
|
||||
@RequestMapping("/index")
|
||||
@Menu(type = "admin", subtype = "organ")
|
||||
public ModelAndView index(ModelMap map, HttpServletRequest request, @Valid String organ, @Valid String msg) {
|
||||
List<Organ> organList = organRepository.findByOrgi(super.getOrgi());
|
||||
map.addAttribute("organList", organList);
|
||||
map.addAttribute("organList", getOwnOragans(request));
|
||||
if (organList.size() > 0) {
|
||||
Organ organData = null;
|
||||
if (!StringUtils.isBlank(organ) && !"null".equals(organ)) {
|
||||
@ -98,7 +100,7 @@ public class OrganController extends Handler {
|
||||
}
|
||||
}
|
||||
} else {
|
||||
map.addAttribute("organData", organData = organList.get(0));
|
||||
map.addAttribute("organData", organData = super.getOrgan(request));
|
||||
}
|
||||
if (organData != null) {
|
||||
map.addAttribute(
|
||||
@ -125,7 +127,7 @@ public class OrganController extends Handler {
|
||||
map.addAttribute("area", areaRepository.findByIdAndOrgi(area, super.getOrgi()));
|
||||
}
|
||||
|
||||
map.addAttribute("organList", organRepository.findByOrgi(super.getOrgi()));
|
||||
map.addAttribute("organList", getOwnOragans(request));
|
||||
|
||||
return request(super.createRequestPageTempletResponse("/admin/organ/add"));
|
||||
}
|
||||
@ -159,8 +161,8 @@ public class OrganController extends Handler {
|
||||
@RequestMapping("/seluser")
|
||||
@Menu(type = "admin", subtype = "seluser", admin = true)
|
||||
public ModelAndView seluser(ModelMap map, HttpServletRequest request, @Valid String organ) {
|
||||
map.addAttribute(
|
||||
"userList", userRepository.findByOrgiAndDatastatus(super.getOrgi(), false));
|
||||
Map<String, Organ> organs = organProxy.findAllOrganByParentAndOrgi(super.getOrgan(request), super.getOrgi(request));
|
||||
map.addAttribute("userList", userProxy.findUserInOrgans(organs.keySet()));
|
||||
Organ organData = organRepository.findByIdAndOrgi(organ, super.getOrgi());
|
||||
map.addAttribute("userOrganList", userProxy
|
||||
.findByOrganAndOrgiAndDatastatus(organ, super.getOrgi(), false));
|
||||
@ -249,7 +251,12 @@ public class OrganController extends Handler {
|
||||
) {
|
||||
logger.info("[userroledelete] user id {}, organ {}", id, organ);
|
||||
if (id != null) {
|
||||
organUserRes.deleteOrganUserByUseridAndOrgan(id, organ);
|
||||
List<OrganUser> organUsers = organUserRes.findByUserid(id);
|
||||
if (organUsers.size() > 1) {
|
||||
organUserRes.deleteOrganUserByUseridAndOrgan(id, organ);
|
||||
} else {
|
||||
return request(super.createRequestPageTempletResponse("redirect:/admin/organ/index.html?organ=" + organ + "&msg=not_allow_remove_user"));
|
||||
}
|
||||
}
|
||||
return request(super.createRequestPageTempletResponse("redirect:/admin/organ/index.html?organ=" + organ));
|
||||
}
|
||||
@ -258,10 +265,11 @@ public class OrganController extends Handler {
|
||||
@Menu(type = "admin", subtype = "organ")
|
||||
public ModelAndView edit(ModelMap map, HttpServletRequest request, @Valid String id) {
|
||||
ModelAndView view = request(super.createRequestPageTempletResponse("/admin/organ/edit"));
|
||||
Organ currentOrgan = super.getOrgan(request);
|
||||
map.addAttribute("areaList", areaRepository.findByOrgi(super.getOrgi()));
|
||||
view.addObject("organData", organRepository.findByIdAndOrgi(id, super.getOrgi()));
|
||||
|
||||
map.addAttribute("organList", organRepository.findByOrgi(super.getOrgi()));
|
||||
view.addObject("isRootOrgan", id.equals(currentOrgan.getId()));
|
||||
map.addAttribute("organList", getOwnOragans(request));
|
||||
return view;
|
||||
}
|
||||
|
||||
|
@ -21,6 +21,8 @@ import com.chatopera.cc.basic.MainContext;
|
||||
import com.chatopera.cc.controller.Handler;
|
||||
import com.chatopera.cc.model.*;
|
||||
import com.chatopera.cc.persistence.repository.*;
|
||||
import com.chatopera.cc.proxy.OrganProxy;
|
||||
import com.chatopera.cc.proxy.UserProxy;
|
||||
import com.chatopera.cc.util.Menu;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.slf4j.Logger;
|
||||
@ -36,6 +38,7 @@ import javax.servlet.http.HttpServletRequest;
|
||||
import javax.validation.Valid;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("/admin/role")
|
||||
@ -58,10 +61,18 @@ public class RoleController extends Handler {
|
||||
@Autowired
|
||||
private SysDicRepository sysDicRes;
|
||||
|
||||
@Autowired
|
||||
OrganProxy organProxy;
|
||||
|
||||
@Autowired
|
||||
UserProxy userProxy;
|
||||
|
||||
@RequestMapping("/index")
|
||||
@Menu(type = "admin", subtype = "role")
|
||||
public ModelAndView index(ModelMap map, HttpServletRequest request, @Valid String role, @Valid String msg) {
|
||||
List<Role> roleList = roleRepository.findByOrgi(super.getOrgi());
|
||||
Organ currentOrgan = super.getOrgan(request);
|
||||
|
||||
List<Role> roleList = roleRepository.findByOrgiAndOrgan(super.getOrgi(),currentOrgan.getId());
|
||||
map.addAttribute("roleList", roleList);
|
||||
map.addAttribute("msg", msg);
|
||||
if (roleList.size() > 0) {
|
||||
@ -92,6 +103,7 @@ public class RoleController extends Handler {
|
||||
@RequestMapping("/save")
|
||||
@Menu(type = "admin", subtype = "role")
|
||||
public ModelAndView save(HttpServletRequest request, @Valid Role role) {
|
||||
Organ currentOrgan = super.getOrgan(request);
|
||||
Role tempRole = roleRepository.findByNameAndOrgi(role.getName(), super.getOrgi());
|
||||
String msg = "admin_role_save_success";
|
||||
if (tempRole != null) {
|
||||
@ -101,6 +113,7 @@ public class RoleController extends Handler {
|
||||
role.setCreater(super.getUser(request).getId());
|
||||
role.setCreatetime(new Date());
|
||||
role.setUpdatetime(new Date());
|
||||
role.setOrgan(currentOrgan.getId());
|
||||
roleRepository.save(role);
|
||||
}
|
||||
return request(super.createRequestPageTempletResponse("redirect:/admin/role/index.html?msg=" + msg));
|
||||
@ -109,14 +122,14 @@ public class RoleController extends Handler {
|
||||
@RequestMapping("/seluser")
|
||||
@Menu(type = "admin", subtype = "seluser", admin = true)
|
||||
public ModelAndView seluser(ModelMap map, HttpServletRequest request, @Valid String role) {
|
||||
map.addAttribute("userList", userRepository.findByOrgiAndDatastatus(super.getOrgi(), false));
|
||||
Map<String, Organ> organs = organProxy.findAllOrganByParentAndOrgi(super.getOrgan(request), super.getOrgi(request));
|
||||
map.addAttribute("userList", userProxy.findUserInOrgans(organs.keySet()));
|
||||
Role roleData = roleRepository.findByIdAndOrgi(role, super.getOrgi());
|
||||
map.addAttribute("userRoleList", userRoleRes.findByOrgiAndRole(super.getOrgi(), roleData));
|
||||
map.addAttribute("role", roleData);
|
||||
return request(super.createRequestPageTempletResponse("/admin/role/seluser"));
|
||||
}
|
||||
|
||||
|
||||
@RequestMapping("/saveuser")
|
||||
@Menu(type = "admin", subtype = "saveuser", admin = true)
|
||||
public ModelAndView saveuser(HttpServletRequest request, @Valid String[] users, @Valid String role) {
|
||||
|
@ -79,37 +79,29 @@ public class UsersController extends Handler {
|
||||
@Menu(type = "admin", subtype = "user")
|
||||
public ModelAndView index(ModelMap map, HttpServletRequest request) throws IOException {
|
||||
User logined = super.getUser(request);
|
||||
if (!logined.isSuperadmin()) {
|
||||
Map<String, Organ> organs = organProxy.findAllOrganByParentAndOrgi(super.getOrgan(request), super.getOrgi(request));
|
||||
map.addAttribute("userList", userProxy.findUserInOrgans(organs.keySet(), new PageRequest(
|
||||
super.getP(request),
|
||||
super.getPs(request),
|
||||
Sort.Direction.ASC,
|
||||
"createtime"
|
||||
)));
|
||||
} else {
|
||||
map.addAttribute(
|
||||
"userList",
|
||||
userRepository.findByDatastatusAndOrgiAndSuperadminNot(
|
||||
false,
|
||||
super.getOrgi(),
|
||||
true,
|
||||
new PageRequest(
|
||||
super.getP(request),
|
||||
super.getPs(request),
|
||||
Sort.Direction.ASC,
|
||||
"createtime"
|
||||
)
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
Map<String, Organ> organs = organProxy.findAllOrganByParentAndOrgi(super.getOrgan(request), super.getOrgi(request));
|
||||
map.addAttribute("userList", userProxy.findUserInOrgans(organs.keySet(), new PageRequest(
|
||||
super.getP(request),
|
||||
super.getPs(request),
|
||||
Sort.Direction.ASC,
|
||||
"createtime"
|
||||
)));
|
||||
|
||||
|
||||
return request(super.createAdminTempletResponse("/admin/user/index"));
|
||||
}
|
||||
|
||||
@RequestMapping("/add")
|
||||
@Menu(type = "admin", subtype = "user")
|
||||
public ModelAndView add(ModelMap map, HttpServletRequest request) {
|
||||
return request(super.createRequestPageTempletResponse("/admin/user/add"));
|
||||
ModelAndView view = request(super.createRequestPageTempletResponse("/admin/user/add"));
|
||||
Organ currentOrgan = super.getOrgan(request);
|
||||
Map<String, Organ> organs = organProxy.findAllOrganByParentAndOrgi(currentOrgan, super.getOrgi(request));
|
||||
map.addAttribute("currentOrgan", currentOrgan);
|
||||
map.addAttribute("organList", organs.values());
|
||||
|
||||
return view;
|
||||
}
|
||||
|
||||
@RequestMapping("/edit")
|
||||
|
@ -64,13 +64,9 @@ public class SNSAccountIMController extends Handler {
|
||||
@RequestMapping("/index")
|
||||
@Menu(type = "admin", subtype = "im", access = false, admin = true)
|
||||
public ModelAndView index(ModelMap map, HttpServletRequest request, @Valid String execute, @RequestParam(name = "status", required = false) String status) {
|
||||
User logined = super.getUser(request);
|
||||
if (logined.isSuperadmin()) {
|
||||
map.addAttribute("snsAccountList", snsAccountRes.findBySnstypeAndOrgi(MainContext.ChannelType.WEBIM.toString(), super.getOrgi(request), new PageRequest(super.getP(request), super.getPs(request))));
|
||||
} else {
|
||||
Map<String, Organ> organs = organProxy.findAllOrganByParentAndOrgi(super.getOrgan(request), super.getOrgi(request));
|
||||
map.addAttribute("snsAccountList", snsAccountRes.findBySnstypeAndOrgiAndOrgan(MainContext.ChannelType.WEBIM.toString(), super.getOrgi(request), organs.keySet(), new PageRequest(super.getP(request), super.getPs(request))));
|
||||
}
|
||||
Map<String, Organ> organs = organProxy.findAllOrganByParentAndOrgi(super.getOrgan(request), super.getOrgi(request));
|
||||
map.addAttribute("snsAccountList", snsAccountRes.findBySnstypeAndOrgiAndOrgan(MainContext.ChannelType.WEBIM.toString(), super.getOrgi(request), organs.keySet(), new PageRequest(super.getP(request), super.getPs(request))));
|
||||
|
||||
map.addAttribute("status", status);
|
||||
List<Secret> secretConfig = secRes.findByOrgi(super.getOrgi(request));
|
||||
if (secretConfig != null && secretConfig.size() > 0) {
|
||||
@ -92,6 +88,7 @@ public class SNSAccountIMController extends Handler {
|
||||
@Menu(type = "admin", subtype = "weixin")
|
||||
public ModelAndView save(HttpServletRequest request,
|
||||
@Valid SNSAccount snsAccount) throws NoSuchAlgorithmException {
|
||||
Organ currentOrgan = super.getOrgan(request);
|
||||
String status = "new_webim_fail";
|
||||
if (StringUtils.isNotBlank(snsAccount.getBaseURL())) {
|
||||
snsAccount.setSnsid(Base62.encode(snsAccount.getBaseURL()).toLowerCase());
|
||||
@ -103,6 +100,7 @@ public class SNSAccountIMController extends Handler {
|
||||
snsAccount.setCreatetime(new Date());
|
||||
User curr = super.getUser(request);
|
||||
snsAccount.setCreater(curr.getId());
|
||||
snsAccount.setOrgan(currentOrgan.getId());
|
||||
|
||||
snsAccountRes.save(snsAccount);
|
||||
|
||||
|
@ -23,6 +23,7 @@ import com.chatopera.cc.cache.Cache;
|
||||
import com.chatopera.cc.controller.Handler;
|
||||
import com.chatopera.cc.controller.api.request.RestUtils;
|
||||
import com.chatopera.cc.model.*;
|
||||
import com.chatopera.cc.persistence.repository.OrganRepository;
|
||||
import com.chatopera.cc.persistence.repository.OrganUserRepository;
|
||||
import com.chatopera.cc.persistence.repository.UserRepository;
|
||||
import com.chatopera.cc.persistence.repository.UserRoleRepository;
|
||||
@ -72,6 +73,9 @@ public class ApiUserController extends Handler {
|
||||
@Autowired
|
||||
private OrganUserRepository organUserRes;
|
||||
|
||||
@Autowired
|
||||
private OrganRepository organRes;
|
||||
|
||||
@Autowired
|
||||
private UserRoleRepository userRoleRes;
|
||||
|
||||
@ -156,11 +160,17 @@ public class ApiUserController extends Handler {
|
||||
*/
|
||||
private JsonObject create(final HttpServletRequest request, final JsonObject payload) {
|
||||
logger.info("[create] payload {}", payload.toString());
|
||||
String parent = payload.get("parent").getAsString();
|
||||
Organ parentOrgan = super.getOrgan(request);
|
||||
if (StringUtils.isNotEmpty(parent)) {
|
||||
parentOrgan = organRes.getOne(parent);
|
||||
}
|
||||
|
||||
// 创建新用户时,阻止传入ID
|
||||
payload.remove("id");
|
||||
// 从payload中创建User
|
||||
User user = userProxy.parseUserFromJson(payload);
|
||||
JsonObject resp = userProxy.createNewUser(user);
|
||||
JsonObject resp = userProxy.createNewUser(user, parentOrgan);
|
||||
logger.info("[create] response {}", resp.toString());
|
||||
return resp;
|
||||
}
|
||||
|
@ -51,6 +51,7 @@ import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Controller
|
||||
@RequestMapping(value = "/apps/cca")
|
||||
@ -197,7 +198,7 @@ public class AgentAuditController extends Handler {
|
||||
List<Organ> skills = organRes.findByOrgiAndSkill(orgi, true);
|
||||
List<User> agents = userRes.findByOrgiAndAgentAndDatastatusAndIdIsNot(orgi, true, false, logined.getId());
|
||||
|
||||
view.addObject("skillGroups", skills);
|
||||
view.addObject("skillGroups", skills.stream().filter(s -> organs.containsKey(s.getId())).collect(Collectors.toList()));
|
||||
view.addObject("agentList", agents);
|
||||
|
||||
return view;
|
||||
|
@ -24,87 +24,113 @@ import java.util.Date;
|
||||
@Entity
|
||||
@Table(name = "uk_role")
|
||||
@org.hibernate.annotations.Proxy(lazy = false)
|
||||
public class Role implements java.io.Serializable{
|
||||
public class Role implements java.io.Serializable {
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
private static final long serialVersionUID = 1115593425069549681L;
|
||||
|
||||
private String id ;
|
||||
private String name ;
|
||||
private String code ;
|
||||
private Date createtime ;
|
||||
private String creater;
|
||||
private String username ;
|
||||
private Date updatetime ;
|
||||
private String orgi ;
|
||||
private String orgid ;
|
||||
|
||||
|
||||
public Role(){}
|
||||
|
||||
public Role(String id){
|
||||
this.id = id ;
|
||||
}
|
||||
@Id
|
||||
@Column(length = 32)
|
||||
@GeneratedValue(generator = "system-uuid")
|
||||
@GenericGenerator(name = "system-uuid", strategy = "uuid")
|
||||
public String getId() {
|
||||
return id;
|
||||
}
|
||||
public void setId(String id) {
|
||||
this.id = id;
|
||||
}
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
public String getCode() {
|
||||
return code;
|
||||
}
|
||||
public void setCode(String code) {
|
||||
this.code = code;
|
||||
}
|
||||
public String getCreater() {
|
||||
return creater;
|
||||
}
|
||||
public void setCreater(String creater) {
|
||||
this.creater = creater;
|
||||
}
|
||||
public String getUsername() {
|
||||
return username;
|
||||
}
|
||||
public void setUsername(String username) {
|
||||
this.username = username;
|
||||
}
|
||||
public String getOrgi() {
|
||||
return orgi;
|
||||
}
|
||||
public void setOrgi(String orgi) {
|
||||
this.orgi = orgi;
|
||||
}
|
||||
public Date getCreatetime() {
|
||||
return createtime;
|
||||
}
|
||||
public void setCreatetime(Date createtime) {
|
||||
this.createtime = createtime;
|
||||
}
|
||||
public Date getUpdatetime() {
|
||||
return updatetime;
|
||||
}
|
||||
public void setUpdatetime(Date updatetime) {
|
||||
this.updatetime = updatetime;
|
||||
}
|
||||
/**
|
||||
*
|
||||
*/
|
||||
private static final long serialVersionUID = 1115593425069549681L;
|
||||
|
||||
public String getOrgid() {
|
||||
return orgid;
|
||||
}
|
||||
private String id;
|
||||
private String name;
|
||||
private String code;
|
||||
private Date createtime;
|
||||
private String creater;
|
||||
private String username;
|
||||
private Date updatetime;
|
||||
private String orgi;
|
||||
private String orgid;
|
||||
private String organ;
|
||||
|
||||
public void setOrgid(String orgid) {
|
||||
this.orgid = orgid;
|
||||
}
|
||||
|
||||
public Role() {
|
||||
}
|
||||
|
||||
public Role(String id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
@Id
|
||||
@Column(length = 32)
|
||||
@GeneratedValue(generator = "system-uuid")
|
||||
@GenericGenerator(name = "system-uuid", strategy = "uuid")
|
||||
public String getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(String id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public String getCode() {
|
||||
return code;
|
||||
}
|
||||
|
||||
public void setCode(String code) {
|
||||
this.code = code;
|
||||
}
|
||||
|
||||
public String getCreater() {
|
||||
return creater;
|
||||
}
|
||||
|
||||
public void setCreater(String creater) {
|
||||
this.creater = creater;
|
||||
}
|
||||
|
||||
public String getUsername() {
|
||||
return username;
|
||||
}
|
||||
|
||||
public void setUsername(String username) {
|
||||
this.username = username;
|
||||
}
|
||||
|
||||
public String getOrgi() {
|
||||
return orgi;
|
||||
}
|
||||
|
||||
public void setOrgi(String orgi) {
|
||||
this.orgi = orgi;
|
||||
}
|
||||
|
||||
public Date getCreatetime() {
|
||||
return createtime;
|
||||
}
|
||||
|
||||
public void setCreatetime(Date createtime) {
|
||||
this.createtime = createtime;
|
||||
}
|
||||
|
||||
public Date getUpdatetime() {
|
||||
return updatetime;
|
||||
}
|
||||
|
||||
public void setUpdatetime(Date updatetime) {
|
||||
this.updatetime = updatetime;
|
||||
}
|
||||
|
||||
public String getOrgid() {
|
||||
return orgid;
|
||||
}
|
||||
|
||||
public void setOrgid(String orgid) {
|
||||
this.orgid = orgid;
|
||||
}
|
||||
|
||||
public String getOrgan() {
|
||||
return organ;
|
||||
}
|
||||
|
||||
public void setOrgan(String organ) {
|
||||
this.organ = organ;
|
||||
}
|
||||
}
|
||||
|
@ -22,14 +22,15 @@ import org.springframework.data.jpa.repository.JpaRepository;
|
||||
import java.util.List;
|
||||
|
||||
public interface RoleRepository
|
||||
extends JpaRepository<Role, String>
|
||||
{
|
||||
Role findByIdAndOrgi(String paramString, String orgi);
|
||||
extends JpaRepository<Role, String> {
|
||||
Role findByIdAndOrgi(String paramString, String orgi);
|
||||
|
||||
List<Role> findByOrgi(String orgi);
|
||||
|
||||
List<Role> findByOrgi(String orgi, String orgid);
|
||||
|
||||
Role findByNameAndOrgi(String paramString, String orgi);
|
||||
List<Role> findByOrgi(String orgi);
|
||||
|
||||
List<Role> findByOrgiAndOrgan(String orgi, String organ);
|
||||
|
||||
List<Role> findByOrgi(String orgi, String orgid);
|
||||
|
||||
Role findByNameAndOrgi(String paramString, String orgi);
|
||||
}
|
||||
|
||||
|
@ -49,8 +49,8 @@ public interface SNSAccountRepository
|
||||
|
||||
Page<SNSAccount> findBySnstypeAndOrgi(String paramString, String orgi, Pageable page);
|
||||
|
||||
@Query(value = "select s.* from `uk_snsaccount` s left join `uk_consult_invite` ci on ci.`snsaccountid`=s.`snsid` WHERE s.snstype = ?1 AND s.orgi = ?2 and ci.`consult_skill_fixed_id` in (?3) ORDER BY ?#{#pageable}",
|
||||
countQuery = "select count(1) from `uk_snsaccount` s left join `uk_consult_invite` ci on ci.`snsaccountid`=s.`snsid` WHERE s.snstype = ?1 AND s.orgi = ?2 and ci.`consult_skill_fixed_id` in (?3)", nativeQuery = true)
|
||||
@Query(value = "select s.* from `uk_snsaccount` s WHERE s.snstype = ?1 AND s.orgi = ?2 and s.`organ` in (?3) ORDER BY ?#{#pageable}",
|
||||
countQuery = "select count(1) from `uk_snsaccount` s WHERE s.snstype = ?1 AND s.orgi = ?2 and s.`organ` in (?3)", nativeQuery = true)
|
||||
Page<SNSAccount> findBySnstypeAndOrgiAndOrgan(String paramString, String orgi, Collection<String> organ, Pageable page);
|
||||
|
||||
@Query(value = "SELECT * FROM uk_snsaccount WHERE snstype = ?1 AND snsid = ?2 AND orgi = ?3 LIMIT 1", nativeQuery = true)
|
||||
|
@ -59,6 +59,10 @@ public class UserProxy {
|
||||
@Autowired
|
||||
private ExtensionRepository extensionRes;
|
||||
|
||||
public JsonObject createNewUser(final User user) {
|
||||
return this.createNewUser(user, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建新用户
|
||||
* 支持多租户
|
||||
@ -67,7 +71,7 @@ public class UserProxy {
|
||||
* @param organ
|
||||
* @return
|
||||
*/
|
||||
public JsonObject createNewUser(final User user) {
|
||||
public JsonObject createNewUser(final User user, Organ organ) {
|
||||
JsonObject result = new JsonObject();
|
||||
String msg = validUser(user);
|
||||
if (StringUtils.equalsIgnoreCase(msg, "new_user_success")) {
|
||||
@ -80,6 +84,14 @@ public class UserProxy {
|
||||
user.setPassword(MainUtils.md5(user.getPassword()));
|
||||
}
|
||||
userRes.save(user);
|
||||
|
||||
if(organ!=null) {
|
||||
OrganUser ou = new OrganUser();
|
||||
ou.setUserid(user.getId());
|
||||
ou.setOrgan(organ.getId());
|
||||
organUserRes.save(ou);
|
||||
}
|
||||
|
||||
}
|
||||
// 新账号未通过验证,返回创建失败信息msg
|
||||
result.addProperty(RestUtils.RESP_KEY_RC, RestUtils.RESP_RC_SUCC);
|
||||
|
@ -391,11 +391,11 @@ var Proxy = {
|
||||
}
|
||||
}
|
||||
if(answer) {
|
||||
var li = ' <li class="ukefu-agentservice-list" onclick="chooseAnswer(\'' + answer.content + '\')">\n' +
|
||||
var li = ' <li class="ukefu-agentservice-list chooseAnswer" data-title="'+answer.content+'">\n' +
|
||||
' <div class="nowrap" title="' + result.data[j].post + '">问题:' + result.data[j].post + '</div>\n' +
|
||||
' <div style="color: #333">\n' +
|
||||
' <p class="nowrap" title="' + answer.content + '" style="float: left ">答案:' + answer.content + '</p>\n' +
|
||||
' <button style="float: right" class="layui-btn layui-btn-mini" onclick="chooseAnswer(\'' + answer.content + '\')">选择</button>\n' +
|
||||
' <button style="float: right" class="layui-btn layui-btn-mini chooseAnswer" data-title="'+answer.content+'">选择</button>\n' +
|
||||
' </div>\n' +
|
||||
' </li>'
|
||||
type == "agent" ? $("#quickReplyBox").append(li) : $("#ccaQuickReplyBox").append(li);
|
||||
@ -431,6 +431,8 @@ var Proxy = {
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
endAgentUserService:function(data){
|
||||
if($('#tip_message_'+data.userid).length >0){
|
||||
if(data.channel){
|
||||
|
@ -77,6 +77,16 @@
|
||||
<dd <#if subtype?? && subtype == 'metadata'>class="layui-this"</#if>>
|
||||
<a href="/admin/metadata/index.html">元数据</a>
|
||||
</dd>
|
||||
<#if models?seq_contains("chatbot")>
|
||||
<#if user?? &&( user.roleAuthMap["A09"]?? || user.admin) >
|
||||
<dd>
|
||||
<a data-title="智能机器人" href="javascript:void(0)" onclick="openChatbot()" data-href="/apps/chatbot/index.html" class="iframe_btn" data-id="chatbotIntegrationWin" data-type="tabAdd">
|
||||
智能机器人
|
||||
</a>
|
||||
</dd>
|
||||
</#if>
|
||||
</#if>
|
||||
|
||||
<dd <#if subtype?? && subtype == 'template'>class="layui-this"</#if>>
|
||||
<a href="/admin/template/index.html">系统模板</a>
|
||||
</dd>
|
||||
@ -91,3 +101,9 @@
|
||||
</li>
|
||||
</#if>
|
||||
</ul>
|
||||
|
||||
<script>
|
||||
function openChatbot(){
|
||||
window.parent.active.tabAdd($(".iframe_btn").data('href') , $(".iframe_btn").data('title'), $(".iframe_btn").data('id'));
|
||||
};
|
||||
</script>
|
||||
|
@ -125,10 +125,10 @@ layui.use('form', function(){
|
||||
|
||||
|
||||
var zNodes =[
|
||||
{ id:'0', pId:'00', name:"组织机构", open:true , organ : true, type : "organ"}
|
||||
// { id:'0', pId:'00', name:"组织机构", open:true , organ : true, type : "organ"}
|
||||
<#if organList??>
|
||||
<#list organList as organ>
|
||||
,{ id:'${organ.id!''}', pId:'${organ.parent!'0'}', name:"${organ.name!''}", open:true , organ : true , type : "organ", icon:"/images/dept.png" }
|
||||
{ id:'${organ.id!''}', pId:'${organ.parent!'0'}', name:"${organ.name!''}", open:true , organ : true , type : "organ", icon:"/images/dept.png" },
|
||||
</#list>
|
||||
</#if>
|
||||
];
|
||||
|
@ -2,17 +2,18 @@
|
||||
<form class="layui-form uk-form" action="/admin/organ/update.html">
|
||||
<input type="hidden" name="id" value="${organData.id!''}">
|
||||
<input type="hidden" name="area" id="area" value="${organData.area!''}">
|
||||
<input type="hidden" id="parent" name="parent" value="<#if organData??>${organData.parent}<#else>0</#if>">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">部门:</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="name" lay-verify="requiredOrgiName" value="${organData.name!''}" placeholder="请输入部门名称" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<#if isRootOrgan!=true>
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label">上级机构:</label>
|
||||
<div class="layui-input-inline" style="position: relative;">
|
||||
<input type="hidden" id="parent" name="parent" value="<#if organData??>${organData.parent}<#else>0</#if>">
|
||||
<input type="text" name="parentname" id="parentname" required value="<#if organData??>${organData.name}<#else>组织机构</#if>" lay-verify="requiredTwo" autocomplete="off" readOnly="readonly" onClick="showMenu();"
|
||||
class="layui-input">
|
||||
<i class="layui-icon" style="position: absolute;right: 3px;top: 6px;font-size: 25px;${systemConfig.color!'color:#0096C4;'}" onClick="showMenu()"></i>
|
||||
@ -22,6 +23,7 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</#if>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">启用技能组:</label>
|
||||
<div class="layui-input-block">
|
||||
@ -133,10 +135,10 @@ layui.use('form', function(){
|
||||
|
||||
|
||||
var zNodes =[
|
||||
{ id:'0', pId:'00', name:"组织机构", open:true , organ : true, type : "organ"}
|
||||
// { id:'0', pId:'00', name:"组织机构", open:true , organ : true, type : "organ"}
|
||||
<#if organList??>
|
||||
<#list organList as organ>
|
||||
,{ id:'${organ.id!''}', pId:'${organ.parent!'0'}', name:"${organ.name!''}", open:true , organ : true , type : "organ", icon:"/images/dept.png" }
|
||||
{ id:'${organ.id!''}', pId:'${organ.parent!'0'}', name:"${organ.name!''}", open:true , organ : true , type : "organ", icon:"/images/dept.png" },
|
||||
</#list>
|
||||
</#if>
|
||||
];
|
||||
@ -144,8 +146,10 @@ layui.use('form', function(){
|
||||
var ztree = $.fn.zTree.init($("#organTree"), setting, zNodes);
|
||||
<#if organData??>
|
||||
var node = ztree.getNodeByParam('id', '${organData.parent!''}');//获取id为1的点
|
||||
ztree.selectNode(node);//选择点
|
||||
$("#parentname").attr("value", node.name);
|
||||
ztree.selectNode(node);//选择点
|
||||
if(node){
|
||||
$("#parentname").attr("value", node.name);
|
||||
}
|
||||
<#if organData.area??>
|
||||
<#list organData.area?split(",") as area>
|
||||
var areanode_${area_index} = ztree.getNodeByParam('id', '${area}');//获取id为1的点
|
||||
|
@ -117,10 +117,10 @@
|
||||
}
|
||||
|
||||
var zNodes =[
|
||||
{ id:'0', pId:'00', name:"组织机构", open:true , topic : false}
|
||||
// { id:'0', pId:'00', name:"组织机构", open:true , topic : false}
|
||||
<#if organList??>
|
||||
<#list organList as organ>
|
||||
,{ id:'${organ.id!''}', pId:'${organ.parent!'0'}', name:"${organ.name!''}", open:true , topic : true , <#if organ.area?? && organ.area != "">icon:"/images/area.png" <#else>icon:"/images/dept.png"</#if> }
|
||||
{ id:'${organ.id!''}', pId:'${organ.parent!'0'}', name:"${organ.name!''}", open:true , topic : true , <#if organ.area?? && organ.area != "">icon:"/images/area.png" <#else>icon:"/images/dept.png"</#if> },
|
||||
</#list>
|
||||
</#if>
|
||||
];
|
||||
@ -153,6 +153,8 @@
|
||||
layer.msg('新建组织成功',{icon: 1, time: 1500})
|
||||
<#elseif msg?? && msg == 'admin_organ_update_not_standard'>
|
||||
layer.msg('修改无法完成,上级机构选择错误',{icon: 2, time: 1500})
|
||||
<#elseif msg?? && msg == 'not_allow_remove_user'>
|
||||
layer.msg('用户只有一个组织,不允许移除',{icon: 2, time: 1500})
|
||||
</#if>
|
||||
|
||||
|
||||
|
@ -35,6 +35,21 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label">组织机构:</label>
|
||||
<div class="layui-input-inline" style="position: relative;">
|
||||
<input type="hidden" id="parent" name="parent" value="<#if currentOrgan??>${currentOrgan.id}<#else>0</#if>">
|
||||
<input type="text" name="parentname" id="parentname" required value="<#if currentOrgan??>${currentOrgan.name}<#else>组织机构</#if>" lay-verify="requiredTwo" autocomplete="off" readOnly="readonly" onClick="showMenu();"
|
||||
class="layui-input">
|
||||
<i class="layui-icon" style="position: absolute;right: 3px;top: 6px;font-size: 25px;${systemConfig.color!'color:#0096C4;'}" onClick="showMenu()"></i>
|
||||
<div id="menuContent" style="display:none; position: absolute;z-index:10000;width: 218px;" class="ukefu-ztree">
|
||||
<ul id="organTree" class="ztree" style="width:208px;"></ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">管理员:</label>
|
||||
<div class="layui-input-inline">
|
||||
@ -269,3 +284,109 @@ layui.use('form', function(){
|
||||
});
|
||||
|
||||
</script>
|
||||
|
||||
<SCRIPT type="text/javascript">
|
||||
var setting = {
|
||||
data: {
|
||||
simpleData: {
|
||||
enable: true
|
||||
}
|
||||
},
|
||||
callback: {
|
||||
onClick: onClick,
|
||||
beforeClick: beforeClick
|
||||
}
|
||||
};
|
||||
|
||||
function beforeClick(treeId, treeNode) {
|
||||
var zTree = $.fn.zTree.getZTreeObj("organTree")
|
||||
nodes = zTree.getSelectedNodes();
|
||||
var allow = true , lastnode ;
|
||||
for (var i=0, l=nodes.length; i<l; i++) {
|
||||
lastnode = nodes[i].type ;
|
||||
if(nodes[i].organ && (nodes.length >= 1 && (event.ctrlKey || event.shiftKey))){
|
||||
allow = false ; break ;
|
||||
}
|
||||
}
|
||||
if(lastnode != treeNode.type && (event.ctrlKey || event.shiftKey)){
|
||||
allow = false ;
|
||||
}
|
||||
|
||||
if (allow == false) {
|
||||
top.layer.alert("组织机构不能点选多个上级机构,也不能同时选择地区和机构", {icon: 3});
|
||||
return false;
|
||||
} else {
|
||||
return true;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
function onClick(e, treeId, treeNode) {
|
||||
var zTree = $.fn.zTree.getZTreeObj("organTree"),
|
||||
nodes = zTree.getSelectedNodes(),
|
||||
v = "" , value = "";
|
||||
nodes.sort(function compare(a,b){return a.id-b.id;});
|
||||
for (var i=0, l=nodes.length; i<l; i++) {
|
||||
v += nodes[i].name + ",";
|
||||
if(value != ""){
|
||||
value = value + "," ;
|
||||
}
|
||||
value = nodes[i].id ;
|
||||
}
|
||||
if (v.length > 0 ) v = v.substring(0, v.length-1);
|
||||
if(treeNode.type == "area"){
|
||||
$("#parentname").attr("value", v);
|
||||
$("#parent").attr("value", "0");
|
||||
$("#area").attr("value", value);
|
||||
}else{
|
||||
$("#parentname").attr("value", v);
|
||||
$("#parent").attr("value", value);
|
||||
$("#area").attr("value", "");
|
||||
}
|
||||
if (!event.ctrlKey && !event.shiftKey) {
|
||||
hideMenu() ;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
var zNodes =[
|
||||
// { id:'0', pId:'00', name:"组织机构", open:true , organ : true, type : "organ"}
|
||||
<#if organList??>
|
||||
<#list organList as organ>
|
||||
{ id:'${organ.id!''}', pId:'${organ.parent!'0'}', name:"${organ.name!''}", open:true , organ : true , type : "organ", icon:"/images/dept.png" },
|
||||
</#list>
|
||||
</#if>
|
||||
];
|
||||
$(document).ready(function(){
|
||||
var ztree = $.fn.zTree.init($("#organTree"), setting, zNodes);
|
||||
<#if organData??>
|
||||
var node = ztree.getNodeByParam('id', '${organData.parent!''}');//获取id为1的点
|
||||
ztree.selectNode(node);//选择点
|
||||
if(node){
|
||||
$("#parentname").attr("value", node.name);
|
||||
}
|
||||
<#if organData.area??>
|
||||
<#list organData.area?split(",") as area>
|
||||
var areanode_${area_index} = ztree.getNodeByParam('id', '${area}');//获取id为1的点
|
||||
ztree.selectNode(areanode_${area_index} , true );//选择点
|
||||
</#list>
|
||||
</#if>
|
||||
|
||||
</#if>
|
||||
});
|
||||
function showMenu() {
|
||||
$("#menuContent").css({left:"0px", top:"38px"}).show();
|
||||
|
||||
$("body").bind("mousedown", onBodyDown);
|
||||
}
|
||||
function hideMenu() {
|
||||
$("#menuContent").hide();
|
||||
$("body").unbind("mousedown", onBodyDown);
|
||||
}
|
||||
function onBodyDown(event) {
|
||||
if (!(event.target.id == "menuBtn" || event.target.id == "menuContent" || $(event.target).parents("#menuContent").length>0)) {
|
||||
hideMenu();
|
||||
}
|
||||
}
|
||||
|
||||
</SCRIPT>
|
||||
|
@ -199,11 +199,11 @@ word-break: break-all;"><#if curagentuser??>${curagentuser.username!''}<#if cura
|
||||
}
|
||||
}
|
||||
if(answer){
|
||||
var li = ' <li class="ukefu-agentservice-list" onclick="chooseAnswer(\''+answer.content+'\')">\n' +
|
||||
var li = ' <li class="ukefu-agentservice-list chooseAnswer" data-title="'+answer.content+'">\n' +
|
||||
' <div class="nowrap" title="'+result.data[j].post+'">问题:'+result.data[j].post+'</div>\n' +
|
||||
' <div style="color: #333">\n' +
|
||||
' <p class="nowrap" title="'+answer.content+'" style="float: left ">答案:'+answer.content+'</p>\n' +
|
||||
' <button style="float: right" class="layui-btn layui-btn-mini" onclick="chooseAnswer(\''+answer.content+'\')">选择</button>\n' +
|
||||
' <button style="float: right" class="layui-btn layui-btn-mini chooseAnswer" data-title="'+answer.content+'">选择</button>\n' +
|
||||
' </div>\n' +
|
||||
' </li>'
|
||||
$("#quickReplyAgentBox").append(li);
|
||||
@ -609,10 +609,9 @@ word-break: break-all;"><#if curagentuser??>${curagentuser.username!''}<#if cura
|
||||
showOrHide('none');
|
||||
};
|
||||
|
||||
function chooseAnswer(data){
|
||||
editor.html(data)
|
||||
}
|
||||
|
||||
// function chooseAnswer(data){
|
||||
// editor.html(data)
|
||||
// }
|
||||
function showOrHide(data){
|
||||
$("#agentAnswer").css("display",data)
|
||||
}
|
||||
@ -651,11 +650,11 @@ word-break: break-all;"><#if curagentuser??>${curagentuser.username!''}<#if cura
|
||||
}
|
||||
}
|
||||
if(answer) {
|
||||
var li = ' <li class="ukefu-agentservice-list" onclick="chooseAnswer(\'' + answer.content + '\')">\n' +
|
||||
var li = ' <li class="ukefu-agentservice-list chooseAnswer" data-title="'+answer.content+'">\n' +
|
||||
' <div class="nowrap" title="' + result.data[j].post + '">问题:' + result.data[j].post + '</div>\n' +
|
||||
' <div style="color: #333">\n' +
|
||||
' <p class="nowrap" title="' + answer.content + '" style="float: left ">答案:' + answer.content + '</p>\n' +
|
||||
' <button style="float: right" class="layui-btn layui-btn-mini" onclick="chooseAnswer(\'' + answer.content + '\')">选择</button>\n' +
|
||||
' <button style="float: right" class="layui-btn layui-btn-mini chooseAnswer" data-title="'+answer.content+'">选择</button>\n' +
|
||||
' </div>\n' +
|
||||
' </li>'
|
||||
$("#quickReplyBox").append(li);
|
||||
@ -752,6 +751,7 @@ word-break: break-all;"><#if curagentuser??>${curagentuser.username!''}<#if cura
|
||||
$("#searchlabel").removeClass('selected')
|
||||
$("#all").addClass('selected')
|
||||
})
|
||||
|
||||
//点击标注
|
||||
$('#searchlabel').click(function () {
|
||||
searchSwitch = !searchSwitch;
|
||||
@ -817,5 +817,13 @@ word-break: break-all;"><#if curagentuser??>${curagentuser.username!''}<#if cura
|
||||
|
||||
});
|
||||
|
||||
$('#quickReplyAgentBox').on('click','.chooseAnswer', function(){
|
||||
editor.html($(this).data('title'))
|
||||
});
|
||||
|
||||
$('#quickReplyBox').on('click','.chooseAnswer', function(){
|
||||
editor.html($(this).data('title'))
|
||||
});
|
||||
|
||||
|
||||
</script>
|
||||
|
@ -182,11 +182,11 @@ word-break: break-all;"><#if curagentuser??>${curagentuser.username!''}<#if cura
|
||||
}
|
||||
}
|
||||
if(answer) {
|
||||
var li = ' <li class="ukefu-agentservice-list" onclick="chooseAnswer(\'' + answer.content + '\')">\n' +
|
||||
var li = ' <li class="ukefu-agentservice-list chooseAnswer" data-title="'+answer.content+'">\n' +
|
||||
' <div class="nowrap" title="' + result.data[j].post + '">问题:' + result.data[j].post + '</div>\n' +
|
||||
' <div style="color: #333">\n' +
|
||||
' <p class="nowrap" title="' + answer.content + '" style="float: left ">答案:' + answer.content + '</p>\n' +
|
||||
' <button style="float: right" class="layui-btn layui-btn-mini" onclick="chooseAnswer(\'' + answer.content + '\')">选择</button>\n' +
|
||||
' <button style="float: right" class="layui-btn layui-btn-mini chooseAnswer" data-title="'+answer.content+'">选择</button>\n' +
|
||||
' </div>\n' +
|
||||
' </li>'
|
||||
$("#ccaQuickReplyAgentBox").append(li);
|
||||
@ -634,11 +634,11 @@ word-break: break-all;"><#if curagentuser??>${curagentuser.username!''}<#if cura
|
||||
}
|
||||
}
|
||||
if(answer) {
|
||||
var li = ' <li class="ukefu-agentservice-list" onclick="chooseAnswer(\'' + answer.content + '\')">\n' +
|
||||
var li = ' <li class="ukefu-agentservice-list chooseAnswer" data-title="'+answer.content+'">\n' +
|
||||
' <div class="nowrap" title="' + result.data[j].post + '">问题:' + result.data[j].post + '</div>\n' +
|
||||
' <div style="color: #333">\n' +
|
||||
' <p class="nowrap" title="' + answer.content + '" style="float: left ">答案:' + answer.content + '</p>\n' +
|
||||
' <button style="float: right" class="layui-btn layui-btn-mini" onclick="chooseAnswer(\'' + answer.content + '\')">选择</button>\n' +
|
||||
' <button style="float: right" class="layui-btn layui-btn-mini chooseAnswer" data-title="'+answer.content+'">选择</button>\n' +
|
||||
' </div>\n' +
|
||||
' </li>'
|
||||
$("#ccaQuickReplyBox").append(li);
|
||||
@ -800,6 +800,12 @@ word-break: break-all;"><#if curagentuser??>${curagentuser.username!''}<#if cura
|
||||
});
|
||||
|
||||
});
|
||||
$('#ccaQuickReplyAgentBox').on('click','.chooseAnswer', function(){
|
||||
editor.html($(this).data('title'))
|
||||
});
|
||||
|
||||
$('#ccaQuickReplyBox').on('click','.chooseAnswer', function(){
|
||||
editor.html($(this).data('title'))
|
||||
});
|
||||
|
||||
</script>
|
||||
|
@ -349,16 +349,6 @@
|
||||
<!-- </#if>-->
|
||||
<!-- </#if>-->
|
||||
|
||||
<#if models?seq_contains("chatbot")>
|
||||
<#if user?? &&( user.roleAuthMap["A09"]?? || user.admin) >
|
||||
<dd class="ukefu-left-menu" data-tooltip="智能机器人">
|
||||
<a href="javascript:void(0)" data-title="智能机器人" onclick="return false;" data-href="/apps/chatbot/index.html" class="iframe_btn" data-id="chatbotIntegrationWin" data-type="tabAdd">
|
||||
<i class="csfont" style="position: relative;"></i>
|
||||
</a>
|
||||
</dd>
|
||||
</#if>
|
||||
</#if>
|
||||
|
||||
<#if models?seq_contains("sample")>
|
||||
<dd class="ukefu-left-menu" data-tooltip="插件示例">
|
||||
<a href="javascript:void(0)" data-title="插件示例" onclick="return false;" data-href="/apps/sample/index.html" class="iframe_btn" data-id="samplePluginWin" data-type="tabAdd">
|
||||
|
@ -3183,6 +3183,7 @@ CREATE TABLE `uk_role` (
|
||||
`ORGI` varchar(32) DEFAULT NULL COMMENT '租户ID',
|
||||
`ORGID` varchar(32) DEFAULT NULL COMMENT '企业ID',
|
||||
`USERNAME` varchar(50) DEFAULT NULL COMMENT '用户名',
|
||||
`ORGAN` varchar(32) DEFAULT NULL COMMENT '部门',
|
||||
PRIMARY KEY (`ID`) USING BTREE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT COMMENT='角色表';
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user