{"repo": "beginner686/campusreuse", "files": {"CampusReuse-ui/.env.development": {"a32d43201e6bad14852d62e9e0b2ab6270717973": {"t": 1785599282.3839495, "n": 128, "h": "0db4604893fd9572", "c": "# 页面标题\nVITE_APP_TITLE = 校园闲置物品智能管理平台\n\n# 开发环境配置\nVITE_APP_ENV = 'development'\n\n# 校园闲置物品智能管理平台/开发环境\nVITE_APP_BASE_API = '/dev-api'\n"}}, "CampusReuse-admin/src/main/java/com/campusreuse/RuoYiApplication.java": {"e0f47f9bb7236023c517c2d9e91e904cb46a41cc": {"t": 1785599282.5275412, "n": 1153, "h": "6a204d6c89d7897c", "c": "package com.campusreuse;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;\n\n/**\n * 启动程序\n * \n * @author ruoyi\n */\n@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })\npublic class RuoYiApplication\n{\n public static void main(String[] args)\n {\n // System.setProperty(\"spring.devtools.restart.enabled\", \"false\");\n SpringApplication.run(RuoYiApplication.class, args);\n System.out.println(\"(♥◠‿◠)ノ゙ 若依启动成功 ლ(´ڡ`ლ)゙ \\n\" +\n \" .-------. ____ __ \\n\" +\n \" | _ _ \\\\ \\\\ \\\\ / / \\n\" +\n \" | ( ' ) | \\\\ _. / ' \\n\" +\n \" |(_ o _) / _( )_ .' \\n\" +\n \" | (_,_).' __ ___(_ o _)' \\n\" +\n \" | |\\\\ \\\\ | || |(_,_)' \\n\" +\n \" | | \\\\ `' /| `-' / \\n\" +\n \" | | \\\\ / \\\\ / \\n\" +\n \" ''-' `'-' `-..-' \");\n }\n}\n"}}, "CampusReuse-framework/src/main/java/com/campusreuse/framework/security/handle/AuthenticationEntryPointImpl.java": {"b26932fcafb022891e74166b36cc58387a7a8fd7": {"t": 1785599282.5746927, "n": 1244, "h": "4de5c9f0ae1f5b37", "c": "package com.campusreuse.framework.security.handle;\n\nimport java.io.IOException;\nimport java.io.Serializable;\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpServletResponse;\nimport org.springframework.security.core.AuthenticationException;\nimport org.springframework.security.web.AuthenticationEntryPoint;\nimport org.springframework.stereotype.Component;\nimport com.alibaba.fastjson2.JSON;\nimport com.campusreuse.common.constant.HttpStatus;\nimport com.campusreuse.common.core.domain.AjaxResult;\nimport com.campusreuse.common.utils.ServletUtils;\nimport com.campusreuse.common.utils.StringUtils;\n\n/**\n * 认证失败处理类 返回未授权\n * \n * @author ruoyi\n */\n@Component\npublic class AuthenticationEntryPointImpl implements AuthenticationEntryPoint, Serializable\n{\n private static final long serialVersionUID = -8970718410437077606L;\n\n @Override\n public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException e)\n throws IOException\n {\n int code = HttpStatus.UNAUTHORIZED;\n String msg = StringUtils.format(\"请求访问:{},认证失败,无法访问系统资源\", request.getRequestURI());\n ServletUtils.renderString(response, JSON.toJSONString(AjaxResult.error(code, msg)));\n }\n}\n"}}, "CampusReuse-ui/src/views/system/user/authRole.vue": {"a7546aaab4e7c3f4a5f461bc57d29c6687ea9267": {"t": 1785599282.6468918, "n": 3744, "h": "16be7641679cd145", "c": "\n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n\n \n
\n \n \n {{ (pageNum - 1) * pageSize + scope.$index + 1 }}\n \n \n \n \n \n \n \n \n {{ parseTime(scope.row.createTime) }}\n \n \n \n\n
0\" :total=\"total\" v-model:page=\"pageNum\" v-model:limit=\"pageSize\" />\n\n \n \n 提交\n 返回\n
\n \n \n\n\n\n"}}, "CampusReuse-ui/src/utils/auth.js": {"08a43d6e299227a695497dd2d8a312096315958b": {"t": 1785599282.6904573, "n": 271, "h": "afe56db4feae7f7e", "c": "import Cookies from 'js-cookie'\n\nconst TokenKey = 'Admin-Token'\n\nexport function getToken() {\n return Cookies.get(TokenKey)\n}\n\nexport function setToken(token) {\n return Cookies.set(TokenKey, token)\n}\n\nexport function removeToken() {\n return Cookies.remove(TokenKey)\n}\n"}}, "CampusReuse-ui/.env.production": {"e90c616c7a5ae8950380ba93796169c1446adcb9": {"t": 1785599282.6921067, "n": 185, "h": "918f1f2b51705f0a", "c": "# 页面标题\nVITE_APP_TITLE = 校园闲置物品智能管理平台\n\n# 生产环境配置\nVITE_APP_ENV = 'production'\n\n# 校园闲置物品智能管理平台/生产环境\nVITE_APP_BASE_API = '/prod-api'\n\n# 是否在打包时开启压缩,支持 gzip 和 brotli\nVITE_BUILD_COMPRESS = gzip"}}, "CampusReuse-ui/src/plugins/auth.js": {"1354e8760f3b797fc580dbb35a9d118ee896fb18": {"t": 1785599282.7350366, "n": 1274, "h": "86e65b3fd4db9512", "c": "import useUserStore from '@/store/modules/user'\n\nfunction authPermission(permission) {\n const all_permission = \"*:*:*\"\n const permissions = useUserStore().permissions\n if (permission && permission.length > 0) {\n return permissions.some(v => {\n return all_permission === v || v === permission\n })\n } else {\n return false\n }\n}\n\nfunction authRole(role) {\n const super_admin = \"admin\"\n const roles = useUserStore().roles\n if (role && role.length > 0) {\n return roles.some(v => {\n return super_admin === v || v === role\n })\n } else {\n return false\n }\n}\n\nexport default {\n // 验证用户是否具备某权限\n hasPermi(permission) {\n return authPermission(permission)\n },\n // 验证用户是否含有指定权限,只需包含其中一个\n hasPermiOr(permissions) {\n return permissions.some(item => {\n return authPermission(item)\n })\n },\n // 验证用户是否含有指定权限,必须全部拥有\n hasPermiAnd(permissions) {\n return permissions.every(item => {\n return authPermission(item)\n })\n },\n // 验证用户是否具备某角色\n hasRole(role) {\n return authRole(role)\n },\n // 验证用户是否含有指定角色,只需包含其中一个\n hasRoleOr(roles) {\n return roles.some(item => {\n return authRole(item)\n })\n },\n // 验证用户是否含有指定角色,必须全部拥有\n hasRoleAnd(roles) {\n return roles.every(item => {\n return authRole(item)\n })\n }\n}\n"}}, "CampusReuse-ui/.env.staging": {"2b7d47c9c087324e9429dafff73c3acb80151e66": {"t": 1785599282.7688565, "n": 183, "h": "5862b1f3275eaba5", "c": "# 页面标题\nVITE_APP_TITLE = 校园闲置物品智能管理平台\n\n# 生产环境配置\nVITE_APP_ENV = 'staging'\n\n# 校园闲置物品智能管理平台/生产环境\nVITE_APP_BASE_API = '/stage-api'\n\n# 是否在打包时开启压缩,支持 gzip 和 brotli\nVITE_BUILD_COMPRESS = gzip"}}, ".vscode/settings.json": {"7b016a89fbafd4b802a61d3207cf76f7c2253c6e": {"t": 1785599282.807956, "n": 53, "h": "c1d39a7eba93e0c2", "c": "{\n \"java.compile.nullAnalysis.mode\": \"automatic\"\n}"}}, "CampusReuse-admin/src/main/java/com/campusreuse/web/controller/system/SysConfigController.java": {"96c7657e31af563a1e1e459d6bcd46e681f2adcf": {"t": 1785599282.8360884, "n": 4303, "h": "3373e9f18f6a164d", "c": "package com.campusreuse.web.controller.system;\n\nimport java.util.List;\nimport javax.servlet.http.HttpServletResponse;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.security.access.prepost.PreAuthorize;\nimport org.springframework.validation.annotation.Validated;\nimport org.springframework.web.bind.annotation.DeleteMapping;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.PutMapping;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\nimport com.campusreuse.common.annotation.Log;\nimport com.campusreuse.common.core.controller.BaseController;\nimport com.campusreuse.common.core.domain.AjaxResult;\nimport com.campusreuse.common.core.page.TableDataInfo;\nimport com.campusreuse.common.enums.BusinessType;\nimport com.campusreuse.common.utils.poi.ExcelUtil;\nimport com.campusreuse.system.domain.SysConfig;\nimport com.campusreuse.system.service.ISysConfigService;\n\n/**\n * 参数配置 信息操作处理\n * \n * @author ruoyi\n */\n@RestController\n@RequestMapping(\"/system/config\")\npublic class SysConfigController extends BaseController\n{\n @Autowired\n private ISysConfigService configService;\n\n /**\n * 获取参数配置列表\n */\n @PreAuthorize(\"@ss.hasPermi('system:config:list')\")\n @GetMapping(\"/list\")\n public TableDataInfo list(SysConfig config)\n {\n startPage();\n List list = configService.selectConfigList(config);\n return getDataTable(list);\n }\n\n @Log(title = \"参数管理\", businessType = BusinessType.EXPORT)\n @PreAuthorize(\"@ss.hasPermi('system:config:export')\")\n @PostMapping(\"/export\")\n public void export(HttpServletResponse response, SysConfig config)\n {\n List list = configService.selectConfigList(config);\n ExcelUtil util = new ExcelUtil(SysConfig.class);\n util.exportExcel(response, list, \"参数数据\");\n }\n\n /**\n * 根据参数编号获取详细信息\n */\n @PreAuthorize(\"@ss.hasPermi('system:config:query')\")\n @GetMapping(value = \"/{configId}\")\n public AjaxResult getInfo(@PathVariable Long configId)\n {\n return success(configService.selectConfigById(configId));\n }\n\n /**\n * 根据参数键名查询参数值\n */\n @GetMapping(value = \"/configKey/{configKey}\")\n public AjaxResult getConfigKey(@PathVariable String configKey)\n {\n return success(configService.selectConfigByKey(configKey));\n }\n\n /**\n * 新增参数配置\n */\n @PreAuthorize(\"@ss.hasPermi('system:config:add')\")\n @Log(title = \"参数管理\", businessType = BusinessType.INSERT)\n @PostMapping\n public AjaxResult add(@Validated @RequestBody SysConfig config)\n {\n if (!configService.checkConfigKeyUnique(config))\n {\n return error(\"新增参数'\" + config.getConfigName() + \"'失败,参数键名已存在\");\n }\n config.setCreateBy(getUsername());\n return toAjax(configService.insertConfig(config));\n }\n\n /**\n * 修改参数配置\n */\n @PreAuthorize(\"@ss.hasPermi('system:config:edit')\")\n @Log(title = \"参数管理\", businessType = BusinessType.UPDATE)\n @PutMapping\n public AjaxResult edit(@Validated @RequestBody SysConfig config)\n {\n if (!configService.checkConfigKeyUnique(config))\n {\n return error(\"修改参数'\" + config.getConfigName() + \"'失败,参数键名已存在\");\n }\n config.setUpdateBy(getUsername());\n return toAjax(configService.updateConfig(config));\n }\n\n /**\n * 删除参数配置\n */\n @PreAuthorize(\"@ss.hasPermi('system:config:remove')\")\n @Log(title = \"参数管理\", businessType = BusinessType.DELETE)\n @DeleteMapping(\"/{configIds}\")\n public AjaxResult remove(@PathVariable Long[] configIds)\n {\n configService.deleteConfigByIds(configIds);\n return success();\n }\n\n /**\n * 刷新参数缓存\n */\n @PreAuthorize(\"@ss.hasPermi('system:config:remove')\")\n @Log(title = \"参数管理\", businessType = BusinessType.CLEAN)\n @DeleteMapping(\"/refreshCache\")\n public AjaxResult refreshCache()\n {\n configService.resetConfigCache();\n return success();\n }\n}\n"}}, "CampusReuse-framework/src/main/java/com/campusreuse/framework/security/filter/JwtAuthenticationTokenFilter.java": {"4a83e4fbaa4dce23bec5b7315e949efdded66d23": {"t": 1785599282.838055, "n": 1893, "h": "87d138fce82951f8", "c": "package com.campusreuse.framework.security.filter;\n\nimport java.io.IOException;\nimport javax.servlet.FilterChain;\nimport javax.servlet.ServletException;\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpServletResponse;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.security.authentication.UsernamePasswordAuthenticationToken;\nimport org.springframework.security.core.context.SecurityContextHolder;\nimport org.springframework.security.web.authentication.WebAuthenticationDetailsSource;\nimport org.springframework.stereotype.Component;\nimport org.springframework.web.filter.OncePerRequestFilter;\nimport com.campusreuse.common.core.domain.model.LoginUser;\nimport com.campusreuse.common.utils.SecurityUtils;\nimport com.campusreuse.common.utils.StringUtils;\nimport com.campusreuse.framework.web.service.TokenService;\n\n/**\n * token过滤器 验证token有效性\n * \n * @author ruoyi\n */\n@Component\npublic class JwtAuthenticationTokenFilter extends OncePerRequestFilter\n{\n @Autowired\n private TokenService tokenService;\n\n @Override\n protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)\n throws ServletException, IOException\n {\n LoginUser loginUser = tokenService.getLoginUser(request);\n if (StringUtils.isNotNull(loginUser) && StringUtils.isNull(SecurityUtils.getAuthentication()))\n {\n tokenService.verifyToken(loginUser);\n UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(loginUser, null, loginUser.getAuthorities());\n authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));\n SecurityContextHolder.getContext().setAuthentication(authenticationToken);\n }\n chain.doFilter(request, response);\n }\n}\n"}}, "CampusReuse-framework/src/main/java/com/campusreuse/framework/security/context/AuthenticationContextHolder.java": {"577cd1ff966f1b499f298a9069afbb8b2d39c6e0": {"t": 1785599282.961583, "n": 570, "h": "bed5a903ce9eac37", "c": "package com.campusreuse.framework.security.context;\n\nimport org.springframework.security.core.Authentication;\n\n/**\n * 身份验证信息\n * \n * @author ruoyi\n */\npublic class AuthenticationContextHolder\n{\n private static final ThreadLocal contextHolder = new ThreadLocal<>();\n\n public static Authentication getContext()\n {\n return contextHolder.get();\n }\n\n public static void setContext(Authentication context)\n {\n contextHolder.set(context);\n }\n\n public static void clearContext()\n {\n contextHolder.remove();\n }\n}\n"}}, "CampusReuse-ui/src/views/system/role/authUser.vue": {"c607f639513f57a5d5f1cde26ca52608aa7679fd": {"t": 1785599283.0418432, "n": 5565, "h": "95dedcd2600d2cf3", "c": "\n\n \n
\n \n \n \n \n \n \n \n 搜索\n 重置\n \n \n\n
\n \n 添加用户\n \n \n 批量取消授权\n \n \n 关闭\n \n \n \n\n
\n \n \n \n \n \n \n \n \n \n \n \n \n {{ parseTime(scope.row.createTime) }}\n \n \n \n \n 取消授权\n \n \n \n\n
0\"\n :total=\"total\"\n v-model:page=\"queryParams.pageNum\"\n v-model:limit=\"queryParams.pageSize\"\n @pagination=\"getList\"\n />\n \n \n\n\n\n"}}, "CampusReuse-admin/src/main/resources/META-INF/spring-devtools.properties": {"37e7b5806ee4a61e35699d6f114f906efad2e500": {"t": 1785599283.0554752, "n": 49, "h": "6705545e6beb6226", "c": "restart.include.json=/com.alibaba.fastjson2.*.jar"}}, "CampusReuse-admin/src/main/java/com/campusreuse/web/core/config/SwaggerConfig.java": {"557534f38e492c88913a1edb266188ff2cf7ed99": {"t": 1785599283.2339761, "n": 4214, "h": "00f8873c4664929c", "c": "package com.campusreuse.web.core.config;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport com.campusreuse.common.config.RuoYiConfig;\nimport io.swagger.annotations.ApiOperation;\nimport io.swagger.models.auth.In;\nimport springfox.documentation.builders.ApiInfoBuilder;\nimport springfox.documentation.builders.PathSelectors;\nimport springfox.documentation.builders.RequestHandlerSelectors;\nimport springfox.documentation.service.ApiInfo;\nimport springfox.documentation.service.ApiKey;\nimport springfox.documentation.service.AuthorizationScope;\nimport springfox.documentation.service.Contact;\nimport springfox.documentation.service.SecurityReference;\nimport springfox.documentation.service.SecurityScheme;\nimport springfox.documentation.spi.DocumentationType;\nimport springfox.documentation.spi.service.contexts.SecurityContext;\nimport springfox.documentation.spring.web.plugins.Docket;\n\n/**\n * Swagger2的接口配置\n * \n * @author ruoyi\n */\n@Configuration\npublic class SwaggerConfig\n{\n /** 系统基础配置 */\n @Autowired\n private RuoYiConfig ruoyiConfig;\n\n /** 是否开启swagger */\n @Value(\"${swagger.enabled}\")\n private boolean enabled;\n\n /** 设置请求的统一前缀 */\n @Value(\"${swagger.pathMapping}\")\n private String pathMapping;\n\n /**\n * 创建API\n */\n @Bean\n public Docket createRestApi()\n {\n return new Docket(DocumentationType.OAS_30)\n // 是否启用Swagger\n .enable(enabled)\n // 用来创建该API的基本信息,展示在文档的页面中(自定义展示的信息)\n .apiInfo(apiInfo())\n // 设置哪些接口暴露给Swagger展示\n .select()\n // 扫描所有有注解的api,用这种方式更灵活\n .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))\n // 扫描指定包中的swagger注解\n // .apis(RequestHandlerSelectors.basePackage(\"com.campusreuse.project.tool.swagger\"))\n // 扫描所有 .apis(RequestHandlerSelectors.any())\n .paths(PathSelectors.any())\n .build()\n /* 设置安全模式,swagger可以设置访问token */\n .securitySchemes(securitySchemes())\n .securityContexts(securityContexts())\n .pathMapping(pathMapping);\n }\n\n /**\n * 安全模式,这里指定token通过Authorization头请求头传递\n */\n private List securitySchemes()\n {\n List apiKeyList = new ArrayList();\n apiKeyList.add(new ApiKey(\"Authorization\", \"Authorization\", In.HEADER.toValue()));\n return apiKeyList;\n }\n\n /**\n * 安全上下文\n */\n private List securityContexts()\n {\n List securityContexts = new ArrayList<>();\n securityContexts.add(\n SecurityContext.builder()\n .securityReferences(defaultAuth())\n .operationSelector(o -> o.requestMappingPattern().matches(\"/.*\"))\n .build());\n return securityContexts;\n }\n\n /**\n * 默认的安全上引用\n */\n private List defaultAuth()\n {\n AuthorizationScope authorizationScope = new AuthorizationScope(\"global\", \"accessEverything\");\n AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];\n authorizationScopes[0] = authorizationScope;\n List securityReferences = new ArrayList<>();\n securityReferences.add(new SecurityReference(\"Authorization\", authorizationScopes));\n return securityReferences;\n }\n\n /**\n * 添加摘要信息\n */\n private ApiInfo apiInfo()\n {\n // 用ApiInfoBuilder进行定制\n return new ApiInfoBuilder()\n // 设置标题\n .title(\"标题:校园二手交易系统_接口文档\")\n // 描述\n .description(\"描述:用于管理集团旗下公司的人员信息,具体包括XXX,XXX模块...\")\n // 作者信息\n .contact(new Contact(ruoyiConfig.getName(), null, null))\n // 版本\n .version(\"版本号:\" + ruoyiConfig.getVersion())\n .build();\n }\n}\n"}}, "CampusReuse-common/src/main/java/com/campusreuse/common/config/RuoYiConfig.java": {"6e3f60ebd809eedd7f3d705ec1608ba62b0a8651": {"t": 1785599284.0605962, "n": 2160, "h": "da00f487f1b3ec8e", "c": "package com.campusreuse.common.config;\n\nimport org.springframework.boot.context.properties.ConfigurationProperties;\nimport org.springframework.stereotype.Component;\n\n/**\n * 读取项目相关配置\n * \n * @author ruoyi\n */\n@Component\n@ConfigurationProperties(prefix = \"ruoyi\")\npublic class RuoYiConfig\n{\n /** 项目名称 */\n private String name;\n\n /** 版本 */\n private String version;\n\n /** 版权年份 */\n private String copyrightYear;\n\n /** 上传路径 */\n private static String profile;\n\n /** 获取地址开关 */\n private static boolean addressEnabled;\n\n /** 验证码类型 */\n private static String captchaType;\n\n public String getName()\n {\n return name;\n }\n\n public void setName(String name)\n {\n this.name = name;\n }\n\n public String getVersion()\n {\n return version;\n }\n\n public void setVersion(String version)\n {\n this.version = version;\n }\n\n public String getCopyrightYear()\n {\n return copyrightYear;\n }\n\n public void setCopyrightYear(String copyrightYear)\n {\n this.copyrightYear = copyrightYear;\n }\n\n public static String getProfile()\n {\n return profile;\n }\n\n public void setProfile(String profile)\n {\n RuoYiConfig.profile = profile;\n }\n\n public static boolean isAddressEnabled()\n {\n return addressEnabled;\n }\n\n public void setAddressEnabled(boolean addressEnabled)\n {\n RuoYiConfig.addressEnabled = addressEnabled;\n }\n\n public static String getCaptchaType() {\n return captchaType;\n }\n\n public void setCaptchaType(String captchaType) {\n RuoYiConfig.captchaType = captchaType;\n }\n\n /**\n * 获取导入上传路径\n */\n public static String getImportPath()\n {\n return getProfile() + \"/import\";\n }\n\n /**\n * 获取头像上传路径\n */\n public static String getAvatarPath()\n {\n return getProfile() + \"/avatar\";\n }\n\n /**\n * 获取下载路径\n */\n public static String getDownloadPath()\n {\n return getProfile() + \"/download/\";\n }\n\n /**\n * 获取上传路径\n */\n public static String getUploadPath()\n {\n return getProfile() + \"/upload\";\n }\n}\n"}}, "CampusReuse-common/src/main/java/com/campusreuse/common/filter/XssHttpServletRequestWrapper.java": {"ab033fab0b414b0af0de77bd849a32b17ae98f30": {"t": 1785599284.2432535, "n": 2873, "h": "7a3614def735fef6", "c": "package com.campusreuse.common.filter;\n\nimport java.io.ByteArrayInputStream;\nimport java.io.IOException;\nimport javax.servlet.ReadListener;\nimport javax.servlet.ServletInputStream;\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpServletRequestWrapper;\nimport org.apache.commons.io.IOUtils;\nimport org.springframework.http.HttpHeaders;\nimport org.springframework.http.MediaType;\nimport com.campusreuse.common.utils.StringUtils;\nimport com.campusreuse.common.utils.html.EscapeUtil;\n\n/**\n * XSS过滤处理\n * \n * @author ruoyi\n */\npublic class XssHttpServletRequestWrapper extends HttpServletRequestWrapper\n{\n /**\n * @param request\n */\n public XssHttpServletRequestWrapper(HttpServletRequest request)\n {\n super(request);\n }\n\n @Override\n public String[] getParameterValues(String name)\n {\n String[] values = super.getParameterValues(name);\n if (values != null)\n {\n int length = values.length;\n String[] escapesValues = new String[length];\n for (int i = 0; i < length; i++)\n {\n // 防xss攻击和过滤前后空格\n escapesValues[i] = EscapeUtil.clean(values[i]).trim();\n }\n return escapesValues;\n }\n return super.getParameterValues(name);\n }\n\n @Override\n public ServletInputStream getInputStream() throws IOException\n {\n // 非json类型,直接返回\n if (!isJsonRequest())\n {\n return super.getInputStream();\n }\n\n // 为空,直接返回\n String json = IOUtils.toString(super.getInputStream(), \"utf-8\");\n if (StringUtils.isEmpty(json))\n {\n return super.getInputStream();\n }\n\n // xss过滤\n json = EscapeUtil.clean(json).trim();\n byte[] jsonBytes = json.getBytes(\"utf-8\");\n final ByteArrayInputStream bis = new ByteArrayInputStream(jsonBytes);\n return new ServletInputStream()\n {\n @Override\n public boolean isFinished()\n {\n return true;\n }\n\n @Override\n public boolean isReady()\n {\n return true;\n }\n\n @Override\n public int available() throws IOException\n {\n return jsonBytes.length;\n }\n\n @Override\n public void setReadListener(ReadListener readListener)\n {\n }\n\n @Override\n public int read() throws IOException\n {\n return bis.read();\n }\n };\n }\n\n /**\n * 是否是Json请求\n * \n * @param request\n */\n public boolean isJsonRequest()\n {\n String header = super.getHeader(HttpHeaders.CONTENT_TYPE);\n return StringUtils.startsWithIgnoreCase(header, MediaType.APPLICATION_JSON_VALUE);\n }\n}"}}, "CampusReuse-common/src/main/java/com/campusreuse/common/filter/RepeatedlyRequestWrapper.java": {"c2d9129dfb0b16545cf975c739fb91169ccde333": {"t": 1785599284.271596, "n": 2006, "h": "af9e3a9a08f3a033", "c": "package com.campusreuse.common.filter;\n\nimport java.io.BufferedReader;\nimport java.io.ByteArrayInputStream;\nimport java.io.IOException;\nimport java.io.InputStreamReader;\nimport javax.servlet.ReadListener;\nimport javax.servlet.ServletInputStream;\nimport javax.servlet.ServletResponse;\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpServletRequestWrapper;\nimport com.campusreuse.common.utils.http.HttpHelper;\nimport com.campusreuse.common.constant.Constants;\n\n/**\n * 构建可重复读取inputStream的request\n * \n * @author ruoyi\n */\npublic class RepeatedlyRequestWrapper extends HttpServletRequestWrapper\n{\n private final byte[] body;\n\n public RepeatedlyRequestWrapper(HttpServletRequest request, ServletResponse response) throws IOException\n {\n super(request);\n request.setCharacterEncoding(Constants.UTF8);\n response.setCharacterEncoding(Constants.UTF8);\n\n body = HttpHelper.getBodyString(request).getBytes(Constants.UTF8);\n }\n\n @Override\n public BufferedReader getReader() throws IOException\n {\n return new BufferedReader(new InputStreamReader(getInputStream()));\n }\n\n @Override\n public ServletInputStream getInputStream() throws IOException\n {\n final ByteArrayInputStream bais = new ByteArrayInputStream(body);\n return new ServletInputStream()\n {\n @Override\n public int read() throws IOException\n {\n return bais.read();\n }\n\n @Override\n public int available() throws IOException\n {\n return body.length;\n }\n\n @Override\n public boolean isFinished()\n {\n return false;\n }\n\n @Override\n public boolean isReady()\n {\n return false;\n }\n\n @Override\n public void setReadListener(ReadListener readListener)\n {\n\n }\n };\n }\n}\n"}}, "CampusReuse-admin/src/main/resources/mybatis/mybatis-config.xml": {"ac47c038e041f2435bdd4975c0ce7225c6b21b28": {"t": 1785599284.2779987, "n": 796, "h": "cc4d464dc3550f63", "c": "\n\n\n \n \n \n \n \n \n \n \n\t\t\n \n \n\t\t\n\t\n\t\n\n"}}, "CampusReuse-common/src/main/java/com/campusreuse/common/constant/UserConstants.java": {"aa75a796e9dc5ea4792c74d6d7b3970c74864703": {"t": 1785599284.6220062, "n": 1804, "h": "af1d6e7da6554538", "c": "package com.campusreuse.common.constant;\n\n/**\n * 用户常量信息\n * \n * @author ruoyi\n */\npublic class UserConstants\n{\n /**\n * 平台内系统用户的唯一标志\n */\n public static final String SYS_USER = \"SYS_USER\";\n\n /** 正常状态 */\n public static final String NORMAL = \"0\";\n\n /** 异常状态 */\n public static final String EXCEPTION = \"1\";\n\n /** 用户封禁状态 */\n public static final String USER_DISABLE = \"1\";\n\n /** 角色正常状态 */\n public static final String ROLE_NORMAL = \"0\";\n\n /** 角色封禁状态 */\n public static final String ROLE_DISABLE = \"1\";\n\n /** 部门正常状态 */\n public static final String DEPT_NORMAL = \"0\";\n\n /** 部门停用状态 */\n public static final String DEPT_DISABLE = \"1\";\n\n /** 字典正常状态 */\n public static final String DICT_NORMAL = \"0\";\n\n /** 是否为系统默认(是) */\n public static final String YES = \"Y\";\n\n /** 是否菜单外链(是) */\n public static final String YES_FRAME = \"0\";\n\n /** 是否菜单外链(否) */\n public static final String NO_FRAME = \"1\";\n\n /** 菜单类型(目录) */\n public static final String TYPE_DIR = \"M\";\n\n /** 菜单类型(菜单) */\n public static final String TYPE_MENU = \"C\";\n\n /** 菜单类型(按钮) */\n public static final String TYPE_BUTTON = \"F\";\n\n /** Layout组件标识 */\n public final static String LAYOUT = \"Layout\";\n \n /** ParentView组件标识 */\n public final static String PARENT_VIEW = \"ParentView\";\n\n /** InnerLink组件标识 */\n public final static String INNER_LINK = \"InnerLink\";\n\n /** 校验是否唯一的返回标识 */\n public final static boolean UNIQUE = true;\n public final static boolean NOT_UNIQUE = false;\n\n /**\n * 用户名长度限制\n */\n public static final int USERNAME_MIN_LENGTH = 2;\n public static final int USERNAME_MAX_LENGTH = 20;\n\n /**\n * 密码长度限制\n */\n public static final int PASSWORD_MIN_LENGTH = 5;\n public static final int PASSWORD_MAX_LENGTH = 20;\n}\n"}}, "CampusReuse-admin/src/main/resources/application.yml": {"497cbef080c325933ed4484df08a76e51bf278d6": {"t": 1785599284.7901425, "n": 2485, "h": "0fa37b76ccd3962b", "c": "# 项目相关配置\nruoyi:\n # 名称\n name: CampusReuse\n # 版本\n version: 3.9.0\n # 版权年份\n copyrightYear: 2025\n # 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath)\n # 使用绝对路径,确保能正确访问上传的文件\n profile: C:/Users/黄裔雄/Desktop/论文1/xiaoyuan/20251223104749/CampusReuse/my_uploads\n # 获取ip地址开关\n addressEnabled: false\n # 验证码类型 math 数字计算 char 字符验证\n captchaType: math\n\n# AI 豆包大模型配置\nai:\n doubao:\n # API Key (建议通过环境变量配置)\n api-key: 99ffb06b-ff6f-44bc-b376-c171b688851f\n # 接口地址\n endpoint: https://ark.cn-beijing.volces.com/api/v3/chat/completions\n # 模型名称\n model: ep-20260109112940-2s6v2\n\n\n\n\n# 开发环境配置\nserver:\n # 服务器的HTTP端口,默认为8080\n port: 8081\n servlet:\n # 应用的访问路径\n context-path: /\n tomcat:\n # tomcat的URI编码\n uri-encoding: UTF-8\n # 连接数满后的排队数,默认为100\n accept-count: 1000\n threads:\n # tomcat最大线程数,默认为200\n max: 800\n # Tomcat启动初始化的线程数,默认值10\n min-spare: 100\n\n# 日志配置\nlogging:\n level:\n com.campusreuse: debug\n org.springframework: warn\n\n# 用户配置\nuser:\n password:\n # 密码最大错误次数\n maxRetryCount: 5\n # 密码锁定时间(默认10分钟)\n lockTime: 10\n\n# Spring配置\nspring:\n # 资源信息\n messages:\n # 国际化资源文件路径\n basename: i18n/messages\n profiles:\n active: druid\n # 文件上传\n servlet:\n multipart:\n # 单个文件大小\n max-file-size: 10MB\n # 设置总上传的文件大小\n max-request-size: 20MB\n # 服务模块\n devtools:\n restart:\n # 热部署开关\n enabled: true\n # redis 配置\n redis:\n # 地址\n host: localhost\n # 端口,默认为6379\n port: 6379\n # 数据库索引\n database: 0\n # 密码\n password:\n # 连接超时时间\n timeout: 10s\n lettuce:\n pool:\n # 连接池中的最小空闲连接\n min-idle: 0\n # 连接池中的最大空闲连接\n max-idle: 8\n # 连接池的最大数据库连接数\n max-active: 8\n # #连接池最大阻塞等待时间(使用负值表示没有限制)\n max-wait: -1ms\n\n# token配置\ntoken:\n # 令牌自定义标识\n header: Authorization\n # 令牌密钥\n secret: abcdefghijklmnopqrstuvwxyz\n # 令牌有效期(默认30分钟)\n expireTime: 30\n\n# MyBatis配置\nmybatis:\n # 搜索指定包别名\n typeAliasesPackage: com.campusreuse.**.domain\n # 配置mapper的扫描,找到所有的mapper.xml映射文件\n mapperLocations: classpath*:mapper/**/*Mapper.xml\n # 加载全局的配置文件\n configLocation: classpath:mybatis/mybatis-config.xml\n\n# PageHelper分页插件\npagehelper:\n helperDialect: mysql\n supportMethodsArguments: true\n params: count=countSql\n\n# Swagger配置\nswagger:\n # 是否开启swagger\n enabled: true\n # 请求前缀\n pathMapping: /dev-api\n\n# 防止XSS攻击\nxss:\n # 过滤开关\n enabled: true\n # 排除链接(多个用逗号分隔)\n excludes: /system/notice\n # 匹配链接\n urlPatterns: /system/*,/monitor/*,/tool/*\n\n\n"}, "427252fc68bbe46248249d298baa33128ef2c207": {"t": 1785611542.471752, "n": 2485, "h": "0fa37b76ccd3962b", "c": "# 项目相关配置\nruoyi:\n # 名称\n name: CampusReuse\n # 版本\n version: 3.9.0\n # 版权年份\n copyrightYear: 2025\n # 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath)\n # 使用绝对路径,确保能正确访问上传的文件\n profile: C:/Users/黄裔雄/Desktop/论文1/xiaoyuan/20251223104749/CampusReuse/my_uploads\n # 获取ip地址开关\n addressEnabled: false\n # 验证码类型 math 数字计算 char 字符验证\n captchaType: math\n\n# AI 豆包大模型配置\nai:\n doubao:\n # API Key (建议通过环境变量配置)\n api-key: 99ffb06b-ff6f-44bc-b376-c171b688851f\n # 接口地址\n endpoint: https://ark.cn-beijing.volces.com/api/v3/chat/completions\n # 模型名称\n model: ep-20260109112940-2s6v2\n\n\n\n\n# 开发环境配置\nserver:\n # 服务器的HTTP端口,默认为8080\n port: 8081\n servlet:\n # 应用的访问路径\n context-path: /\n tomcat:\n # tomcat的URI编码\n uri-encoding: UTF-8\n # 连接数满后的排队数,默认为100\n accept-count: 1000\n threads:\n # tomcat最大线程数,默认为200\n max: 800\n # Tomcat启动初始化的线程数,默认值10\n min-spare: 100\n\n# 日志配置\nlogging:\n level:\n com.campusreuse: debug\n org.springframework: warn\n\n# 用户配置\nuser:\n password:\n # 密码最大错误次数\n maxRetryCount: 5\n # 密码锁定时间(默认10分钟)\n lockTime: 10\n\n# Spring配置\nspring:\n # 资源信息\n messages:\n # 国际化资源文件路径\n basename: i18n/messages\n profiles:\n active: druid\n # 文件上传\n servlet:\n multipart:\n # 单个文件大小\n max-file-size: 10MB\n # 设置总上传的文件大小\n max-request-size: 20MB\n # 服务模块\n devtools:\n restart:\n # 热部署开关\n enabled: true\n # redis 配置\n redis:\n # 地址\n host: localhost\n # 端口,默认为6379\n port: 6379\n # 数据库索引\n database: 0\n # 密码\n password:\n # 连接超时时间\n timeout: 10s\n lettuce:\n pool:\n # 连接池中的最小空闲连接\n min-idle: 0\n # 连接池中的最大空闲连接\n max-idle: 8\n # 连接池的最大数据库连接数\n max-active: 8\n # #连接池最大阻塞等待时间(使用负值表示没有限制)\n max-wait: -1ms\n\n# token配置\ntoken:\n # 令牌自定义标识\n header: Authorization\n # 令牌密钥\n secret: abcdefghijklmnopqrstuvwxyz\n # 令牌有效期(默认30分钟)\n expireTime: 30\n\n# MyBatis配置\nmybatis:\n # 搜索指定包别名\n typeAliasesPackage: com.campusreuse.**.domain\n # 配置mapper的扫描,找到所有的mapper.xml映射文件\n mapperLocations: classpath*:mapper/**/*Mapper.xml\n # 加载全局的配置文件\n configLocation: classpath:mybatis/mybatis-config.xml\n\n# PageHelper分页插件\npagehelper:\n helperDialect: mysql\n supportMethodsArguments: true\n params: count=countSql\n\n# Swagger配置\nswagger:\n # 是否开启swagger\n enabled: true\n # 请求前缀\n pathMapping: /dev-api\n\n# 防止XSS攻击\nxss:\n # 过滤开关\n enabled: true\n # 排除链接(多个用逗号分隔)\n excludes: /system/notice\n # 匹配链接\n urlPatterns: /system/*,/monitor/*,/tool/*\n\n\n"}, "5092e74aa684812e1fbe6898ad2e5aa1c42ff0e0": {"t": 1785611544.2607687, "n": 2402, "h": "e882cca0e9bf1057", "c": "# 项目相关配置\nruoyi:\n # 名称\n name: CampusReuse\n # 版本\n version: 3.9.0\n # 版权年份\n copyrightYear: 2025\n # 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath)\n profile: ./my_uploads\n # 获取ip地址开关\n addressEnabled: false\n # 验证码类型 math 数字计算 char 字符验证\n captchaType: math\n\n# AI 豆包大模型配置\nai:\n doubao:\n # API Key (建议通过环境变量配置)\n api-key: 99ffb06b-ff6f-44bc-b376-c171b688851f\n # 接口地址\n endpoint: https://ark.cn-beijing.volces.com/api/v3/chat/completions\n # 模型名称\n model: ep-20260109112940-2s6v2\n\n\n\n\n# 开发环境配置\nserver:\n # 服务器的HTTP端口,默认为8080\n port: 8081\n servlet:\n # 应用的访问路径\n context-path: /\n tomcat:\n # tomcat的URI编码\n uri-encoding: UTF-8\n # 连接数满后的排队数,默认为100\n accept-count: 1000\n threads:\n # tomcat最大线程数,默认为200\n max: 800\n # Tomcat启动初始化的线程数,默认值10\n min-spare: 100\n\n# 日志配置\nlogging:\n level:\n com.campusreuse: debug\n org.springframework: warn\n\n# 用户配置\nuser:\n password:\n # 密码最大错误次数\n maxRetryCount: 5\n # 密码锁定时间(默认10分钟)\n lockTime: 10\n\n# Spring配置\nspring:\n # 资源信息\n messages:\n # 国际化资源文件路径\n basename: i18n/messages\n profiles:\n active: druid\n # 文件上传\n servlet:\n multipart:\n # 单个文件大小\n max-file-size: 10MB\n # 设置总上传的文件大小\n max-request-size: 20MB\n # 服务模块\n devtools:\n restart:\n # 热部署开关\n enabled: true\n # redis 配置\n redis:\n # 地址\n host: localhost\n # 端口,默认为6379\n port: 6379\n # 数据库索引\n database: 0\n # 密码\n password:\n # 连接超时时间\n timeout: 10s\n lettuce:\n pool:\n # 连接池中的最小空闲连接\n min-idle: 0\n # 连接池中的最大空闲连接\n max-idle: 8\n # 连接池的最大数据库连接数\n max-active: 8\n # #连接池最大阻塞等待时间(使用负值表示没有限制)\n max-wait: -1ms\n\n# token配置\ntoken:\n # 令牌自定义标识\n header: Authorization\n # 令牌密钥\n secret: abcdefghijklmnopqrstuvwxyz\n # 令牌有效期(默认30分钟)\n expireTime: 30\n\n# MyBatis配置\nmybatis:\n # 搜索指定包别名\n typeAliasesPackage: com.campusreuse.**.domain\n # 配置mapper的扫描,找到所有的mapper.xml映射文件\n mapperLocations: classpath*:mapper/**/*Mapper.xml\n # 加载全局的配置文件\n configLocation: classpath:mybatis/mybatis-config.xml\n\n# PageHelper分页插件\npagehelper:\n helperDialect: mysql\n supportMethodsArguments: true\n params: count=countSql\n\n# Swagger配置\nswagger:\n # 是否开启swagger\n enabled: true\n # 请求前缀\n pathMapping: /dev-api\n\n# 防止XSS攻击\nxss:\n # 过滤开关\n enabled: true\n # 排除链接(多个用逗号分隔)\n excludes: /system/notice\n # 匹配链接\n urlPatterns: /system/*,/monitor/*,/tool/*\n\n\n"}, "ab3adea29f2ce0d4284eb02dccbdced37ce19650": {"t": 1785611545.660528, "n": 2403, "h": "12ee44bab2939c23", "c": "# 项目相关配置\nruoyi:\n # 名称\n name: RuoYi\n # 版本\n version: 3.9.0\n # 版权年份\n copyrightYear: 2025\n # 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath)\n profile: D:/ruoyi/uploadPath\n # 获取ip地址开关\n addressEnabled: false\n # 验证码类型 math 数字计算 char 字符验证\n captchaType: math\n\n# AI 豆包大模型配置\nai:\n doubao:\n # API Key (建议通过环境变量配置)\n api-key: 99ffb06b-ff6f-44bc-b376-c171b688851f\n # 接口地址\n endpoint: https://ark.cn-beijing.volces.com/api/v3/chat/completions\n # 模型名称\n model: ep-20260109112940-2s6v2\n\n\n\n\n# 开发环境配置\nserver:\n # 服务器的HTTP端口,默认为8080\n port: 8081\n servlet:\n # 应用的访问路径\n context-path: /\n tomcat:\n # tomcat的URI编码\n uri-encoding: UTF-8\n # 连接数满后的排队数,默认为100\n accept-count: 1000\n threads:\n # tomcat最大线程数,默认为200\n max: 800\n # Tomcat启动初始化的线程数,默认值10\n min-spare: 100\n\n# 日志配置\nlogging:\n level:\n com.campusreuse: debug\n org.springframework: warn\n\n# 用户配置\nuser:\n password:\n # 密码最大错误次数\n maxRetryCount: 5\n # 密码锁定时间(默认10分钟)\n lockTime: 10\n\n# Spring配置\nspring:\n # 资源信息\n messages:\n # 国际化资源文件路径\n basename: i18n/messages\n profiles:\n active: druid\n # 文件上传\n servlet:\n multipart:\n # 单个文件大小\n max-file-size: 10MB\n # 设置总上传的文件大小\n max-request-size: 20MB\n # 服务模块\n devtools:\n restart:\n # 热部署开关\n enabled: true\n # redis 配置\n redis:\n # 地址\n host: localhost\n # 端口,默认为6379\n port: 6379\n # 数据库索引\n database: 0\n # 密码\n password:\n # 连接超时时间\n timeout: 10s\n lettuce:\n pool:\n # 连接池中的最小空闲连接\n min-idle: 0\n # 连接池中的最大空闲连接\n max-idle: 8\n # 连接池的最大数据库连接数\n max-active: 8\n # #连接池最大阻塞等待时间(使用负值表示没有限制)\n max-wait: -1ms\n\n# token配置\ntoken:\n # 令牌自定义标识\n header: Authorization\n # 令牌密钥\n secret: abcdefghijklmnopqrstuvwxyz\n # 令牌有效期(默认30分钟)\n expireTime: 30\n\n# MyBatis配置\nmybatis:\n # 搜索指定包别名\n typeAliasesPackage: com.campusreuse.**.domain\n # 配置mapper的扫描,找到所有的mapper.xml映射文件\n mapperLocations: classpath*:mapper/**/*Mapper.xml\n # 加载全局的配置文件\n configLocation: classpath:mybatis/mybatis-config.xml\n\n# PageHelper分页插件\npagehelper:\n helperDialect: mysql\n supportMethodsArguments: true\n params: count=countSql\n\n# Swagger配置\nswagger:\n # 是否开启swagger\n enabled: true\n # 请求前缀\n pathMapping: /dev-api\n\n# 防止XSS攻击\nxss:\n # 过滤开关\n enabled: true\n # 排除链接(多个用逗号分隔)\n excludes: /system/notice\n # 匹配链接\n urlPatterns: /system/*,/monitor/*,/tool/*\n\n\n"}, "d8c4b8c2469d9e015f52bfdf4063e9ec47f0efca": {"t": 1785611546.8240445, "n": 2166, "h": "e41029e4c8f474ca", "c": "# 项目相关配置\nruoyi:\n # 名称\n name: RuoYi\n # 版本\n version: 3.9.0\n # 版权年份\n copyrightYear: 2025\n # 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath)\n profile: D:/ruoyi/uploadPath\n # 获取ip地址开关\n addressEnabled: false\n # 验证码类型 math 数字计算 char 字符验证\n captchaType: math\n\n# 开发环境配置\nserver:\n # 服务器的HTTP端口,默认为8080\n port: 8081\n servlet:\n # 应用的访问路径\n context-path: /\n tomcat:\n # tomcat的URI编码\n uri-encoding: UTF-8\n # 连接数满后的排队数,默认为100\n accept-count: 1000\n threads:\n # tomcat最大线程数,默认为200\n max: 800\n # Tomcat启动初始化的线程数,默认值10\n min-spare: 100\n\n# 日志配置\nlogging:\n level:\n com.campusreuse: debug\n org.springframework: warn\n\n# 用户配置\nuser:\n password:\n # 密码最大错误次数\n maxRetryCount: 5\n # 密码锁定时间(默认10分钟)\n lockTime: 10\n\n# Spring配置\nspring:\n # 资源信息\n messages:\n # 国际化资源文件路径\n basename: i18n/messages\n profiles:\n active: druid\n # 文件上传\n servlet:\n multipart:\n # 单个文件大小\n max-file-size: 10MB\n # 设置总上传的文件大小\n max-request-size: 20MB\n # 服务模块\n devtools:\n restart:\n # 热部署开关\n enabled: true\n # redis 配置\n redis:\n # 地址\n host: localhost\n # 端口,默认为6379\n port: 6379\n # 数据库索引\n database: 0\n # 密码\n password:\n # 连接超时时间\n timeout: 10s\n lettuce:\n pool:\n # 连接池中的最小空闲连接\n min-idle: 0\n # 连接池中的最大空闲连接\n max-idle: 8\n # 连接池的最大数据库连接数\n max-active: 8\n # #连接池最大阻塞等待时间(使用负值表示没有限制)\n max-wait: -1ms\n\n# token配置\ntoken:\n # 令牌自定义标识\n header: Authorization\n # 令牌密钥\n secret: abcdefghijklmnopqrstuvwxyz\n # 令牌有效期(默认30分钟)\n expireTime: 30\n\n# MyBatis配置\nmybatis:\n # 搜索指定包别名\n typeAliasesPackage: com.campusreuse.**.domain\n # 配置mapper的扫描,找到所有的mapper.xml映射文件\n mapperLocations: classpath*:mapper/**/*Mapper.xml\n # 加载全局的配置文件\n configLocation: classpath:mybatis/mybatis-config.xml\n\n# PageHelper分页插件\npagehelper:\n helperDialect: mysql\n supportMethodsArguments: true\n params: count=countSql\n\n# Swagger配置\nswagger:\n # 是否开启swagger\n enabled: true\n # 请求前缀\n pathMapping: /dev-api\n\n# 防止XSS攻击\nxss:\n # 过滤开关\n enabled: true\n # 排除链接(多个用逗号分隔)\n excludes: /system/notice\n # 匹配链接\n urlPatterns: /system/*,/monitor/*,/tool/*\n\n\n"}}, "CampusReuse-framework/src/main/java/com/campusreuse/framework/config/ApplicationConfig.java": {"cde032df7ff0d595909ccba4e07b0c61470f14bd": {"t": 1785599284.9720595, "n": 865, "h": "13ddcd8c23dc7ac5", "c": "package com.campusreuse.framework.config;\n\nimport java.util.TimeZone;\nimport org.mybatis.spring.annotation.MapperScan;\nimport org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.context.annotation.EnableAspectJAutoProxy;\n\n/**\n * 程序注解配置\n *\n * @author ruoyi\n */\n@Configuration\n// 表示通过aop框架暴露该代理对象,AopContext能够访问\n@EnableAspectJAutoProxy(exposeProxy = true)\n// 指定要扫描的Mapper类的包的路径\n@MapperScan(\"com.campusreuse.**.mapper\")\npublic class ApplicationConfig\n{\n /**\n * 时区配置\n */\n @Bean\n public Jackson2ObjectMapperBuilderCustomizer jacksonObjectMapperCustomization()\n {\n return jacksonObjectMapperBuilder -> jacksonObjectMapperBuilder.timeZone(TimeZone.getDefault());\n }\n}\n"}}, "CampusReuse-admin/src/main/resources/i18n/messages.properties": {"93de0055b88777639f269935b652207b53c9078a": {"t": 1785599285.021339, "n": 1120, "h": "0548b262df1fd48a", "c": "#错误消息\nnot.null=* 必须填写\nuser.jcaptcha.error=验证码错误\nuser.jcaptcha.expire=验证码已失效\nuser.not.exists=用户不存在/密码错误\nuser.password.not.match=用户不存在/密码错误\nuser.password.retry.limit.count=密码输入错误{0}次\nuser.password.retry.limit.exceed=密码输入错误{0}次,帐户锁定{1}分钟\nuser.password.delete=对不起,您的账号已被删除\nuser.blocked=用户已封禁,请联系管理员\nrole.blocked=角色已封禁,请联系管理员\nlogin.blocked=很遗憾,访问IP已被列入系统黑名单\nuser.logout.success=退出成功\n\nlength.not.valid=长度必须在{min}到{max}个字符之间\n\nuser.username.not.valid=* 2到20个汉字、字母、数字或下划线组成,且必须以非数字开头\nuser.password.not.valid=* 5-50个字符\n \nuser.email.not.valid=邮箱格式错误\nuser.mobile.phone.number.not.valid=手机号格式错误\nuser.login.success=登录成功\nuser.register.success=注册成功\nuser.notfound=请重新登录\nuser.forcelogout=管理员强制退出,请重新登录\nuser.unknown.error=未知错误,请重新登录\n\n##文件上传消息\nupload.exceed.maxSize=上传的文件大小超出限制的文件大小!
允许的文件最大大小是:{0}MB!\nupload.filename.exceed.length=上传的文件名最长{0}个字符\n\n##权限\nno.permission=您没有数据的权限,请联系管理员添加权限 [{0}]\nno.create.permission=您没有创建数据的权限,请联系管理员添加权限 [{0}]\nno.update.permission=您没有修改数据的权限,请联系管理员添加权限 [{0}]\nno.delete.permission=您没有删除数据的权限,请联系管理员添加权限 [{0}]\nno.export.permission=您没有导出数据的权限,请联系管理员添加权限 [{0}]\nno.view.permission=您没有查看数据的权限,请联系管理员添加权限 [{0}]\n"}}, "CampusReuse-common/src/main/java/com/campusreuse/common/constant/MarketConstants.java": {"5b117e0919cf9f8ad7b62c7a50c45e134ef9062e": {"t": 1785599285.0532846, "n": 1558, "h": "6ab1d0d7c240a31f", "c": "package com.campusreuse.common.constant;\n\n/**\n * 校园二手交易系统 业务常量\n * \n * @author campusreuse\n */\npublic class MarketConstants {\n\n /** 订单状态:待付款 */\n public static final String ORDER_STATUS_PENDING_PAY = \"0\";\n /** 订单状态:待发货 */\n public static final String ORDER_STATUS_PENDING_SHIP = \"1\";\n /** 订单状态:待收货 */\n public static final String ORDER_STATUS_PENDING_RECEIVE = \"2\";\n /** 订单状态:已完成 */\n public static final String ORDER_STATUS_COMPLETED = \"3\";\n /** 订单状态:已取消 */\n public static final String ORDER_STATUS_CANCELLED = \"4\";\n /** 订单状态:退款中 */\n public static final String ORDER_STATUS_REFUNDING = \"5\";\n /** 订单状态:已退款 */\n public static final String ORDER_STATUS_REFUNDED = \"6\";\n\n /** 支付状态:未支付 */\n public static final String PAY_STATUS_UNPAID = \"0\";\n /** 支付状态:已支付 */\n public static final String PAY_STATUS_PAID = \"1\";\n\n /** 商品状态:在售 */\n public static final String GOODS_STATUS_ON_SALE = \"0\";\n /** 商品状态:已售 */\n public static final String GOODS_STATUS_SOLD = \"1\";\n /** 商品状态:已下架 */\n public static final String GOODS_STATUS_OFF_SHELF = \"2\";\n\n /** 审核状态:待审核 */\n public static final String AUDIT_STATUS_PENDING = \"0\";\n /** 审核状态:审核通过 */\n public static final String AUDIT_STATUS_PASS = \"1\";\n /** 审核状态:审核拒绝 */\n public static final String AUDIT_STATUS_REJECT = \"2\";\n\n /** 消息类型:通知 */\n public static final String MESSAGE_TYPE_NOTICE = \"0\";\n /** 消息类型:私聊 */\n public static final String MESSAGE_TYPE_CHAT = \"1\";\n /** 消息类型:订单消息 */\n public static final String MESSAGE_TYPE_ORDER = \"2\";\n}\n"}}, "CampusReuse-admin/src/main/resources/application-prod.yml": {"b405a78ce0488bab048e255f79a896f1278b3638": {"t": 1785599285.205915, "n": 693, "h": "e6dbe0a9c0be662e", "c": "# 项目生产环境配置\nspring:\n # 数据源配置\n datasource:\n type: com.alibaba.druid.pool.DruidDataSource\n driverClassName: com.mysql.cj.jdbc.Driver\n url: jdbc:mysql://localhost:3306/campus_market?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8\n username: YOUR_PROD_USERNAME\n password: YOUR_PROD_PASSWORD\n \n # Redis 配置\n redis:\n host: 127.0.0.1\n port: 6379\n password: \n database: 0\n timeout: 3000\n\n# 日志配置\nlogging:\n level:\n com.campusreuse: info\n org.springframework: info\n file:\n name: logs/campus-reuse.log\n path: /app/logs\n logback:\n rollingpolicy:\n max-file-size: 10MB\n max-history: 30\n"}}, "CampusReuse-common/src/main/java/com/campusreuse/common/constant/ScheduleConstants.java": {"b0d9deba11fc21aa022a81b1cb28f653628c0eeb": {"t": 1785599285.2339988, "n": 937, "h": "ecccf97169c7ccae", "c": "package com.campusreuse.common.constant;\n\n/**\n * 任务调度通用常量\n * \n * @author ruoyi\n */\npublic class ScheduleConstants\n{\n public static final String TASK_CLASS_NAME = \"TASK_CLASS_NAME\";\n\n /** 执行目标key */\n public static final String TASK_PROPERTIES = \"TASK_PROPERTIES\";\n\n /** 默认 */\n public static final String MISFIRE_DEFAULT = \"0\";\n\n /** 立即触发执行 */\n public static final String MISFIRE_IGNORE_MISFIRES = \"1\";\n\n /** 触发一次执行 */\n public static final String MISFIRE_FIRE_AND_PROCEED = \"2\";\n\n /** 不触发立即执行 */\n public static final String MISFIRE_DO_NOTHING = \"3\";\n\n public enum Status\n {\n /**\n * 正常\n */\n NORMAL(\"0\"),\n /**\n * 暂停\n */\n PAUSE(\"1\");\n\n private String value;\n\n private Status(String value)\n {\n this.value = value;\n }\n\n public String getValue()\n {\n return value;\n }\n }\n}\n"}}, "CampusReuse-common/src/main/java/com/campusreuse/common/constant/CacheConstants.java": {"9a8cba83822d29bf5849f3b105fb0a6859e1f145": {"t": 1785599285.4828568, "n": 844, "h": "0c6227b6f7970577", "c": "package com.campusreuse.common.constant;\n\n/**\n * 缓存的key 常量\n * \n * @author ruoyi\n */\npublic class CacheConstants\n{\n /**\n * 登录用户 redis key\n */\n public static final String LOGIN_TOKEN_KEY = \"login_tokens:\";\n\n /**\n * 验证码 redis key\n */\n public static final String CAPTCHA_CODE_KEY = \"captcha_codes:\";\n\n /**\n * 参数管理 cache key\n */\n public static final String SYS_CONFIG_KEY = \"sys_config:\";\n\n /**\n * 字典管理 cache key\n */\n public static final String SYS_DICT_KEY = \"sys_dict:\";\n\n /**\n * 防重提交 redis key\n */\n public static final String REPEAT_SUBMIT_KEY = \"repeat_submit:\";\n\n /**\n * 限流 redis key\n */\n public static final String RATE_LIMIT_KEY = \"rate_limit:\";\n\n /**\n * 登录账户密码错误次数 redis key\n */\n public static final String PWD_ERR_CNT_KEY = \"pwd_err_cnt:\";\n}\n"}}, "CampusReuse-admin/src/main/resources/application-druid.yml": {"11541ceaa6363020b4aae02cf622f658b2b1bf02": {"t": 1785599285.617123, "n": 1977, "h": "6752234be17c9a7f", "c": "# 数据源配置\nspring:\n datasource:\n type: com.alibaba.druid.pool.DruidDataSource\n driverClassName: com.mysql.cj.jdbc.Driver\n druid:\n # 主库数据源\n master:\n url: jdbc:mysql://localhost:3306/ruoyi?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8\n username: root\n password: 123456\n # 从库数据源\n slave:\n # 从数据源开关/默认关闭\n enabled: false\n url: \n username: \n password: \n # 初始连接数\n initialSize: 5\n # 最小连接池数量\n minIdle: 10\n # 最大连接池数量\n maxActive: 20\n # 配置获取连接等待超时的时间\n maxWait: 60000\n # 配置连接超时时间\n connectTimeout: 30000\n # 配置网络超时时间\n socketTimeout: 60000\n # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒\n timeBetweenEvictionRunsMillis: 60000\n # 配置一个连接在池中最小生存的时间,单位是毫秒\n minEvictableIdleTimeMillis: 300000\n # 配置一个连接在池中最大生存的时间,单位是毫秒\n maxEvictableIdleTimeMillis: 900000\n # 配置检测连接是否有效\n validationQuery: SELECT 1 FROM DUAL\n testWhileIdle: true\n testOnBorrow: false\n testOnReturn: false\n webStatFilter: \n enabled: true\n statViewServlet:\n enabled: true\n # 设置白名单,不填则允许所有访问\n allow:\n url-pattern: /druid/*\n # 控制台管理用户名和密码\n login-username: ruoyi\n login-password: 123456\n filter:\n stat:\n enabled: true\n # 慢SQL记录\n log-slow-sql: true\n slow-sql-millis: 1000\n merge-sql: true\n wall:\n config:\n multi-statement-allow: true"}}, "CampusReuse-framework/src/main/java/com/campusreuse/framework/config/AsyncConfig.java": {"38c30a35f220a2a2c2aa347453ba021905ea5671": {"t": 1785599285.885312, "n": 267, "h": "439065748a8eb087", "c": "package com.campusreuse.framework.config;\n\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.scheduling.annotation.EnableAsync;\n\n/**\n * 异步配置\n * \n * @author campusreuse\n */\n@Configuration\n@EnableAsync\npublic class AsyncConfig {\n}\n"}}, "CampusReuse-framework/src/main/java/com/campusreuse/framework/config/I18nConfig.java": {"f1a3db7514066946604f8b84af6c8f8c96ced899": {"t": 1785599286.024267, "n": 1256, "h": "f725f4c14d4eb3a0", "c": "package com.campusreuse.framework.config;\n\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.web.servlet.LocaleResolver;\nimport org.springframework.web.servlet.config.annotation.InterceptorRegistry;\nimport org.springframework.web.servlet.config.annotation.WebMvcConfigurer;\nimport org.springframework.web.servlet.i18n.LocaleChangeInterceptor;\nimport org.springframework.web.servlet.i18n.SessionLocaleResolver;\nimport com.campusreuse.common.constant.Constants;\n\n/**\n * 资源文件配置加载\n * \n * @author ruoyi\n */\n@Configuration\npublic class I18nConfig implements WebMvcConfigurer\n{\n @Bean\n public LocaleResolver localeResolver()\n {\n SessionLocaleResolver slr = new SessionLocaleResolver();\n // 默认语言\n slr.setDefaultLocale(Constants.DEFAULT_LOCALE);\n return slr;\n }\n\n @Bean\n public LocaleChangeInterceptor localeChangeInterceptor()\n {\n LocaleChangeInterceptor lci = new LocaleChangeInterceptor();\n // 参数名\n lci.setParamName(\"lang\");\n return lci;\n }\n\n @Override\n public void addInterceptors(InterceptorRegistry registry)\n {\n registry.addInterceptor(localeChangeInterceptor());\n }\n}\n"}}, "CampusReuse-common/src/main/java/com/campusreuse/common/constant/Constants.java": {"9610be281fabe047555538fb9ebe2f2e711cc0e3": {"t": 1785599286.2329876, "n": 3246, "h": "fc66122561908505", "c": "package com.campusreuse.common.constant;\n\nimport java.util.Locale;\nimport io.jsonwebtoken.Claims;\n\n/**\n * 通用常量信息\n * \n * @author ruoyi\n */\npublic class Constants\n{\n /**\n * UTF-8 字符集\n */\n public static final String UTF8 = \"UTF-8\";\n\n /**\n * GBK 字符集\n */\n public static final String GBK = \"GBK\";\n\n /**\n * 系统语言\n */\n public static final Locale DEFAULT_LOCALE = Locale.SIMPLIFIED_CHINESE;\n\n /**\n * www主域\n */\n public static final String WWW = \"www.\";\n\n /**\n * http请求\n */\n public static final String HTTP = \"http://\";\n\n /**\n * https请求\n */\n public static final String HTTPS = \"https://\";\n\n /**\n * 通用成功标识\n */\n public static final String SUCCESS = \"0\";\n\n /**\n * 通用失败标识\n */\n public static final String FAIL = \"1\";\n\n /**\n * 登录成功\n */\n public static final String LOGIN_SUCCESS = \"Success\";\n\n /**\n * 注销\n */\n public static final String LOGOUT = \"Logout\";\n\n /**\n * 注册\n */\n public static final String REGISTER = \"Register\";\n\n /**\n * 登录失败\n */\n public static final String LOGIN_FAIL = \"Error\";\n\n /**\n * 所有权限标识\n */\n public static final String ALL_PERMISSION = \"*:*:*\";\n\n /**\n * 管理员角色权限标识\n */\n public static final String SUPER_ADMIN = \"admin\";\n\n /**\n * 角色权限分隔符\n */\n public static final String ROLE_DELIMETER = \",\";\n\n /**\n * 权限标识分隔符\n */\n public static final String PERMISSION_DELIMETER = \",\";\n\n /**\n * 验证码有效期(分钟)\n */\n public static final Integer CAPTCHA_EXPIRATION = 2;\n\n /**\n * 令牌\n */\n public static final String TOKEN = \"token\";\n\n /**\n * 令牌前缀\n */\n public static final String TOKEN_PREFIX = \"Bearer \";\n\n /**\n * 令牌前缀\n */\n public static final String LOGIN_USER_KEY = \"login_user_key\";\n\n /**\n * 用户ID\n */\n public static final String JWT_USERID = \"userid\";\n\n /**\n * 用户名称\n */\n public static final String JWT_USERNAME = Claims.SUBJECT;\n\n /**\n * 用户头像\n */\n public static final String JWT_AVATAR = \"avatar\";\n\n /**\n * 创建时间\n */\n public static final String JWT_CREATED = \"created\";\n\n /**\n * 用户权限\n */\n public static final String JWT_AUTHORITIES = \"authorities\";\n\n /**\n * 资源映射路径 前缀\n */\n public static final String RESOURCE_PREFIX = \"/profile\";\n\n /**\n * RMI 远程方法调用\n */\n public static final String LOOKUP_RMI = \"rmi:\";\n\n /**\n * LDAP 远程方法调用\n */\n public static final String LOOKUP_LDAP = \"ldap:\";\n\n /**\n * LDAPS 远程方法调用\n */\n public static final String LOOKUP_LDAPS = \"ldaps:\";\n\n /**\n * 自动识别json对象白名单配置(仅允许解析的包名,范围越小越安全)\n */\n public static final String[] JSON_WHITELIST_STR = { \"org.springframework\", \"com.campusreuse\" };\n\n /**\n * 定时任务白名单配置(仅允许访问的包名,如其他需要可以自行添加)\n */\n public static final String[] JOB_WHITELIST_STR = { \"com.campusreuse.quartz.task\" };\n\n /**\n * 定时任务违规的字符\n */\n public static final String[] JOB_ERROR_STR = { \"java.net.URL\", \"javax.naming.InitialContext\", \"org.yaml.snakeyaml\",\n \"org.springframework\", \"org.apache\", \"com.campusreuse.common.utils.file\", \"com.campusreuse.common.config\", \"com.campusreuse.generator\" };\n}\n"}}, "CampusReuse-framework/src/main/java/com/campusreuse/framework/config/ResourcesConfig.java": {"464723cd81d9d30b6bc53b72e7016fa33cc42c08": {"t": 1785599286.3002102, "n": 2863, "h": "1c08796db7cd00aa", "c": "package com.campusreuse.framework.config;\n\nimport java.util.concurrent.TimeUnit;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.http.CacheControl;\nimport org.springframework.web.cors.CorsConfiguration;\nimport org.springframework.web.cors.UrlBasedCorsConfigurationSource;\nimport org.springframework.web.filter.CorsFilter;\nimport org.springframework.web.servlet.config.annotation.InterceptorRegistry;\nimport org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;\nimport org.springframework.web.servlet.config.annotation.WebMvcConfigurer;\nimport com.campusreuse.common.config.RuoYiConfig;\nimport com.campusreuse.common.constant.Constants;\nimport com.campusreuse.framework.interceptor.RepeatSubmitInterceptor;\n\n/**\n * 通用配置\n * \n * @author ruoyi\n */\n@Configuration\npublic class ResourcesConfig implements WebMvcConfigurer {\n private static final Logger log = LoggerFactory.getLogger(ResourcesConfig.class);\n\n @Autowired\n private RepeatSubmitInterceptor repeatSubmitInterceptor;\n\n @Override\n public void addResourceHandlers(ResourceHandlerRegistry registry) {\n /** 本地文件上传路径 */\n String profile = RuoYiConfig.getProfile();\n log.info(\"本地文件上传路径 profile: {}\", profile);\n\n // 规范化路径,适配 Windows,确保以 file: 开头且路径正确\n String path = profile;\n if (!path.endsWith(\"/\") && !path.endsWith(\"\\\\\")) {\n path += \"/\";\n }\n String resourceLocation = \"file:\" + path;\n\n registry.addResourceHandler(Constants.RESOURCE_PREFIX + \"/**\")\n .addResourceLocations(resourceLocation);\n\n /** swagger配置 */\n registry.addResourceHandler(\"/swagger-ui/**\")\n .addResourceLocations(\"classpath:/META-INF/resources/webjars/springfox-swagger-ui/\")\n .setCacheControl(CacheControl.maxAge(5, TimeUnit.HOURS).cachePublic());\n }\n\n /**\n * 自定义拦截规则\n */\n @Override\n public void addInterceptors(InterceptorRegistry registry) {\n registry.addInterceptor(repeatSubmitInterceptor).addPathPatterns(\"/**\");\n }\n\n /**\n * 跨域配置\n */\n @Bean\n public CorsFilter corsFilter() {\n CorsConfiguration config = new CorsConfiguration();\n // 设置访问源地址\n config.addAllowedOriginPattern(\"*\");\n // 设置访问源请求头\n config.addAllowedHeader(\"*\");\n // 设置访问源请求方法\n config.addAllowedMethod(\"*\");\n // 有效期 1800秒\n config.setMaxAge(1800L);\n // 添加映射路径,拦截一切请求\n UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();\n source.registerCorsConfiguration(\"/**\", config);\n // 返回新的CorsFilter\n return new CorsFilter(source);\n }\n}"}}, "CampusReuse-framework/src/main/java/com/campusreuse/framework/config/ThreadPoolConfig.java": {"43095816a0fe53d15130879a0564dc5a09559aa9": {"t": 1785599286.694495, "n": 1944, "h": "ee99a3ed41c80ba5", "c": "package com.campusreuse.framework.config;\n\nimport com.campusreuse.common.utils.Threads;\nimport org.apache.commons.lang3.concurrent.BasicThreadFactory;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;\nimport java.util.concurrent.ScheduledExecutorService;\nimport java.util.concurrent.ScheduledThreadPoolExecutor;\nimport java.util.concurrent.ThreadPoolExecutor;\n\n/**\n * 线程池配置\n *\n * @author ruoyi\n **/\n@Configuration\npublic class ThreadPoolConfig\n{\n // 核心线程池大小\n private int corePoolSize = 50;\n\n // 最大可创建的线程数\n private int maxPoolSize = 200;\n\n // 队列最大长度\n private int queueCapacity = 1000;\n\n // 线程池维护线程所允许的空闲时间\n private int keepAliveSeconds = 300;\n\n @Bean(name = \"threadPoolTaskExecutor\")\n public ThreadPoolTaskExecutor threadPoolTaskExecutor()\n {\n ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();\n executor.setMaxPoolSize(maxPoolSize);\n executor.setCorePoolSize(corePoolSize);\n executor.setQueueCapacity(queueCapacity);\n executor.setKeepAliveSeconds(keepAliveSeconds);\n // 线程池对拒绝任务(无线程可用)的处理策略\n executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());\n return executor;\n }\n\n /**\n * 执行周期性或定时任务\n */\n @Bean(name = \"scheduledExecutorService\")\n protected ScheduledExecutorService scheduledExecutorService()\n {\n return new ScheduledThreadPoolExecutor(corePoolSize,\n new BasicThreadFactory.Builder().namingPattern(\"schedule-pool-%d\").daemon(true).build(),\n new ThreadPoolExecutor.CallerRunsPolicy())\n {\n @Override\n protected void afterExecute(Runnable r, Throwable t)\n {\n super.afterExecute(r, t);\n Threads.printException(r, t);\n }\n };\n }\n}\n"}}, "CampusReuse-framework/src/main/java/com/campusreuse/framework/config/DruidConfig.java": {"add81d406fba0fc7bdbecf72d3333ffd1eb5d5dc": {"t": 1785599286.7699833, "n": 4767, "h": "d2628d90551bdf38", "c": "package com.campusreuse.framework.config;\n\nimport java.io.IOException;\nimport java.util.HashMap;\nimport java.util.Map;\nimport javax.servlet.Filter;\nimport javax.servlet.FilterChain;\nimport javax.servlet.ServletException;\nimport javax.servlet.ServletRequest;\nimport javax.servlet.ServletResponse;\nimport javax.sql.DataSource;\nimport org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;\nimport org.springframework.boot.context.properties.ConfigurationProperties;\nimport org.springframework.boot.web.servlet.FilterRegistrationBean;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.context.annotation.Primary;\nimport com.alibaba.druid.pool.DruidDataSource;\nimport com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;\nimport com.alibaba.druid.spring.boot.autoconfigure.properties.DruidStatProperties;\nimport com.alibaba.druid.util.Utils;\nimport com.campusreuse.common.enums.DataSourceType;\nimport com.campusreuse.common.utils.spring.SpringUtils;\nimport com.campusreuse.framework.config.properties.DruidProperties;\nimport com.campusreuse.framework.datasource.DynamicDataSource;\n\n/**\n * druid 配置多数据源\n * \n * @author ruoyi\n */\n@Configuration\npublic class DruidConfig\n{\n @Bean\n @ConfigurationProperties(\"spring.datasource.druid.master\")\n public DataSource masterDataSource(DruidProperties druidProperties)\n {\n DruidDataSource dataSource = DruidDataSourceBuilder.create().build();\n return druidProperties.dataSource(dataSource);\n }\n\n @Bean\n @ConfigurationProperties(\"spring.datasource.druid.slave\")\n @ConditionalOnProperty(prefix = \"spring.datasource.druid.slave\", name = \"enabled\", havingValue = \"true\")\n public DataSource slaveDataSource(DruidProperties druidProperties)\n {\n DruidDataSource dataSource = DruidDataSourceBuilder.create().build();\n return druidProperties.dataSource(dataSource);\n }\n\n @Bean(name = \"dynamicDataSource\")\n @Primary\n public DynamicDataSource dataSource(DataSource masterDataSource)\n {\n Map