!467 新增 ThreadLocalHolder 整合 SaHolder,ThreadLocal
* fix 修复 issue#I8RWB5 字段缺少问题 ;
* add 新增 ThreadLocalHolder 替换 SaHolder ;
| | |
| | | <artifactId>ip2region</artifactId> |
| | | </dependency> |
| | | |
| | | <dependency> |
| | | <groupId>com.alibaba</groupId> |
| | | <artifactId>transmittable-thread-local</artifactId> |
| | | </dependency> |
| | | |
| | | </dependencies> |
| | | |
| | | </project> |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package org.dromara.common.core.context; |
| | | |
| | | import com.alibaba.ttl.TransmittableThreadLocal; |
| | | |
| | | import java.util.HashMap; |
| | | import java.util.Map; |
| | | |
| | | /** |
| | | * çº¿ç¨ææç±» |
| | | * |
| | | * @author Michelle.Chung |
| | | */ |
| | | public class ThreadLocalHolder { |
| | | |
| | | /** |
| | | * åå§å (æ¯æå¼æ¥) |
| | | */ |
| | | private static final ThreadLocal<Map<String, Object>> THREAD_LOCAL = TransmittableThreadLocal.withInitial(HashMap::new); |
| | | |
| | | /** |
| | | * è®¾ç½®å¼ |
| | | * |
| | | * @param key é® |
| | | * @param value å¼ |
| | | */ |
| | | public static <T> void set(String key, T value) { |
| | | THREAD_LOCAL.get().put(key, value); |
| | | } |
| | | |
| | | /** |
| | | * è·åå¼ |
| | | * |
| | | * @param key é® |
| | | * @return å¼ |
| | | */ |
| | | @SuppressWarnings("unchecked") |
| | | public static <T> T get(String key) { |
| | | return (T) THREAD_LOCAL.get().get(key); |
| | | } |
| | | |
| | | /** |
| | | * ç§»é¤å¼ |
| | | * |
| | | * @param key é® |
| | | */ |
| | | public static void remove(String key) { |
| | | THREAD_LOCAL.get().remove(key); |
| | | } |
| | | |
| | | /** |
| | | * æ¸
ç©ºå¼ |
| | | */ |
| | | public static void clear() { |
| | | THREAD_LOCAL.remove(); |
| | | } |
| | | |
| | | } |
| | |
| | | import cn.hutool.core.util.ObjectUtil; |
| | | import cn.hutool.crypto.SecureUtil; |
| | | import org.dromara.common.core.constant.GlobalConstants; |
| | | import org.dromara.common.core.context.ThreadLocalHolder; |
| | | import org.dromara.common.core.domain.R; |
| | | import org.dromara.common.core.exception.ServiceException; |
| | | import org.dromara.common.core.utils.MessageUtils; |
| | |
| | | @Aspect |
| | | public class RepeatSubmitAspect { |
| | | |
| | | private static final ThreadLocal<String> KEY_CACHE = new ThreadLocal<>(); |
| | | private static final String KEY_CACHE = "keyCache"; |
| | | |
| | | @Before("@annotation(repeatSubmit)") |
| | | public void doBefore(JoinPoint point, RepeatSubmit repeatSubmit) throws Throwable { |
| | |
| | | // å¯ä¸æ è¯ï¼æå®key + url + æ¶æ¯å¤´ï¼ |
| | | String cacheRepeatKey = GlobalConstants.REPEAT_SUBMIT_KEY + url + submitKey; |
| | | if (RedisUtils.setObjectIfAbsent(cacheRepeatKey, "", Duration.ofMillis(interval))) { |
| | | KEY_CACHE.set(cacheRepeatKey); |
| | | ThreadLocalHolder.set(KEY_CACHE, cacheRepeatKey); |
| | | } else { |
| | | String message = repeatSubmit.message(); |
| | | if (StringUtils.startsWith(message, "{") && StringUtils.endsWith(message, "}")) { |
| | |
| | | if (r.getCode() == R.SUCCESS) { |
| | | return; |
| | | } |
| | | RedisUtils.deleteObject(KEY_CACHE.get()); |
| | | String cacheKey = ThreadLocalHolder.get(KEY_CACHE); |
| | | RedisUtils.deleteObject(cacheKey); |
| | | } finally { |
| | | KEY_CACHE.remove(); |
| | | ThreadLocalHolder.remove(KEY_CACHE); |
| | | } |
| | | } |
| | | } |
| | |
| | | */ |
| | | @AfterThrowing(value = "@annotation(repeatSubmit)", throwing = "e") |
| | | public void doAfterThrowing(JoinPoint joinPoint, RepeatSubmit repeatSubmit, Exception e) { |
| | | RedisUtils.deleteObject(KEY_CACHE.get()); |
| | | KEY_CACHE.remove(); |
| | | String cacheKey = ThreadLocalHolder.get(KEY_CACHE); |
| | | RedisUtils.deleteObject(cacheKey); |
| | | ThreadLocalHolder.remove(KEY_CACHE); |
| | | } |
| | | |
| | | /** |
| | |
| | | import cn.hutool.core.map.MapUtil; |
| | | import cn.hutool.core.util.ArrayUtil; |
| | | import cn.hutool.core.util.ObjectUtil; |
| | | import com.alibaba.ttl.TransmittableThreadLocal; |
| | | import org.dromara.common.core.context.ThreadLocalHolder; |
| | | import org.dromara.common.core.domain.model.LoginUser; |
| | | import org.dromara.common.core.utils.ServletUtils; |
| | | import org.dromara.common.core.utils.SpringUtils; |
| | |
| | | |
| | | |
| | | /** |
| | | * è®¡ç®æä½æ¶èæ¶é´ |
| | | * è®¡æ¶ key |
| | | */ |
| | | private static final ThreadLocal<StopWatch> TIME_THREADLOCAL = new TransmittableThreadLocal<>(); |
| | | private static final String LOG_STOP_WATCH_KEY = "logStopwatch"; |
| | | |
| | | /** |
| | | * å¤ç请æ±åæ§è¡ |
| | |
| | | @Before(value = "@annotation(controllerLog)") |
| | | public void boBefore(JoinPoint joinPoint, Log controllerLog) { |
| | | StopWatch stopWatch = new StopWatch(); |
| | | TIME_THREADLOCAL.set(stopWatch); |
| | | ThreadLocalHolder.set(LOG_STOP_WATCH_KEY, stopWatch); |
| | | stopWatch.start(); |
| | | } |
| | | |
| | |
| | | // å¤ç设置注解ä¸çåæ° |
| | | getControllerMethodDescription(joinPoint, controllerLog, operLog, jsonResult); |
| | | // 设置æ¶èæ¶é´ |
| | | StopWatch stopWatch = TIME_THREADLOCAL.get(); |
| | | StopWatch stopWatch = ThreadLocalHolder.get(LOG_STOP_WATCH_KEY); |
| | | stopWatch.stop(); |
| | | operLog.setCostTime(stopWatch.getTime()); |
| | | // åå¸äºä»¶ä¿åæ°æ®åº |
| | |
| | | log.error("å¼å¸¸ä¿¡æ¯:{}", exp.getMessage()); |
| | | exp.printStackTrace(); |
| | | } finally { |
| | | TIME_THREADLOCAL.remove(); |
| | | ThreadLocalHolder.remove(LOG_STOP_WATCH_KEY); |
| | | } |
| | | } |
| | | |
| | |
| | | import com.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelper; |
| | | import lombok.AccessLevel; |
| | | import lombok.NoArgsConstructor; |
| | | import org.dromara.common.core.context.ThreadLocalHolder; |
| | | |
| | | import java.util.HashMap; |
| | | import java.util.Map; |
| | |
| | | package org.dromara.common.satoken.utils; |
| | | |
| | | import cn.dev33.satoken.context.SaHolder; |
| | | import cn.dev33.satoken.context.model.SaStorage; |
| | | import cn.dev33.satoken.session.SaSession; |
| | | import cn.dev33.satoken.stp.SaLoginModel; |
| | | import cn.dev33.satoken.stp.StpUtil; |
| | |
| | | import lombok.NoArgsConstructor; |
| | | import org.dromara.common.core.constant.TenantConstants; |
| | | import org.dromara.common.core.constant.UserConstants; |
| | | import org.dromara.common.core.context.ThreadLocalHolder; |
| | | import org.dromara.common.core.domain.model.LoginUser; |
| | | import org.dromara.common.core.enums.UserType; |
| | | |
| | |
| | | * @param model é
ç½®åæ° |
| | | */ |
| | | public static void login(LoginUser loginUser, SaLoginModel model) { |
| | | SaStorage storage = SaHolder.getStorage(); |
| | | storage.set(LOGIN_USER_KEY, loginUser); |
| | | storage.set(TENANT_KEY, loginUser.getTenantId()); |
| | | storage.set(USER_KEY, loginUser.getUserId()); |
| | | storage.set(DEPT_KEY, loginUser.getDeptId()); |
| | | ThreadLocalHolder.set(LOGIN_USER_KEY, loginUser); |
| | | ThreadLocalHolder.set(TENANT_KEY, loginUser.getTenantId()); |
| | | ThreadLocalHolder.set(USER_KEY, loginUser.getUserId()); |
| | | ThreadLocalHolder.set(DEPT_KEY, loginUser.getDeptId()); |
| | | model = ObjectUtil.defaultIfNull(model, new SaLoginModel()); |
| | | StpUtil.login(loginUser.getLoginId(), |
| | | model.setExtra(TENANT_KEY, loginUser.getTenantId()) |
| | |
| | | |
| | | public static Object getStorageIfAbsentSet(String key, Supplier<Object> handle) { |
| | | try { |
| | | Object obj = SaHolder.getStorage().get(key); |
| | | Object obj = ThreadLocalHolder.get(key); |
| | | if (ObjectUtil.isNull(obj)) { |
| | | obj = handle.get(); |
| | | SaHolder.getStorage().set(key, obj); |
| | | ThreadLocalHolder.set(key, obj); |
| | | } |
| | | return obj; |
| | | } catch (Exception e) { |
| | |
| | | import cn.dev33.satoken.interceptor.SaInterceptor; |
| | | import cn.dev33.satoken.router.SaRouter; |
| | | import cn.dev33.satoken.stp.StpUtil; |
| | | import jakarta.servlet.http.HttpServletRequest; |
| | | import jakarta.servlet.http.HttpServletResponse; |
| | | import org.dromara.common.core.utils.ServletUtils; |
| | | import org.dromara.common.core.utils.SpringUtils; |
| | | import org.dromara.common.core.utils.StringUtils; |
| | | import org.dromara.common.satoken.utils.LoginHelper; |
| | | import org.dromara.common.core.context.ThreadLocalHolder; |
| | | import org.dromara.common.security.config.properties.SecurityProperties; |
| | | import org.dromara.common.security.handler.AllUrlHandler; |
| | | import lombok.RequiredArgsConstructor; |
| | |
| | | public void addInterceptors(InterceptorRegistry registry) { |
| | | // 注åè·¯ç±æ¦æªå¨ï¼èªå®ä¹éªè¯è§å |
| | | registry.addInterceptor(new SaInterceptor(handler -> { |
| | | AllUrlHandler allUrlHandler = SpringUtils.getBean(AllUrlHandler.class); |
| | | // ç»å½éªè¯ -- æé¤å¤ä¸ªè·¯å¾ |
| | | SaRouter |
| | | // è·åææç |
| | | .match(allUrlHandler.getUrls()) |
| | | // å¯¹æªæé¤çè·¯å¾è¿è¡æ£æ¥ |
| | | .check(() -> { |
| | | // æ£æ¥æ¯å¦ç»å½ æ¯å¦ætoken |
| | | StpUtil.checkLogin(); |
| | | AllUrlHandler allUrlHandler = SpringUtils.getBean(AllUrlHandler.class); |
| | | // ç»å½éªè¯ -- æé¤å¤ä¸ªè·¯å¾ |
| | | SaRouter |
| | | // è·åææç |
| | | .match(allUrlHandler.getUrls()) |
| | | // å¯¹æªæé¤çè·¯å¾è¿è¡æ£æ¥ |
| | | .check(() -> { |
| | | // æ£æ¥æ¯å¦ç»å½ æ¯å¦ætoken |
| | | StpUtil.checkLogin(); |
| | | |
| | | // æ£æ¥ header ä¸ param éç clientid ä¸ token éçæ¯å¦ä¸è´ |
| | | String headerCid = ServletUtils.getRequest().getHeader(LoginHelper.CLIENT_KEY); |
| | | String paramCid = ServletUtils.getParameter(LoginHelper.CLIENT_KEY); |
| | | String clientId = StpUtil.getExtra(LoginHelper.CLIENT_KEY).toString(); |
| | | if (!StringUtils.equalsAny(clientId, headerCid, paramCid)) { |
| | | // token æ æ |
| | | throw NotLoginException.newInstance(StpUtil.getLoginType(), |
| | | "-100", "客æ·ç«¯IDä¸Tokenä¸å¹é
", |
| | | StpUtil.getTokenValue()); |
| | | } |
| | | // æ£æ¥ header ä¸ param éç clientid ä¸ token éçæ¯å¦ä¸è´ |
| | | String headerCid = ServletUtils.getRequest().getHeader(LoginHelper.CLIENT_KEY); |
| | | String paramCid = ServletUtils.getParameter(LoginHelper.CLIENT_KEY); |
| | | String clientId = StpUtil.getExtra(LoginHelper.CLIENT_KEY).toString(); |
| | | if (!StringUtils.equalsAny(clientId, headerCid, paramCid)) { |
| | | // token æ æ |
| | | throw NotLoginException.newInstance(StpUtil.getLoginType(), |
| | | "-100", "客æ·ç«¯IDä¸Tokenä¸å¹é
", |
| | | StpUtil.getTokenValue()); |
| | | } |
| | | |
| | | // ææçå½±å ç¨äºä¸´æ¶æµè¯ |
| | | // if (log.isDebugEnabled()) { |
| | | // log.info("å©ä½æææ¶é´: {}", StpUtil.getTokenTimeout()); |
| | | // log.info("ä¸´æ¶æææ¶é´: {}", StpUtil.getTokenActivityTimeout()); |
| | | // } |
| | | // ä¿åç¨æ·ä¿¡æ¯ |
| | | ThreadLocalHolder.set(LoginHelper.LOGIN_USER_KEY, LoginHelper.getLoginUser()); |
| | | |
| | | }); |
| | | })).addPathPatterns("/**") |
| | | // ææçå½±å ç¨äºä¸´æ¶æµè¯ |
| | | // if (log.isDebugEnabled()) { |
| | | // log.info("å©ä½æææ¶é´: {}", StpUtil.getTokenTimeout()); |
| | | // log.info("ä¸´æ¶æææ¶é´: {}", StpUtil.getTokenActivityTimeout()); |
| | | // } |
| | | |
| | | }); |
| | | }) |
| | | { |
| | | @Override |
| | | public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { |
| | | ThreadLocalHolder.remove(LoginHelper.LOGIN_USER_KEY); |
| | | } |
| | | }).addPathPatterns("/**") |
| | | // æé¤ä¸éè¦æ¦æªçè·¯å¾ |
| | | .excludePathPatterns(securityProperties.getExcludes()); |
| | | } |
| | |
| | | package org.dromara.common.tenant.helper; |
| | | |
| | | import cn.dev33.satoken.context.SaHolder; |
| | | import cn.dev33.satoken.stp.StpUtil; |
| | | import cn.hutool.core.convert.Convert; |
| | | import com.alibaba.ttl.TransmittableThreadLocal; |
| | | import com.baomidou.mybatisplus.core.plugins.IgnoreStrategy; |
| | | import com.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelper; |
| | | import lombok.AccessLevel; |
| | | import lombok.NoArgsConstructor; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.dromara.common.core.constant.GlobalConstants; |
| | | import org.dromara.common.core.context.ThreadLocalHolder; |
| | | import org.dromara.common.core.utils.SpringUtils; |
| | | import org.dromara.common.core.utils.StringUtils; |
| | | import org.dromara.common.redis.utils.RedisUtils; |
| | |
| | | |
| | | private static final String DYNAMIC_TENANT_KEY = GlobalConstants.GLOBAL_REDIS_KEY + "dynamicTenant"; |
| | | |
| | | private static final ThreadLocal<String> TEMP_DYNAMIC_TENANT = new TransmittableThreadLocal<>(); |
| | | private static final String TENANT_ID_KEY = "tempDynamicTenant"; |
| | | |
| | | /** |
| | | * ç§æ·åè½æ¯å¦å¯ç¨ |
| | |
| | | return; |
| | | } |
| | | if (!isLogin()) { |
| | | TEMP_DYNAMIC_TENANT.set(tenantId); |
| | | ThreadLocalHolder.set(TENANT_ID_KEY, tenantId); |
| | | return; |
| | | } |
| | | String cacheKey = DYNAMIC_TENANT_KEY + ":" + LoginHelper.getUserId(); |
| | | RedisUtils.setCacheObject(cacheKey, tenantId); |
| | | SaHolder.getStorage().set(cacheKey, tenantId); |
| | | ThreadLocalHolder.set(cacheKey, tenantId); |
| | | } |
| | | |
| | | /** |
| | |
| | | return null; |
| | | } |
| | | if (!isLogin()) { |
| | | return TEMP_DYNAMIC_TENANT.get(); |
| | | return ThreadLocalHolder.get(TENANT_ID_KEY); |
| | | } |
| | | String cacheKey = DYNAMIC_TENANT_KEY + ":" + LoginHelper.getUserId(); |
| | | String tenantId = (String) SaHolder.getStorage().get(cacheKey); |
| | | String tenantId = ThreadLocalHolder.get(cacheKey); |
| | | if (StringUtils.isNotBlank(tenantId)) { |
| | | return tenantId; |
| | | } |
| | | tenantId = RedisUtils.getCacheObject(cacheKey); |
| | | SaHolder.getStorage().set(cacheKey, tenantId); |
| | | ThreadLocalHolder.set(cacheKey, tenantId); |
| | | return tenantId; |
| | | } |
| | | |
| | |
| | | return; |
| | | } |
| | | if (!isLogin()) { |
| | | TEMP_DYNAMIC_TENANT.remove(); |
| | | ThreadLocalHolder.remove(TENANT_ID_KEY); |
| | | return; |
| | | } |
| | | String cacheKey = DYNAMIC_TENANT_KEY + ":" + LoginHelper.getUserId(); |
| | | RedisUtils.deleteObject(cacheKey); |
| | | SaHolder.getStorage().delete(cacheKey); |
| | | ThreadLocalHolder.remove(cacheKey); |
| | | } |
| | | |
| | | /** |
| | |
| | | |
| | | import cn.hutool.core.io.IoUtil; |
| | | import cn.hutool.core.map.MapUtil; |
| | | import com.alibaba.ttl.TransmittableThreadLocal; |
| | | import org.dromara.common.core.context.ThreadLocalHolder; |
| | | import org.dromara.common.core.utils.SpringUtils; |
| | | import org.dromara.common.core.utils.StringUtils; |
| | | import org.dromara.common.json.utils.JsonUtils; |
| | |
| | | |
| | | private final String prodProfile = "prod"; |
| | | |
| | | private final TransmittableThreadLocal<StopWatch> invokeTimeTL = new TransmittableThreadLocal<>(); |
| | | private final String STOP_WATCH_KEY = "stopwatch"; |
| | | |
| | | @Override |
| | | public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { |
| | |
| | | } |
| | | |
| | | StopWatch stopWatch = new StopWatch(); |
| | | invokeTimeTL.set(stopWatch); |
| | | ThreadLocalHolder.set(STOP_WATCH_KEY, stopWatch); |
| | | stopWatch.start(); |
| | | } |
| | | return true; |
| | |
| | | @Override |
| | | public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { |
| | | if (!prodProfile.equals(SpringUtils.getActiveProfile())) { |
| | | StopWatch stopWatch = invokeTimeTL.get(); |
| | | StopWatch stopWatch = ThreadLocalHolder.get(STOP_WATCH_KEY); |
| | | stopWatch.stop(); |
| | | log.info("[PLUS]ç»æè¯·æ± => URL[{}],èæ¶:[{}]毫ç§", request.getMethod() + " " + request.getRequestURI(), stopWatch.getTime()); |
| | | invokeTimeTL.remove(); |
| | | ThreadLocalHolder.clear(); |
| | | } |
| | | } |
| | | |
| | |
| | | package org.dromara.system.service.impl; |
| | | |
| | | import cn.dev33.satoken.context.SaHolder; |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.hutool.core.util.ObjectUtil; |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import org.dromara.common.core.constant.CacheConstants; |
| | | import org.dromara.common.core.constant.CacheNames; |
| | | import org.dromara.common.core.context.ThreadLocalHolder; |
| | | import org.dromara.common.core.exception.ServiceException; |
| | | import org.dromara.common.core.service.DictService; |
| | | import org.dromara.common.core.utils.MapstructUtils; |
| | |
| | | @Override |
| | | public String getDictLabel(String dictType, String dictValue, String separator) { |
| | | // ä¼å
仿¬å°ç¼åè·å |
| | | List<SysDictDataVo> datas = (List<SysDictDataVo>) SaHolder.getStorage().get(CacheConstants.SYS_DICT_KEY + dictType); |
| | | List<SysDictDataVo> datas = ThreadLocalHolder.get(CacheConstants.SYS_DICT_KEY + dictType); |
| | | if (ObjectUtil.isNull(datas)) { |
| | | datas = SpringUtils.getAopProxy(this).selectDictDataByType(dictType); |
| | | SaHolder.getStorage().set(CacheConstants.SYS_DICT_KEY + dictType, datas); |
| | | ThreadLocalHolder.set(CacheConstants.SYS_DICT_KEY + dictType, datas); |
| | | } |
| | | |
| | | Map<String, String> map = StreamUtils.toMap(datas, SysDictDataVo::getDictValue, SysDictDataVo::getDictLabel); |
| | |
| | | @Override |
| | | public String getDictValue(String dictType, String dictLabel, String separator) { |
| | | // ä¼å
仿¬å°ç¼åè·å |
| | | List<SysDictDataVo> datas = (List<SysDictDataVo>) SaHolder.getStorage().get(CacheConstants.SYS_DICT_KEY + dictType); |
| | | List<SysDictDataVo> datas = ThreadLocalHolder.get(CacheConstants.SYS_DICT_KEY + dictType); |
| | | if (ObjectUtil.isNull(datas)) { |
| | | datas = SpringUtils.getAopProxy(this).selectDictDataByType(dictType); |
| | | SaHolder.getStorage().set(CacheConstants.SYS_DICT_KEY + dictType, datas); |
| | | ThreadLocalHolder.set(CacheConstants.SYS_DICT_KEY + dictType, datas); |
| | | } |
| | | |
| | | Map<String, String> map = StreamUtils.toMap(datas, SysDictDataVo::getDictLabel, SysDictDataVo::getDictValue); |
| | |
| | | INSERT sys_user VALUES (4, N'000000', 102, N'test1', N'ä»
æ¬äºº å¯ç 666666', N'sys_user', N'', N'', N'0', NULL, N'$2a$10$b8yUzN0C71sbz.PhNOCgJe.Tu1yWC3RNrTyjSQ8p1W0.aaUXUJ.Ne', N'0', N'0', N'127.0.0.1', getdate(), 103, 1, getdate(), 4, getdate(), NULL); |
| | | GO |
| | | |
| | | INSERT sys_menu VALUES (5, N'æµè¯èå', 0, 5, N'demo', NULL, 1, 0, N'M', N'0', N'0', NULL, N'star', 103, 1, getdate(), NULL, NULL, N''); |
| | | INSERT sys_menu VALUES (5, N'æµè¯èå', 0, 5, N'demo', NULL, N'', 1, 0, N'M', N'0', N'0', NULL, N'star', 103, 1, getdate(), NULL, NULL, N''); |
| | | GO |
| | | |
| | | INSERT sys_menu VALUES (1500, N'æµè¯å表', 5, 1, N'demo', N'demo/demo/index', 1, 0, N'C', N'0', N'0', N'demo:demo:list', N'#', 103, 1, getdate(), NULL, NULL, N'æµè¯å表èå'); |
| | | INSERT sys_menu VALUES (1500, N'æµè¯å表', 5, 1, N'demo', N'demo/demo/index', N'', 1, 0, N'C', N'0', N'0', N'demo:demo:list', N'#', 103, 1, getdate(), NULL, NULL, N'æµè¯å表èå'); |
| | | GO |
| | | INSERT sys_menu VALUES (1501, N'æµè¯å表æ¥è¯¢', 1500, 1, N'#', N'', 1, 0, N'F', N'0', N'0', N'demo:demo:query', N'#', 103, 1, getdate(), NULL, NULL, N''); |
| | | INSERT sys_menu VALUES (1501, N'æµè¯å表æ¥è¯¢', 1500, 1, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'demo:demo:query', N'#', 103, 1, getdate(), NULL, NULL, N''); |
| | | GO |
| | | INSERT sys_menu VALUES (1502, N'æµè¯å表æ°å¢', 1500, 2, N'#', N'', 1, 0, N'F', N'0', N'0', N'demo:demo:add', N'#', 103, 1, getdate(), NULL, NULL, N''); |
| | | INSERT sys_menu VALUES (1502, N'æµè¯å表æ°å¢', 1500, 2, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'demo:demo:add', N'#', 103, 1, getdate(), NULL, NULL, N''); |
| | | GO |
| | | INSERT sys_menu VALUES (1503, N'æµè¯å表修æ¹', 1500, 3, N'#', N'', 1, 0, N'F', N'0', N'0', N'demo:demo:edit', N'#', 103, 1, getdate(), NULL, NULL, N''); |
| | | INSERT sys_menu VALUES (1503, N'æµè¯å表修æ¹', 1500, 3, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'demo:demo:edit', N'#', 103, 1, getdate(), NULL, NULL, N''); |
| | | GO |
| | | INSERT sys_menu VALUES (1504, N'æµè¯å表å é¤', 1500, 4, N'#', N'', 1, 0, N'F', N'0', N'0', N'demo:demo:remove', N'#', 103, 1, getdate(), NULL, NULL, N''); |
| | | INSERT sys_menu VALUES (1504, N'æµè¯å表å é¤', 1500, 4, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'demo:demo:remove', N'#', 103, 1, getdate(), NULL, NULL, N''); |
| | | GO |
| | | INSERT sys_menu VALUES (1505, N'æµè¯å表导åº', 1500, 5, N'#', N'', 1, 0, N'F', N'0', N'0', N'demo:demo:export', N'#', 103, 1, getdate(), NULL, NULL, N''); |
| | | INSERT sys_menu VALUES (1505, N'æµè¯å表导åº', 1500, 5, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'demo:demo:export', N'#', 103, 1, getdate(), NULL, NULL, N''); |
| | | GO |
| | | |
| | | INSERT sys_menu VALUES (1506, N'æµè¯æ 表', 5, 1, N'tree', N'demo/tree/index', 1, 0, N'C', N'0', N'0', N'demo:tree:list', N'#', 103, 1, getdate(), NULL, NULL, N'æµè¯æ 表èå'); |
| | | INSERT sys_menu VALUES (1506, N'æµè¯æ 表', 5, 1, N'tree', N'demo/tree/index', N'', 1, 0, N'C', N'0', N'0', N'demo:tree:list', N'#', 103, 1, getdate(), NULL, NULL, N'æµè¯æ 表èå'); |
| | | GO |
| | | INSERT sys_menu VALUES (1507, N'æµè¯æ 表æ¥è¯¢', 1506, 1, N'#', N'', 1, 0, N'F', N'0', N'0', N'demo:tree:query', N'#', 103, 1, getdate(), NULL, NULL, N''); |
| | | INSERT sys_menu VALUES (1507, N'æµè¯æ 表æ¥è¯¢', 1506, 1, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'demo:tree:query', N'#', 103, 1, getdate(), NULL, NULL, N''); |
| | | GO |
| | | INSERT sys_menu VALUES (1508, N'æµè¯æ 表æ°å¢', 1506, 2, N'#', N'', 1, 0, N'F', N'0', N'0', N'demo:tree:add', N'#', 103, 1, getdate(), NULL, NULL, N''); |
| | | INSERT sys_menu VALUES (1508, N'æµè¯æ 表æ°å¢', 1506, 2, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'demo:tree:add', N'#', 103, 1, getdate(), NULL, NULL, N''); |
| | | GO |
| | | INSERT sys_menu VALUES (1509, N'æµè¯æ 表修æ¹', 1506, 3, N'#', N'', 1, 0, N'F', N'0', N'0', N'demo:tree:edit', N'#', 103, 1, getdate(), NULL, NULL, N''); |
| | | INSERT sys_menu VALUES (1509, N'æµè¯æ 表修æ¹', 1506, 3, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'demo:tree:edit', N'#', 103, 1, getdate(), NULL, NULL, N''); |
| | | GO |
| | | INSERT sys_menu VALUES (1510, N'æµè¯æ 表å é¤', 1506, 4, N'#', N'', 1, 0, N'F', N'0', N'0', N'demo:tree:remove', N'#', 103, 1, getdate(), NULL, NULL, N''); |
| | | INSERT sys_menu VALUES (1510, N'æµè¯æ 表å é¤', 1506, 4, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'demo:tree:remove', N'#', 103, 1, getdate(), NULL, NULL, N''); |
| | | GO |
| | | INSERT sys_menu VALUES (1511, N'æµè¯æ 表导åº', 1506, 5, N'#', N'', 1, 0, N'F', N'0', N'0', N'demo:tree:export', N'#', 103, 1, getdate(), NULL, NULL, N''); |
| | | INSERT sys_menu VALUES (1511, N'æµè¯æ 表导åº', 1506, 5, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'demo:tree:export', N'#', 103, 1, getdate(), NULL, NULL, N''); |
| | | GO |
| | | |
| | | INSERT sys_role VALUES (3, N'000000', N'æ¬é¨é¨å以ä¸', N'test1', 3, N'4', 1, 1, N'0', N'0', 103, 1, getdate(), 1, NULL, NULL); |