|
@@ -0,0 +1,405 @@
|
|
|
+package com.xtframe.sec.menu.service.impl;
|
|
|
+
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.Collection;
|
|
|
+import java.util.HashMap;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+
|
|
|
+import javax.persistence.criteria.CriteriaBuilder;
|
|
|
+import javax.persistence.criteria.CriteriaQuery;
|
|
|
+import javax.persistence.criteria.Predicate;
|
|
|
+import javax.persistence.criteria.Root;
|
|
|
+import javax.transaction.Transactional;
|
|
|
+
|
|
|
+import net.sf.json.JSONArray;
|
|
|
+import net.sf.json.JSONObject;
|
|
|
+
|
|
|
+import org.springframework.data.jpa.domain.Specification;
|
|
|
+import org.springframework.util.Assert;
|
|
|
+
|
|
|
+import com.xtframe.core.base.ctl.BaseCtl;
|
|
|
+import com.xtframe.core.base.vo.NodeVo;
|
|
|
+import com.xtframe.core.exception.BizException;
|
|
|
+import com.xtframe.core.menu.entity.Function;
|
|
|
+import com.xtframe.core.menu.entity.Menu;
|
|
|
+import com.xtframe.core.menu.service.MenuService;
|
|
|
+import com.xtframe.core.user.entity.User;
|
|
|
+import com.xtframe.sec.common.BaseSecurityService;
|
|
|
+import com.xtframe.sec.common.OracleSqlConsts;
|
|
|
+import com.xtframe.sec.menu.dao.FunctionDao;
|
|
|
+import com.xtframe.sec.menu.dao.MenuDao;
|
|
|
+import com.xtframe.sec.menu.entity.FunctionEntity;
|
|
|
+import com.xtframe.sec.menu.entity.MenuEntity;
|
|
|
+import com.xtframe.sec.utils.SecUtils;
|
|
|
+
|
|
|
+public class MenuServiceImpl extends BaseSecurityService implements MenuService {
|
|
|
+ private MenuDao dao;
|
|
|
+ private FunctionDao funcDao;
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional
|
|
|
+ public String delete(String... ids) {
|
|
|
+ dao.delete(ids);
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void deleteOrgFunctionMap(String arg0, String... arg1) {
|
|
|
+ throw new BizException("不支持此方法!请与管理员联系!");
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void deleteOrgMenuMap(String arg0, String... arg1) {
|
|
|
+ throw new BizException("不支持此方法!请与管理员联系!");
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void deleteRoleFunctionMap(String arg0, String... arg1) {
|
|
|
+ throw new BizException("不支持此方法!请与管理员联系!");
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void deleteRoleMenuMap(String arg0, String... arg1) {
|
|
|
+ throw new BizException("不支持此方法!请与管理员联系!");
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void deleteUserMenuMap(String arg0, String... arg1) {
|
|
|
+ throw new BizException("不支持此方法!请与管理员联系!");
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<Menu> findAccordionMenus() {
|
|
|
+ return findAuthedMenuByPid(BaseCtl.BLANK_UUID);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<Menu> findAuthedMenuByPid(final String pid) {
|
|
|
+ User u = SecUtils.getCurrUser();
|
|
|
+ String sql = "SELECT M.* FROM T_XTFRAME_MENU M " + "WHERE M.VALID='Y' AND M.PID=:pid AND"
|
|
|
+ + "( EXISTS(SELECT 1 " + "FROM T_XTFRAME_USER_MENU UM " + "WHERE UM.MID=M.ID AND UM.USERID=:userid) "
|
|
|
+ + "OR EXISTS( " + "SELECT 1 FROM T_XTFRAME_ROLE_MENU RM JOIN T_XTFRAME_ROLE_USER RU ON RM.RID=RU.RID "
|
|
|
+ + "WHERE RU.USERID=:userid AND RM.MID=M.ID) " + "OR EXISTS( "
|
|
|
+ + "SELECT 1 FROM T_XTFRAME_ORG_MENU OM JOIN T_XTFRAME_USER U ON OM.ORGID=U.ORG "
|
|
|
+ + "WHERE U.ID=:userid AND OM.MID=M.ID)) ORDER BY M.SORTNO ASC";
|
|
|
+ Map<String, Object> params = new HashMap<String, Object>();
|
|
|
+ params.put("userid", u.getId());
|
|
|
+ params.put("pid", pid);
|
|
|
+ List<MenuEntity> menus = dao.nativeQuery(sql, MenuEntity.class, params);
|
|
|
+ List<Menu> ms = new ArrayList<Menu>(menus.size());
|
|
|
+ for (MenuEntity m : menus) {
|
|
|
+ ms.add(m);
|
|
|
+ }
|
|
|
+ return ms;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Function findFunction(String id) {
|
|
|
+ return funcDao.findOne(id);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<Function> findFunctionByIds(String... id) {
|
|
|
+ return funcDao.findByIdInOrderBySortnoAsc(id);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Menu findMenu(String id) {
|
|
|
+ return dao.findOne(id);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<Menu> findMenuByIds(String... id) {
|
|
|
+ return dao.findByIdInOrderBySortnoAsc(id);
|
|
|
+ }
|
|
|
+
|
|
|
+ public List<Function> findValidFunctionByOrgId(final String orgId) {
|
|
|
+ Map<String, Object> params = new HashMap<String, Object>();
|
|
|
+ params.put("orgid", orgId);
|
|
|
+ StringBuilder sqlBuilder = new StringBuilder();
|
|
|
+ sqlBuilder
|
|
|
+ .append("select f.* from T_XTFRAME_FUNC f join T_XTFRAME_ORG_FUNC ofc on f.id=ofc.fid where ofc.orgid=:orgid");
|
|
|
+ List<FunctionEntity> fes = funcDao.nativeQuery(sqlBuilder.toString(), FunctionEntity.class, params);
|
|
|
+ List<Function> fs = new ArrayList<Function>(fes.size());
|
|
|
+ for (FunctionEntity fe : fes) {
|
|
|
+ fs.add(fe);
|
|
|
+ }
|
|
|
+ return fs;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<Function> findValidFunctionByRoleId(String roleId) {
|
|
|
+ Map<String, Object> params = new HashMap<String, Object>();
|
|
|
+ params.put("roleid", roleId);
|
|
|
+ StringBuilder sqlBuilder = new StringBuilder();
|
|
|
+ sqlBuilder
|
|
|
+ .append("select f.* from T_XTFRAME_FUNC f join T_XTFRAME_ROLE_FUNC rfc on f.id=rfc.fid where rfc.rid=:roleid");
|
|
|
+ List<FunctionEntity> fes = funcDao.nativeQuery(sqlBuilder.toString(), FunctionEntity.class, params);
|
|
|
+ List<Function> fs = new ArrayList<Function>(fes.size());
|
|
|
+ for (FunctionEntity fe : fes) {
|
|
|
+ fs.add(fe);
|
|
|
+ }
|
|
|
+ return fs;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<Function> findValidFunctionByUserId(String userId) {
|
|
|
+ Map<String, Object> params = new HashMap<String, Object>();
|
|
|
+ params.put("userid", userId);
|
|
|
+ List<FunctionEntity> fes = funcDao.nativeQuery(OracleSqlConsts.queryFunctionByUser, FunctionEntity.class,
|
|
|
+ params);
|
|
|
+ List<Function> fs = new ArrayList<Function>(fes.size());
|
|
|
+ for (FunctionEntity fe : fes) {
|
|
|
+ fs.add(fe);
|
|
|
+ }
|
|
|
+ return fs;
|
|
|
+ }
|
|
|
+
|
|
|
+ public List<Menu> findValidMenuByOrgId(final String orgId) {
|
|
|
+ Map<String, Object> params = new HashMap<String, Object>();
|
|
|
+ params.put("orgid", orgId);
|
|
|
+ List<MenuEntity> mes = dao.nativeQuery(
|
|
|
+ "select m.* from T_XTFRAME_MENU m join T_XTFRAME_ORG_MENU om on m.id=om.mid where om.orgid=:orgid",
|
|
|
+ MenuEntity.class, params);
|
|
|
+ List<Menu> ms = new ArrayList<Menu>(mes.size());
|
|
|
+ for (MenuEntity me : mes) {
|
|
|
+ ms.add(me);
|
|
|
+ }
|
|
|
+ return ms;
|
|
|
+ }
|
|
|
+
|
|
|
+ public List<Menu> findValidMenuByPid(final String pid) {
|
|
|
+ return dao.findValidMenusByPid(pid);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<Menu> findValidMenuByRoleId(String roleId) {
|
|
|
+ Map<String, Object> params = new HashMap<String, Object>();
|
|
|
+ params.put("roleid", roleId);
|
|
|
+ List<MenuEntity> mes = dao.nativeQuery(
|
|
|
+ "select m.* from T_XTFRAME_MENU m join T_XTFRAME_ROLE_MENU rm on m.id=rm.mid where rm.rid=:roleid",
|
|
|
+ MenuEntity.class, params);
|
|
|
+ List<Menu> ms = new ArrayList<Menu>(mes.size());
|
|
|
+ for (MenuEntity me : mes) {
|
|
|
+ ms.add(me);
|
|
|
+ }
|
|
|
+ return ms;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<Menu> findValidMenuByUserId(String userid) {
|
|
|
+ Map<String, Object> params = new HashMap<String, Object>();
|
|
|
+ params.put("userid", userid);
|
|
|
+ StringBuilder sqlBuilder = new StringBuilder();
|
|
|
+ sqlBuilder
|
|
|
+ .append("select m.* from T_XTFRAME_MENU m join T_XTFRAME_USER_MENU um on m.id=um.mid where um.userid=:userid");
|
|
|
+ List<MenuEntity> mes = dao.nativeQuery(sqlBuilder.toString(), MenuEntity.class, params);
|
|
|
+ List<Menu> ms = new ArrayList<Menu>(mes.size());
|
|
|
+ for (MenuEntity me : mes) {
|
|
|
+ ms.add(me);
|
|
|
+ }
|
|
|
+ return ms;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据上级菜单ID和授权菜单列表获取下级菜单节点
|
|
|
+ *
|
|
|
+ * @param pid
|
|
|
+ * 上级菜单ID
|
|
|
+ * @param authedMenus
|
|
|
+ * 授权菜单列表
|
|
|
+ * @param cascade
|
|
|
+ * 是否级联获取下级
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public List<NodeVo> getCheckedMenusByPid(String pid, Collection<Menu> authedMenus,
|
|
|
+ Collection<Function> authedFuncs, boolean cascade) {
|
|
|
+ List<NodeVo> menuVos = new ArrayList<NodeVo>();
|
|
|
+ List<Menu> menus = securityMgr.findValidMenusByPid(pid);
|
|
|
+ // 循环生成节点对象
|
|
|
+ for (Menu m : menus) {
|
|
|
+ if (m instanceof MenuEntity) {
|
|
|
+ NodeVo mv = new NodeVo();
|
|
|
+ mv.setId(m.getId());
|
|
|
+ mv.setText(m.getName());
|
|
|
+ mv.setParent(m.getPid());
|
|
|
+ mv.setState("closed");
|
|
|
+ if (authedMenus.contains(m)) {
|
|
|
+ mv.setChecked(true);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ mv.setChecked(false);
|
|
|
+ }
|
|
|
+ Map<String, String> attr = new HashMap<String, String>();
|
|
|
+ attr.put("url", m.getUrl());
|
|
|
+ attr.put("leaf", String.valueOf(m.getLeaf()));
|
|
|
+ attr.put("type", "menu");
|
|
|
+
|
|
|
+ if (m.getLeaf()) {
|
|
|
+ attr.put("funcs", getFunctionByMenu(m.getId(), authedFuncs).toString());
|
|
|
+ mv.setState("open");
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ if (cascade) { // 非叶子节点且需要级联时
|
|
|
+ mv.setChildren(getCheckedMenusByPid(mv.getId(), authedMenus, authedFuncs, cascade));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ mv.setAttributes(attr);
|
|
|
+ menuVos.add(mv);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return menuVos;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据菜单获取菜单功能
|
|
|
+ *
|
|
|
+ * @param mid
|
|
|
+ * @param authedFuncs
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public JSONArray getFunctionByMenu(final String mid, Collection<Function> authedFuncs) {
|
|
|
+ Specification<FunctionEntity> spec = new Specification<FunctionEntity>() {
|
|
|
+ @Override
|
|
|
+ public Predicate toPredicate(Root<FunctionEntity> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
|
|
|
+ List<Predicate> list = new ArrayList<Predicate>();
|
|
|
+ list.add(cb.equal(root.get("menu").get("id").as(String.class), mid));
|
|
|
+ return cb.and(list.toArray(new Predicate[] {}));
|
|
|
+ }
|
|
|
+ };
|
|
|
+ List<FunctionEntity> funcList = funcDao.findAll(spec);
|
|
|
+ JSONArray arr = new JSONArray();
|
|
|
+ for (FunctionEntity f : funcList) {
|
|
|
+ JSONObject jo = new JSONObject();
|
|
|
+ jo.put("id", f.getId());
|
|
|
+ jo.put("name", f.getName());
|
|
|
+ if (authedFuncs.contains(f)) {
|
|
|
+ jo.put("checked", true);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ jo.put("checked", false);
|
|
|
+ }
|
|
|
+ arr.add(jo);
|
|
|
+ }
|
|
|
+ return arr;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void init() {
|
|
|
+ this.dao = (MenuDao) getBeans().get("menuDao");
|
|
|
+ this.funcDao = (FunctionDao) getBeans().get("functionDao");
|
|
|
+ Assert.notNull(this.dao);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional
|
|
|
+ public Menu save(Menu menu) {
|
|
|
+ if (menu instanceof MenuEntity) { return dao.save((MenuEntity) menu); }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional
|
|
|
+ public Function saveFunction(Function f) {
|
|
|
+ if (f instanceof FunctionEntity) { return funcDao.save((FunctionEntity) f); }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void saveOrgFunctionMap(String orgid, String... funcIds) {
|
|
|
+ Map<String, Object> params = new HashMap<String, Object>();
|
|
|
+ params.put("orgid", orgid);
|
|
|
+ StringBuilder sqlBuilder = new StringBuilder();
|
|
|
+ sqlBuilder.append("delete from T_XTFRAME_ORG_FUNC where orgid=:orgid");
|
|
|
+ dao.nativeUpdate(sqlBuilder.toString(), params);
|
|
|
+ sqlBuilder.setLength(0);
|
|
|
+ sqlBuilder.append("insert into T_XTFRAME_ORG_FUNC(orgid,fid)values(:orgid,:fid) ");
|
|
|
+ for (String fid : funcIds) {
|
|
|
+ params.put("fid", fid);
|
|
|
+ dao.nativeUpdate(sqlBuilder.toString(), params);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional
|
|
|
+ public void saveOrgMenuMap(String orgId, String... menuIds) {
|
|
|
+ Map<String, Object> params = new HashMap<String, Object>();
|
|
|
+ params.put("orgid", orgId);
|
|
|
+ StringBuilder sqlBuilder = new StringBuilder();
|
|
|
+ sqlBuilder.append("delete from T_XTFRAME_ORG_MENU where orgid=:orgid");
|
|
|
+ dao.nativeUpdate(sqlBuilder.toString(), params);
|
|
|
+ sqlBuilder.setLength(0);
|
|
|
+ sqlBuilder.append("insert into T_XTFRAME_ORG_MENU(orgid,mid)values(:orgid,:mid) ");
|
|
|
+ for (String mid : menuIds) {
|
|
|
+ params.put("mid", mid);
|
|
|
+ dao.nativeUpdate(sqlBuilder.toString(), params);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void saveRoleFunctionMap(String roleid, String... funcIds) {
|
|
|
+ Map<String, Object> params = new HashMap<String, Object>();
|
|
|
+ params.put("roleid", roleid);
|
|
|
+ StringBuilder sqlBuilder = new StringBuilder();
|
|
|
+ sqlBuilder.append("delete from T_XTFRAME_ROLE_FUNC where rid=:roleid");
|
|
|
+ dao.nativeUpdate(sqlBuilder.toString(), params);
|
|
|
+ sqlBuilder.setLength(0);
|
|
|
+ sqlBuilder.append("insert into T_XTFRAME_ROLE_FUNC(rid,fid)values(:roleid,:fid) ");
|
|
|
+ for (String fid : funcIds) {
|
|
|
+ params.put("fid", fid);
|
|
|
+ dao.nativeUpdate(sqlBuilder.toString(), params);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void saveRoleMenuMap(String roleid, String... menuIds) {
|
|
|
+ Map<String, Object> params = new HashMap<String, Object>();
|
|
|
+ params.put("roleid", roleid);
|
|
|
+ StringBuilder sqlBuilder = new StringBuilder();
|
|
|
+ sqlBuilder.append("delete from T_XTFRAME_ROLE_MENU where rid=:roleid");
|
|
|
+ dao.nativeUpdate(sqlBuilder.toString(), params);
|
|
|
+ sqlBuilder.setLength(0);
|
|
|
+ sqlBuilder.append("insert into T_XTFRAME_ROLE_MENU(rid,mid)values(:roleid,:mid) ");
|
|
|
+ for (String mid : menuIds) {
|
|
|
+ params.put("mid", mid);
|
|
|
+ dao.nativeUpdate(sqlBuilder.toString(), params);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 保存用户功能映射关系
|
|
|
+ *
|
|
|
+ * @param userid
|
|
|
+ * @param funcIds
|
|
|
+ */
|
|
|
+ public void saveUserFunctionMap(String userid, String... funcIds) {
|
|
|
+ Map<String, Object> params = new HashMap<String, Object>();
|
|
|
+ params.put("userid", userid);
|
|
|
+ StringBuilder sqlBuilder = new StringBuilder();
|
|
|
+ sqlBuilder.append("delete from T_XTFRAME_USER_FUNC where userid=:userid");
|
|
|
+ dao.nativeUpdate(sqlBuilder.toString(), params);
|
|
|
+ sqlBuilder.setLength(0);
|
|
|
+ sqlBuilder.append("insert into T_XTFRAME_USER_FUNC(userid,fid)values(:userid,:fid) ");
|
|
|
+ for (String fid : funcIds) {
|
|
|
+ params.put("fid", fid);
|
|
|
+ dao.nativeUpdate(sqlBuilder.toString(), params);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void saveUserMenuMap(String userid, String... menuIds) {
|
|
|
+ Map<String, Object> params = new HashMap<String, Object>();
|
|
|
+ params.put("userid", userid);
|
|
|
+ StringBuilder sqlBuilder = new StringBuilder();
|
|
|
+ sqlBuilder.append("delete from T_XTFRAME_USER_MENU where userid=:userid");
|
|
|
+ dao.nativeUpdate(sqlBuilder.toString(), params);
|
|
|
+ sqlBuilder.setLength(0);
|
|
|
+ sqlBuilder.append("insert into T_XTFRAME_USER_MENU(userid,mid)values(:userid,:mid) ");
|
|
|
+ for (String mid : menuIds) {
|
|
|
+ params.put("mid", mid);
|
|
|
+ dao.nativeUpdate(sqlBuilder.toString(), params);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+}
|