package com.product.admin.service; import com.alibaba.fastjson.JSONArray; import com.product.admin.config.CmnConst; import com.product.admin.config.SystemCode; import com.product.admin.entity.RouterEntity; import com.product.common.lang.StringUtils; import com.product.core.cache.util.RedisUtil; import com.product.core.dao.BaseDao; import com.product.core.entity.DataTableEntity; import com.product.core.entity.FieldSetEntity; import com.product.core.exception.BaseException; import com.product.core.service.support.AbstractBaseService; import com.product.core.spring.context.SpringMVCContextHolder; import com.product.module.sys.entity.SystemUser; import com.product.util.BaseUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; /** * @author cheng * @date 2021年3月10日14:27:49 * @Description 路由service */ @Service public class RouterService extends AbstractBaseService { @Autowired BaseDao baseDao; /** * 路由缓存key */ private final String ALL_ROUTER_CACHE_KEY = "system-cache:router"; /** * 初始化路由 */ public synchronized void refreshRouter() { DataTableEntity dt = baseDao.listTable("product_sys_router_v"); //所有的角色信息 if (!BaseUtil.dataTableIsEmpty(dt)) { //根据按钮&功能 分组记录路由信息 RouterEntity routerEntity = new RouterEntity(dt); setRouterEntity(routerEntity); } } /** * 刷新路由根据按钮 * * @param button_uuid */ public synchronized void refreshRouter(String button_uuid) { //查询按钮所属功能 FieldSetEntity fse = baseDao.getFieldSetEntity(CmnConst.PRODUCT_SYS_FUNCTION_BUTTONS, new String[]{"uuid,function_uuid"}, button_uuid, false); if (fse != null && !StringUtils.isEmpty(fse.getUUID())) { DataTableEntity roles = baseDao.listTable("product_sys_function_permission", "concat(',',button_uuid,',') like concat('%,',?,',%')", new Object[]{button_uuid}, new Object[]{"role_uuid uuid"}); //根据功能刷新路由 updateRouter(fse.getString(CmnConst.FUNCTION_UUID)); updateLoginUserInfoService.updateUserInfoByUpdateRole(roles.getUuids(), true); } } /** * 更新路由根据角色uuid * * @param role_uuid */ public void updateRouter(String[] role_uuid) { RouterEntity routerEntity = getRouterEntity(); if (routerEntity != null) { routerEntity.updateRouter(role_uuid); setRouterEntity(routerEntity); } } @Autowired UpdateLoginUserInfoService updateLoginUserInfoService; /** * 更新路由根据功能 * * @param function_uuid */ public void updateRouter(String function_uuid) { if (!StringUtils.isEmpty(function_uuid)) { RouterEntity routerEntity = getRouterEntity(); if (routerEntity != null) { routerEntity.updateRouter(function_uuid, baseDao.listTable("product_sys_router_v", "`group`=?", new Object[]{function_uuid})); setRouterEntity(routerEntity); } } } /** * 获取路由信息 * * @return */ public RouterEntity getRouterEntity() { return (RouterEntity) RedisUtil.get(ALL_ROUTER_CACHE_KEY); } /** * 获取路由(手机端) * * @return */ public DataTableEntity getMobileRouter() { SystemUser currentUser = SpringMVCContextHolder.getCurrentUser(); StringBuilder sql = new StringBuilder(); sql.append(" SELECT "); sql.append(" concat( '/', d.uuid ) path, "); sql.append(" d.route_name `name`,d.uuid button_uuid, "); sql.append(" nav.nav_bar_name, "); sql.append(" page_url component, "); sql.append(" b.function_uuid `group`, "); sql.append(" c.uuid mvc_page_uuid, "); sql.append(" page_name title, "); sql.append(" d.button_icon icon, "); sql.append(" page_type, "); sql.append(" c.face_uuid,c.face_number "); sql.append(" d.uuid button_uuid, "); sql.append(" d.button_name, "); sql.append(" d.client_type_uuid "); sql.append(" FROM "); sql.append(" product_sys_app_nav_bar nav "); sql.append(" JOIN product_sys_functions ff on nav.function_uuid=ff.uuid and concat(',',ff.client_type_uuid,',') like '%,App,%' "); sql.append(" JOIN product_sys_link b ON b.function_uuid = ff.uuid "); sql.append(" AND ff.status_uuid = 1 "); sql.append(" AND ff.data_type = 1 "); sql.append(" JOIN product_sys_mvc_page c ON b.`line_to` = c.uuid "); sql.append(" JOIN product_sys_function_buttons d ON b.line_from = d.uuid and d.client_type_uuid='App' "); sql.append(" WHERE "); sql.append(" page_url IS NOT NULL "); sql.append(" AND page_url != '' "); sql.append(" and nav.is_used=1 AND "); sql.append(" nav.function_uuid in (select function_uuid from product_sys_function_permission where "); sql.append(BaseUtil.buildQuestionMarkFilter("role_uuid", currentUser.getRoles().split(","), true)).append(" ) "); sql.append(" GROUP BY "); sql.append(" b.function_uuid, "); sql.append(" d.uuid, "); sql.append(" page_name, "); sql.append(" page_url, "); sql.append(" c.uuid,nav_bar_name, "); sql.append(" PAGE_type "); DataTableEntity dt = getBaseDao().listTable(sql.toString(), new Object[]{}); return dt; } /** * 获取路由信息 * * @return */ public void setRouterEntity(RouterEntity routerEntity) { RedisUtil.set(ALL_ROUTER_CACHE_KEY, routerEntity); } /** * 根据功能和按钮uuid 获取跳转路由 * * @param functionUuid * @param button_uuid * @return */ public String functionSkipByButtonUuid(String functionUuid, String button_uuid) { SystemUser currentUser = SpringMVCContextHolder.getCurrentUser(); if (StringUtils.isEmpty(functionUuid) || StringUtils.isEmpty(button_uuid) || currentUser == null || currentUser.getRoles() == null) { return null; } RouterEntity routerEntity = getRouterEntity(); if (routerEntity != null) { return routerEntity.getRouteNameByUuid(functionUuid, button_uuid, currentUser.getRoles().split(",")); } return null; } /** * 根据功能和按钮标识 获取跳转路由 * * @param functionUuid * @param button_name * @return */ public String functionSkip(String functionUuid, String button_name) { SystemUser currentUser = SpringMVCContextHolder.getCurrentUser(); if (StringUtils.isEmpty(functionUuid) || StringUtils.isEmpty(button_name) || currentUser == null || currentUser.getRoles() == null) { return null; } RouterEntity routerEntity = getRouterEntity(); if (routerEntity != null) { return routerEntity.getRouteNameByName(functionUuid, button_name, currentUser.getRoles().split(",")); } return null; } /** * 获取路由 * * @return * @throws BaseException */ public JSONArray getRouter() throws BaseException { SystemUser currentUser = SpringMVCContextHolder.getCurrentUser(); RouterEntity routerEntity = getRouterEntity(); JSONArray routerList = routerEntity.getRouterList(currentUser.getRoles().split(",")); if (routerList == null || routerList.isEmpty() || routerList.size() <= 0) { throw new BaseException(SystemCode.SYSTEM_ROUTER_GET_FAIL.getValue(), SystemCode.SYSTEM_ROUTER_GET_FAIL.getText()); } return routerList; } }