diff --git a/.gitignore b/.gitignore index 9154f4c..010ab86 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,3 @@ -# ---> Java # Compiled class file *.class @@ -10,17 +9,21 @@ # Mobile Tools for Java (J2ME) .mtj.tmp/ +target # Package Files # *.jar *.war -*.nar *.ear *.zip *.tar.gz *.rar +*.iml +.idea # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml hs_err_pid* -replay_pid* +.idea + +/upload/ \ No newline at end of file diff --git a/admin/pom.xml b/admin/pom.xml new file mode 100644 index 0000000..455cdb6 --- /dev/null +++ b/admin/pom.xml @@ -0,0 +1,119 @@ + + + io.renren + block-identity-auth + 5.4.0 + + 4.0.0 + admin + jar + admin + + + 2.3.2 + 1.12.0 + 1.6.2 + 3.2.1 + 7.2.27 + 2.8.3 + 3.2.2 + 5.4.4 + + + + + io.renren + common + 5.4.0 + + + org.apache.shiro + shiro-spring + jakarta + ${shiro.version} + + + + org.apache.shiro + shiro-core + + + org.apache.shiro + shiro-web + + + + + + org.apache.shiro + shiro-core + jakarta + ${shiro.version} + + + org.apache.shiro + shiro-web + jakarta + ${shiro.version} + + + org.apache.shiro + shiro-core + + + + + com.github.whvcse + easy-captcha + ${captcha.version} + + + com.alibaba + easyexcel + ${easyexcel.version} + + + com.qiniu + qiniu-java-sdk + ${qiniu.version} + + + com.aliyun.oss + aliyun-sdk-oss + ${aliyun.oss.version} + + + com.aliyun + aliyun-java-sdk-core + ${aliyun.core.version} + + + com.qcloud + cos_api + ${qcloud.cos.version} + + + org.slf4j + slf4j-log4j12 + + + + + + + ${project.artifactId} + + + org.springframework.boot + spring-boot-maven-plugin + + + org.apache.maven.plugins + maven-surefire-plugin + + true + + + + + diff --git a/admin/src/main/java/io/AdminApplication.java b/admin/src/main/java/io/AdminApplication.java new file mode 100644 index 0000000..8901e90 --- /dev/null +++ b/admin/src/main/java/io/AdminApplication.java @@ -0,0 +1,21 @@ +package io; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; +import org.springframework.context.annotation.ComponentScan; +@SpringBootApplication +@ComponentScan(basePackages = {"io.modules","io.modules","io.common"}) // 扫描多个包 +@MapperScan(basePackages = {"io.modules.**.dao","io.common.modules.**.dao"}) +public class AdminApplication extends SpringBootServletInitializer { + + public static void main(String[] args) { + SpringApplication.run(AdminApplication.class, args); + } + + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { + return application.sources(AdminApplication.class); + } +} diff --git a/admin/src/main/java/io/common/annotation/DataFilter.java b/admin/src/main/java/io/common/annotation/DataFilter.java new file mode 100644 index 0000000..070c132 --- /dev/null +++ b/admin/src/main/java/io/common/annotation/DataFilter.java @@ -0,0 +1,30 @@ + + +package io.common.annotation; + +import java.lang.annotation.*; + +/** + * 数据过滤注解 + * + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface DataFilter { + /** + * 表的别名 + */ + String tableAlias() default ""; + + /** + * 用户ID + */ + String userId() default "creator"; + + /** + * 部门ID + */ + String deptId() default "dept_id"; + +} diff --git a/admin/src/main/java/io/common/annotation/LogOperation.java b/admin/src/main/java/io/common/annotation/LogOperation.java new file mode 100644 index 0000000..4803613 --- /dev/null +++ b/admin/src/main/java/io/common/annotation/LogOperation.java @@ -0,0 +1,22 @@ + + +package io.common.annotation; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 操作日志注解 + * + + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface LogOperation { + + String value() default ""; +} diff --git a/admin/src/main/java/io/common/aspect/DataFilterAspect.java b/admin/src/main/java/io/common/aspect/DataFilterAspect.java new file mode 100644 index 0000000..5832ec7 --- /dev/null +++ b/admin/src/main/java/io/common/aspect/DataFilterAspect.java @@ -0,0 +1,90 @@ +package io.common.aspect; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.qiniu.util.StringUtils; +import io.common.annotation.DataFilter; +import io.common.interceptor.DataScope; +import io.common.constant.Constant; +import io.common.exception.ErrorCode; +import io.common.exception.RenException; +import io.modules.security.user.SecurityUser; +import io.modules.security.user.UserDetail; +import io.modules.sys.enums.SuperAdminEnum; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.aspectj.lang.annotation.Pointcut; +import org.aspectj.lang.reflect.MethodSignature; +import org.springframework.stereotype.Component; + +import java.lang.reflect.Method; +import java.util.List; +import java.util.Map; +/** + * 数据过滤,切面处理类 + * + */ +@Aspect +@Component +public class DataFilterAspect { + + @Pointcut("@annotation(io.common.annotation.DataFilter)") + public void dataFilterCut() { + + } + + @Before("dataFilterCut()") + public void dataFilter(JoinPoint point) { + Object params = point.getArgs()[0]; + if (params != null && params instanceof Map) { + UserDetail user = SecurityUser.getUser(); + + //如果是超级管理员,则不进行数据过滤 + if (user.getSuperAdmin() == SuperAdminEnum.YES.value()) { + return; + } + + try { + //否则进行数据过滤 + Map map = (Map) params; + String sqlFilter = getSqlFilter(user, point); + map.put(Constant.SQL_FILTER, new DataScope(sqlFilter)); + } catch (Exception e) { + + } + return; + } + throw new RenException("日期参数错误!"); + } + + /** + * 获取数据过滤的SQL + */ + private String getSqlFilter(UserDetail user, JoinPoint point) throws Exception { + MethodSignature signature = (MethodSignature) point.getSignature(); + Method method = point.getTarget().getClass().getDeclaredMethod(signature.getName(), signature.getParameterTypes()); + DataFilter dataFilter = method.getAnnotation(DataFilter.class); + + //获取表的别名 + String tableAlias = dataFilter.tableAlias(); + if (StrUtil.isNotBlank(tableAlias)) { + tableAlias += "."; + } + StringBuilder sqlFilter = new StringBuilder(); + sqlFilter.append(" ("); + //部门ID列表 + List deptIdList = user.getDeptIdList(); + if (CollUtil.isNotEmpty(deptIdList)) { + sqlFilter.append(tableAlias).append(dataFilter.deptId()); + + sqlFilter.append(" in(").append(StringUtils.join(deptIdList, ",")).append(")"); + } + //查询本人数据 + if (CollUtil.isNotEmpty(deptIdList)) { + sqlFilter.append(" or "); + } + sqlFilter.append(tableAlias).append(dataFilter.userId()).append("=").append(user.getId()); + sqlFilter.append(")"); + return sqlFilter.toString(); + } +} diff --git a/admin/src/main/java/io/common/aspect/LogOperationAspect.java b/admin/src/main/java/io/common/aspect/LogOperationAspect.java new file mode 100644 index 0000000..a942ca5 --- /dev/null +++ b/admin/src/main/java/io/common/aspect/LogOperationAspect.java @@ -0,0 +1,44 @@ +package io.common.aspect; + +import lombok.AllArgsConstructor; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.springframework.stereotype.Component; + + +/** + * 操作日志,切面处理类 + * + */ +@Aspect +@Component +@AllArgsConstructor +public class LogOperationAspect { + + @Pointcut("@annotation(io.common.annotation.LogOperation)") + public void logPointCut() { + } + @Around("logPointCut()") + public Object around(ProceedingJoinPoint point) throws Throwable { + long beginTime = System.currentTimeMillis(); + try { + //执行方法 + Object result = point.proceed(); + + //执行时长(毫秒) + long time = System.currentTimeMillis() - beginTime; + + + return result; + } catch (Exception e) { + //执行时长(毫秒) + long time = System.currentTimeMillis() - beginTime; + + + throw e; + } + } + +} diff --git a/admin/src/main/java/io/common/config/MybatisPlusConfig.java b/admin/src/main/java/io/common/config/MybatisPlusConfig.java new file mode 100644 index 0000000..ba72124 --- /dev/null +++ b/admin/src/main/java/io/common/config/MybatisPlusConfig.java @@ -0,0 +1,34 @@ + + +package io.common.config; + +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.BlockAttackInnerInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; +import io.common.interceptor.DataFilterInterceptor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * mybatis-plus配置 + */ +@Configuration +public class MybatisPlusConfig { + + @Bean + public MybatisPlusInterceptor mybatisPlusInterceptor() { + MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor(); + // 数据权限 + mybatisPlusInterceptor.addInnerInterceptor(new DataFilterInterceptor()); + // 分页插件 + mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor()); + // 乐观锁 + mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); + // 防止全表更新与删除 + mybatisPlusInterceptor.addInnerInterceptor(new BlockAttackInnerInterceptor()); + + return mybatisPlusInterceptor; + } + +} diff --git a/admin/src/main/java/io/common/config/SwaggerConfig.java b/admin/src/main/java/io/common/config/SwaggerConfig.java new file mode 100644 index 0000000..a008654 --- /dev/null +++ b/admin/src/main/java/io/common/config/SwaggerConfig.java @@ -0,0 +1,41 @@ +package io.common.config; + +import io.common.constant.Constant; +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.info.Info; +import io.swagger.v3.oas.models.security.SecurityRequirement; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.ArrayList; +import java.util.List; + +/** + * Swagger配置 + * + */ +@Configuration +public class SwaggerConfig { + @Bean + public OpenAPI createRestApi() { + return new OpenAPI() + .info(apiInfo()) + .security(security()); + } + + private Info apiInfo() { + return new Info() + .title("系统") + .description("admin文档") + .version("5.x"); + } + + private List security() { + SecurityRequirement key = new SecurityRequirement(); + key.addList(Constant.TOKEN_HEADER, Constant.TOKEN_HEADER); + + List list = new ArrayList<>(); + list.add(key); + return list; + } +} diff --git a/admin/src/main/java/io/common/exception/RenExceptionHandler.java b/admin/src/main/java/io/common/exception/RenExceptionHandler.java new file mode 100644 index 0000000..566b0c6 --- /dev/null +++ b/admin/src/main/java/io/common/exception/RenExceptionHandler.java @@ -0,0 +1,55 @@ +package io.common.exception; + +import cn.hutool.core.map.MapUtil; +import io.common.utils.HttpContextUtils; +import io.common.utils.IpUtils; +import io.common.utils.JsonUtils; +import io.common.utils.Result; + +import jakarta.servlet.http.HttpServletRequest; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.http.HttpHeaders; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +import java.util.Map; + +/** + * 异常处理器 + */ +@Slf4j +@RestControllerAdvice +@AllArgsConstructor +public class RenExceptionHandler { + + + /** + * 处理自定义异常 + */ + @ExceptionHandler(RenException.class) + public Result handleRenException(RenException ex) { + System.out.println("自定义捕捉异常!"); + Result result = new Result(); + result.error(500, ex.getMsg()); + return result; + } + + @ExceptionHandler(DuplicateKeyException.class) + public Result handleDuplicateKeyException(DuplicateKeyException ex) { + Result result = new Result(); + result.error("数据库中已存在该记录!"); + return result; + } + + @ExceptionHandler(Exception.class) + public Result handleException(Exception ex) { + System.out.println("全局捕捉异常!"); + log.error(ex.getMessage(), ex); + + return new Result().error(ex.getMessage()); + } + + +} diff --git a/admin/src/main/java/io/common/handler/FieldMetaObjectHandler.java b/admin/src/main/java/io/common/handler/FieldMetaObjectHandler.java new file mode 100644 index 0000000..92de1e3 --- /dev/null +++ b/admin/src/main/java/io/common/handler/FieldMetaObjectHandler.java @@ -0,0 +1,49 @@ +package io.common.handler; + +import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; +import io.modules.security.user.SecurityUser; +import io.modules.security.user.UserDetail; +import org.apache.ibatis.reflection.MetaObject; +import org.springframework.stereotype.Component; + +import java.util.Date; + +/** + * 公共字段,自动填充值 + * + */ +@Component +public class FieldMetaObjectHandler implements MetaObjectHandler { + private final static String CREATE_DATE = "createDate"; + private final static String CREATOR = "creator"; + private final static String UPDATE_DATE = "updateDate"; + private final static String UPDATER = "updater"; + private final static String DEPT_ID = "deptId"; + + @Override + public void insertFill(MetaObject metaObject) { + UserDetail user = SecurityUser.getUser(); + Date date = new Date(); + + //创建者 + strictInsertFill(metaObject, CREATOR, Long.class, user.getId()); + //创建时间 + strictInsertFill(metaObject, CREATE_DATE, Date.class, date); + + //创建者所属部门 + strictInsertFill(metaObject, DEPT_ID, Long.class, user.getDeptId()); + + //更新者 + strictInsertFill(metaObject, UPDATER, Long.class, user.getId()); + //更新时间 + strictInsertFill(metaObject, UPDATE_DATE, Date.class, date); + } + + @Override + public void updateFill(MetaObject metaObject) { + //更新者 + strictUpdateFill(metaObject, UPDATER, Long.class, SecurityUser.getUserId()); + //更新时间 + strictUpdateFill(metaObject, UPDATE_DATE, Date.class, new Date()); + } +} diff --git a/admin/src/main/java/io/common/interceptor/DataFilterInterceptor.java b/admin/src/main/java/io/common/interceptor/DataFilterInterceptor.java new file mode 100644 index 0000000..cf07268 --- /dev/null +++ b/admin/src/main/java/io/common/interceptor/DataFilterInterceptor.java @@ -0,0 +1,82 @@ + + +package io.common.interceptor; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.toolkit.PluginUtils; +import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor; +import net.sf.jsqlparser.JSQLParserException; +import net.sf.jsqlparser.expression.Expression; +import net.sf.jsqlparser.expression.StringValue; +import net.sf.jsqlparser.expression.operators.conditional.AndExpression; +import net.sf.jsqlparser.parser.CCJSqlParserUtil; +import net.sf.jsqlparser.statement.select.PlainSelect; +import net.sf.jsqlparser.statement.select.Select; +import org.apache.ibatis.executor.Executor; +import org.apache.ibatis.mapping.BoundSql; +import org.apache.ibatis.mapping.MappedStatement; +import org.apache.ibatis.session.ResultHandler; +import org.apache.ibatis.session.RowBounds; + +import java.util.Map; + +/** + * 数据过滤 + * + */ +public class DataFilterInterceptor implements InnerInterceptor { + + @Override + public void beforeQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) { + DataScope scope = getDataScope(parameter); + // 不进行数据过滤 + if(scope == null || StrUtil.isBlank(scope.getSqlFilter())){ + return; + } + + // 拼接新SQL + String buildSql = getSelect(boundSql.getSql(), scope); + + // 重写SQL + PluginUtils.mpBoundSql(boundSql).sql(buildSql); + } + + private DataScope getDataScope(Object parameter){ + if (parameter == null){ + return null; + } + + // 判断参数里是否有DataScope对象 + if (parameter instanceof Map) { + Map parameterMap = (Map) parameter; + for (Map.Entry entry : parameterMap.entrySet()) { + if (entry.getValue() != null && entry.getValue() instanceof DataScope) { + return (DataScope) entry.getValue(); + } + } + } else if (parameter instanceof DataScope) { + return (DataScope) parameter; + } + + return null; + } + + private String getSelect(String buildSql, DataScope scope){ + try { + Select select = (Select) CCJSqlParserUtil.parse(buildSql); + PlainSelect plainSelect = (PlainSelect) select.getSelectBody(); + + Expression expression = plainSelect.getWhere(); + if(expression == null){ + plainSelect.setWhere(new StringValue(scope.getSqlFilter())); + }else{ + AndExpression andExpression = new AndExpression(expression, new StringValue(scope.getSqlFilter())); + plainSelect.setWhere(andExpression); + } + + return select.toString().replaceAll("'", ""); + }catch (JSQLParserException e){ + return buildSql; + } + } +} diff --git a/admin/src/main/java/io/common/interceptor/DataScope.java b/admin/src/main/java/io/common/interceptor/DataScope.java new file mode 100644 index 0000000..781ab6c --- /dev/null +++ b/admin/src/main/java/io/common/interceptor/DataScope.java @@ -0,0 +1,27 @@ + + +package io.common.interceptor; + +/** + * 数据范围 + */ +public class DataScope { + private String sqlFilter; + + public DataScope(String sqlFilter) { + this.sqlFilter = sqlFilter; + } + + public String getSqlFilter() { + return sqlFilter; + } + + public void setSqlFilter(String sqlFilter) { + this.sqlFilter = sqlFilter; + } + + @Override + public String toString() { + return this.sqlFilter; + } +} diff --git a/admin/src/main/java/io/common/utils/ExcelUtils.java b/admin/src/main/java/io/common/utils/ExcelUtils.java new file mode 100644 index 0000000..2ce04f9 --- /dev/null +++ b/admin/src/main/java/io/common/utils/ExcelUtils.java @@ -0,0 +1,64 @@ +package io.common.utils; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.core.util.URLUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.converters.longconverter.LongStringConverter; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.beans.BeanUtils; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * excel工具类 + */ +public class ExcelUtils { + + /** + * Excel导出 + * + * @param response response + * @param fileName 文件名 + * @param sheetName sheetName + * @param list 数据List + * @param pojoClass 对象Class + */ + public static void exportExcel(HttpServletResponse response, String fileName, String sheetName, List list, + Class pojoClass) throws IOException { + if (StrUtil.isBlank(fileName)) { + //当前日期 + fileName = DateUtils.format(new Date()); + } + + response.setContentType("application/vnd.ms-excel"); + response.setCharacterEncoding("UTF-8"); + fileName = URLUtil.encode(fileName, StandardCharsets.UTF_8); + response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx"); + EasyExcel.write(response.getOutputStream(), pojoClass).registerConverter(new LongStringConverter()).sheet(sheetName).doWrite(list); + } + + /** + * Excel导出,先sourceList转换成List,再导出 + * + * @param response response + * @param fileName 文件名 + * @param sheetName sheetName + * @param sourceList 原数据List + * @param targetClass 目标对象Class + */ + public static void exportExcelToTarget(HttpServletResponse response, String fileName, String sheetName, List sourceList, + Class targetClass) throws Exception { + List targetList = new ArrayList<>(sourceList.size()); + for (Object source : sourceList) { + Object target = targetClass.newInstance(); + BeanUtils.copyProperties(source, target); + targetList.add(target); + } + exportExcel(response, fileName, sheetName, targetList, targetClass); + } + +} diff --git a/admin/src/main/java/io/modules/security/config/ShiroConfig.java b/admin/src/main/java/io/modules/security/config/ShiroConfig.java new file mode 100644 index 0000000..8f5b5b7 --- /dev/null +++ b/admin/src/main/java/io/modules/security/config/ShiroConfig.java @@ -0,0 +1,84 @@ + + +package io.modules.security.config; + +import io.modules.security.oauth2.Oauth2Filter; +import io.modules.security.oauth2.Oauth2Realm; +import org.apache.shiro.mgt.SecurityManager; +import org.apache.shiro.session.mgt.SessionManager; +import org.apache.shiro.spring.LifecycleBeanPostProcessor; +import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor; +import org.apache.shiro.spring.web.ShiroFilterFactoryBean; +import org.apache.shiro.web.mgt.DefaultWebSecurityManager; +import org.apache.shiro.web.session.mgt.DefaultWebSessionManager; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import jakarta.servlet.Filter; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * Shiro的配置文件 + * + */ +@Configuration +public class ShiroConfig { + + @Bean + public DefaultWebSessionManager sessionManager(){ + DefaultWebSessionManager sessionManager = new DefaultWebSessionManager(); + sessionManager.setSessionValidationSchedulerEnabled(false); + sessionManager.setSessionIdUrlRewritingEnabled(false); + + return sessionManager; + } + + @Bean("securityManager") + public SecurityManager securityManager(Oauth2Realm oAuth2Realm, SessionManager sessionManager) { + DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); + securityManager.setRealm(oAuth2Realm); + securityManager.setSessionManager(sessionManager); + securityManager.setRememberMeManager(null); + return securityManager; + } + + @Bean("shiroFilter") + public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager) { + ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean(); + shiroFilter.setSecurityManager(securityManager); + + //oauth过滤 + Map filters = new HashMap<>(); + filters.put("oauth2", new Oauth2Filter()); + shiroFilter.setFilters(filters); + + Map filterMap = new LinkedHashMap<>(); + filterMap.put("/webjars/**", "anon"); + filterMap.put("/druid/**", "anon"); + filterMap.put("/login", "anon"); + filterMap.put("/swagger/**", "anon"); + filterMap.put("/v3/api-docs/**", "anon"); + filterMap.put("/doc.html", "anon"); + filterMap.put("/swagger-resources/**", "anon"); + filterMap.put("/captcha", "anon"); + filterMap.put("/favicon.ico", "anon"); + filterMap.put("/", "anon"); + filterMap.put("/**", "oauth2"); + shiroFilter.setFilterChainDefinitionMap(filterMap); + + return shiroFilter; + } + + @Bean("lifecycleBeanPostProcessor") + public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() { + return new LifecycleBeanPostProcessor(); + } + + @Bean + public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) { + AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor(); + advisor.setSecurityManager(securityManager); + return advisor; + } +} diff --git a/admin/src/main/java/io/modules/security/config/WebMvcConfig.java b/admin/src/main/java/io/modules/security/config/WebMvcConfig.java new file mode 100644 index 0000000..afb870b --- /dev/null +++ b/admin/src/main/java/io/modules/security/config/WebMvcConfig.java @@ -0,0 +1,67 @@ + + +package io.modules.security.config; + +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.module.SimpleModule; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import io.common.utils.DateUtils; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.converter.ByteArrayHttpMessageConverter; +import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.http.converter.ResourceHttpMessageConverter; +import org.springframework.http.converter.StringHttpMessageConverter; +import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; +import org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +import java.text.SimpleDateFormat; +import java.util.List; +import java.util.TimeZone; + +@Configuration +public class WebMvcConfig implements WebMvcConfigurer { + + @Override + public void addCorsMappings(CorsRegistry registry) { + registry.addMapping("/**") + .allowedOriginPatterns("*") + .allowCredentials(true) + .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") + .maxAge(3600); + } + + @Override + public void configureMessageConverters(List> converters) { + converters.add(new ByteArrayHttpMessageConverter()); + converters.add(new StringHttpMessageConverter()); + converters.add(new ResourceHttpMessageConverter()); + converters.add(new AllEncompassingFormHttpMessageConverter()); + converters.add(new StringHttpMessageConverter()); + converters.add(jackson2HttpMessageConverter()); + } + + @Bean + public MappingJackson2HttpMessageConverter jackson2HttpMessageConverter() { + MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); + ObjectMapper mapper = new ObjectMapper(); + + //日期格式转换 + mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + mapper.setDateFormat(new SimpleDateFormat(DateUtils.DATE_TIME_PATTERN)); + mapper.setTimeZone(TimeZone.getTimeZone("GMT+8")); + + //Long类型转String类型 + SimpleModule simpleModule = new SimpleModule(); + simpleModule.addSerializer(Long.class, ToStringSerializer.instance); + simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance); + mapper.registerModule(simpleModule); + + converter.setObjectMapper(mapper); + return converter; + } + +} diff --git a/admin/src/main/java/io/modules/security/controller/LoginController.java b/admin/src/main/java/io/modules/security/controller/LoginController.java new file mode 100644 index 0000000..3454da9 --- /dev/null +++ b/admin/src/main/java/io/modules/security/controller/LoginController.java @@ -0,0 +1,95 @@ +package io.modules.security.controller; + +import io.common.exception.RenException; +import io.common.utils.Result; +import io.common.validator.AssertUtils; +import io.common.validator.ValidatorUtils; +import io.modules.security.dto.LoginDTO; +import io.modules.security.password.PasswordUtils; +import io.modules.security.service.CaptchaService; +import io.modules.security.service.SysUserTokenService; +import io.modules.security.user.SecurityUser; +import io.modules.security.user.UserDetail; +import io.modules.sys.dto.SysUserDTO; +import io.modules.sys.enums.UserStatusEnum; +import io.modules.sys.service.SysUserService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.enums.ParameterIn; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import lombok.AllArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; +import java.io.IOException; + + +/** + * 登录 + * + */ +@RestController +@Tag(name = "登录管理") +@AllArgsConstructor +public class LoginController { + private final SysUserService sysUserService; + private final SysUserTokenService sysUserTokenService; + private final CaptchaService captchaService; + + + @GetMapping("captcha") + @Operation(summary = "验证码") + @Parameter(in = ParameterIn.QUERY, ref = "string", name = "uuid", required = true) + public void captcha(HttpServletResponse response, String uuid) throws IOException { + //uuid不能为空 + AssertUtils.isBlank(uuid, "UUID不能为空~"); + //生成验证码 + captchaService.create(response, uuid); + } + @PostMapping("login") + @Operation(summary = "登录") + public Result login(HttpServletRequest request, @RequestBody LoginDTO login) { + //效验数据 + ValidatorUtils.validateEntity(login); + //验证码是否正确 +// boolean flag = captchaService.validate(login.getUuid(), login.getCaptcha()); +// if (!flag) { +// return new Result().error("验证码不正确~"); +// } + //用户信息 + SysUserDTO user = sysUserService.getByUsername(login.getUsername()); + + //用户不存在 + if (user == null) { + + throw new RenException("管理员用户不存在~"); + } + //密码错误 + if (!PasswordUtils.matches(login.getPassword(), user.getPassword())) { + + throw new RenException("密码错误~"); + } + //账号停用 + if (user.getStatus() == UserStatusEnum.DISABLE.value()) { + + throw new RenException("账号停用~"); + } + //登录成功 + + return sysUserTokenService.createToken(user.getId()); + } + + @PostMapping("logout") + @Operation(summary = "退出") + public Result logout(HttpServletRequest request) { + UserDetail user = SecurityUser.getUser(); + //退出 + sysUserTokenService.logout(user.getId()); + //用户信息 + + return new Result(); + } +} diff --git a/admin/src/main/java/io/modules/security/dao/SysUserTokenDao.java b/admin/src/main/java/io/modules/security/dao/SysUserTokenDao.java new file mode 100644 index 0000000..f3f62c8 --- /dev/null +++ b/admin/src/main/java/io/modules/security/dao/SysUserTokenDao.java @@ -0,0 +1,23 @@ + + +package io.modules.security.dao; + +import io.modules.security.entity.SysUserTokenEntity; +import io.common.dao.BaseDao; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +/** + * 系统用户Token + * + + */ +@Mapper +public interface SysUserTokenDao extends BaseDao { + + SysUserTokenEntity getByToken(String token); + + SysUserTokenEntity getByUserId(Long userId); + + void updateToken(@Param("userId") Long userId, @Param("token") String token); +} diff --git a/admin/src/main/java/io/modules/security/dto/LoginDTO.java b/admin/src/main/java/io/modules/security/dto/LoginDTO.java new file mode 100644 index 0000000..2973eea --- /dev/null +++ b/admin/src/main/java/io/modules/security/dto/LoginDTO.java @@ -0,0 +1,37 @@ + + +package io.modules.security.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import lombok.Data; + +import java.io.Serializable; + +/** + * 登录表单 + * + + */ +@Data +@Schema(title = "登录表单") +public class LoginDTO implements Serializable { + private static final long serialVersionUID = 1L; + + @Schema(title = "用户名", required = true) + @NotBlank(message="用户名不能为空~") + private String username; + + @Schema(title = "密码") + @NotBlank(message="密码不能为空") + private String password; + +// @Schema(title = "验证码") +// @NotBlank(message="验证不能为空") +// private String captcha; + +// @Schema(title = "唯一标识") +// @NotBlank(message="唯一标识不能为空") +// private String uuid; + +} diff --git a/admin/src/main/java/io/modules/security/entity/SysUserTokenEntity.java b/admin/src/main/java/io/modules/security/entity/SysUserTokenEntity.java new file mode 100644 index 0000000..f6c617e --- /dev/null +++ b/admin/src/main/java/io/modules/security/entity/SysUserTokenEntity.java @@ -0,0 +1,48 @@ + + +package io.modules.security.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 系统用户Token + */ +@Data +@TableName("sys_user_token") +public class SysUserTokenEntity implements Serializable { + private static final long serialVersionUID = 1L; + /** + * id + */ + @TableId + private Long id; + /** + * 用户ID + */ + private Long userId; + /** + * 用户token + */ + private String token; + /** + * 过期时间 + */ + private Date expireDate; + /** + * 更新时间 + */ + private Date updateDate; + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + private Date createDate; + +} diff --git a/admin/src/main/java/io/modules/security/oauth2/Oauth2Filter.java b/admin/src/main/java/io/modules/security/oauth2/Oauth2Filter.java new file mode 100644 index 0000000..6ad31d8 --- /dev/null +++ b/admin/src/main/java/io/modules/security/oauth2/Oauth2Filter.java @@ -0,0 +1,96 @@ +package io.modules.security.oauth2; + +import cn.hutool.core.util.StrUtil; +import io.common.constant.Constant; +import io.common.exception.ErrorCode; +import io.common.utils.HttpContextUtils; +import io.common.utils.JsonUtils; +import io.common.utils.Result; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.apache.http.HttpStatus; +import org.apache.shiro.authc.AuthenticationException; +import org.apache.shiro.authc.AuthenticationToken; +import org.apache.shiro.web.filter.authc.AuthenticatingFilter; +import org.springframework.web.bind.annotation.RequestMethod; + +import java.io.IOException; + +/** + * oauth2过滤器 + * + */ +public class Oauth2Filter extends AuthenticatingFilter { + + @Override + protected AuthenticationToken createToken(ServletRequest request, ServletResponse response) throws Exception { + //获取请求token + String token = getRequestToken((HttpServletRequest) request); + if (StrUtil.isBlank(token)) { + return null; + } + return new Oauth2Token(token); + } + + @Override + protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) { + if (((HttpServletRequest) request).getMethod().equals(RequestMethod.OPTIONS.name())) { + return true; + } + + return false; + } + + @Override + protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception { + //获取请求token,如果token不存在,直接返回401 + String token = getRequestToken((HttpServletRequest) request); + if (StrUtil.isBlank(token)) { + HttpServletResponse httpResponse = (HttpServletResponse) response; + httpResponse.setContentType("application/json;charset=utf-8"); + httpResponse.setHeader("Access-Control-Allow-Credentials", "true"); + httpResponse.setHeader("Access-Control-Allow-Origin", HttpContextUtils.getOrigin()); + String json = JsonUtils.toJsonString(new Result().error("未授权访问!")); + httpResponse.getWriter().print(json); + return false; + } + + return executeLogin(request, response); + } + + @Override + protected boolean onLoginFailure(AuthenticationToken token, AuthenticationException e, ServletRequest request, ServletResponse response) { + HttpServletResponse httpResponse = (HttpServletResponse) response; + httpResponse.setContentType("application/json;charset=utf-8"); + httpResponse.setHeader("Access-Control-Allow-Credentials", "true"); + httpResponse.setHeader("Access-Control-Allow-Origin", HttpContextUtils.getOrigin()); + try { + //处理登录失败的异常 + Throwable throwable = e.getCause() == null ? e : e.getCause(); + Result r = new Result().error(HttpStatus.SC_UNAUTHORIZED, throwable.getMessage()); + + String json = JsonUtils.toJsonString(r); + httpResponse.getWriter().print(json); + } catch (IOException e1) { + + } + + return false; + } + + /** + * 获取请求的token + */ + private String getRequestToken(HttpServletRequest httpRequest) { + //从header中获取token + String token = httpRequest.getHeader(Constant.TOKEN_HEADER); + //如果header中不存在token,则从参数中获取token + if (StrUtil.isBlank(token)) { + token = httpRequest.getParameter(Constant.TOKEN_HEADER); + } + return token; + } + +} diff --git a/admin/src/main/java/io/modules/security/oauth2/Oauth2Realm.java b/admin/src/main/java/io/modules/security/oauth2/Oauth2Realm.java new file mode 100644 index 0000000..b5f0ccf --- /dev/null +++ b/admin/src/main/java/io/modules/security/oauth2/Oauth2Realm.java @@ -0,0 +1,77 @@ + + +package io.modules.security.oauth2; + +import io.modules.security.service.ShiroService; +import io.common.exception.ErrorCode; +import io.common.utils.ConvertUtils; +import io.modules.security.entity.SysUserTokenEntity; +import io.modules.security.user.UserDetail; +import io.modules.sys.entity.SysUserEntity; +import lombok.AllArgsConstructor; +import org.apache.shiro.authc.*; +import org.apache.shiro.authz.AuthorizationInfo; +import org.apache.shiro.authz.SimpleAuthorizationInfo; +import org.apache.shiro.realm.AuthorizingRealm; +import org.apache.shiro.subject.PrincipalCollection; +import org.springframework.stereotype.Component; +import java.util.List; +import java.util.Set; + +/** + * 认证 + * + */ +@Component +@AllArgsConstructor +public class Oauth2Realm extends AuthorizingRealm { + private final ShiroService shiroService; + + @Override + public boolean supports(AuthenticationToken token) { + return token instanceof Oauth2Token; + } + + /** + * 授权(验证权限时调用) + */ + @Override + protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { + UserDetail user = (UserDetail) principals.getPrimaryPrincipal(); + + //用户权限列表 + Set permsSet = shiroService.getUserPermissions(user); + + SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); + info.setStringPermissions(permsSet); + return info; + } + + /** + * 认证(登录时调用) + */ + @Override + protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { + String accessToken = (String) token.getPrincipal(); + //根据accessToken,查询用户信息 + SysUserTokenEntity tokenEntity = shiroService.getByToken(accessToken); + //token失效 + if (tokenEntity == null || tokenEntity.getExpireDate().getTime() < System.currentTimeMillis()) { + throw new IncorrectCredentialsException("登录失效,请重新登录!"); + } + //查询用户信息 + SysUserEntity userEntity = shiroService.getUser(tokenEntity.getUserId()); + //转换成UserDetail对象 + UserDetail userDetail = ConvertUtils.sourceToTarget(userEntity, UserDetail.class); + //获取用户对应的部门数据权限 + List deptIdList = shiroService.getDataScopeList(userDetail.getId()); + userDetail.setDeptIdList(deptIdList); + //账号锁定 + if (userDetail.getStatus() == 0) { + throw new LockedAccountException("账号已被锁定!"); + } + SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(userDetail, accessToken, getName()); + return info; + } + +} diff --git a/admin/src/main/java/io/modules/security/oauth2/Oauth2Token.java b/admin/src/main/java/io/modules/security/oauth2/Oauth2Token.java new file mode 100644 index 0000000..51d338d --- /dev/null +++ b/admin/src/main/java/io/modules/security/oauth2/Oauth2Token.java @@ -0,0 +1,27 @@ + + +package io.modules.security.oauth2; + +import org.apache.shiro.authc.AuthenticationToken; + +/** + * token + * + */ +public class Oauth2Token implements AuthenticationToken { + private String token; + + public Oauth2Token(String token){ + this.token = token; + } + + @Override + public String getPrincipal() { + return token; + } + + @Override + public Object getCredentials() { + return token; + } +} diff --git a/admin/src/main/java/io/modules/security/oauth2/TokenGenerator.java b/admin/src/main/java/io/modules/security/oauth2/TokenGenerator.java new file mode 100644 index 0000000..679316c --- /dev/null +++ b/admin/src/main/java/io/modules/security/oauth2/TokenGenerator.java @@ -0,0 +1,45 @@ + + +package io.modules.security.oauth2; + +import io.common.exception.RenException; + +import java.security.MessageDigest; +import java.util.UUID; + +/** + * 生成token + * + */ +public class TokenGenerator { + + public static String generateValue() { + return generateValue(UUID.randomUUID().toString()); + } + + private static final char[] HEX_CODE = "0123456789abcdef".toCharArray(); + + public static String toHexString(byte[] data) { + if(data == null) { + return null; + } + StringBuilder r = new StringBuilder(data.length*2); + for ( byte b : data) { + r.append(HEX_CODE[(b >> 4) & 0xF]); + r.append(HEX_CODE[(b & 0xF)]); + } + return r.toString(); + } + + public static String generateValue(String param) { + try { + MessageDigest algorithm = MessageDigest.getInstance("MD5"); + algorithm.reset(); + algorithm.update(param.getBytes()); + byte[] messageDigest = algorithm.digest(); + return toHexString(messageDigest); + } catch (Exception e) { + throw new RenException("token invalid", e); + } + } +} diff --git a/admin/src/main/java/io/modules/security/password/BCrypt.java b/admin/src/main/java/io/modules/security/password/BCrypt.java new file mode 100644 index 0000000..f8034f1 --- /dev/null +++ b/admin/src/main/java/io/modules/security/password/BCrypt.java @@ -0,0 +1,623 @@ +package io.modules.security.password; + +import java.io.ByteArrayOutputStream; +import java.io.UnsupportedEncodingException; +import java.security.SecureRandom; + +public class BCrypt { + // BCrypt parameters + + private static final int GENSALT_DEFAULT_LOG2_ROUNDS = 10; + private static final int BCRYPT_SALT_LEN = 16; + // Blowfish parameters + private static final int BLOWFISH_NUM_ROUNDS = 16; + // Initial contents of key schedule + private static final int P_orig[] = { 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, + 0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89, 0x452821e6, 0x38d01377, + 0xbe5466cf, 0x34e90c6c, 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, + 0x9216d5d9, 0x8979fb1b }; + private static final int S_orig[] = { 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, + 0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99, 0x24a19947, 0xb3916cf7, + 0x0801f2e2, 0x858efc16, 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e, + 0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee, 0x7b54a41d, 0xc25a59b5, + 0x9c30d539, 0x2af26013, 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef, + 0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e, 0xd71577c1, 0xbd314b27, + 0x78af2fda, 0x55605c60, 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, + 0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce, 0xa15486af, 0x7c72e993, + 0xb3ee1411, 0x636fbc2a, 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, + 0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677, 0x3b8f4898, 0x6b4bb9af, + 0xc4bfe81b, 0x66282193, 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, + 0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88, 0x23893e81, 0xd396acc5, + 0x0f6d6ff3, 0x83f44239, 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, + 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0, 0x6a51a0d2, 0xd8542f68, + 0x960fa728, 0xab5133a3, 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98, + 0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88, 0x8cee8619, 0x456f9fb4, + 0x7d84a5c3, 0x3b8b5ebe, 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, + 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d, 0x37d0d724, 0xd00a1248, + 0xdb0fead3, 0x49f1c09b, 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7, + 0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba, 0xc1a94fb6, 0x409f60c4, + 0x5e5c9ec2, 0x196a2463, 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, + 0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09, 0xbee3d004, 0xde334afd, + 0x660f2807, 0x192e4bb3, 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb, + 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279, 0x679f25fe, 0xfb1fa3cc, + 0x8ea5e9f8, 0xdb3222f8, 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, + 0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82, 0x9e5c57bb, 0xca6f8ca0, + 0x1a87562e, 0xdf1769db, 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, + 0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0, 0x10fa3d98, 0xfd2183b8, + 0x4afcb56c, 0x2dd1d35b, 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, + 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8, 0xef20cada, 0x36774c01, + 0xd07e9efe, 0x2bf11fb4, 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, + 0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7, 0x8ff6e2fb, 0xf2122b64, + 0x8888b812, 0x900df01c, 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, + 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1, 0xe5a0cc0f, 0xb56f74e8, + 0x18acf3d6, 0xce89e299, 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, + 0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477, 0xe6ad2065, 0x77b5fa86, + 0xc75442f5, 0xfb9d35cf, 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, + 0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af, 0x2464369b, 0xf009b91e, + 0x5563911d, 0x59dfa6aa, 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5, + 0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41, 0xb3472dca, 0x7b14a94a, + 0x1b510052, 0x9a532915, 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, + 0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915, 0xb6636521, 0xe7b9f9b6, + 0xff34052e, 0xc5855664, 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a, + 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, 0xad6ea6b0, 0x49a7df7d, + 0x9cee60b8, 0x8fedb266, 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1, + 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e, 0x3f54989a, 0x5b429d65, + 0x6b8fe4d6, 0x99f73fd6, 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, + 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, 0x09686b3f, 0x3ebaefc9, + 0x3c971814, 0x6b6a70a1, 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, + 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8, 0xb03ada37, 0xf0500c0d, + 0xf01c1f04, 0x0200b3ff, 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, + 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701, 0x3ae5e581, 0x37c2dadc, + 0xc8b57634, 0x9af3dda7, 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41, + 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331, 0x4e548b38, 0x4f6db908, + 0x6f420d03, 0xf60a04bf, 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af, + 0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e, 0x5512721f, 0x2e6b7124, + 0x501adde6, 0x9f84cd87, 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, + 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, 0xef1c1847, 0x3215d908, + 0xdd433b37, 0x24c2ba16, 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd, + 0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b, 0x043556f1, 0xd7a3c76b, + 0x3c11183b, 0x5924a509, 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, + 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, 0x771fe71c, 0x4e3d06fa, + 0x2965dcb9, 0x99e71d0f, 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a, + 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, 0xf2f74ea7, 0x361d2b3d, + 0x1939260f, 0x19c27960, 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, + 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28, 0xc332ddef, 0xbe6c5aa5, + 0x65582185, 0x68ab9802, 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, + 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, 0x13cca830, 0xeb61bd96, + 0x0334fe1e, 0xaa0363cf, 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14, + 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e, 0x648b1eaf, 0x19bdf0ca, + 0xa02369b9, 0x655abb50, 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, + 0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8, 0xf837889a, 0x97e32d77, + 0x11ed935f, 0x16681281, 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99, + 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696, 0xcdb30aeb, 0x532e3054, + 0x8fd948e4, 0x6dbc3128, 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, + 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0, 0x45eee2b6, 0xa3aaabea, + 0xdb6c4f15, 0xfacb4fd0, 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, + 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250, 0xcf62a1f2, 0x5b8d2646, + 0xfc8883a0, 0xc1c7b6a3, 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285, + 0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00, 0x58428d2a, 0x0c55f5ea, + 0x1dadf43e, 0x233f7061, 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, + 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e, 0xa6078084, 0x19f8509e, + 0xe8efd855, 0x61d99735, 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc, + 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9, 0xdb73dbd3, 0x105588cd, + 0x675fda79, 0xe3674340, 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20, + 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7, 0xe93d5a68, 0x948140f7, + 0xf64c261c, 0x94692934, 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068, + 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, 0x1e39f62e, 0x97244546, + 0x14214f74, 0xbf8b8840, 0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45, + 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504, 0x96eb27b3, 0x55fd3941, + 0xda2547e6, 0xabca0a9a, 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb, + 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee, 0x4f3ffea2, 0xe887ad8c, + 0xb58ce006, 0x7af4d6b6, 0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42, + 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b, 0x1dc9faf7, 0x4b6d1856, + 0x26a36631, 0xeae397b2, 0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb, + 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527, 0x55533a3a, 0x20838d87, + 0xfe6ba9b7, 0xd096954b, 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33, + 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c, 0xfdf8e802, 0x04272f70, + 0x80bb155c, 0x05282ce3, 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc, + 0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17, 0x325f51eb, 0xd59bc0d1, + 0xf2bcc18f, 0x41113564, 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, + 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115, 0x6b2395e0, 0x333e92e1, + 0x3b240b62, 0xeebeb922, 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728, + 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0, 0x5449a36f, 0x877d48fa, + 0xc39dfd27, 0xf33e8d1e, 0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37, + 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d, 0xc67b5510, 0x6d672c37, + 0x2765d43b, 0xdcd0e804, 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b, + 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, 0xbb132f88, 0x515bad24, + 0x7b9479bf, 0x763bd6eb, 0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d, + 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c, 0x6a124237, 0xb79251e7, + 0x06a1bbe6, 0x4bfb6350, 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9, + 0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a, 0x64af674e, 0xda86a85f, + 0xbebfe988, 0x64e4c3fe, 0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d, + 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc, 0x83426b33, 0xf01eab71, + 0xb0804187, 0x3c005e5f, 0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61, + 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2, 0x5366f9c3, 0xc8b38e74, + 0xb475f255, 0x46fcd9b9, 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2, + 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c, 0xb90bace1, 0xbb8205d0, + 0x11a86248, 0x7574a99e, 0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633, + 0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10, 0x1ab93d1d, 0x0ba5a4df, + 0xa186f20f, 0x2868f169, 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, + 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027, 0x9af88c27, 0x773f8641, + 0xc3604c06, 0x61a806b5, 0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62, + 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634, 0xbbcbee56, 0x90bcb6de, + 0xebfc7da1, 0xce591d76, 0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24, + 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc, 0xed545578, 0x08fca5b5, + 0xd83d7cd3, 0x4dad0fc4, 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c, + 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, 0xd79a3234, 0x92638212, + 0x670efa8e, 0x406000e0, 0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, + 0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe, 0xd5118e9d, 0xbf0f7315, + 0xd62d1c7e, 0xc700c47b, 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, + 0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8, 0x530ff8ee, 0x468dde7d, + 0xd5730a1d, 0x4cd04dc6, 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304, + 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22, 0xc089c2b8, 0x43242ef6, + 0xa51e03aa, 0x9cf2d0a4, 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6, + 0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9, 0xc72fefd3, 0xf752f7da, + 0x3f046f69, 0x77fa0a59, 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, + 0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51, 0x96d5ac3a, 0x017da67d, + 0xd1cf3ed6, 0x7c7d2d28, 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c, + 0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b, 0xe8d3c48d, 0x283b57cc, + 0xf8d56629, 0x79132e28, 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, + 0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd, 0xc3eb9e15, 0x3c9057a2, + 0x97271aec, 0xa93a072a, 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319, + 0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb, 0x28517711, 0xc20ad9f8, + 0xabcc5167, 0xccad925f, 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, + 0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32, 0xa8b6e37e, 0xc3293d46, + 0x48de5369, 0x6413e680, 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, + 0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae, 0x5bbef7dd, 0x1b588d40, + 0xccd2017f, 0x6bb4e3bb, 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, + 0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47, 0xd29be463, 0x542f5d9e, + 0xaec2771b, 0xf64e6370, 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, + 0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84, 0xe1b00428, 0x95983a1d, + 0x06b89fb4, 0xce6ea048, 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, + 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd, 0xa08839e1, 0x51ce794b, + 0x2f32c9b7, 0xa01fbac9, 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, + 0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38, 0x0339c32a, 0xc6913667, + 0x8df9317c, 0xe0b12b4f, 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, + 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525, 0xfae59361, 0xceb69ceb, + 0xc2a86459, 0x12baa8d1, 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442, + 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964, 0x9f1f9532, 0xe0d392df, + 0xd3a0342b, 0x8971f21e, 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, + 0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d, 0xe54cda54, 0x1edad891, + 0xce6279cf, 0xcd3e7e6f, 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299, + 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02, 0xacf08162, 0x5a75ebb5, + 0x6e163697, 0x88d273cc, 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, + 0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a, 0xc9aa53fd, 0x62a80f00, + 0xbb25bfe2, 0x35bdd2f6, 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, + 0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0, 0xba38209c, 0xf746ce76, + 0x77afa1c5, 0x20756060, 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, + 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9, 0x90d4f869, 0xa65cdea0, + 0x3f09252d, 0xc208e69f, 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6 }; + // bcrypt IV: "OrpheanBeholderScryDoubt" + static private final int bf_crypt_ciphertext[] = { 0x4f727068, 0x65616e42, + 0x65686f6c, 0x64657253, 0x63727944, 0x6f756274 }; + // Table for Base64 encoding + static private final char base64_code[] = { '.', '/', 'A', 'B', 'C', 'D', 'E', 'F', + 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', + 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', + 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', + 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' }; + // Table for Base64 decoding + static private final byte index_64[] = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, -1, -1, -1, -1, -1, -1, -1, 2, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + -1, -1, -1, -1, -1, -1, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, -1, -1, -1, -1, -1 }; + static final int MIN_LOG_ROUNDS = 4; + static final int MAX_LOG_ROUNDS = 31; + // Expanded Blowfish key + private int P[]; + private int S[]; + + /** + * Encode a byte array using bcrypt's slightly-modified base64 encoding scheme. Note + * that this is not compatible with the standard MIME-base64 + * encoding. + * + * @param d the byte array to encode + * @param len the number of bytes to encode + * @param rs the destination buffer for the base64-encoded string + * @exception IllegalArgumentException if the length is invalid + */ + static void encode_base64(byte d[], int len, StringBuilder rs) + throws IllegalArgumentException { + int off = 0; + int c1, c2; + + if (len <= 0 || len > d.length) { + throw new IllegalArgumentException("Invalid len"); + } + + while (off < len) { + c1 = d[off++] & 0xff; + rs.append(base64_code[(c1 >> 2) & 0x3f]); + c1 = (c1 & 0x03) << 4; + if (off >= len) { + rs.append(base64_code[c1 & 0x3f]); + break; + } + c2 = d[off++] & 0xff; + c1 |= (c2 >> 4) & 0x0f; + rs.append(base64_code[c1 & 0x3f]); + c1 = (c2 & 0x0f) << 2; + if (off >= len) { + rs.append(base64_code[c1 & 0x3f]); + break; + } + c2 = d[off++] & 0xff; + c1 |= (c2 >> 6) & 0x03; + rs.append(base64_code[c1 & 0x3f]); + rs.append(base64_code[c2 & 0x3f]); + } + } + + /** + * Look up the 3 bits base64-encoded by the specified character, range-checking + * against conversion table + * @param x the base64-encoded value + * @return the decoded value of x + */ + private static byte char64(char x) { + if (x > index_64.length) { + return -1; + } + return index_64[x]; + } + + /** + * Decode a string encoded using bcrypt's base64 scheme to a byte array. Note that + * this is *not* compatible with the standard MIME-base64 encoding. + * @param s the string to decode + * @param maxolen the maximum number of bytes to decode + * @return an array containing the decoded bytes + * @throws IllegalArgumentException if maxolen is invalid + */ + static byte[] decode_base64(String s, int maxolen) throws IllegalArgumentException { + ByteArrayOutputStream out = new ByteArrayOutputStream(maxolen); + int off = 0, slen = s.length(), olen = 0; + byte c1, c2, c3, c4, o; + + if (maxolen <= 0) { + throw new IllegalArgumentException("Invalid maxolen"); + } + + while (off < slen - 1 && olen < maxolen) { + c1 = char64(s.charAt(off++)); + c2 = char64(s.charAt(off++)); + if (c1 == -1 || c2 == -1) { + break; + } + o = (byte) (c1 << 2); + o |= (c2 & 0x30) >> 4; + out.write(o); + if (++olen >= maxolen || off >= slen) { + break; + } + c3 = char64(s.charAt(off++)); + if (c3 == -1) { + break; + } + o = (byte) ((c2 & 0x0f) << 4); + o |= (c3 & 0x3c) >> 2; + out.write(o); + if (++olen >= maxolen || off >= slen) { + break; + } + c4 = char64(s.charAt(off++)); + o = (byte) ((c3 & 0x03) << 6); + o |= c4; + out.write(o); + ++olen; + } + + return out.toByteArray(); + } + + /** + * Blowfish encipher a single 64-bit block encoded as two 32-bit halves + * @param lr an array containing the two 32-bit half blocks + * @param off the position in the array of the blocks + */ + private final void encipher(int lr[], int off) { + int i, n, l = lr[off], r = lr[off + 1]; + + l ^= P[0]; + for (i = 0; i <= BLOWFISH_NUM_ROUNDS - 2;) { + // Feistel substitution on left word + n = S[(l >> 24) & 0xff]; + n += S[0x100 | ((l >> 16) & 0xff)]; + n ^= S[0x200 | ((l >> 8) & 0xff)]; + n += S[0x300 | (l & 0xff)]; + r ^= n ^ P[++i]; + + // Feistel substitution on right word + n = S[(r >> 24) & 0xff]; + n += S[0x100 | ((r >> 16) & 0xff)]; + n ^= S[0x200 | ((r >> 8) & 0xff)]; + n += S[0x300 | (r & 0xff)]; + l ^= n ^ P[++i]; + } + lr[off] = r ^ P[BLOWFISH_NUM_ROUNDS + 1]; + lr[off + 1] = l; + } + + /** + * Cycically extract a word of key material + * @param data the string to extract the data from + * @param offp a "pointer" (as a one-entry array) to the current offset into data + * @return the next word of material from data + */ + private static int streamtoword(byte data[], int offp[]) { + int i; + int word = 0; + int off = offp[0]; + + for (i = 0; i < 4; i++) { + word = (word << 8) | (data[off] & 0xff); + off = (off + 1) % data.length; + } + + offp[0] = off; + return word; + } + + /** + * Initialise the Blowfish key schedule + */ + private void init_key() { + P = (int[]) P_orig.clone(); + S = (int[]) S_orig.clone(); + } + + /** + * Key the Blowfish cipher + * @param key an array containing the key + */ + private void key(byte key[]) { + int i; + int koffp[] = { 0 }; + int lr[] = { 0, 0 }; + int plen = P.length, slen = S.length; + + for (i = 0; i < plen; i++) { + P[i] = P[i] ^ streamtoword(key, koffp); + } + + for (i = 0; i < plen; i += 2) { + encipher(lr, 0); + P[i] = lr[0]; + P[i + 1] = lr[1]; + } + + for (i = 0; i < slen; i += 2) { + encipher(lr, 0); + S[i] = lr[0]; + S[i + 1] = lr[1]; + } + } + + /** + * Perform the "enhanced key schedule" step described by Provos and Mazieres in + * "A Future-Adaptable Password Scheme" http://www.openbsd.org/papers/bcrypt-paper.ps + * @param data salt information + * @param key password information + */ + private void ekskey(byte data[], byte key[]) { + int i; + int koffp[] = { 0 }, doffp[] = { 0 }; + int lr[] = { 0, 0 }; + int plen = P.length, slen = S.length; + + for (i = 0; i < plen; i++) { + P[i] = P[i] ^ streamtoword(key, koffp); + } + + for (i = 0; i < plen; i += 2) { + lr[0] ^= streamtoword(data, doffp); + lr[1] ^= streamtoword(data, doffp); + encipher(lr, 0); + P[i] = lr[0]; + P[i + 1] = lr[1]; + } + + for (i = 0; i < slen; i += 2) { + lr[0] ^= streamtoword(data, doffp); + lr[1] ^= streamtoword(data, doffp); + encipher(lr, 0); + S[i] = lr[0]; + S[i + 1] = lr[1]; + } + } + + static long roundsForLogRounds(int log_rounds) { + if (log_rounds < 4 || log_rounds > 31) { + throw new IllegalArgumentException("Bad number of rounds"); + } + return 1L << log_rounds; + } + + /** + * Perform the central password hashing step in the bcrypt scheme + * @param password the password to hash + * @param salt the binary salt to hash with the password + * @param log_rounds the binary logarithm of the number of rounds of hashing to apply + * @return an array containing the binary hashed password + */ + private byte[] crypt_raw(byte password[], byte salt[], int log_rounds) { + int cdata[] = (int[]) bf_crypt_ciphertext.clone(); + int clen = cdata.length; + byte ret[]; + + long rounds = roundsForLogRounds(log_rounds); + + init_key(); + ekskey(salt, password); + for (long i = 0; i < rounds; i++) { + key(password); + key(salt); + } + + for (int i = 0; i < 64; i++) { + for (int j = 0; j < (clen >> 1); j++) { + encipher(cdata, j << 1); + } + } + + ret = new byte[clen * 4]; + for (int i = 0, j = 0; i < clen; i++) { + ret[j++] = (byte) ((cdata[i] >> 24) & 0xff); + ret[j++] = (byte) ((cdata[i] >> 16) & 0xff); + ret[j++] = (byte) ((cdata[i] >> 8) & 0xff); + ret[j++] = (byte) (cdata[i] & 0xff); + } + return ret; + } + + /** + * Hash a password using the OpenBSD bcrypt scheme + * @param password the password to hash + * @param salt the salt to hash with (perhaps generated using BCrypt.gensalt) + * @return the hashed password + * @throws IllegalArgumentException if invalid salt is passed + */ + public static String hashpw(String password, String salt) throws IllegalArgumentException { + BCrypt B; + String real_salt; + byte passwordb[], saltb[], hashed[]; + char minor = (char) 0; + int rounds, off = 0; + StringBuilder rs = new StringBuilder(); + + if (salt == null) { + throw new IllegalArgumentException("salt cannot be null"); + } + + int saltLength = salt.length(); + + if (saltLength < 28) { + throw new IllegalArgumentException("Invalid salt"); + } + + if (salt.charAt(0) != '$' || salt.charAt(1) != '2') { + throw new IllegalArgumentException("Invalid salt version"); + } + if (salt.charAt(2) == '$') { + off = 3; + } + else { + minor = salt.charAt(2); + if (minor != 'a' || salt.charAt(3) != '$') { + throw new IllegalArgumentException("Invalid salt revision"); + } + off = 4; + } + + if (saltLength - off < 25) { + throw new IllegalArgumentException("Invalid salt"); + } + + // Extract number of rounds + if (salt.charAt(off + 2) > '$') { + throw new IllegalArgumentException("Missing salt rounds"); + } + rounds = Integer.parseInt(salt.substring(off, off + 2)); + + real_salt = salt.substring(off + 3, off + 25); + try { + passwordb = (password + (minor >= 'a' ? "\000" : "")).getBytes("UTF-8"); + } + catch (UnsupportedEncodingException uee) { + throw new AssertionError("UTF-8 is not supported"); + } + + saltb = decode_base64(real_salt, BCRYPT_SALT_LEN); + + B = new BCrypt(); + hashed = B.crypt_raw(passwordb, saltb, rounds); + + rs.append("$2"); + if (minor >= 'a') { + rs.append(minor); + } + rs.append("$"); + if (rounds < 10) { + rs.append("0"); + } + rs.append(rounds); + rs.append("$"); + encode_base64(saltb, saltb.length, rs); + encode_base64(hashed, bf_crypt_ciphertext.length * 4 - 1, rs); + return rs.toString(); + } + + /** + * Generate a salt for use with the BCrypt.hashpw() method + * @param log_rounds the log2 of the number of rounds of hashing to apply - the work + * factor therefore increases as 2**log_rounds. Minimum 4, maximum 31. + * @param random an instance of SecureRandom to use + * @return an encoded salt value + */ + public static String gensalt(int log_rounds, SecureRandom random) { + if (log_rounds < MIN_LOG_ROUNDS || log_rounds > MAX_LOG_ROUNDS) { + throw new IllegalArgumentException("Bad number of rounds"); + } + StringBuilder rs = new StringBuilder(); + byte rnd[] = new byte[BCRYPT_SALT_LEN]; + + random.nextBytes(rnd); + + rs.append("$2a$"); + if (log_rounds < 10) { + rs.append("0"); + } + rs.append(log_rounds); + rs.append("$"); + encode_base64(rnd, rnd.length, rs); + return rs.toString(); + } + + /** + * Generate a salt for use with the BCrypt.hashpw() method + * @param log_rounds the log2 of the number of rounds of hashing to apply - the work + * factor therefore increases as 2**log_rounds. Minimum 4, maximum 31. + * @return an encoded salt value + */ + public static String gensalt(int log_rounds) { + return gensalt(log_rounds, new SecureRandom()); + } + + /** + * Generate a salt for use with the BCrypt.hashpw() method, selecting a reasonable + * default for the number of hashing rounds to apply + * @return an encoded salt value + */ + public static String gensalt() { + return gensalt(GENSALT_DEFAULT_LOG2_ROUNDS); + } + + /** + * Check that a plaintext password matches a previously hashed one + * @param plaintext the plaintext password to verify + * @param hashed the previously-hashed password + * @return true if the passwords match, false otherwise + */ + public static boolean checkpw(String plaintext, String hashed) { + return equalsNoEarlyReturn(hashed, hashpw(plaintext, hashed)); + } + + static boolean equalsNoEarlyReturn(String a, String b) { + char[] caa = a.toCharArray(); + char[] cab = b.toCharArray(); + + if (caa.length != cab.length) { + return false; + } + + byte ret = 0; + for (int i = 0; i < caa.length; i++) { + ret |= caa[i] ^ cab[i]; + } + return ret == 0; + } +} diff --git a/admin/src/main/java/io/modules/security/password/BCryptPasswordEncoder.java b/admin/src/main/java/io/modules/security/password/BCryptPasswordEncoder.java new file mode 100644 index 0000000..731cb4b --- /dev/null +++ b/admin/src/main/java/io/modules/security/password/BCryptPasswordEncoder.java @@ -0,0 +1,73 @@ +package io.modules.security.password; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import java.security.SecureRandom; +import java.util.regex.Pattern; + +public class BCryptPasswordEncoder implements PasswordEncoder { + private Pattern BCRYPT_PATTERN = Pattern + .compile("\\A\\$2a?\\$\\d\\d\\$[./0-9A-Za-z]{53}"); + private final Log logger = LogFactory.getLog(getClass()); + + private final int strength; + + private final SecureRandom random; + + public BCryptPasswordEncoder() { + this(-1); + } + + /** + * @param strength the log rounds to use, between 4 and 31 + */ + public BCryptPasswordEncoder(int strength) { + this(strength, null); + } + + /** + * @param strength the log rounds to use, between 4 and 31 + * @param random the secure random instance to use + * + */ + public BCryptPasswordEncoder(int strength, SecureRandom random) { + if (strength != -1 && (strength < BCrypt.MIN_LOG_ROUNDS || strength > BCrypt.MAX_LOG_ROUNDS)) { + throw new IllegalArgumentException("Bad strength"); + } + this.strength = strength; + this.random = random; + } + + @Override + public String encode(CharSequence rawPassword) { + String salt; + if (strength > 0) { + if (random != null) { + salt = BCrypt.gensalt(strength, random); + } + else { + salt = BCrypt.gensalt(strength); + } + } + else { + salt = BCrypt.gensalt(); + } + return BCrypt.hashpw(rawPassword.toString(), salt); + } + + @Override + public boolean matches(CharSequence rawPassword, String encodedPassword) { + if (encodedPassword == null || encodedPassword.length() == 0) { + logger.warn("Empty encoded password"); + return false; + } + + if (!BCRYPT_PATTERN.matcher(encodedPassword).matches()) { + logger.warn("Encoded password does not look like BCrypt"); + return false; + } + + return BCrypt.checkpw(rawPassword.toString(), encodedPassword); + } +} diff --git a/admin/src/main/java/io/modules/security/password/PasswordEncoder.java b/admin/src/main/java/io/modules/security/password/PasswordEncoder.java new file mode 100644 index 0000000..14c1944 --- /dev/null +++ b/admin/src/main/java/io/modules/security/password/PasswordEncoder.java @@ -0,0 +1,30 @@ +package io.modules.security.password; + +/** + * Service interface for encoding passwords. + * + * The preferred implementation is {@code BCryptPasswordEncoder}. + * + * @author Keith Donald + */ +public interface PasswordEncoder { + + /** + * Encode the raw password. Generally, a good encoding algorithm applies a SHA-1 or + * greater hash combined with an 8-byte or greater randomly generated salt. + */ + String encode(CharSequence rawPassword); + + /** + * Verify the encoded password obtained from storage matches the submitted raw + * password after it too is encoded. Returns true if the passwords match, false if + * they do not. The stored password itself is never decoded. + * + * @param rawPassword the raw password to encode and match + * @param encodedPassword the encoded password from storage to compare with + * @return true if the raw password, after encoding, matches the encoded password from + * storage + */ + boolean matches(CharSequence rawPassword, String encodedPassword); + +} diff --git a/admin/src/main/java/io/modules/security/password/PasswordUtils.java b/admin/src/main/java/io/modules/security/password/PasswordUtils.java new file mode 100644 index 0000000..05ced8f --- /dev/null +++ b/admin/src/main/java/io/modules/security/password/PasswordUtils.java @@ -0,0 +1,41 @@ +package io.modules.security.password; + +/** + * 密码工具类 + * + + * @since 1.0.0 + */ +public class PasswordUtils { + private static PasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); + + /** + * 加密 + * @param str 字符串 + * @return 返回加密字符串 + */ + public static String encode(String str){ + return passwordEncoder.encode(str); + } + + + /** + * 比较密码是否相等 + * @param str 明文密码 + * @param password 加密后密码 + * @return true:成功 false:失败 + */ + public static boolean matches(String str, String password){ + return passwordEncoder.matches(str, password); + } + + + public static void main(String[] args) { + String str = "admin"; + String password = encode(str); + + System.out.println(password); + System.out.println(matches(str, password)); + } + +} diff --git a/admin/src/main/java/io/modules/security/service/CaptchaService.java b/admin/src/main/java/io/modules/security/service/CaptchaService.java new file mode 100644 index 0000000..043adb6 --- /dev/null +++ b/admin/src/main/java/io/modules/security/service/CaptchaService.java @@ -0,0 +1,28 @@ + + +package io.modules.security.service; + +import jakarta.servlet.http.HttpServletResponse; + +import java.io.IOException; + +/** + * 验证码 + * + + */ +public interface CaptchaService { + + /** + * 图片验证码 + */ + void create(HttpServletResponse response, String uuid) throws IOException; + + /** + * 验证码效验 + * @param uuid uuid + * @param code 验证码 + * @return true:成功 false:失败 + */ + boolean validate(String uuid, String code); +} diff --git a/admin/src/main/java/io/modules/security/service/ShiroService.java b/admin/src/main/java/io/modules/security/service/ShiroService.java new file mode 100644 index 0000000..6a5f01b --- /dev/null +++ b/admin/src/main/java/io/modules/security/service/ShiroService.java @@ -0,0 +1,37 @@ + + +package io.modules.security.service; + +import io.modules.security.user.UserDetail; +import io.modules.sys.entity.SysUserEntity; +import io.modules.security.entity.SysUserTokenEntity; + +import java.util.List; +import java.util.Set; + +/** + * shiro相关接口 + * + + */ +public interface ShiroService { + /** + * 获取用户权限列表 + */ + Set getUserPermissions(UserDetail user); + + SysUserTokenEntity getByToken(String token); + + /** + * 根据用户ID,查询用户 + * @param userId + */ + SysUserEntity getUser(Long userId); + + /** + * 获取用户对应的部门数据权限 + * @param userId 用户ID + * @return 返回部门ID列表 + */ + List getDataScopeList(Long userId); +} diff --git a/admin/src/main/java/io/modules/security/service/SysUserTokenService.java b/admin/src/main/java/io/modules/security/service/SysUserTokenService.java new file mode 100644 index 0000000..5b71107 --- /dev/null +++ b/admin/src/main/java/io/modules/security/service/SysUserTokenService.java @@ -0,0 +1,28 @@ + + +package io.modules.security.service; + +import io.common.service.BaseService; +import io.common.utils.Result; +import io.modules.security.entity.SysUserTokenEntity; + +/** + * 用户Token + * + + */ +public interface SysUserTokenService extends BaseService { + + /** + * 生成token + * @param userId 用户ID + */ + Result createToken(Long userId); + + /** + * 退出,修改token值 + * @param userId 用户ID + */ + void logout(Long userId); + +} diff --git a/admin/src/main/java/io/modules/security/service/impl/CaptchaServiceImpl.java b/admin/src/main/java/io/modules/security/service/impl/CaptchaServiceImpl.java new file mode 100644 index 0000000..e8b5976 --- /dev/null +++ b/admin/src/main/java/io/modules/security/service/impl/CaptchaServiceImpl.java @@ -0,0 +1,62 @@ +package io.modules.security.service.impl; + +import cn.hutool.cache.Cache; +import cn.hutool.cache.CacheUtil; +import com.wf.captcha.SpecCaptcha; +import com.wf.captcha.base.Captcha; +import io.modules.security.service.CaptchaService; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import java.io.IOException; +/** + * 验证码 + * + + */ +@Service +public class CaptchaServiceImpl implements CaptchaService { + /** + * Local Cache 5分钟过期 + */ + Cache localCache = CacheUtil.newLRUCache(1000, 1000 * 60 * 5); + + @Override + public void create(HttpServletResponse response, String uuid) throws IOException { + response.setContentType("image/gif"); + response.setHeader("Pragma", "No-cache"); + response.setHeader("Cache-Control", "no-cache"); + response.setDateHeader("Expires", 0); + //生成验证码 + SpecCaptcha captcha = new SpecCaptcha(150, 40); + captcha.setLen(5); + captcha.setCharType(Captcha.TYPE_DEFAULT); + captcha.out(response.getOutputStream()); + //保存到缓存 + setCache(uuid, captcha.text()); + } + + @Override + public boolean validate(String uuid, String code) { + //获取验证码 + String captcha = getCache(uuid); + //效验成功 + if (code.equalsIgnoreCase(captcha)) { + return true; + } + return false; + } + private void setCache(String key, String value) { + localCache.put(key, value); + } + + private String getCache(String key) { + String captcha = localCache.get(key); + //删除验证码 + if (captcha != null) { + localCache.remove(key); + } + return captcha; + } +} diff --git a/admin/src/main/java/io/modules/security/service/impl/ShiroServiceImpl.java b/admin/src/main/java/io/modules/security/service/impl/ShiroServiceImpl.java new file mode 100644 index 0000000..7353437 --- /dev/null +++ b/admin/src/main/java/io/modules/security/service/impl/ShiroServiceImpl.java @@ -0,0 +1,67 @@ + + +package io.modules.security.service.impl; + +import cn.hutool.core.util.StrUtil; +import io.modules.security.dao.SysUserTokenDao; +import io.modules.security.entity.SysUserTokenEntity; +import io.modules.security.service.ShiroService; +import io.modules.security.user.UserDetail; +import io.modules.sys.dao.SysMenuDao; +import io.modules.sys.dao.SysRoleDataScopeDao; +import io.modules.sys.dao.SysUserDao; +import io.modules.sys.entity.SysUserEntity; +import io.modules.sys.enums.SuperAdminEnum; +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +@Service +@AllArgsConstructor +public class ShiroServiceImpl implements ShiroService { + private final SysMenuDao sysMenuDao; + private final SysUserDao sysUserDao; + private final SysUserTokenDao sysUserTokenDao; + private final SysRoleDataScopeDao sysRoleDataScopeDao; + + @Override + public Set getUserPermissions(UserDetail user) { + //系统管理员,拥有最高权限 + List permissionsList; + if (user.getSuperAdmin() == SuperAdminEnum.YES.value()) { + permissionsList = sysMenuDao.getPermissionsList(); + } else { + permissionsList = sysMenuDao.getUserPermissionsList(user.getId()); + } + + //用户权限列表 + Set permsSet = new HashSet<>(); + for (String permissions : permissionsList) { + if (StrUtil.isBlank(permissions)) { + continue; + } + permsSet.addAll(Arrays.asList(permissions.trim().split(","))); + } + + return permsSet; + } + + @Override + public SysUserTokenEntity getByToken(String token) { + return sysUserTokenDao.getByToken(token); + } + + @Override + public SysUserEntity getUser(Long userId) { + return sysUserDao.selectById(userId); + } + + @Override + public List getDataScopeList(Long userId) { + return sysRoleDataScopeDao.getDataScopeList(userId); + } +} diff --git a/admin/src/main/java/io/modules/security/service/impl/SysUserTokenServiceImpl.java b/admin/src/main/java/io/modules/security/service/impl/SysUserTokenServiceImpl.java new file mode 100644 index 0000000..027cc74 --- /dev/null +++ b/admin/src/main/java/io/modules/security/service/impl/SysUserTokenServiceImpl.java @@ -0,0 +1,80 @@ + + +package io.modules.security.service.impl; + +import io.common.constant.Constant; +import io.common.service.impl.BaseServiceImpl; +import io.modules.security.oauth2.TokenGenerator; +import io.common.utils.Result; +import io.modules.security.dao.SysUserTokenDao; +import io.modules.security.entity.SysUserTokenEntity; +import io.modules.security.service.SysUserTokenService; +import org.springframework.stereotype.Service; + +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +@Service +public class SysUserTokenServiceImpl extends BaseServiceImpl implements SysUserTokenService { + /** + * 12小时后过期 + */ + private final static int EXPIRE = 3600 * 12; + + @Override + public Result createToken(Long userId) { + //用户token + String token; + + //当前时间 + Date now = new Date(); + //过期时间 + Date expireTime = new Date(now.getTime() + EXPIRE * 1000); + + //判断是否生成过token + SysUserTokenEntity tokenEntity = baseDao.getByUserId(userId); + if(tokenEntity == null){ + //生成一个token + token = TokenGenerator.generateValue(); + + tokenEntity = new SysUserTokenEntity(); + tokenEntity.setUserId(userId); + tokenEntity.setToken(token); + tokenEntity.setUpdateDate(now); + tokenEntity.setExpireDate(expireTime); + + //保存token + this.insert(tokenEntity); + }else{ + //判断token是否过期 + if(tokenEntity.getExpireDate().getTime() < System.currentTimeMillis()){ + //token过期,重新生成token + token = TokenGenerator.generateValue(); + }else { + token = tokenEntity.getToken(); + } + + tokenEntity.setToken(token); + tokenEntity.setUpdateDate(now); + tokenEntity.setExpireDate(expireTime); + + //更新token + this.updateById(tokenEntity); + } + + Map map = new HashMap<>(2); + map.put(Constant.TOKEN_HEADER, token); + map.put("expire", EXPIRE); + return new Result().ok(map); + } + + @Override + public void logout(Long userId) { + //生成一个token + String token = TokenGenerator.generateValue(); + + //修改token + baseDao.updateToken(userId, token); + } +} diff --git a/admin/src/main/java/io/modules/security/user/SecurityUser.java b/admin/src/main/java/io/modules/security/user/SecurityUser.java new file mode 100644 index 0000000..02efa97 --- /dev/null +++ b/admin/src/main/java/io/modules/security/user/SecurityUser.java @@ -0,0 +1,53 @@ + + +package io.modules.security.user; + +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.subject.Subject; + +/** + * 用户 + * + + */ +public class SecurityUser { + + public static Subject getSubject() { + try { + return SecurityUtils.getSubject(); + }catch (Exception e){ + return null; + } + } + + /** + * 获取用户信息 + */ + public static UserDetail getUser() { + Subject subject = getSubject(); + if(subject == null){ + return new UserDetail(); + } + + UserDetail user = (UserDetail)subject.getPrincipal(); + if(user == null){ + return new UserDetail(); + } + + return user; + } + + /** + * 获取用户ID + */ + public static Long getUserId() { + return getUser().getId(); + } + + /** + * 获取部门ID + */ + public static Long getDeptId() { + return getUser().getDeptId(); + } +} diff --git a/admin/src/main/java/io/modules/security/user/UserDetail.java b/admin/src/main/java/io/modules/security/user/UserDetail.java new file mode 100644 index 0000000..327ce06 --- /dev/null +++ b/admin/src/main/java/io/modules/security/user/UserDetail.java @@ -0,0 +1,35 @@ + + +package io.modules.security.user; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * 登录用户信息 + * + + */ +@Data +public class UserDetail implements Serializable { + private static final long serialVersionUID = 1L; + + private Long id; + private String username; + private String realName; + private String headUrl; + private Integer gender; + private String email; + private String mobile; + private Long deptId; + private String password; + private Integer status; + private Integer superAdmin; + /** + * 部门数据权限 + */ + private List deptIdList; + +} diff --git a/admin/src/main/java/io/modules/sys/controller/ApplicationsController.java b/admin/src/main/java/io/modules/sys/controller/ApplicationsController.java new file mode 100644 index 0000000..3cf71cd --- /dev/null +++ b/admin/src/main/java/io/modules/sys/controller/ApplicationsController.java @@ -0,0 +1,103 @@ +package io.modules.sys.controller; + +import io.common.constant.Constant; +import io.common.page.PageData; +import io.common.utils.Result; +import io.common.validator.AssertUtils; +import io.common.validator.ValidatorUtils; +import io.common.validator.group.AddGroup; +import io.common.validator.group.DefaultGroup; +import io.common.validator.group.UpdateGroup; +import io.modules.item.dto.ApplicationsDTO; +import io.modules.item.dto.CertificatesDTO; +import io.modules.item.dto.UserDTO; +import io.modules.item.service.ApplicationsService; +import io.modules.item.service.CertificatesService; +import io.modules.item.service.FrontUserService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.enums.ParameterIn; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.*; + +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 申请表 + */ +@RestController +@RequestMapping("/sys/applications") +@Tag(name="证书表") +@CrossOrigin +public class ApplicationsController { + @Autowired + private ApplicationsService applicationsService; + @Autowired + private FrontUserService userService; + + @Autowired + private CertificatesService certificatesService; + + @Value("${upload.url}") + private String uploadUrl; + + @GetMapping("page") + @Operation(summary = "分页") + @Parameters({ + @Parameter(name = Constant.PAGE, description = "当前页码,从1开始", in = ParameterIn.QUERY, required = true, ref="int") , + @Parameter(name = Constant.LIMIT, description = "每页显示记录数", in = ParameterIn.QUERY,required = true, ref="int") , + @Parameter(name = Constant.ORDER_FIELD, description = "排序字段", in = ParameterIn.QUERY, ref="String") , + @Parameter(name = Constant.ORDER, description = "排序方式,可选值(asc、desc)", in = ParameterIn.QUERY, ref="String") + }) + public Result> page(@Parameter(hidden = true) @RequestParam Map params){ + PageData page = applicationsService.page(params); + List collect = page.getList().stream().map(e -> { + Long userId = e.getUserId(); + UserDTO userDTO = userService.get(userId); + e.setUser(userDTO); + CertificatesDTO certificatesDTO = certificatesService.get(e.getCertId()); + if (certificatesDTO != null){ + certificatesDTO.setImg(uploadUrl + certificatesDTO.getImg()); + e.setCertificates(certificatesDTO); + } + return e; // 返回修改后的对象 + }).collect(Collectors.toList()); + page.setList(collect); + return new Result>().ok(page); + } + + @PostMapping + @Operation(summary = "保存") + public Result save(@RequestBody ApplicationsDTO dto){ + //效验数据 + ValidatorUtils.validateEntity(dto, AddGroup.class, DefaultGroup.class); + applicationsService.save(dto); + return new Result(); + } + + @PutMapping + @Operation(summary = "修改") + public Result update(@RequestBody ApplicationsDTO dto){ + //效验数据 + ValidatorUtils.validateEntity(dto, UpdateGroup.class, DefaultGroup.class); + dto.setAuditTime(new Date()); + applicationsService.update(dto); + return new Result(); + } + + @DeleteMapping + @Operation(summary = "删除") + public Result delete(@RequestBody Long[] ids){ + //效验数据 + AssertUtils.isArrayEmpty(ids, "id"); + applicationsService.delete(ids); + return new Result(); + } + +} diff --git a/admin/src/main/java/io/modules/sys/controller/CertificatesController.java b/admin/src/main/java/io/modules/sys/controller/CertificatesController.java new file mode 100644 index 0000000..5d55e8c --- /dev/null +++ b/admin/src/main/java/io/modules/sys/controller/CertificatesController.java @@ -0,0 +1,112 @@ +package io.modules.sys.controller; + + +import io.common.constant.Constant; +import io.common.page.PageData; +import io.common.utils.Result; +import io.common.validator.AssertUtils; +import io.common.validator.ValidatorUtils; +import io.common.validator.group.AddGroup; +import io.common.validator.group.DefaultGroup; +import io.common.validator.group.UpdateGroup; +import io.modules.item.dto.CertificatesDTO; +import io.modules.item.dto.UserDTO; +import io.modules.item.entity.SetResponse; +import io.modules.item.service.CertificatesService; +import io.modules.item.service.FrontUserService; +import io.modules.item.service.SetRequestService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.enums.ParameterIn; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.*; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 证书表 + */ +@RestController +@RequestMapping("/sys/certificate") +@Tag(name="证书表") +@CrossOrigin +public class CertificatesController { + @Autowired + private CertificatesService certificatesService; + @Autowired + private SetRequestService setRequestService; + @Autowired + private FrontUserService userService; + @Value("${upload.url}") + private String uploadUrl; + + @GetMapping("page") + @Operation(summary = "分页") + @Parameters({ + @Parameter(name = Constant.PAGE, description = "当前页码,从1开始", in = ParameterIn.QUERY, required = true, ref="int") , + @Parameter(name = Constant.LIMIT, description = "每页显示记录数", in = ParameterIn.QUERY,required = true, ref="int") , + @Parameter(name = Constant.ORDER_FIELD, description = "排序字段", in = ParameterIn.QUERY, ref="String") , + @Parameter(name = Constant.ORDER, description = "排序方式,可选值(asc、desc)", in = ParameterIn.QUERY, ref="String") + }) + public Result> page(@Parameter(hidden = true) @RequestParam Map params){ + PageData page = certificatesService.page(params); + List collect = page.getList().stream().map(e -> { + // 拼接域名 + e.setImg(uploadUrl + e.getImg()); + Long userId = e.getUserId(); + UserDTO userDTO = userService.get(userId); + e.setUser(userDTO); + return e; // 返回修改后的对象 + }).collect(Collectors.toList()); + page.setList(collect); + return new Result>().ok(page); + } + + @PostMapping + @Operation(summary = "保存") + public Result save(@RequestBody CertificatesDTO dto){ + //效验数据 + ValidatorUtils.validateEntity(dto, AddGroup.class, DefaultGroup.class); + dto.setImg(dto.getImg().replace(uploadUrl,"")); + certificatesService.save(dto); + return new Result(); + } + + @PutMapping + @Operation(summary = "修改") + public Result update(@RequestBody CertificatesDTO dto){ + //效验数据 + ValidatorUtils.validateEntity(dto, UpdateGroup.class, DefaultGroup.class); + dto.setImg(dto.getImg().replace(uploadUrl,"")); + certificatesService.update(dto); + return new Result(); + } + + @PutMapping("block") + @Operation(summary = "上链") + public Result book(@RequestBody CertificatesDTO dto){ + //效验数据 + ValidatorUtils.validateEntity(dto, UpdateGroup.class, DefaultGroup.class); + dto.setImg(dto.getImg().replace(uploadUrl,"")); + SetResponse setResponse = setRequestService.sendSetRequest(String.valueOf(dto.getId()), dto.toString()); + dto.setBlockchainTxId(setResponse.getData()); + dto.setIsBlock(1); + certificatesService.update(dto); + return new Result(); + } + + + @DeleteMapping + @Operation(summary = "删除") + public Result delete(@RequestBody Long[] ids){ + //效验数据 + AssertUtils.isArrayEmpty(ids, "id"); + certificatesService.delete(ids); + return new Result(); + } + +} diff --git a/admin/src/main/java/io/modules/sys/controller/IndexController.java b/admin/src/main/java/io/modules/sys/controller/IndexController.java new file mode 100644 index 0000000..87bbdc1 --- /dev/null +++ b/admin/src/main/java/io/modules/sys/controller/IndexController.java @@ -0,0 +1,20 @@ +package io.modules.sys.controller; + +import io.common.utils.Result; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 首页提示 + * + + */ +@RestController +public class IndexController { + + @GetMapping("/") + public Result index(){ + String tips = "你好,已启动,请启动ui,才能访问页面!"; + return new Result().ok(tips); + } +} diff --git a/admin/src/main/java/io/modules/sys/controller/SysDeptController.java b/admin/src/main/java/io/modules/sys/controller/SysDeptController.java new file mode 100644 index 0000000..799203d --- /dev/null +++ b/admin/src/main/java/io/modules/sys/controller/SysDeptController.java @@ -0,0 +1,92 @@ + + +package io.modules.sys.controller; + +import io.common.annotation.LogOperation; +import io.common.utils.Result; +import io.common.validator.AssertUtils; +import io.common.validator.ValidatorUtils; +import io.common.validator.group.AddGroup; +import io.common.validator.group.DefaultGroup; +import io.common.validator.group.UpdateGroup; +import io.modules.sys.dto.SysDeptDTO; +import io.modules.sys.service.SysDeptService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.AllArgsConstructor; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.web.bind.annotation.*; + +import java.util.HashMap; +import java.util.List; + +/** + * 部门管理 + * + + */ +@RestController +@RequestMapping("/sys/dept") +@Tag(name = "部门管理") +@AllArgsConstructor +public class SysDeptController { + private final SysDeptService sysDeptService; + + @GetMapping("list") + @Operation(summary = "列表") + @RequiresPermissions("sys:dept:list") + public Result> list() { + List list = sysDeptService.list(new HashMap<>(1)); + + return new Result>().ok(list); + } + + @GetMapping("{id}") + @Operation(summary = "信息") + @RequiresPermissions("sys:dept:info") + public Result get(@PathVariable("id") Long id) { + SysDeptDTO data = sysDeptService.get(id); + + return new Result().ok(data); + } + + @PostMapping + @Operation(summary = "保存") + @LogOperation("保存") + @RequiresPermissions("sys:dept:save") + public Result save(@RequestBody SysDeptDTO dto) { + //效验数据 + ValidatorUtils.validateEntity(dto, AddGroup.class, DefaultGroup.class); + + sysDeptService.save(dto); + + return new Result(); + } + + @PutMapping + @Operation(summary = "修改") + @LogOperation("修改") + @RequiresPermissions("sys:dept:update") + public Result update(@RequestBody SysDeptDTO dto) { + //效验数据 + ValidatorUtils.validateEntity(dto, UpdateGroup.class, DefaultGroup.class); + + sysDeptService.update(dto); + + return new Result(); + } + + @DeleteMapping("{id}") + @Operation(summary = "删除") + @LogOperation("删除") + @RequiresPermissions("sys:dept:delete") + public Result delete(@PathVariable("id") Long id) { + //效验数据 + AssertUtils.isNull(id, "id"); + + sysDeptService.delete(id); + + return new Result(); + } + +} diff --git a/admin/src/main/java/io/modules/sys/controller/SysDictDataController.java b/admin/src/main/java/io/modules/sys/controller/SysDictDataController.java new file mode 100644 index 0000000..d67c693 --- /dev/null +++ b/admin/src/main/java/io/modules/sys/controller/SysDictDataController.java @@ -0,0 +1,104 @@ + + +package io.modules.sys.controller; + +import io.common.annotation.LogOperation; +import io.common.constant.Constant; +import io.common.page.PageData; +import io.common.utils.Result; +import io.common.validator.AssertUtils; +import io.common.validator.ValidatorUtils; +import io.common.validator.group.DefaultGroup; +import io.common.validator.group.UpdateGroup; +import io.modules.sys.dto.SysDictDataDTO; +import io.modules.sys.service.SysDictDataService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.enums.ParameterIn; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.AllArgsConstructor; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.web.bind.annotation.*; + +import java.util.Map; + +/** + * 字典数据 + * + + */ +@RestController +@RequestMapping("sys/dict/data") +@Tag(name = "字典数据") +@AllArgsConstructor +public class SysDictDataController { + private final SysDictDataService sysDictDataService; + + @GetMapping("page") + @Operation(summary = "字典数据") + @Parameters({ + @Parameter(name = Constant.PAGE, description = "当前页码,从1开始", in = ParameterIn.QUERY, required = true, ref = "int"), + @Parameter(name = Constant.LIMIT, description = "每页显示记录数", in = ParameterIn.QUERY, required = true, ref = "int"), + @Parameter(name = Constant.ORDER_FIELD, description = "排序字段", in = ParameterIn.QUERY, ref = "String"), + @Parameter(name = Constant.ORDER, description = "排序方式,可选值(asc、desc)", in = ParameterIn.QUERY, ref = "String"), + @Parameter(name = "dictLabel", description = "字典标签", in = ParameterIn.QUERY, ref = "String"), + @Parameter(name = "dictValue", description = "字典值", in = ParameterIn.QUERY, ref = "String") + }) + @RequiresPermissions("sys:dict:page") + public Result> page(@Parameter(hidden = true) @RequestParam Map params) { + //字典类型 + PageData page = sysDictDataService.page(params); + + return new Result>().ok(page); + } + + @GetMapping("{id}") + @Operation(summary = "信息") + @RequiresPermissions("sys:dict:info") + public Result get(@PathVariable("id") Long id) { + SysDictDataDTO data = sysDictDataService.get(id); + + return new Result().ok(data); + } + + @PostMapping + @Operation(summary = "保存") + @LogOperation("保存") + @RequiresPermissions("sys:dict:save") + public Result save(@RequestBody SysDictDataDTO dto) { + //效验数据 + ValidatorUtils.validateEntity(dto, DefaultGroup.class); + + sysDictDataService.save(dto); + + return new Result(); + } + + @PutMapping + @Operation(summary = "修改") + @LogOperation("修改") + @RequiresPermissions("sys:dict:update") + public Result update(@RequestBody SysDictDataDTO dto) { + //效验数据 + ValidatorUtils.validateEntity(dto, UpdateGroup.class, DefaultGroup.class); + + sysDictDataService.update(dto); + + return new Result(); + } + + @DeleteMapping + @Operation(summary = "删除") + @LogOperation("删除") + @RequiresPermissions("sys:dict:delete") + public Result delete(@RequestBody Long[] ids) { + //效验数据 + AssertUtils.isArrayEmpty(ids, "id"); + + sysDictDataService.delete(ids); + + return new Result(); + } + +} diff --git a/admin/src/main/java/io/modules/sys/controller/SysDictTypeController.java b/admin/src/main/java/io/modules/sys/controller/SysDictTypeController.java new file mode 100644 index 0000000..3f2bf18 --- /dev/null +++ b/admin/src/main/java/io/modules/sys/controller/SysDictTypeController.java @@ -0,0 +1,112 @@ + + +package io.modules.sys.controller; + +import io.common.annotation.LogOperation; +import io.common.constant.Constant; +import io.common.page.PageData; +import io.common.utils.Result; +import io.common.validator.AssertUtils; +import io.common.validator.ValidatorUtils; +import io.common.validator.group.DefaultGroup; +import io.common.validator.group.UpdateGroup; +import io.modules.sys.dto.SysDictTypeDTO; +import io.modules.sys.entity.DictType; +import io.modules.sys.service.SysDictTypeService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.enums.ParameterIn; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.AllArgsConstructor; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; + +/** + * 字典类型 + */ +@RestController +@RequestMapping("sys/dict/type") +@Tag(name = "字典类型") +@AllArgsConstructor +public class SysDictTypeController { + private final SysDictTypeService sysDictTypeService; + + @GetMapping("page") + @Operation(summary = "字典类型") + @Parameters({ + @Parameter(name = Constant.PAGE, description = "当前页码,从1开始", in = ParameterIn.QUERY, required = true, ref = "int"), + @Parameter(name = Constant.LIMIT, description = "每页显示记录数", in = ParameterIn.QUERY, required = true, ref = "int"), + @Parameter(name = Constant.ORDER_FIELD, description = "排序字段", in = ParameterIn.QUERY, ref = "String"), + @Parameter(name = Constant.ORDER, description = "排序方式,可选值(asc、desc)", in = ParameterIn.QUERY, ref = "String"), + @Parameter(name = "dictType", description = "字典类型", in = ParameterIn.QUERY, ref = "String"), + @Parameter(name = "dictName", description = "字典名称", in = ParameterIn.QUERY, ref = "String") + }) + @RequiresPermissions("sys:dict:page") + public Result> page(@Parameter(hidden = true) @RequestParam Map params) { + //字典类型 + PageData page = sysDictTypeService.page(params); + + return new Result>().ok(page); + } + + @GetMapping("{id}") + @Operation(summary = "信息") + @RequiresPermissions("sys:dict:info") + public Result get(@PathVariable("id") Long id) { + SysDictTypeDTO data = sysDictTypeService.get(id); + + return new Result().ok(data); + } + + @PostMapping + @Operation(summary = "保存") + @LogOperation("保存") + @RequiresPermissions("sys:dict:save") + public Result save(@RequestBody SysDictTypeDTO dto) { + //效验数据 + ValidatorUtils.validateEntity(dto, DefaultGroup.class); + + sysDictTypeService.save(dto); + + return new Result(); + } + + @PutMapping + @Operation(summary = "修改") + @LogOperation("修改") + @RequiresPermissions("sys:dict:update") + public Result update(@RequestBody SysDictTypeDTO dto) { + //效验数据 + ValidatorUtils.validateEntity(dto, UpdateGroup.class, DefaultGroup.class); + + sysDictTypeService.update(dto); + + return new Result(); + } + + @DeleteMapping + @Operation(summary = "删除") + @LogOperation("删除") + @RequiresPermissions("sys:dict:delete") + public Result delete(@RequestBody Long[] ids) { + //效验数据 + AssertUtils.isArrayEmpty(ids, "id"); + + sysDictTypeService.delete(ids); + + return new Result(); + } + + @GetMapping("all") + @Operation(summary = "所有字典数据") + public Result> all() { + List list = sysDictTypeService.getAllList(); + + return new Result>().ok(list); + } + +} diff --git a/admin/src/main/java/io/modules/sys/controller/SysMenuController.java b/admin/src/main/java/io/modules/sys/controller/SysMenuController.java new file mode 100644 index 0000000..0c542bb --- /dev/null +++ b/admin/src/main/java/io/modules/sys/controller/SysMenuController.java @@ -0,0 +1,132 @@ + + +package io.modules.sys.controller; + +import io.modules.security.service.ShiroService; +import io.modules.security.user.SecurityUser; +import io.modules.security.user.UserDetail; +import io.common.annotation.LogOperation; +import io.common.exception.ErrorCode; +import io.common.utils.Result; +import io.common.validator.AssertUtils; +import io.common.validator.ValidatorUtils; +import io.common.validator.group.DefaultGroup; +import io.modules.sys.dto.SysMenuDTO; +import io.modules.sys.enums.MenuTypeEnum; +import io.modules.sys.service.SysMenuService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.enums.ParameterIn; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.AllArgsConstructor; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Set; + +/** + * 菜单管理 + * + + */ +@RestController +@RequestMapping("/sys/menu") +@Tag(name = "菜单管理") +@AllArgsConstructor +public class SysMenuController { + private final SysMenuService sysMenuService; + private final ShiroService shiroService; + + @GetMapping("nav") + @Operation(summary = "导航") + public Result> nav() { + UserDetail user = SecurityUser.getUser(); + List list = sysMenuService.getUserMenuList(user, MenuTypeEnum.MENU.value()); + + return new Result>().ok(list); + } + + @GetMapping("permissions") + @Operation(summary = "权限标识") + public Result> permissions() { + UserDetail user = SecurityUser.getUser(); + Set set = shiroService.getUserPermissions(user); + + return new Result>().ok(set); + } + + @GetMapping("list") + @Operation(summary = "列表") + @Parameter(name = "type", description = "菜单类型 0:菜单 1:按钮 null:全部", in = ParameterIn.QUERY, ref = "int") + @RequiresPermissions("sys:menu:list") + public Result> list(Integer type) { + List list = sysMenuService.getAllMenuList(type); + + return new Result>().ok(list); + } + + @GetMapping("{id}") + @Operation(summary = "信息") + @RequiresPermissions("sys:menu:info") + public Result get(@PathVariable("id") Long id) { + SysMenuDTO data = sysMenuService.get(id); + + return new Result().ok(data); + } + + @PostMapping + @Operation(summary = "保存") + @LogOperation("保存") + @RequiresPermissions("sys:menu:save") + public Result save(@RequestBody SysMenuDTO dto) { + //效验数据 + ValidatorUtils.validateEntity(dto, DefaultGroup.class); + + sysMenuService.save(dto); + + return new Result(); + } + + @PutMapping + @Operation(summary = "修改") + @LogOperation("修改") + @RequiresPermissions("sys:menu:update") + public Result update(@RequestBody SysMenuDTO dto) { + //效验数据 + ValidatorUtils.validateEntity(dto, DefaultGroup.class); + + sysMenuService.update(dto); + + return new Result(); + } + + @DeleteMapping("{id}") + @Operation(summary = "删除") + @LogOperation("删除") + @RequiresPermissions("sys:menu:delete") + public Result delete(@PathVariable("id") Long id) { + //效验数据 + AssertUtils.isNull(id, "id"); + + //判断是否有子菜单或按钮 + List list = sysMenuService.getListPid(id); + if (list.size() > 0) { + return new Result().error("先删除子菜单或按钮!"); + } + + sysMenuService.delete(id); + + return new Result(); + } + + @GetMapping("select") + @Operation(summary = "角色菜单权限") + @RequiresPermissions("sys:menu:select") + public Result> select() { + UserDetail user = SecurityUser.getUser(); + List list = sysMenuService.getUserMenuList(user, null); + + return new Result>().ok(list); + } +} diff --git a/admin/src/main/java/io/modules/sys/controller/SysParamsController.java b/admin/src/main/java/io/modules/sys/controller/SysParamsController.java new file mode 100644 index 0000000..cef6f79 --- /dev/null +++ b/admin/src/main/java/io/modules/sys/controller/SysParamsController.java @@ -0,0 +1,120 @@ + + +package io.modules.sys.controller; + +import io.common.annotation.LogOperation; +import io.common.constant.Constant; +import io.common.page.PageData; +import io.common.utils.ExcelUtils; +import io.common.utils.Result; +import io.common.validator.AssertUtils; +import io.common.validator.ValidatorUtils; +import io.common.validator.group.AddGroup; +import io.common.validator.group.DefaultGroup; +import io.common.validator.group.UpdateGroup; +import io.modules.sys.dto.SysParamsDTO; +import io.modules.sys.excel.SysParamsExcel; +import io.modules.sys.service.SysParamsService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.enums.ParameterIn; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletResponse; +import lombok.AllArgsConstructor; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; + + +/** + * 参数管理 + * + + * @since 1.0.0 + */ +@RestController +@RequestMapping("sys/params") +@Tag(name = "参数管理") +@AllArgsConstructor +public class SysParamsController { + private final SysParamsService sysParamsService; + + @GetMapping("page") + @Operation(summary = "分页") + @Parameters({ + @Parameter(name = Constant.PAGE, description = "当前页码,从1开始", in = ParameterIn.QUERY, required = true, ref = "int"), + @Parameter(name = Constant.LIMIT, description = "每页显示记录数", in = ParameterIn.QUERY, required = true, ref = "int"), + @Parameter(name = Constant.ORDER_FIELD, description = "排序字段", in = ParameterIn.QUERY, ref = "String"), + @Parameter(name = Constant.ORDER, description = "排序方式,可选值(asc、desc)", in = ParameterIn.QUERY, ref = "String"), + @Parameter(name = "paramCode", description = "参数编码", in = ParameterIn.QUERY, ref = "String") + }) + @RequiresPermissions("sys:params:page") + public Result> page(@Parameter(hidden = true) @RequestParam Map params) { + PageData page = sysParamsService.page(params); + + return new Result>().ok(page); + } + + @GetMapping("{id}") + @Operation(summary = "信息") + @RequiresPermissions("sys:params:info") + public Result get(@PathVariable("id") Long id) { + SysParamsDTO data = sysParamsService.get(id); + + return new Result().ok(data); + } + + @PostMapping + @Operation(summary = "保存") + @LogOperation("保存") + @RequiresPermissions("sys:params:save") + public Result save(@RequestBody SysParamsDTO dto) { + //效验数据 + ValidatorUtils.validateEntity(dto, AddGroup.class, DefaultGroup.class); + + sysParamsService.save(dto); + + return new Result(); + } + + @PutMapping + @Operation(summary = "修改") + @LogOperation("修改") + @RequiresPermissions("sys:params:update") + public Result update(@RequestBody SysParamsDTO dto) { + //效验数据 + ValidatorUtils.validateEntity(dto, UpdateGroup.class, DefaultGroup.class); + + sysParamsService.update(dto); + + return new Result(); + } + + @DeleteMapping + @Operation(summary = "删除") + @LogOperation("删除") + @RequiresPermissions("sys:params:delete") + public Result delete(@RequestBody Long[] ids) { + //效验数据 + AssertUtils.isArrayEmpty(ids, "id"); + + sysParamsService.delete(ids); + + return new Result(); + } + + @GetMapping("export") + @Operation(summary = "导出") + @LogOperation("导出") + @RequiresPermissions("sys:params:export") + @Parameter(name = "paramCode", description = "参数编码", in = ParameterIn.QUERY, ref = "String") + public void export(@Parameter(hidden = true) @RequestParam Map params, HttpServletResponse response) throws Exception { + List list = sysParamsService.list(params); + + ExcelUtils.exportExcelToTarget(response, null, "参数管理", list, SysParamsExcel.class); + } + +} diff --git a/admin/src/main/java/io/modules/sys/controller/SysRoleController.java b/admin/src/main/java/io/modules/sys/controller/SysRoleController.java new file mode 100644 index 0000000..a28b8ac --- /dev/null +++ b/admin/src/main/java/io/modules/sys/controller/SysRoleController.java @@ -0,0 +1,125 @@ + + +package io.modules.sys.controller; + +import io.common.annotation.LogOperation; +import io.common.constant.Constant; +import io.common.page.PageData; +import io.common.utils.Result; +import io.common.validator.AssertUtils; +import io.common.validator.ValidatorUtils; +import io.common.validator.group.AddGroup; +import io.common.validator.group.DefaultGroup; +import io.common.validator.group.UpdateGroup; +import io.modules.sys.dto.SysRoleDTO; +import io.modules.sys.service.SysRoleDataScopeService; +import io.modules.sys.service.SysRoleMenuService; +import io.modules.sys.service.SysRoleService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.enums.ParameterIn; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.AllArgsConstructor; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.web.bind.annotation.*; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 角色管理 + * + + */ +@RestController +@RequestMapping("/sys/role") +@Tag(name = "角色管理") +@AllArgsConstructor +public class SysRoleController { + private final SysRoleService sysRoleService; + private final SysRoleMenuService sysRoleMenuService; + private final SysRoleDataScopeService sysRoleDataScopeService; + + @GetMapping("page") + @Operation(summary = "分页") + @Parameters({ + @Parameter(name = Constant.PAGE, description = "当前页码,从1开始", in = ParameterIn.QUERY, required = true, ref = "int"), + @Parameter(name = Constant.LIMIT, description = "每页显示记录数", in = ParameterIn.QUERY, required = true, ref = "int"), + @Parameter(name = Constant.ORDER_FIELD, description = "排序字段", in = ParameterIn.QUERY, ref = "String"), + @Parameter(name = Constant.ORDER, description = "排序方式,可选值(asc、desc)", in = ParameterIn.QUERY, ref = "String"), + @Parameter(name = "name", description = "角色名", in = ParameterIn.QUERY, ref = "String") + }) + @RequiresPermissions("sys:role:page") + public Result> page(@Parameter(hidden = true) @RequestParam Map params) { + PageData page = sysRoleService.page(params); + + return new Result>().ok(page); + } + + @GetMapping("list") + @Operation(summary = "列表") + @RequiresPermissions("sys:role:list") + public Result> list() { + List data = sysRoleService.list(new HashMap<>(1)); + + return new Result>().ok(data); + } + + @GetMapping("{id}") + @Operation(summary = "信息") + @RequiresPermissions("sys:role:info") + public Result get(@PathVariable("id") Long id) { + SysRoleDTO data = sysRoleService.get(id); + + //查询角色对应的菜单 + List menuIdList = sysRoleMenuService.getMenuIdList(id); + data.setMenuIdList(menuIdList); + + //查询角色对应的数据权限 + List deptIdList = sysRoleDataScopeService.getDeptIdList(id); + data.setDeptIdList(deptIdList); + + return new Result().ok(data); + } + + @PostMapping + @Operation(summary = "保存") + @LogOperation("保存") + @RequiresPermissions("sys:role:save") + public Result save(@RequestBody SysRoleDTO dto) { + //效验数据 + ValidatorUtils.validateEntity(dto, AddGroup.class, DefaultGroup.class); + + sysRoleService.save(dto); + + return new Result(); + } + + @PutMapping + @Operation(summary = "修改") + @LogOperation("修改") + @RequiresPermissions("sys:role:update") + public Result update(@RequestBody SysRoleDTO dto) { + //效验数据 + ValidatorUtils.validateEntity(dto, UpdateGroup.class, DefaultGroup.class); + + sysRoleService.update(dto); + + return new Result(); + } + + @DeleteMapping + @Operation(summary = "删除") + @LogOperation("删除") + @RequiresPermissions("sys:role:delete") + public Result delete(@RequestBody Long[] ids) { + //效验数据 + AssertUtils.isArrayEmpty(ids, "id"); + + sysRoleService.delete(ids); + + return new Result(); + } +} diff --git a/admin/src/main/java/io/modules/sys/controller/SysUserController.java b/admin/src/main/java/io/modules/sys/controller/SysUserController.java new file mode 100644 index 0000000..8054b1f --- /dev/null +++ b/admin/src/main/java/io/modules/sys/controller/SysUserController.java @@ -0,0 +1,141 @@ + + +package io.modules.sys.controller; + +import io.modules.security.password.PasswordUtils; +import io.modules.security.user.SecurityUser; +import io.modules.security.user.UserDetail; +import io.common.annotation.LogOperation; +import io.common.constant.Constant; +import io.common.exception.ErrorCode; +import io.common.page.PageData; +import io.common.utils.ConvertUtils; +import io.common.utils.ExcelUtils; +import io.common.utils.Result; +import io.common.validator.AssertUtils; +import io.common.validator.ValidatorUtils; +import io.common.validator.group.AddGroup; +import io.common.validator.group.DefaultGroup; +import io.common.validator.group.UpdateGroup; +import io.modules.sys.dto.PasswordDTO; +import io.modules.sys.dto.SysUserDTO; +import io.modules.sys.excel.SysUserExcel; +import io.modules.sys.service.SysRoleUserService; +import io.modules.sys.service.SysUserService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.enums.ParameterIn; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletResponse; +import lombok.AllArgsConstructor; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.web.bind.annotation.*; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** + * 用户管理 + * + + */ +@RestController +@RequestMapping("/sys/user") +@Tag(name = "用户管理") +@AllArgsConstructor +public class SysUserController { + private final SysUserService sysUserService; + private final SysRoleUserService sysRoleUserService; + + @GetMapping("page") + @Operation(summary = "分页") + @Parameters({ + @Parameter(name = Constant.PAGE, description = "当前页码,从1开始", in = ParameterIn.QUERY, required = true, ref = "int"), + @Parameter(name = Constant.LIMIT, description = "每页显示记录数", in = ParameterIn.QUERY, required = true, ref = "int"), + @Parameter(name = Constant.ORDER_FIELD, description = "排序字段", in = ParameterIn.QUERY, ref = "String"), + @Parameter(name = Constant.ORDER, description = "排序方式,可选值(asc、desc)", in = ParameterIn.QUERY, ref = "String"), + @Parameter(name = "username", description = "用户名", in = ParameterIn.QUERY, ref = "String"), + @Parameter(name = "gender", description = "性别", in = ParameterIn.QUERY, ref = "String"), + @Parameter(name = "deptId", description = "部门ID", in = ParameterIn.QUERY, ref = "String") + }) + @RequiresPermissions("sys:user:page") + public Result> page(@Parameter(hidden = true) @RequestParam Map params) { + PageData page = sysUserService.page(params); + + return new Result>().ok(page); + } + + @GetMapping("{id}") + @Operation(summary = "信息") + @RequiresPermissions("sys:user:info") + public Result get(@PathVariable("id") Long id) { + SysUserDTO data = sysUserService.get(id); + //用户角色列表 + List roleIdList = sysRoleUserService.getRoleIdList(id); + data.setRoleIdList(roleIdList); + return new Result().ok(data); + } + + @GetMapping("info") + @Operation(summary = "登录用户信息") + public Result info() { + SysUserDTO data = ConvertUtils.sourceToTarget(SecurityUser.getUser(), SysUserDTO.class); + return new Result().ok(data); + } + + @PutMapping("password") + @Operation(summary = "修改密码") + @LogOperation("修改密码") + public Result password(@RequestBody PasswordDTO dto) { + //效验数据 + ValidatorUtils.validateEntity(dto); + UserDetail user = SecurityUser.getUser(); + //原密码不正确 + if (!PasswordUtils.matches(dto.getPassword(), user.getPassword())) { + return new Result().error("原密码不正确!"); + } + sysUserService.updatePassword(user.getId(), dto.getNewPassword()); + return new Result(); + } + @PostMapping + @Operation(summary = "保存") + @LogOperation("保存") + @RequiresPermissions("sys:user:save") + public Result save(@RequestBody SysUserDTO dto) { + //效验数据 + ValidatorUtils.validateEntity(dto, AddGroup.class, DefaultGroup.class); + sysUserService.save(dto); + return new Result(); + } + @PutMapping + @Operation(summary = "修改") + @LogOperation("修改") + @RequiresPermissions("sys:user:update") + public Result update(@RequestBody SysUserDTO dto) { + //效验数据 + ValidatorUtils.validateEntity(dto, UpdateGroup.class, DefaultGroup.class); + sysUserService.update(dto); + return new Result(); + } + @DeleteMapping + @Operation(summary = "删除") + @LogOperation("删除") + @RequiresPermissions("sys:user:delete") + public Result delete(@RequestBody Long[] ids) { + //效验数据 + AssertUtils.isArrayEmpty(ids, "id"); + sysUserService.deleteBatchIds(Arrays.asList(ids)); + return new Result(); + } + @GetMapping("export") + @Operation(summary = "导出") + @LogOperation("导出") + @RequiresPermissions("sys:user:export") + @Parameter(name = "username", description = "用户名", in = ParameterIn.QUERY, ref = "String") + public void export(@Parameter(hidden = true) @RequestParam Map params, HttpServletResponse response) throws Exception { + List list = sysUserService.list(params); + ExcelUtils.exportExcelToTarget(response, null, "用户管理", list, SysUserExcel.class); + } +} diff --git a/admin/src/main/java/io/modules/sys/controller/UserController.java b/admin/src/main/java/io/modules/sys/controller/UserController.java new file mode 100644 index 0000000..7530083 --- /dev/null +++ b/admin/src/main/java/io/modules/sys/controller/UserController.java @@ -0,0 +1,97 @@ +package io.modules.sys.controller; + +import cn.hutool.crypto.digest.DigestUtil; +import io.common.annotation.LogOperation; +import io.common.constant.Constant; +import io.common.page.PageData; +import io.common.utils.ExcelUtils; +import io.common.utils.Result; +import io.common.validator.AssertUtils; +import io.common.validator.ValidatorUtils; +import io.common.validator.group.AddGroup; +import io.common.validator.group.DefaultGroup; +import io.common.validator.group.UpdateGroup; +import io.modules.item.dto.UserDTO; +import io.modules.item.service.FrontUserService; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.enums.ParameterIn; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.apache.commons.lang3.StringUtils; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import jakarta.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Map; +/** + * 用户 + */ +@RestController +@RequestMapping("/sys/user-front") +@Tag(name="用户") +public class UserController { + @Autowired + private FrontUserService userService; + + @GetMapping("page") + @Operation(summary = "分页") + @Parameters({ + @Parameter(name = Constant.PAGE, description = "当前页码,从1开始", in = ParameterIn.QUERY, required = true, ref="int") , + @Parameter(name = Constant.LIMIT, description = "每页显示记录数", in = ParameterIn.QUERY,required = true, ref="int") , + @Parameter(name = Constant.ORDER_FIELD, description = "排序字段", in = ParameterIn.QUERY, ref="String") , + @Parameter(name = Constant.ORDER, description = "排序方式,可选值(asc、desc)", in = ParameterIn.QUERY, ref="String") + }) + public Result> page(@Parameter(hidden = true) @RequestParam Map params){ + PageData page = userService.page(params); + return new Result>().ok(page); + } + + @GetMapping("{id}") + @Operation(summary = "信息") + public Result get(@PathVariable("id") Long id){ + UserDTO data = userService.get(id); + return new Result().ok(data); + } + + @PostMapping + @Operation(summary = "保存") + @LogOperation("保存") + public Result save(@RequestBody UserDTO dto){ + //效验数据 + ValidatorUtils.validateEntity(dto, AddGroup.class, DefaultGroup.class); + if (StringUtils.isNotBlank(dto.getPassword())){ + dto.setPassword(DigestUtil.sha256Hex(dto.getPassword())); + } + userService.save(dto); + return new Result(); + } + + @PutMapping + @Operation(summary = "修改") + @LogOperation("修改") + public Result update(@RequestBody UserDTO dto){ + //效验数据 + ValidatorUtils.validateEntity(dto, UpdateGroup.class, DefaultGroup.class); + if (StringUtils.isNotBlank(dto.getPassword())){ + dto.setPassword(DigestUtil.sha256Hex(dto.getPassword())); + } + userService.update(dto); + + return new Result(); + } + + @DeleteMapping("{id}") + @Operation(summary = "删除") + @LogOperation("删除") + public Result delete(@PathVariable Long id){ + + Long[] ids = new Long[] { id }; + //效验数据 + AssertUtils.isArrayEmpty(ids, "id"); + userService.delete(ids); + return new Result(); + } +} diff --git a/admin/src/main/java/io/modules/sys/dao/SysDeptDao.java b/admin/src/main/java/io/modules/sys/dao/SysDeptDao.java new file mode 100644 index 0000000..5075e7f --- /dev/null +++ b/admin/src/main/java/io/modules/sys/dao/SysDeptDao.java @@ -0,0 +1,35 @@ + + +package io.modules.sys.dao; + +import io.modules.sys.entity.SysDeptEntity; +import io.common.dao.BaseDao; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; +import java.util.Map; + +/** + * 部门管理 + * + + */ +@Mapper +public interface SysDeptDao extends BaseDao { + + List getList(Map params); + + SysDeptEntity getById(Long id); + + /** + * 获取所有部门的id、pid列表 + */ + List getIdAndPidList(); + + /** + * 根据部门ID,获取所有子部门ID列表 + * @param id 部门ID + */ + List getSubDeptIdList(String id); + +} diff --git a/admin/src/main/java/io/modules/sys/dao/SysDictDataDao.java b/admin/src/main/java/io/modules/sys/dao/SysDictDataDao.java new file mode 100644 index 0000000..9a158f9 --- /dev/null +++ b/admin/src/main/java/io/modules/sys/dao/SysDictDataDao.java @@ -0,0 +1,24 @@ + + +package io.modules.sys.dao; + +import io.modules.sys.entity.DictData; +import io.modules.sys.entity.SysDictDataEntity; +import io.common.dao.BaseDao; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 字典数据 + * + + */ +@Mapper +public interface SysDictDataDao extends BaseDao { + + /** + * 字典数据列表 + */ + List getDictDataList(); +} diff --git a/admin/src/main/java/io/modules/sys/dao/SysDictTypeDao.java b/admin/src/main/java/io/modules/sys/dao/SysDictTypeDao.java new file mode 100644 index 0000000..30bea43 --- /dev/null +++ b/admin/src/main/java/io/modules/sys/dao/SysDictTypeDao.java @@ -0,0 +1,25 @@ + + +package io.modules.sys.dao; + +import io.modules.sys.entity.DictType; +import io.modules.sys.entity.SysDictTypeEntity; +import io.common.dao.BaseDao; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 字典类型 + * + + */ +@Mapper +public interface SysDictTypeDao extends BaseDao { + + /** + * 字典类型列表 + */ + List getDictTypeList(); + +} diff --git a/admin/src/main/java/io/modules/sys/dao/SysMenuDao.java b/admin/src/main/java/io/modules/sys/dao/SysMenuDao.java new file mode 100644 index 0000000..852ba0d --- /dev/null +++ b/admin/src/main/java/io/modules/sys/dao/SysMenuDao.java @@ -0,0 +1,54 @@ + + +package io.modules.sys.dao; + +import io.modules.sys.entity.SysMenuEntity; +import io.common.dao.BaseDao; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 菜单管理 + * + + */ +@Mapper +public interface SysMenuDao extends BaseDao { + + SysMenuEntity getById(@Param("id") Long id); + + /** + * 查询所有菜单列表 + * + * @param menuType 菜单类型 + */ + List getMenuList(@Param("menuType") Integer menuType); + + /** + * 查询用户菜单列表 + * + * @param userId 用户ID + * @param menuType 菜单类型 + */ + List getUserMenuList(@Param("userId") Long userId, @Param("menuType") Integer menuType); + + /** + * 查询用户权限列表 + * @param userId 用户ID + */ + List getUserPermissionsList(Long userId); + + /** + * 查询所有权限列表 + */ + List getPermissionsList(); + + /** + * 根据父菜单,查询子菜单 + * @param pid 父菜单ID + */ + List getListPid(Long pid); + +} diff --git a/admin/src/main/java/io/modules/sys/dao/SysParamsDao.java b/admin/src/main/java/io/modules/sys/dao/SysParamsDao.java new file mode 100644 index 0000000..57545b5 --- /dev/null +++ b/admin/src/main/java/io/modules/sys/dao/SysParamsDao.java @@ -0,0 +1,40 @@ + + +package io.modules.sys.dao; + +import io.modules.sys.entity.SysParamsEntity; +import io.common.dao.BaseDao; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 参数管理 + * + + * @since 1.0.0 + */ +@Mapper +public interface SysParamsDao extends BaseDao { + /** + * 根据参数编码,查询value + * @param paramCode 参数编码 + * @return 参数值 + */ + String getValueByCode(String paramCode); + + /** + * 获取参数编码列表 + * @param ids ids + * @return 返回参数编码列表 + */ + List getParamCodeList(Long[] ids); + + /** + * 根据参数编码,更新value + * @param paramCode 参数编码 + * @param paramValue 参数值 + */ + int updateValueByCode(@Param("paramCode") String paramCode, @Param("paramValue") String paramValue); +} diff --git a/admin/src/main/java/io/modules/sys/dao/SysRoleDao.java b/admin/src/main/java/io/modules/sys/dao/SysRoleDao.java new file mode 100644 index 0000000..94f0a04 --- /dev/null +++ b/admin/src/main/java/io/modules/sys/dao/SysRoleDao.java @@ -0,0 +1,18 @@ + + +package io.modules.sys.dao; + +import io.modules.sys.entity.SysRoleEntity; +import io.common.dao.BaseDao; +import org.apache.ibatis.annotations.Mapper; + +/** + * 角色管理 + * + + */ +@Mapper +public interface SysRoleDao extends BaseDao { + + +} diff --git a/admin/src/main/java/io/modules/sys/dao/SysRoleDataScopeDao.java b/admin/src/main/java/io/modules/sys/dao/SysRoleDataScopeDao.java new file mode 100644 index 0000000..8482377 --- /dev/null +++ b/admin/src/main/java/io/modules/sys/dao/SysRoleDataScopeDao.java @@ -0,0 +1,35 @@ + + +package io.modules.sys.dao; + +import io.modules.sys.entity.SysRoleDataScopeEntity; +import io.common.dao.BaseDao; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 角色数据权限 + * + + * @since 1.0.0 + */ +@Mapper +public interface SysRoleDataScopeDao extends BaseDao { + + /** + * 根据角色ID,获取部门ID列表 + */ + List getDeptIdList(Long roleId); + + /** + * 获取用户的部门数据权限列表 + */ + List getDataScopeList(Long userId); + + /** + * 根据角色id,删除角色数据权限关系 + * @param roleIds 角色ids + */ + void deleteByRoleIds(Long[] roleIds); +} diff --git a/admin/src/main/java/io/modules/sys/dao/SysRoleMenuDao.java b/admin/src/main/java/io/modules/sys/dao/SysRoleMenuDao.java new file mode 100644 index 0000000..d42c3b4 --- /dev/null +++ b/admin/src/main/java/io/modules/sys/dao/SysRoleMenuDao.java @@ -0,0 +1,35 @@ + + +package io.modules.sys.dao; + +import io.modules.sys.entity.SysRoleMenuEntity; +import io.common.dao.BaseDao; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 角色与菜单对应关系 + * + + */ +@Mapper +public interface SysRoleMenuDao extends BaseDao { + + /** + * 根据角色ID,获取菜单ID列表 + */ + List getMenuIdList(Long roleId); + + /** + * 根据角色id,删除角色菜单关系 + * @param roleIds 角色ids + */ + void deleteByRoleIds(Long[] roleIds); + + /** + * 根据菜单id,删除角色菜单关系 + * @param menuId 菜单id + */ + void deleteByMenuId(Long menuId); +} diff --git a/admin/src/main/java/io/modules/sys/dao/SysRoleUserDao.java b/admin/src/main/java/io/modules/sys/dao/SysRoleUserDao.java new file mode 100644 index 0000000..cbcd7ce --- /dev/null +++ b/admin/src/main/java/io/modules/sys/dao/SysRoleUserDao.java @@ -0,0 +1,39 @@ + + +package io.modules.sys.dao; + +import io.modules.sys.entity.SysRoleUserEntity; +import io.common.dao.BaseDao; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 角色用户关系 + * + + * @since 1.0.0 + */ +@Mapper +public interface SysRoleUserDao extends BaseDao { + + /** + * 根据角色ids,删除角色用户关系 + * @param roleIds 角色ids + */ + void deleteByRoleIds(Long[] roleIds); + + /** + * 根据用户id,删除角色用户关系 + * @param userIds 用户ids + */ + void deleteByUserIds(Long[] userIds); + + /** + * 角色ID列表 + * @param userId 用户ID + * + * @return + */ + List getRoleIdList(Long userId); +} diff --git a/admin/src/main/java/io/modules/sys/dao/SysUserDao.java b/admin/src/main/java/io/modules/sys/dao/SysUserDao.java new file mode 100644 index 0000000..cd3256f --- /dev/null +++ b/admin/src/main/java/io/modules/sys/dao/SysUserDao.java @@ -0,0 +1,38 @@ + + +package io.modules.sys.dao; + +import io.modules.sys.entity.SysUserEntity; +import io.common.dao.BaseDao; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + * 系统用户 + * + + */ +@Mapper +public interface SysUserDao extends BaseDao { + + List getList(Map params); + + SysUserEntity getById(Long id); + + SysUserEntity getByUsername(String username); + + int updatePassword(@Param("id") Long id, @Param("newPassword") String newPassword); + + /** + * 根据部门ID,查询用户数 + */ + int getCountByDeptId(Long deptId); + + /** + * 根据部门ID,查询用户ID列表 + */ + List getUserIdListByDeptId(List deptIdList); +} diff --git a/admin/src/main/java/io/modules/sys/dto/PasswordDTO.java b/admin/src/main/java/io/modules/sys/dto/PasswordDTO.java new file mode 100644 index 0000000..190c46d --- /dev/null +++ b/admin/src/main/java/io/modules/sys/dto/PasswordDTO.java @@ -0,0 +1,30 @@ + + +package io.modules.sys.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import lombok.Data; + +import java.io.Serializable; + +/** + * 修改密码 + * + + * @since 1.0.0 + */ +@Data +@Schema(title = "修改密码") +public class PasswordDTO implements Serializable { + private static final long serialVersionUID = 1L; + + @Schema(title = "原密码") + @NotBlank(message="{sysuser.password.require}") + private String password; + + @Schema(title = "新密码") + @NotBlank(message="{sysuser.password.require}") + private String newPassword; + +} diff --git a/admin/src/main/java/io/modules/sys/dto/SysDeptDTO.java b/admin/src/main/java/io/modules/sys/dto/SysDeptDTO.java new file mode 100644 index 0000000..75c1bfa --- /dev/null +++ b/admin/src/main/java/io/modules/sys/dto/SysDeptDTO.java @@ -0,0 +1,76 @@ + + +package io.modules.sys.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import io.common.utils.TreeNode; +import io.common.validator.group.AddGroup; +import io.common.validator.group.DefaultGroup; +import io.common.validator.group.UpdateGroup; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Null; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.util.Date; + +/** + * 部门管理 + * + + * @since 1.0.0 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Schema(title = "部门管理") +public class SysDeptDTO extends TreeNode implements Serializable { + private static final long serialVersionUID = 1L; + + @Schema(title = "id") + @Null(message="ID必须为空", groups = AddGroup.class) + @NotNull(message="{id.require}", groups = UpdateGroup.class) + private Long id; + + @Schema(title = "上级ID") + @NotNull(message="{sysdept.pid.require}", groups = DefaultGroup.class) + private Long pid; + + @Schema(title = "部门名称") + @NotBlank(message="{sysdept.name.require}", groups = DefaultGroup.class) + private String name; + + @Schema(title = "排序") + @Min(value = 0, message = "{sort.number}", groups = DefaultGroup.class) + private Integer sort; + + @Schema(title = "创建时间") + @JsonProperty(access = JsonProperty.Access.READ_ONLY) + private Date createDate; + + @Schema(title = "上级部门名称") + private String parentName; + + @Override + public Long getId() { + return id; + } + + @Override + public void setId(Long id) { + this.id = id; + } + + @Override + public Long getPid() { + return pid; + } + + @Override + public void setPid(Long pid) { + this.pid = pid; + } +} diff --git a/admin/src/main/java/io/modules/sys/dto/SysDictDataDTO.java b/admin/src/main/java/io/modules/sys/dto/SysDictDataDTO.java new file mode 100644 index 0000000..113b291 --- /dev/null +++ b/admin/src/main/java/io/modules/sys/dto/SysDictDataDTO.java @@ -0,0 +1,59 @@ + + +package io.modules.sys.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import io.common.validator.group.AddGroup; +import io.common.validator.group.DefaultGroup; +import io.common.validator.group.UpdateGroup; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Null; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 字典数据 + * + + */ +@Data +@Schema(title = "字典数据") +public class SysDictDataDTO implements Serializable { + private static final long serialVersionUID = 1L; + + @Schema(title = "id") + @Null(message="ID必须为空", groups = AddGroup.class) + @NotNull(message="{id.require}", groups = UpdateGroup.class) + private Long id; + + @Schema(title = "字典类型ID") + @NotNull(message="{sysdict.type.require}", groups = DefaultGroup.class) + private Long dictTypeId; + + @Schema(title = "字典标签") + @NotBlank(message="{sysdict.label.require}", groups = DefaultGroup.class) + private String dictLabel; + + @Schema(title = "字典值") + private String dictValue; + + @Schema(title = "备注") + private String remark; + + @Schema(title = "排序") + @Min(value = 0, message = "{sort.number}", groups = DefaultGroup.class) + private Integer sort; + + @Schema(title = "创建时间") + @JsonProperty(access = JsonProperty.Access.READ_ONLY) + private Date createDate; + + @Schema(title = "更新时间") + @JsonProperty(access = JsonProperty.Access.READ_ONLY) + private Date updateDate; +} diff --git a/admin/src/main/java/io/modules/sys/dto/SysDictTypeDTO.java b/admin/src/main/java/io/modules/sys/dto/SysDictTypeDTO.java new file mode 100644 index 0000000..2303f04 --- /dev/null +++ b/admin/src/main/java/io/modules/sys/dto/SysDictTypeDTO.java @@ -0,0 +1,56 @@ + + +package io.modules.sys.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import io.common.validator.group.AddGroup; +import io.common.validator.group.DefaultGroup; +import io.common.validator.group.UpdateGroup; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Null; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 字典类型 + * + + */ +@Data +@Schema(title = "字典类型") +public class SysDictTypeDTO implements Serializable { + private static final long serialVersionUID = 1L; + + @Schema(title = "id") + @Null(message="ID必须为空", groups = AddGroup.class) + @NotNull(message="{id.require}", groups = UpdateGroup.class) + private Long id; + + @Schema(title = "字典类型") + @NotBlank(message="{sysdict.type.require}", groups = DefaultGroup.class) + private String dictType; + + @Schema(title = "字典名称") + @NotBlank(message="{sysdict.name.require}", groups = DefaultGroup.class) + private String dictName; + + @Schema(title = "备注") + private String remark; + + @Schema(title = "排序") + @Min(value = 0, message = "{sort.number}", groups = DefaultGroup.class) + private Integer sort; + + @Schema(title = "创建时间") + @JsonProperty(access = JsonProperty.Access.READ_ONLY) + private Date createDate; + + @Schema(title = "更新时间") + @JsonProperty(access = JsonProperty.Access.READ_ONLY) + private Date updateDate; +} diff --git a/admin/src/main/java/io/modules/sys/dto/SysMenuDTO.java b/admin/src/main/java/io/modules/sys/dto/SysMenuDTO.java new file mode 100644 index 0000000..ce8c274 --- /dev/null +++ b/admin/src/main/java/io/modules/sys/dto/SysMenuDTO.java @@ -0,0 +1,91 @@ + + +package io.modules.sys.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import io.common.utils.TreeNode; +import io.common.validator.group.AddGroup; +import io.common.validator.group.DefaultGroup; +import io.common.validator.group.UpdateGroup; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Null; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.hibernate.validator.constraints.Range; + +import java.io.Serializable; +import java.util.Date; + +/** + * 菜单管理 + * + + * @since 1.0.0 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Schema(title = "菜单管理") +public class SysMenuDTO extends TreeNode implements Serializable { + private static final long serialVersionUID = 1L; + + @Schema(title = "id") + @Null(message="ID必须为空", groups = AddGroup.class) + @NotNull(message="{id.require}", groups = UpdateGroup.class) + private Long id; + + @Schema(title = "上级ID") + @NotNull(message="{sysmenu.pid.require}", groups = DefaultGroup.class) + private Long pid; + + @Schema(title = "菜单名称") + @NotBlank(message="菜单名称不能为空", groups = DefaultGroup.class) + private String name; + + @Schema(title = "菜单URL") + private String url; + + @Schema(title = "类型 0:菜单 1:按钮") + @Range(min=0, max=1, message = "{sysmenu.type.range}", groups = DefaultGroup.class) + private Integer menuType; + + @Schema(title = "菜单图标") + private String icon; + + @Schema(title = "授权(多个用逗号分隔,如:sys:user:list,sys:user:save)") + private String permissions; + + @Schema(title = "排序") + @Min(value = 0, message = "{sort.number}", groups = DefaultGroup.class) + private Integer sort; + + @Schema(title = "创建时间") + @JsonProperty(access = JsonProperty.Access.READ_ONLY) + private Date createDate; + + @Schema(title = "上级菜单名称") + private String parentName; + + @Override + public Long getId() { + return id; + } + + @Override + public void setId(Long id) { + this.id = id; + } + + @Override + public Long getPid() { + return pid; + } + + @Override + public void setPid(Long pid) { + this.pid = pid; + } + +} diff --git a/admin/src/main/java/io/modules/sys/dto/SysParamsDTO.java b/admin/src/main/java/io/modules/sys/dto/SysParamsDTO.java new file mode 100644 index 0000000..09667a4 --- /dev/null +++ b/admin/src/main/java/io/modules/sys/dto/SysParamsDTO.java @@ -0,0 +1,53 @@ + + +package io.modules.sys.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import io.common.validator.group.AddGroup; +import io.common.validator.group.DefaultGroup; +import io.common.validator.group.UpdateGroup; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Null; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 参数管理 + * + + * @since 1.0.0 + */ +@Data +@Schema(title = "参数管理") +public class SysParamsDTO implements Serializable { + private static final long serialVersionUID = 1L; + + @Schema(title = "id") + @Null(message="ID必须为空", groups = AddGroup.class) + @NotNull(message="{id.require}", groups = UpdateGroup.class) + private Long id; + + @Schema(title = "参数编码") + @NotBlank(message="{sysparams.paramcode.require}", groups = DefaultGroup.class) + private String paramCode; + + @Schema(title = "参数值") + @NotBlank(message="{sysparams.paramvalue.require}", groups = DefaultGroup.class) + private String paramValue; + + @Schema(title = "备注") + private String remark; + + @Schema(title = "创建时间") + @JsonProperty(access = JsonProperty.Access.READ_ONLY) + private Date createDate; + + @Schema(title = "更新时间") + @JsonProperty(access = JsonProperty.Access.READ_ONLY) + private Date updateDate; + +} diff --git a/admin/src/main/java/io/modules/sys/dto/SysRoleDTO.java b/admin/src/main/java/io/modules/sys/dto/SysRoleDTO.java new file mode 100644 index 0000000..1abf1b7 --- /dev/null +++ b/admin/src/main/java/io/modules/sys/dto/SysRoleDTO.java @@ -0,0 +1,52 @@ + + +package io.modules.sys.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import io.common.validator.group.AddGroup; +import io.common.validator.group.DefaultGroup; +import io.common.validator.group.UpdateGroup; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Null; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 角色管理 + * + + * @since 1.0.0 + */ +@Data +@Schema(title = "角色管理") +public class SysRoleDTO implements Serializable { + private static final long serialVersionUID = 1L; + + @Schema(title = "id") + @Null(message="ID必须为空", groups = AddGroup.class) + @NotNull(message="{id.require}", groups = UpdateGroup.class) + private Long id; + + @Schema(title = "角色名称") + @NotBlank(message="{sysrole.name.require}", groups = DefaultGroup.class) + private String name; + + @Schema(title = "备注") + private String remark; + + @Schema(title = "创建时间") + @JsonProperty(access = JsonProperty.Access.READ_ONLY) + private Date createDate; + + @Schema(title = "菜单ID列表") + private List menuIdList; + + @Schema(title = "部门ID列表") + private List deptIdList; + +} diff --git a/admin/src/main/java/io/modules/sys/dto/SysUserDTO.java b/admin/src/main/java/io/modules/sys/dto/SysUserDTO.java new file mode 100644 index 0000000..857a5a5 --- /dev/null +++ b/admin/src/main/java/io/modules/sys/dto/SysUserDTO.java @@ -0,0 +1,86 @@ + + +package io.modules.sys.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import io.common.validator.group.AddGroup; +import io.common.validator.group.DefaultGroup; +import io.common.validator.group.UpdateGroup; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Null; +import lombok.Data; +import org.hibernate.validator.constraints.Range; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 用户管理 + * + + * @since 1.0.0 + */ +@Data +@Schema(title = "用户管理") +public class SysUserDTO implements Serializable { + private static final long serialVersionUID = 1L; + + @Schema(title = "id") + @Null(message="ID必须为空", groups = AddGroup.class) + @NotNull(message="{id.require}", groups = UpdateGroup.class) + private Long id; + + @Schema(title = "用户名", required = true) + @NotBlank(message="{sysuser.username.require}", groups = DefaultGroup.class) + private String username; + + @Schema(title = "密码") + @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) + @NotBlank(message="{sysuser.password.require}", groups = AddGroup.class) + private String password; + + @Schema(title = "姓名", requiredMode = Schema.RequiredMode.REQUIRED) + @NotBlank(message="{sysuser.realName.require}", groups = DefaultGroup.class) + private String realName; + + @Schema(title = "头像") + private String headUrl; + + @Schema(title = "性别 0:男 1:女 2:保密", required = true) + @Range(min=0, max=2, message = "{sysuser.gender.range}", groups = DefaultGroup.class) + private Integer gender; + + @Schema(title = "邮箱") + @Email(message="{sysuser.email.error}", groups = DefaultGroup.class) + private String email; + + @Schema(title = "手机号") + private String mobile; + + @Schema(title = "部门ID", required = true) + @NotNull(message="{sysuser.deptId.require}", groups = DefaultGroup.class) + private Long deptId; + + @Schema(title = "状态 0:停用 1:正常", required = true) + @Range(min=0, max=1, message = "{sysuser.status.range}", groups = DefaultGroup.class) + private Integer status; + + @Schema(title = "创建时间") + @JsonProperty(access = JsonProperty.Access.READ_ONLY) + private Date createDate; + + @Schema(title = "超级管理员 0:否 1:是") + @JsonProperty(access = JsonProperty.Access.READ_ONLY) + private Integer superAdmin; + + @Schema(title = "角色ID列表") + private List roleIdList; + + @Schema(title = "部门名称") + private String deptName; + +} diff --git a/admin/src/main/java/io/modules/sys/dto/SystemDTO.java b/admin/src/main/java/io/modules/sys/dto/SystemDTO.java new file mode 100644 index 0000000..5cb84d9 --- /dev/null +++ b/admin/src/main/java/io/modules/sys/dto/SystemDTO.java @@ -0,0 +1,42 @@ + + +package io.modules.sys.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 系统数据 + * + + * @since 1.0.0 + */ +@Data +@Schema(title = "系统数据") +public class SystemDTO implements Serializable { + private static final long serialVersionUID = 1L; + + private Long sysTime; + private String osName; + private String osArch; + private String osVersion; + private String userLanguage; + private String userDir; + private Long totalPhysical; + private Long freePhysical; + private BigDecimal memoryRate; + private Integer processors; + private String jvmName; + private String javaVersion; + private String javaHome; + private Long javaTotalMemory; + private Long javaFreeMemory; + private Long javaMaxMemory; + private String userName; + private BigDecimal systemCpuLoad; + private String userTimezone; + +} diff --git a/admin/src/main/java/io/modules/sys/entity/DictData.java b/admin/src/main/java/io/modules/sys/entity/DictData.java new file mode 100644 index 0000000..aba0c18 --- /dev/null +++ b/admin/src/main/java/io/modules/sys/entity/DictData.java @@ -0,0 +1,19 @@ + + +package io.modules.sys.entity; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; + +/** + * 字典数据 + * + + */ +@Data +public class DictData { + @JsonIgnore + private Long dictTypeId; + private String dictLabel; + private String dictValue; +} diff --git a/admin/src/main/java/io/modules/sys/entity/DictType.java b/admin/src/main/java/io/modules/sys/entity/DictType.java new file mode 100644 index 0000000..1816aac --- /dev/null +++ b/admin/src/main/java/io/modules/sys/entity/DictType.java @@ -0,0 +1,20 @@ +package io.modules.sys.entity; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; + +import java.util.ArrayList; +import java.util.List; + +/** + * 字典类型 + * + + */ +@Data +public class DictType { + @JsonIgnore + private Long id; + private String dictType; + private List dataList = new ArrayList<>(); +} diff --git a/admin/src/main/java/io/modules/sys/entity/SysDeptEntity.java b/admin/src/main/java/io/modules/sys/entity/SysDeptEntity.java new file mode 100644 index 0000000..ed0f864 --- /dev/null +++ b/admin/src/main/java/io/modules/sys/entity/SysDeptEntity.java @@ -0,0 +1,55 @@ + + +package io.modules.sys.entity; + +import com.baomidou.mybatisplus.annotation.*; +import io.common.entity.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; + +/** + * 部门管理 + * + + */ +@Data +@EqualsAndHashCode(callSuper=false) +@TableName("sys_dept") +public class SysDeptEntity extends BaseEntity { + private static final long serialVersionUID = 1L; + + /** + * 上级ID + */ + private Long pid; + /** + * 所有上级ID,用逗号分开 + */ + private String pids; + /** + * 部门名称 + */ + private String name; + /** + * 排序 + */ + private Integer sort; + /** + * 更新者 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private Long updater; + /** + * 更新时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateDate; + /** + * 上级部门名称 + */ + @TableField(exist = false) + private String parentName; + +} diff --git a/admin/src/main/java/io/modules/sys/entity/SysDictDataEntity.java b/admin/src/main/java/io/modules/sys/entity/SysDictDataEntity.java new file mode 100644 index 0000000..72c7522 --- /dev/null +++ b/admin/src/main/java/io/modules/sys/entity/SysDictDataEntity.java @@ -0,0 +1,54 @@ + + +package io.modules.sys.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import io.common.entity.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; + +/** + * 数据字典 + * + + */ +@Data +@EqualsAndHashCode(callSuper=false) +@TableName("sys_dict_data") +public class SysDictDataEntity extends BaseEntity { + private static final long serialVersionUID = 1L; + /** + * 字典类型ID + */ + private Long dictTypeId; + /** + * 字典标签 + */ + private String dictLabel; + /** + * 字典值 + */ + private String dictValue; + /** + * 备注 + */ + private String remark; + /** + * 排序 + */ + private Integer sort; + /** + * 更新者 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private Long updater; + /** + * 更新时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateDate; +} diff --git a/admin/src/main/java/io/modules/sys/entity/SysDictTypeEntity.java b/admin/src/main/java/io/modules/sys/entity/SysDictTypeEntity.java new file mode 100644 index 0000000..3f47718 --- /dev/null +++ b/admin/src/main/java/io/modules/sys/entity/SysDictTypeEntity.java @@ -0,0 +1,50 @@ + + +package io.modules.sys.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import io.common.entity.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; + +/** + * 字典类型 + * + + */ +@Data +@EqualsAndHashCode(callSuper=false) +@TableName("sys_dict_type") +public class SysDictTypeEntity extends BaseEntity { + private static final long serialVersionUID = 1L; + /** + * 字典类型 + */ + private String dictType; + /** + * 字典名称 + */ + private String dictName; + /** + * 备注 + */ + private String remark; + /** + * 排序 + */ + private Integer sort; + /** + * 更新者 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private Long updater; + /** + * 更新时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateDate; +} diff --git a/admin/src/main/java/io/modules/sys/entity/SysMenuEntity.java b/admin/src/main/java/io/modules/sys/entity/SysMenuEntity.java new file mode 100644 index 0000000..18b8f2b --- /dev/null +++ b/admin/src/main/java/io/modules/sys/entity/SysMenuEntity.java @@ -0,0 +1,69 @@ + + +package io.modules.sys.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import io.common.entity.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; + +/** + * 菜单管理 + * + + */ +@Data +@EqualsAndHashCode(callSuper=false) +@TableName("sys_menu") +public class SysMenuEntity extends BaseEntity { + private static final long serialVersionUID = 1L; + + /** + * 父菜单ID,一级菜单为0 + */ + private Long pid; + /** + * 菜单名称 + */ + private String name; + /** + * 菜单URL + */ + private String url; + /** + * 授权(多个用逗号分隔,如:sys:user:list,sys:user:save) + */ + private String permissions; + /** + * 类型 0:菜单 1:按钮 + */ + private Integer menuType; + /** + * 菜单图标 + */ + private String icon; + /** + * 排序 + */ + private Integer sort; + /** + * 更新者 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private Long updater; + /** + * 更新时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateDate; + /** + * 上级菜单名称 + */ + @TableField(exist = false) + private String parentName; + +} diff --git a/admin/src/main/java/io/modules/sys/entity/SysParamsEntity.java b/admin/src/main/java/io/modules/sys/entity/SysParamsEntity.java new file mode 100644 index 0000000..ab71a0c --- /dev/null +++ b/admin/src/main/java/io/modules/sys/entity/SysParamsEntity.java @@ -0,0 +1,53 @@ + + +package io.modules.sys.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import io.common.entity.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; + +/** + * 参数管理 + * + + * @since 1.0.0 + */ +@Data +@EqualsAndHashCode(callSuper=false) +@TableName("sys_params") +public class SysParamsEntity extends BaseEntity { + private static final long serialVersionUID = 1L; + + /** + * 参数编码 + */ + private String paramCode; + /** + * 参数值 + */ + private String paramValue; + /** + * 类型 0:系统参数 1:非系统参数 + */ + private Integer paramType; + /** + * 备注 + */ + private String remark; + /** + * 更新者 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private Long updater; + /** + * 更新时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateDate; + +} diff --git a/admin/src/main/java/io/modules/sys/entity/SysRoleDataScopeEntity.java b/admin/src/main/java/io/modules/sys/entity/SysRoleDataScopeEntity.java new file mode 100644 index 0000000..ee8120f --- /dev/null +++ b/admin/src/main/java/io/modules/sys/entity/SysRoleDataScopeEntity.java @@ -0,0 +1,31 @@ + + +package io.modules.sys.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.common.entity.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 角色数据权限 + * + + * @since 1.0.0 + */ +@Data +@EqualsAndHashCode(callSuper=false) +@TableName("sys_role_data_scope") +public class SysRoleDataScopeEntity extends BaseEntity { + private static final long serialVersionUID = 1L; + + /** + * 角色ID + */ + private Long roleId; + /** + * 部门ID + */ + private Long deptId; + +} diff --git a/admin/src/main/java/io/modules/sys/entity/SysRoleEntity.java b/admin/src/main/java/io/modules/sys/entity/SysRoleEntity.java new file mode 100644 index 0000000..256a120 --- /dev/null +++ b/admin/src/main/java/io/modules/sys/entity/SysRoleEntity.java @@ -0,0 +1,48 @@ + + +package io.modules.sys.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import io.common.entity.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; + +/** + * 角色 + * + + */ +@Data +@EqualsAndHashCode(callSuper=false) +@TableName("sys_role") +public class SysRoleEntity extends BaseEntity { + private static final long serialVersionUID = 1L; + + /** + * 角色名称 + */ + private String name; + /** + * 备注 + */ + private String remark; + /** + * 部门ID + */ + @TableField(fill = FieldFill.INSERT) + private Long deptId; + /** + * 更新者 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private Long updater; + /** + * 更新时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateDate; +} diff --git a/admin/src/main/java/io/modules/sys/entity/SysRoleMenuEntity.java b/admin/src/main/java/io/modules/sys/entity/SysRoleMenuEntity.java new file mode 100644 index 0000000..60ff33a --- /dev/null +++ b/admin/src/main/java/io/modules/sys/entity/SysRoleMenuEntity.java @@ -0,0 +1,30 @@ + + +package io.modules.sys.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.common.entity.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 角色菜单关系 + * + + * @since 1.0.0 + */ +@Data +@EqualsAndHashCode(callSuper=false) +@TableName("sys_role_menu") +public class SysRoleMenuEntity extends BaseEntity { + private static final long serialVersionUID = 1L; + /** + * 角色ID + */ + private Long roleId; + /** + * 菜单ID + */ + private Long menuId; + +} diff --git a/admin/src/main/java/io/modules/sys/entity/SysRoleUserEntity.java b/admin/src/main/java/io/modules/sys/entity/SysRoleUserEntity.java new file mode 100644 index 0000000..e7e2363 --- /dev/null +++ b/admin/src/main/java/io/modules/sys/entity/SysRoleUserEntity.java @@ -0,0 +1,31 @@ + + +package io.modules.sys.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.common.entity.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 角色用户关系 + * + + * @since 1.0.0 + */ +@Data +@EqualsAndHashCode(callSuper=false) +@TableName("sys_role_user") +public class SysRoleUserEntity extends BaseEntity { + private static final long serialVersionUID = 1L; + + /** + * 角色ID + */ + private Long roleId; + /** + * 用户ID + */ + private Long userId; + +} diff --git a/admin/src/main/java/io/modules/sys/entity/SysUserEntity.java b/admin/src/main/java/io/modules/sys/entity/SysUserEntity.java new file mode 100644 index 0000000..bc1e710 --- /dev/null +++ b/admin/src/main/java/io/modules/sys/entity/SysUserEntity.java @@ -0,0 +1,80 @@ + + +package io.modules.sys.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import io.common.entity.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; + +/** + * 系统用户 + * + + */ +@Data +@EqualsAndHashCode(callSuper=false) +@TableName("sys_user") +public class SysUserEntity extends BaseEntity { + private static final long serialVersionUID = 1L; + /** + * 用户名 + */ + private String username; + /** + * 密码 + */ + private String password; + /** + * 姓名 + */ + private String realName; + /** + * 头像 + */ + private String headUrl; + /** + * 性别 0:男 1:女 2:保密 + */ + private Integer gender; + /** + * 邮箱 + */ + private String email; + /** + * 手机号 + */ + private String mobile; + /** + * 部门ID + */ + private Long deptId; + /** + * 超级管理员 0:否 1:是 + */ + private Integer superAdmin; + /** + * 状态 0:停用 1:正常 + */ + private Integer status; + /** + * 更新者 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private Long updater; + /** + * 更新时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateDate; + /** + * 部门名称 + */ + @TableField(exist=false) + private String deptName; + +} diff --git a/admin/src/main/java/io/modules/sys/enums/MenuTypeEnum.java b/admin/src/main/java/io/modules/sys/enums/MenuTypeEnum.java new file mode 100644 index 0000000..919f6e0 --- /dev/null +++ b/admin/src/main/java/io/modules/sys/enums/MenuTypeEnum.java @@ -0,0 +1,30 @@ + + +package io.modules.sys.enums; + +/** + * 菜单类型枚举 + * + + * @since 1.0.0 + */ +public enum MenuTypeEnum { + /** + * 菜单 + */ + MENU(0), + /** + * 按钮 + */ + BUTTON(1); + + private int value; + + MenuTypeEnum(int value) { + this.value = value; + } + + public int value() { + return this.value; + } +} diff --git a/admin/src/main/java/io/modules/sys/enums/SuperAdminEnum.java b/admin/src/main/java/io/modules/sys/enums/SuperAdminEnum.java new file mode 100644 index 0000000..482ca1e --- /dev/null +++ b/admin/src/main/java/io/modules/sys/enums/SuperAdminEnum.java @@ -0,0 +1,24 @@ + + +package io.modules.sys.enums; + +/** + * 超级管理员枚举 + * + + * @since 1.0.0 + */ +public enum SuperAdminEnum { + YES(1), + NO(0); + + private int value; + + SuperAdminEnum(int value) { + this.value = value; + } + + public int value() { + return this.value; + } +} diff --git a/admin/src/main/java/io/modules/sys/enums/UserStatusEnum.java b/admin/src/main/java/io/modules/sys/enums/UserStatusEnum.java new file mode 100644 index 0000000..e5092cc --- /dev/null +++ b/admin/src/main/java/io/modules/sys/enums/UserStatusEnum.java @@ -0,0 +1,24 @@ + + +package io.modules.sys.enums; + +/** + * 用户状态 + * + + * @since 1.0.0 + */ +public enum UserStatusEnum { + DISABLE(0), + ENABLED(1); + + private int value; + + UserStatusEnum(int value) { + this.value = value; + } + + public int value() { + return this.value; + } +} diff --git a/admin/src/main/java/io/modules/sys/excel/SysParamsExcel.java b/admin/src/main/java/io/modules/sys/excel/SysParamsExcel.java new file mode 100644 index 0000000..b769f15 --- /dev/null +++ b/admin/src/main/java/io/modules/sys/excel/SysParamsExcel.java @@ -0,0 +1,23 @@ + + +package io.modules.sys.excel; + +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +/** + * 参数管理 + * + + * @since 1.0.0 + */ +@Data +public class SysParamsExcel { + @ExcelProperty("参数编码") + private String paramCode; + @ExcelProperty("参数值") + private String paramValue; + @ExcelProperty("备注") + private String remark; + +} diff --git a/admin/src/main/java/io/modules/sys/excel/SysUserExcel.java b/admin/src/main/java/io/modules/sys/excel/SysUserExcel.java new file mode 100644 index 0000000..3661734 --- /dev/null +++ b/admin/src/main/java/io/modules/sys/excel/SysUserExcel.java @@ -0,0 +1,41 @@ + + +package io.modules.sys.excel; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.format.DateTimeFormat; +import io.modules.sys.excel.converter.GenderConverter; +import io.modules.sys.excel.converter.StatusConverter; +import lombok.Data; + +import java.util.Date; + +/** + * 用户管理 + * + + * @since 1.0.0 + */ +@Data +public class SysUserExcel { + @ExcelProperty("用户名") + private String username; + @ExcelProperty("姓名") + private String realName; + @ExcelProperty(value = "性别", converter = GenderConverter.class) + private Integer gender; + @ExcelProperty("邮箱") + private String email; + @ExcelProperty("手机号") + private String mobile; + @ExcelProperty("部门名称") + private String deptName; + @ExcelProperty(value = "状态", converter = StatusConverter.class) + private Integer status; + @ExcelProperty("备注") + private String remark; + @DateTimeFormat("yyyy-MM-dd HH:mm:ss") + @ExcelProperty("创建时间") + private Date createDate; + +} diff --git a/admin/src/main/java/io/modules/sys/excel/converter/GenderConverter.java b/admin/src/main/java/io/modules/sys/excel/converter/GenderConverter.java new file mode 100644 index 0000000..12beedf --- /dev/null +++ b/admin/src/main/java/io/modules/sys/excel/converter/GenderConverter.java @@ -0,0 +1,45 @@ +package io.modules.sys.excel.converter; + +import com.alibaba.excel.converters.Converter; +import com.alibaba.excel.enums.CellDataTypeEnum; +import com.alibaba.excel.metadata.GlobalConfiguration; +import com.alibaba.excel.metadata.data.ReadCellData; +import com.alibaba.excel.metadata.data.WriteCellData; +import com.alibaba.excel.metadata.property.ExcelContentProperty; + + +public class GenderConverter implements Converter { + + + @Override + public Class supportJavaTypeKey() { + return Integer.class; + } + + @Override + public CellDataTypeEnum supportExcelTypeKey() { + return CellDataTypeEnum.STRING; + } + + @Override + public Integer convertToJavaData(ReadCellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) { + if(cellData.getStringValue().equals("男")){ + return 0; + }else if(cellData.getStringValue().equals("女")){ + return 1; + }else { + return 2; + } + } + + @Override + public WriteCellData convertToExcelData(Integer value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) { + if(value == 0){ + return new WriteCellData<>("男"); + }else if(value == 1){ + return new WriteCellData<>("女"); + }else { + return new WriteCellData<>("保密"); + } + } +} diff --git a/admin/src/main/java/io/modules/sys/excel/converter/StatusConverter.java b/admin/src/main/java/io/modules/sys/excel/converter/StatusConverter.java new file mode 100644 index 0000000..6905dfd --- /dev/null +++ b/admin/src/main/java/io/modules/sys/excel/converter/StatusConverter.java @@ -0,0 +1,30 @@ +package io.modules.sys.excel.converter; + +import com.alibaba.excel.converters.Converter; +import com.alibaba.excel.enums.CellDataTypeEnum; +import com.alibaba.excel.metadata.GlobalConfiguration; +import com.alibaba.excel.metadata.data.ReadCellData; +import com.alibaba.excel.metadata.data.WriteCellData; +import com.alibaba.excel.metadata.property.ExcelContentProperty; + +public class StatusConverter implements Converter { + @Override + public Class supportJavaTypeKey() { + return Integer.class; + } + + @Override + public CellDataTypeEnum supportExcelTypeKey() { + return CellDataTypeEnum.STRING; + } + + @Override + public Integer convertToJavaData(ReadCellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) { + return cellData.getStringValue().equals("正常") ? 1 : 0; + } + + @Override + public WriteCellData convertToExcelData(Integer value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) { + return new WriteCellData<>(value == 1 ? "正常" : "停用"); + } +} diff --git a/admin/src/main/java/io/modules/sys/service/SysDeptService.java b/admin/src/main/java/io/modules/sys/service/SysDeptService.java new file mode 100644 index 0000000..28b7e1b --- /dev/null +++ b/admin/src/main/java/io/modules/sys/service/SysDeptService.java @@ -0,0 +1,34 @@ + + +package io.modules.sys.service; + +import io.common.service.BaseService; +import io.modules.sys.dto.SysDeptDTO; +import io.modules.sys.entity.SysDeptEntity; + +import java.util.List; +import java.util.Map; + +/** + * 部门管理 + * + + */ +public interface SysDeptService extends BaseService { + + List list(Map params); + + SysDeptDTO get(Long id); + + void save(SysDeptDTO dto); + + void update(SysDeptDTO dto); + + void delete(Long id); + + /** + * 根据部门ID,获取本部门及子部门ID列表 + * @param id 部门ID + */ + List getSubDeptIdList(Long id); +} diff --git a/admin/src/main/java/io/modules/sys/service/SysDictDataService.java b/admin/src/main/java/io/modules/sys/service/SysDictDataService.java new file mode 100644 index 0000000..0b87ce2 --- /dev/null +++ b/admin/src/main/java/io/modules/sys/service/SysDictDataService.java @@ -0,0 +1,29 @@ + + +package io.modules.sys.service; + +import io.common.page.PageData; +import io.common.service.BaseService; +import io.modules.sys.dto.SysDictDataDTO; +import io.modules.sys.entity.SysDictDataEntity; + +import java.util.Map; + +/** + * 数据字典 + * + + */ +public interface SysDictDataService extends BaseService { + + PageData page(Map params); + + SysDictDataDTO get(Long id); + + void save(SysDictDataDTO dto); + + void update(SysDictDataDTO dto); + + void delete(Long[] ids); + +} diff --git a/admin/src/main/java/io/modules/sys/service/SysDictTypeService.java b/admin/src/main/java/io/modules/sys/service/SysDictTypeService.java new file mode 100644 index 0000000..2d66bc6 --- /dev/null +++ b/admin/src/main/java/io/modules/sys/service/SysDictTypeService.java @@ -0,0 +1,36 @@ + + +package io.modules.sys.service; + +import io.common.page.PageData; +import io.common.service.BaseService; +import io.modules.sys.dto.SysDictTypeDTO; +import io.modules.sys.entity.DictType; +import io.modules.sys.entity.SysDictTypeEntity; + +import java.util.List; +import java.util.Map; + +/** + * 数据字典 + * + + */ +public interface SysDictTypeService extends BaseService { + + PageData page(Map params); + + SysDictTypeDTO get(Long id); + + void save(SysDictTypeDTO dto); + + void update(SysDictTypeDTO dto); + + void delete(Long[] ids); + + /** + * 获取所有字典 + */ + List getAllList(); + +} diff --git a/admin/src/main/java/io/modules/sys/service/SysMenuService.java b/admin/src/main/java/io/modules/sys/service/SysMenuService.java new file mode 100644 index 0000000..7ddaf1c --- /dev/null +++ b/admin/src/main/java/io/modules/sys/service/SysMenuService.java @@ -0,0 +1,48 @@ + + +package io.modules.sys.service; + +import io.modules.security.user.UserDetail; +import io.common.service.BaseService; +import io.modules.sys.dto.SysMenuDTO; +import io.modules.sys.entity.SysMenuEntity; + +import java.util.List; + + +/** + * 菜单管理 + * + + */ +public interface SysMenuService extends BaseService { + + SysMenuDTO get(Long id); + + void save(SysMenuDTO dto); + + void update(SysMenuDTO dto); + + void delete(Long id); + + /** + * 菜单列表 + * + * @param menuType 菜单类型 + */ + List getAllMenuList(Integer menuType); + + /** + * 用户菜单列表 + * + * @param user 用户 + * @param menuType 菜单类型 + */ + List getUserMenuList(UserDetail user, Integer menuType); + + /** + * 根据父菜单,查询子菜单 + * @param pid 父菜单ID + */ + List getListPid(Long pid); +} diff --git a/admin/src/main/java/io/modules/sys/service/SysParamsService.java b/admin/src/main/java/io/modules/sys/service/SysParamsService.java new file mode 100644 index 0000000..4d7ab63 --- /dev/null +++ b/admin/src/main/java/io/modules/sys/service/SysParamsService.java @@ -0,0 +1,50 @@ +package io.modules.sys.service; + +import io.common.page.PageData; +import io.common.service.BaseService; +import io.modules.sys.dto.SysParamsDTO; +import io.modules.sys.entity.SysParamsEntity; +import java.util.List; +import java.util.Map; + +/** + * 参数管理 + * + + * @since 1.0.0 + */ +public interface SysParamsService extends BaseService { + + PageData page(Map params); + + List list(Map params); + + SysParamsDTO get(Long id); + + void save(SysParamsDTO dto); + + void update(SysParamsDTO dto); + + void delete(Long[] ids); + + /** + * 根据参数编码,获取参数的value值 + * + * @param paramCode 参数编码 + */ + String getValue(String paramCode); + + /** + * 根据参数编码,获取value的Object对象 + * @param paramCode 参数编码 + * @param clazz Object对象 + */ + T getValueObject(String paramCode, Class clazz); + + /** + * 根据参数编码,更新value + * @param paramCode 参数编码 + * @param paramValue 参数值 + */ + int updateValueByCode(String paramCode, String paramValue); +} diff --git a/admin/src/main/java/io/modules/sys/service/SysRoleDataScopeService.java b/admin/src/main/java/io/modules/sys/service/SysRoleDataScopeService.java new file mode 100644 index 0000000..3e0345f --- /dev/null +++ b/admin/src/main/java/io/modules/sys/service/SysRoleDataScopeService.java @@ -0,0 +1,35 @@ + + +package io.modules.sys.service; + +import io.common.service.BaseService; +import io.modules.sys.entity.SysRoleDataScopeEntity; + +import java.util.List; + +/** + * 角色数据权限 + * + + * @since 1.0.0 + */ +public interface SysRoleDataScopeService extends BaseService { + + /** + * 根据角色ID,获取部门ID列表 + */ + List getDeptIdList(Long roleId); + + /** + * 保存或修改 + * @param roleId 角色ID + * @param deptIdList 部门ID列表 + */ + void saveOrUpdate(Long roleId, List deptIdList); + + /** + * 根据角色id,删除角色数据权限关系 + * @param roleId 角色ids + */ + void deleteByRoleIds(Long[] roleId); +} diff --git a/admin/src/main/java/io/modules/sys/service/SysRoleMenuService.java b/admin/src/main/java/io/modules/sys/service/SysRoleMenuService.java new file mode 100644 index 0000000..a4e411a --- /dev/null +++ b/admin/src/main/java/io/modules/sys/service/SysRoleMenuService.java @@ -0,0 +1,41 @@ + + +package io.modules.sys.service; + +import io.common.service.BaseService; +import io.modules.sys.entity.SysRoleMenuEntity; + +import java.util.List; + + +/** + * 角色与菜单对应关系 + * + + */ +public interface SysRoleMenuService extends BaseService { + + /** + * 根据角色ID,获取菜单ID列表 + */ + List getMenuIdList(Long roleId); + + /** + * 保存或修改 + * @param roleId 角色ID + * @param menuIdList 菜单ID列表 + */ + void saveOrUpdate(Long roleId, List menuIdList); + + /** + * 根据角色id,删除角色菜单关系 + * @param roleIds 角色ids + */ + void deleteByRoleIds(Long[] roleIds); + + /** + * 根据菜单id,删除角色菜单关系 + * @param menuId 菜单id + */ + void deleteByMenuId(Long menuId); +} diff --git a/admin/src/main/java/io/modules/sys/service/SysRoleService.java b/admin/src/main/java/io/modules/sys/service/SysRoleService.java new file mode 100644 index 0000000..8c97363 --- /dev/null +++ b/admin/src/main/java/io/modules/sys/service/SysRoleService.java @@ -0,0 +1,34 @@ + + +package io.modules.sys.service; + + +import io.common.page.PageData; +import io.common.service.BaseService; +import io.modules.sys.dto.SysRoleDTO; +import io.modules.sys.entity.SysRoleEntity; + +import java.util.List; +import java.util.Map; + + +/** + * 角色 + * + + */ +public interface SysRoleService extends BaseService { + + PageData page(Map params); + + List list(Map params); + + SysRoleDTO get(Long id); + + void save(SysRoleDTO dto); + + void update(SysRoleDTO dto); + + void delete(Long[] ids); + +} diff --git a/admin/src/main/java/io/modules/sys/service/SysRoleUserService.java b/admin/src/main/java/io/modules/sys/service/SysRoleUserService.java new file mode 100644 index 0000000..c714309 --- /dev/null +++ b/admin/src/main/java/io/modules/sys/service/SysRoleUserService.java @@ -0,0 +1,42 @@ + + +package io.modules.sys.service; + +import io.common.service.BaseService; +import io.modules.sys.entity.SysRoleUserEntity; + +import java.util.List; + +/** + * 角色用户关系 + * + + * @since 1.0.0 + */ +public interface SysRoleUserService extends BaseService { + + /** + * 保存或修改 + * @param userId 用户ID + * @param roleIdList 角色ID列表 + */ + void saveOrUpdate(Long userId, List roleIdList); + + /** + * 根据角色ids,删除角色用户关系 + * @param roleIds 角色ids + */ + void deleteByRoleIds(Long[] roleIds); + + /** + * 根据用户id,删除角色用户关系 + * @param userIds 用户ids + */ + void deleteByUserIds(Long[] userIds); + + /** + * 角色ID列表 + * @param userId 用户ID + */ + List getRoleIdList(Long userId); +} diff --git a/admin/src/main/java/io/modules/sys/service/SysUserService.java b/admin/src/main/java/io/modules/sys/service/SysUserService.java new file mode 100644 index 0000000..f094091 --- /dev/null +++ b/admin/src/main/java/io/modules/sys/service/SysUserService.java @@ -0,0 +1,52 @@ + + +package io.modules.sys.service; + +import io.common.page.PageData; +import io.common.service.BaseService; +import io.modules.sys.dto.SysUserDTO; +import io.modules.sys.entity.SysUserEntity; + +import java.util.List; +import java.util.Map; + + +/** + * 系统用户 + * + + */ +public interface SysUserService extends BaseService { + + PageData page(Map params); + + List list(Map params); + + SysUserDTO get(Long id); + + SysUserDTO getByUsername(String username); + + void save(SysUserDTO dto); + + void update(SysUserDTO dto); + + void delete(Long[] ids); + + /** + * 修改密码 + * @param id 用户ID + * @param newPassword 新密码 + */ + void updatePassword(Long id, String newPassword); + + /** + * 根据部门ID,查询用户数 + */ + int getCountByDeptId(Long deptId); + + /** + * 根据部门ID,查询用户Id列表 + */ + List getUserIdListByDeptId(List deptIdList); + +} diff --git a/admin/src/main/java/io/modules/sys/service/impl/SysDeptServiceImpl.java b/admin/src/main/java/io/modules/sys/service/impl/SysDeptServiceImpl.java new file mode 100644 index 0000000..c287160 --- /dev/null +++ b/admin/src/main/java/io/modules/sys/service/impl/SysDeptServiceImpl.java @@ -0,0 +1,160 @@ + + +package io.modules.sys.service.impl; + +import com.qiniu.util.StringUtils; +import io.modules.security.user.SecurityUser; +import io.modules.security.user.UserDetail; +import io.common.constant.Constant; +import io.common.exception.ErrorCode; +import io.common.exception.RenException; +import io.common.service.impl.BaseServiceImpl; +import io.common.utils.ConvertUtils; +import io.common.utils.TreeUtils; +import io.modules.sys.dao.SysDeptDao; +import io.modules.sys.dao.SysUserDao; +import io.modules.sys.dto.SysDeptDTO; +import io.modules.sys.entity.SysDeptEntity; +import io.modules.sys.enums.SuperAdminEnum; +import io.modules.sys.service.SysDeptService; +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + +@Service +@AllArgsConstructor +public class SysDeptServiceImpl extends BaseServiceImpl implements SysDeptService { + private final SysUserDao sysUserDao; + + @Override + public List list(Map params) { + //普通管理员,只能查询所属部门及子部门的数据 + UserDetail user = SecurityUser.getUser(); + if (user.getSuperAdmin() == SuperAdminEnum.NO.value()) { + params.put("deptIdList", getSubDeptIdList(user.getDeptId())); + } + + //查询部门列表 + List entityList = baseDao.getList(params); + + List dtoList = ConvertUtils.sourceToTarget(entityList, SysDeptDTO.class); + + return TreeUtils.build(dtoList); + } + + @Override + public SysDeptDTO get(Long id) { + //超级管理员,部门ID为null + if (id == null) { + return null; + } + + SysDeptEntity entity = baseDao.getById(id); + + return ConvertUtils.sourceToTarget(entity, SysDeptDTO.class); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void save(SysDeptDTO dto) { + SysDeptEntity entity = ConvertUtils.sourceToTarget(dto, SysDeptEntity.class); + + entity.setPids(getPidList(entity.getPid())); + insert(entity); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(SysDeptDTO dto) { + SysDeptEntity entity = ConvertUtils.sourceToTarget(dto, SysDeptEntity.class); + + //上级部门不能为自身 + if (entity.getId().equals(entity.getPid())) { + throw new RenException("上级部门不能为自身!"); + } + + //上级部门不能为下级部门 + List subDeptList = getSubDeptIdList(entity.getId()); + if (subDeptList.contains(entity.getPid())) { + throw new RenException("上级部门不能为下级部门"); + } + + entity.setPids(getPidList(entity.getPid())); + updateById(entity); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void delete(Long id) { + //判断是否有子部门 + List subList = getSubDeptIdList(id); + if (subList.size() > 1) { + throw new RenException("存在子部门!"); + } + + //判断部门下面是否有用户 + int count = sysUserDao.getCountByDeptId(id); + if (count > 0) { + throw new RenException("部门下面是有用户!"); + } + + //删除 + baseDao.deleteById(id); + } + + @Override + public List getSubDeptIdList(Long id) { + List deptIdList = baseDao.getSubDeptIdList("%" + id + "%"); + deptIdList.add(id); + + return deptIdList; + } + + /** + * 获取所有上级部门ID + * + * @param pid 上级ID + */ + private String getPidList(Long pid) { + //顶级部门,无上级部门 + if (Constant.DEPT_ROOT.equals(pid)) { + return Constant.DEPT_ROOT + ""; + } + + //所有部门的id、pid列表 + List deptList = baseDao.getIdAndPidList(); + + //list转map + Map map = new HashMap<>(deptList.size()); + for (SysDeptEntity entity : deptList) { + map.put(entity.getId(), entity); + } + + //递归查询所有上级部门ID列表 + List pidList = new ArrayList<>(); + getPidTree(pid, map, pidList); + + return StringUtils.join(pidList, ","); + } + + private void getPidTree(Long pid, Map map, List pidList) { + //顶级部门,无上级部门 + if (Constant.DEPT_ROOT.equals(pid)) { + return; + } + + //上级部门存在 + SysDeptEntity parent = map.get(pid); + if (parent != null) { + getPidTree(parent.getPid(), map, pidList); + } + + pidList.add(pid); + } +} diff --git a/admin/src/main/java/io/modules/sys/service/impl/SysDictDataServiceImpl.java b/admin/src/main/java/io/modules/sys/service/impl/SysDictDataServiceImpl.java new file mode 100644 index 0000000..2f5254c --- /dev/null +++ b/admin/src/main/java/io/modules/sys/service/impl/SysDictDataServiceImpl.java @@ -0,0 +1,82 @@ + + +package io.modules.sys.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import io.common.page.PageData; +import io.common.service.impl.BaseServiceImpl; +import io.common.utils.ConvertUtils; +import io.modules.sys.dao.SysDictDataDao; +import io.modules.sys.dto.SysDictDataDTO; +import io.modules.sys.entity.SysDictDataEntity; +import io.modules.sys.service.SysDictDataService; +import cn.hutool.core.util.StrUtil; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Arrays; +import java.util.Map; + +/** + * 字典类型 + * + + */ +@Service +public class SysDictDataServiceImpl extends BaseServiceImpl implements SysDictDataService { + + @Override + public PageData page(Map params) { + IPage page = baseDao.selectPage( + getPage(params, "sort", true), + getWrapper(params) + ); + + return getPageData(page, SysDictDataDTO.class); + } + + private QueryWrapper getWrapper(Map params){ + Long dictTypeId = Long.parseLong((String) params.get("dictTypeId")); + String dictLabel = (String) params.get("dictLabel"); + String dictValue = (String) params.get("dictValue"); + + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("dict_type_id", dictTypeId); + wrapper.like(StrUtil.isNotBlank(dictLabel), "dict_label", dictLabel); + wrapper.like(StrUtil.isNotBlank(dictValue), "dict_value", dictValue); + + return wrapper; + } + + @Override + public SysDictDataDTO get(Long id) { + SysDictDataEntity entity = baseDao.selectById(id); + + return ConvertUtils.sourceToTarget(entity, SysDictDataDTO.class); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void save(SysDictDataDTO dto) { + SysDictDataEntity entity = ConvertUtils.sourceToTarget(dto, SysDictDataEntity.class); + + insert(entity); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(SysDictDataDTO dto) { + SysDictDataEntity entity = ConvertUtils.sourceToTarget(dto, SysDictDataEntity.class); + + updateById(entity); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void delete(Long[] ids) { + //删除 + deleteBatchIds(Arrays.asList(ids)); + } + +} diff --git a/admin/src/main/java/io/modules/sys/service/impl/SysDictTypeServiceImpl.java b/admin/src/main/java/io/modules/sys/service/impl/SysDictTypeServiceImpl.java new file mode 100644 index 0000000..a45e4b1 --- /dev/null +++ b/admin/src/main/java/io/modules/sys/service/impl/SysDictTypeServiceImpl.java @@ -0,0 +1,101 @@ + + +package io.modules.sys.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import io.common.page.PageData; +import io.common.service.impl.BaseServiceImpl; +import io.common.utils.ConvertUtils; +import io.modules.sys.dao.SysDictDataDao; +import io.modules.sys.dao.SysDictTypeDao; +import io.modules.sys.dto.SysDictTypeDTO; +import io.modules.sys.entity.DictData; +import io.modules.sys.entity.DictType; +import io.modules.sys.entity.SysDictTypeEntity; +import io.modules.sys.service.SysDictTypeService; +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** + * 字典类型 + * + + */ +@Service +@AllArgsConstructor +public class SysDictTypeServiceImpl extends BaseServiceImpl implements SysDictTypeService { + private final SysDictDataDao sysDictDataDao; + + @Override + public PageData page(Map params) { + IPage page = baseDao.selectPage( + getPage(params, "sort", true), + getWrapper(params) + ); + + return getPageData(page, SysDictTypeDTO.class); + } + + private QueryWrapper getWrapper(Map params) { + String dictType = (String) params.get("dictType"); + String dictName = (String) params.get("dictName"); + + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.like(StrUtil.isNotBlank(dictType), "dict_type", dictType); + wrapper.like(StrUtil.isNotBlank(dictName), "dict_name", dictName); + + return wrapper; + } + + @Override + public SysDictTypeDTO get(Long id) { + SysDictTypeEntity entity = baseDao.selectById(id); + + return ConvertUtils.sourceToTarget(entity, SysDictTypeDTO.class); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void save(SysDictTypeDTO dto) { + SysDictTypeEntity entity = ConvertUtils.sourceToTarget(dto, SysDictTypeEntity.class); + + insert(entity); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(SysDictTypeDTO dto) { + SysDictTypeEntity entity = ConvertUtils.sourceToTarget(dto, SysDictTypeEntity.class); + + updateById(entity); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void delete(Long[] ids) { + //删除 + deleteBatchIds(Arrays.asList(ids)); + } + + @Override + public List getAllList() { + List typeList = baseDao.getDictTypeList(); + List dataList = sysDictDataDao.getDictDataList(); + for (DictType type : typeList) { + for (DictData data : dataList) { + if (type.getId().equals(data.getDictTypeId())) { + type.getDataList().add(data); + } + } + } + return typeList; + } + +} diff --git a/admin/src/main/java/io/modules/sys/service/impl/SysMenuServiceImpl.java b/admin/src/main/java/io/modules/sys/service/impl/SysMenuServiceImpl.java new file mode 100644 index 0000000..130797a --- /dev/null +++ b/admin/src/main/java/io/modules/sys/service/impl/SysMenuServiceImpl.java @@ -0,0 +1,102 @@ + + +package io.modules.sys.service.impl; + +import io.modules.security.user.UserDetail; +import io.common.constant.Constant; +import io.common.exception.ErrorCode; +import io.common.exception.RenException; +import io.common.service.impl.BaseServiceImpl; +import io.common.utils.ConvertUtils; +import io.common.utils.TreeUtils; +import io.modules.sys.dao.SysMenuDao; +import io.modules.sys.dto.SysMenuDTO; +import io.modules.sys.entity.SysMenuEntity; +import io.modules.sys.enums.SuperAdminEnum; +import io.modules.sys.service.SysMenuService; +import io.modules.sys.service.SysRoleMenuService; +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Service +@AllArgsConstructor +public class SysMenuServiceImpl extends BaseServiceImpl implements SysMenuService { + private final SysRoleMenuService sysRoleMenuService; + + @Override + public SysMenuDTO get(Long id) { + SysMenuEntity entity = baseDao.getById(id); + + SysMenuDTO dto = ConvertUtils.sourceToTarget(entity, SysMenuDTO.class); + + return dto; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void save(SysMenuDTO dto) { + SysMenuEntity entity = ConvertUtils.sourceToTarget(dto, SysMenuEntity.class); + + //保存菜单 + insert(entity); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(SysMenuDTO dto) { + SysMenuEntity entity = ConvertUtils.sourceToTarget(dto, SysMenuEntity.class); + + //上级菜单不能为自身 + if (entity.getId().equals(entity.getPid())) { + throw new RenException("上级菜单不能为自身!"); + } + + //更新菜单 + updateById(entity); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void delete(Long id) { + //删除菜单 + deleteById(id); + //删除角色菜单关系 + sysRoleMenuService.deleteByMenuId(id); + } + + @Override + public List getAllMenuList(Integer menuType) { + List menuList = baseDao.getMenuList(menuType); + + List dtoList = ConvertUtils.sourceToTarget(menuList, SysMenuDTO.class); + + return TreeUtils.build(dtoList, Constant.MENU_ROOT); + } + + @Override + public List getUserMenuList(UserDetail user, Integer menuType) { + List menuList; + + //系统管理员,拥有最高权限 + if (user.getSuperAdmin() == SuperAdminEnum.YES.value()) { + menuList = baseDao.getMenuList(menuType); + } else { + menuList = baseDao.getUserMenuList(user.getId(), menuType); + } + + List dtoList = ConvertUtils.sourceToTarget(menuList, SysMenuDTO.class); + + return TreeUtils.build(dtoList); + } + + @Override + public List getListPid(Long pid) { + List menuList = baseDao.getListPid(pid); + + return ConvertUtils.sourceToTarget(menuList, SysMenuDTO.class); + } + +} diff --git a/admin/src/main/java/io/modules/sys/service/impl/SysParamsServiceImpl.java b/admin/src/main/java/io/modules/sys/service/impl/SysParamsServiceImpl.java new file mode 100644 index 0000000..b86a8d7 --- /dev/null +++ b/admin/src/main/java/io/modules/sys/service/impl/SysParamsServiceImpl.java @@ -0,0 +1,123 @@ + + +package io.modules.sys.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import io.common.constant.Constant; +import io.common.exception.ErrorCode; +import io.common.exception.RenException; +import io.common.page.PageData; +import io.common.service.impl.BaseServiceImpl; +import io.common.utils.ConvertUtils; +import io.common.utils.JsonUtils; +import io.modules.sys.dao.SysParamsDao; +import io.modules.sys.dto.SysParamsDTO; +import io.modules.sys.entity.SysParamsEntity; +import io.modules.sys.service.SysParamsService; +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** + * 参数管理 + * + + * @since 1.0.0 + */ +@Service +@AllArgsConstructor +public class SysParamsServiceImpl extends BaseServiceImpl implements SysParamsService { + + + @Override + public PageData page(Map params) { + IPage page = baseDao.selectPage( + getPage(params, Constant.CREATE_DATE, false), + getWrapper(params) + ); + + return getPageData(page, SysParamsDTO.class); + } + + @Override + public List list(Map params) { + List entityList = baseDao.selectList(getWrapper(params)); + + return ConvertUtils.sourceToTarget(entityList, SysParamsDTO.class); + } + + private QueryWrapper getWrapper(Map params) { + String paramCode = (String) params.get("paramCode"); + + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("param_type", 1); + wrapper.like(StrUtil.isNotBlank(paramCode), "param_code", paramCode); + + return wrapper; + } + + @Override + public SysParamsDTO get(Long id) { + SysParamsEntity entity = baseDao.selectById(id); + + return ConvertUtils.sourceToTarget(entity, SysParamsDTO.class); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void save(SysParamsDTO dto) { + SysParamsEntity entity = ConvertUtils.sourceToTarget(dto, SysParamsEntity.class); + insert(entity); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(SysParamsDTO dto) { + SysParamsEntity entity = ConvertUtils.sourceToTarget(dto, SysParamsEntity.class); + updateById(entity); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void delete(Long[] ids) { + //删除Redis数据 + List paramCodeList = baseDao.getParamCodeList(ids); + String[] paramCodes = paramCodeList.toArray(new String[paramCodeList.size()]); + //删除 + deleteBatchIds(Arrays.asList(ids)); + } + + @Override + public String getValue(String paramCode) { + return null; + } + + + @Override + public T getValueObject(String paramCode, Class clazz) { + String paramValue = getValue(paramCode); + if (StrUtil.isNotBlank(paramValue)) { + return JsonUtils.parseObject(paramValue, clazz); + } + + try { + return clazz.newInstance(); + } catch (Exception e) { + throw new RenException("参数错误!"); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public int updateValueByCode(String paramCode, String paramValue) { + int count = baseDao.updateValueByCode(paramCode, paramValue); + return count; + } + +} diff --git a/admin/src/main/java/io/modules/sys/service/impl/SysRoleDataScopeServiceImpl.java b/admin/src/main/java/io/modules/sys/service/impl/SysRoleDataScopeServiceImpl.java new file mode 100644 index 0000000..1a3b2cd --- /dev/null +++ b/admin/src/main/java/io/modules/sys/service/impl/SysRoleDataScopeServiceImpl.java @@ -0,0 +1,56 @@ + + +package io.modules.sys.service.impl; + +import cn.hutool.core.collection.CollUtil; +import io.common.service.impl.BaseServiceImpl; +import io.modules.sys.dao.SysRoleDataScopeDao; +import io.modules.sys.entity.SysRoleDataScopeEntity; +import io.modules.sys.service.SysRoleDataScopeService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + * 角色数据权限 + * + + * @since 1.0.0 + */ +@Service +public class SysRoleDataScopeServiceImpl extends BaseServiceImpl + implements SysRoleDataScopeService { + + @Override + public List getDeptIdList(Long roleId) { + return baseDao.getDeptIdList(roleId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void saveOrUpdate(Long roleId, List deptIdList) { + //先删除角色数据权限关系 + deleteByRoleIds(new Long[]{roleId}); + + //角色没有一个数据权限的情况 + if(CollUtil.isEmpty(deptIdList)){ + return ; + } + + //保存角色数据权限关系 + for(Long deptId : deptIdList){ + SysRoleDataScopeEntity sysRoleDataScopeEntity = new SysRoleDataScopeEntity(); + sysRoleDataScopeEntity.setDeptId(deptId); + sysRoleDataScopeEntity.setRoleId(roleId); + + //保存 + insert(sysRoleDataScopeEntity); + } + } + + @Override + public void deleteByRoleIds(Long[] roleIds) { + baseDao.deleteByRoleIds(roleIds); + } +} diff --git a/admin/src/main/java/io/modules/sys/service/impl/SysRoleMenuServiceImpl.java b/admin/src/main/java/io/modules/sys/service/impl/SysRoleMenuServiceImpl.java new file mode 100644 index 0000000..a8c79cc --- /dev/null +++ b/admin/src/main/java/io/modules/sys/service/impl/SysRoleMenuServiceImpl.java @@ -0,0 +1,63 @@ + + +package io.modules.sys.service.impl; + +import cn.hutool.core.collection.CollUtil; +import io.common.service.impl.BaseServiceImpl; +import io.modules.sys.dao.SysRoleMenuDao; +import io.modules.sys.entity.SysRoleMenuEntity; +import io.modules.sys.service.SysRoleMenuService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + + +/** + * 角色与菜单对应关系 + * + + */ +@Service +public class SysRoleMenuServiceImpl extends BaseServiceImpl implements SysRoleMenuService { + + @Override + @Transactional(rollbackFor = Exception.class) + public void saveOrUpdate(Long roleId, List menuIdList) { + //先删除角色菜单关系 + deleteByRoleIds(new Long[]{roleId}); + + //角色没有一个菜单权限的情况 + if(CollUtil.isEmpty(menuIdList)){ + return ; + } + + //保存角色菜单关系 + for(Long menuId : menuIdList){ + SysRoleMenuEntity sysRoleMenuEntity = new SysRoleMenuEntity(); + sysRoleMenuEntity.setMenuId(menuId); + sysRoleMenuEntity.setRoleId(roleId); + + //保存 + insert(sysRoleMenuEntity); + } + } + + @Override + public List getMenuIdList(Long roleId){ + return baseDao.getMenuIdList(roleId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteByRoleIds(Long[] roleIds) { + baseDao.deleteByRoleIds(roleIds); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteByMenuId(Long menuId) { + baseDao.deleteByMenuId(menuId); + } + +} diff --git a/admin/src/main/java/io/modules/sys/service/impl/SysRoleServiceImpl.java b/admin/src/main/java/io/modules/sys/service/impl/SysRoleServiceImpl.java new file mode 100644 index 0000000..f4df18d --- /dev/null +++ b/admin/src/main/java/io/modules/sys/service/impl/SysRoleServiceImpl.java @@ -0,0 +1,126 @@ + + +package io.modules.sys.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import io.modules.security.user.SecurityUser; +import io.modules.security.user.UserDetail; +import io.modules.sys.service.*; +import io.common.constant.Constant; +import io.common.page.PageData; +import io.common.service.impl.BaseServiceImpl; +import io.common.utils.ConvertUtils; +import io.modules.sys.dao.SysRoleDao; +import io.modules.sys.dto.SysRoleDTO; +import io.modules.sys.entity.SysRoleEntity; +import io.modules.sys.enums.SuperAdminEnum; +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** + * 角色 + * + + */ +@Service +@AllArgsConstructor +public class SysRoleServiceImpl extends BaseServiceImpl implements SysRoleService { + private final SysRoleMenuService sysRoleMenuService; + private final SysRoleDataScopeService sysRoleDataScopeService; + private final SysRoleUserService sysRoleUserService; + private final SysDeptService sysDeptService; + + @Override + public PageData page(Map params) { + IPage page = baseDao.selectPage( + getPage(params, Constant.CREATE_DATE, false), + getWrapper(params) + ); + + return getPageData(page, SysRoleDTO.class); + } + + @Override + public List list(Map params) { + List entityList = baseDao.selectList(getWrapper(params)); + + return ConvertUtils.sourceToTarget(entityList, SysRoleDTO.class); + } + + private QueryWrapper getWrapper(Map params) { + String name = (String) params.get("name"); + + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.like(StrUtil.isNotBlank(name), "name", name); + + //普通管理员,只能查询所属部门及子部门的数据 + UserDetail user = SecurityUser.getUser(); + if (user.getSuperAdmin() == SuperAdminEnum.NO.value()) { + List deptIdList = sysDeptService.getSubDeptIdList(user.getDeptId()); + wrapper.in(deptIdList != null, "dept_id", deptIdList); + } + + return wrapper; + } + + @Override + public SysRoleDTO get(Long id) { + SysRoleEntity entity = baseDao.selectById(id); + + return ConvertUtils.sourceToTarget(entity, SysRoleDTO.class); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void save(SysRoleDTO dto) { + SysRoleEntity entity = ConvertUtils.sourceToTarget(dto, SysRoleEntity.class); + + //保存角色 + insert(entity); + + //保存角色菜单关系 + sysRoleMenuService.saveOrUpdate(entity.getId(), dto.getMenuIdList()); + + //保存角色数据权限关系 + sysRoleDataScopeService.saveOrUpdate(entity.getId(), dto.getDeptIdList()); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(SysRoleDTO dto) { + SysRoleEntity entity = ConvertUtils.sourceToTarget(dto, SysRoleEntity.class); + + //更新角色 + updateById(entity); + + //更新角色菜单关系 + sysRoleMenuService.saveOrUpdate(entity.getId(), dto.getMenuIdList()); + + //更新角色数据权限关系 + sysRoleDataScopeService.saveOrUpdate(entity.getId(), dto.getDeptIdList()); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void delete(Long[] ids) { + //删除角色 + baseDao.deleteBatchIds(Arrays.asList(ids)); + + //删除角色用户关系 + sysRoleUserService.deleteByRoleIds(ids); + + //删除角色菜单关系 + sysRoleMenuService.deleteByRoleIds(ids); + + //删除角色数据权限关系 + sysRoleDataScopeService.deleteByRoleIds(ids); + } + +} diff --git a/admin/src/main/java/io/modules/sys/service/impl/SysRoleUserServiceImpl.java b/admin/src/main/java/io/modules/sys/service/impl/SysRoleUserServiceImpl.java new file mode 100644 index 0000000..8dd1578 --- /dev/null +++ b/admin/src/main/java/io/modules/sys/service/impl/SysRoleUserServiceImpl.java @@ -0,0 +1,59 @@ + + +package io.modules.sys.service.impl; + +import cn.hutool.core.collection.CollUtil; +import io.common.service.impl.BaseServiceImpl; +import io.modules.sys.dao.SysRoleUserDao; +import io.modules.sys.entity.SysRoleUserEntity; +import io.modules.sys.service.SysRoleUserService; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 角色用户关系 + * + + * @since 1.0.0 + */ +@Service +public class SysRoleUserServiceImpl extends BaseServiceImpl implements SysRoleUserService { + + @Override + public void saveOrUpdate(Long userId, List roleIdList) { + //先删除角色用户关系 + deleteByUserIds(new Long[]{userId}); + + //用户没有一个角色权限的情况 + if(CollUtil.isEmpty(roleIdList)){ + return ; + } + + //保存角色用户关系 + for(Long roleId : roleIdList){ + SysRoleUserEntity sysRoleUserEntity = new SysRoleUserEntity(); + sysRoleUserEntity.setUserId(userId); + sysRoleUserEntity.setRoleId(roleId); + + //保存 + insert(sysRoleUserEntity); + } + } + + @Override + public void deleteByRoleIds(Long[] roleIds) { + baseDao.deleteByRoleIds(roleIds); + } + + @Override + public void deleteByUserIds(Long[] userIds) { + baseDao.deleteByUserIds(userIds); + } + + @Override + public List getRoleIdList(Long userId) { + + return baseDao.getRoleIdList(userId); + } +} diff --git a/admin/src/main/java/io/modules/sys/service/impl/SysUserServiceImpl.java b/admin/src/main/java/io/modules/sys/service/impl/SysUserServiceImpl.java new file mode 100644 index 0000000..b5baebc --- /dev/null +++ b/admin/src/main/java/io/modules/sys/service/impl/SysUserServiceImpl.java @@ -0,0 +1,151 @@ + + +package io.modules.sys.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.metadata.IPage; +import io.modules.security.password.PasswordUtils; +import io.modules.security.user.SecurityUser; +import io.modules.security.user.UserDetail; +import io.common.constant.Constant; +import io.common.page.PageData; +import io.common.service.impl.BaseServiceImpl; +import io.common.utils.ConvertUtils; +import io.modules.sys.dao.SysUserDao; +import io.modules.sys.dto.SysUserDTO; +import io.modules.sys.entity.SysUserEntity; +import io.modules.sys.enums.SuperAdminEnum; +import io.modules.sys.service.SysDeptService; +import io.modules.sys.service.SysRoleUserService; +import io.modules.sys.service.SysUserService; +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; + + +/** + * 系统用户 + * + + */ +@Service +@AllArgsConstructor +public class SysUserServiceImpl extends BaseServiceImpl implements SysUserService { + private final SysRoleUserService sysRoleUserService; + private final SysDeptService sysDeptService; + + @Override + public PageData page(Map params) { + //转换成like + paramsToLike(params, "username"); + + //分页 + IPage page = getPage(params, Constant.CREATE_DATE, false); + + //普通管理员,只能查询所属部门及子部门的数据 + UserDetail user = SecurityUser.getUser(); + if (user.getSuperAdmin() == SuperAdminEnum.NO.value()) { + params.put("deptIdList", sysDeptService.getSubDeptIdList(user.getDeptId())); + } + + //查询 + List list = baseDao.getList(params); + + return getPageData(list, page.getTotal(), SysUserDTO.class); + } + + @Override + public List list(Map params) { + //普通管理员,只能查询所属部门及子部门的数据 + UserDetail user = SecurityUser.getUser(); + if (user.getSuperAdmin() == SuperAdminEnum.NO.value()) { + params.put("deptIdList", sysDeptService.getSubDeptIdList(user.getDeptId())); + } + + List entityList = baseDao.getList(params); + + return ConvertUtils.sourceToTarget(entityList, SysUserDTO.class); + } + + @Override + public SysUserDTO get(Long id) { + SysUserEntity entity = baseDao.getById(id); + + return ConvertUtils.sourceToTarget(entity, SysUserDTO.class); + } + + @Override + public SysUserDTO getByUsername(String username) { + SysUserEntity entity = baseDao.getByUsername(username); + return ConvertUtils.sourceToTarget(entity, SysUserDTO.class); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void save(SysUserDTO dto) { + SysUserEntity entity = ConvertUtils.sourceToTarget(dto, SysUserEntity.class); + + //密码加密 + String password = PasswordUtils.encode(entity.getPassword()); + entity.setPassword(password); + + //保存用户 + entity.setSuperAdmin(SuperAdminEnum.NO.value()); + insert(entity); + + //保存角色用户关系 + sysRoleUserService.saveOrUpdate(entity.getId(), dto.getRoleIdList()); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(SysUserDTO dto) { + SysUserEntity entity = ConvertUtils.sourceToTarget(dto, SysUserEntity.class); + + //密码加密 + if (StrUtil.isBlank(dto.getPassword())) { + entity.setPassword(null); + } else { + String password = PasswordUtils.encode(entity.getPassword()); + entity.setPassword(password); + } + + //更新用户 + updateById(entity); + + //更新角色用户关系 + sysRoleUserService.saveOrUpdate(entity.getId(), dto.getRoleIdList()); + } + + @Override + public void delete(Long[] ids) { + //删除用户 + baseDao.deleteBatchIds(Arrays.asList(ids)); + + //删除角色用户关系 + sysRoleUserService.deleteByUserIds(ids); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updatePassword(Long id, String newPassword) { + newPassword = PasswordUtils.encode(newPassword); + + baseDao.updatePassword(id, newPassword); + } + + @Override + public int getCountByDeptId(Long deptId) { + return baseDao.getCountByDeptId(deptId); + } + + @Override + public List getUserIdListByDeptId(List deptIdList) { + return baseDao.getUserIdListByDeptId(deptIdList); + } + +} diff --git a/admin/src/main/resources/application-dev.yml b/admin/src/main/resources/application-dev.yml new file mode 100644 index 0000000..bbdf803 --- /dev/null +++ b/admin/src/main/resources/application-dev.yml @@ -0,0 +1,45 @@ +spring: + datasource: + druid: + #MySQL + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://localhost:33060/block_auth?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true + username: root + password: 123456 + initial-size: 10 + max-active: 100 + min-idle: 10 + max-wait: 6000 + pool-prepared-statements: true + max-pool-prepared-statement-per-connection-size: 20 + time-between-eviction-runs-millis: 60000 + min-evictable-idle-time-millis: 300000 + test-while-idle: true + test-on-borrow: false + test-on-return: false + stat-view-servlet: + enabled: true + url-pattern: /druid/* +#mybatis +mybatis-plus: + mapper-locations: classpath*:/mapper/**/*.xml + #实体扫描,多个package用逗号或者分号分隔 + typeAliasesPackage: io.modules.*.entity,io.modules.*.entity + global-config: + #数据库相关配置 + db-config: + #主键类型 + id-type: AUTO + banner: false + #原生配置 + configuration: + map-underscore-to-camel-case: true + cache-enabled: false + call-setters-on-nulls: true + jdbc-type-for-null: 'null' + configuration-properties: + prefix: + blobType: BLOB + boolValue: TRUE +upload: + url: http://localhost:18081/ diff --git a/admin/src/main/resources/application.yml b/admin/src/main/resources/application.yml new file mode 100644 index 0000000..6ab298b --- /dev/null +++ b/admin/src/main/resources/application.yml @@ -0,0 +1,57 @@ +# Tomcat +server: + tomcat: + uri-encoding: UTF-8 + threads: + max: 1000 + min-spare: 30 + port: 18080 + servlet: + context-path: / + session: + cookie: + http-only: true +knife4j: + enable: true + basic: + enable: false + username: admin + password: admin + setting: + enableFooter: false +spring: + # 环境 dev|test|prod + profiles: + active: dev + messages: + encoding: UTF-8 + basename: i18n/messages + mvc: + pathmatch: + matching-strategy: ANT_PATH_MATCHER + servlet: + multipart: + max-file-size: 100MB + max-request-size: 100MB + enabled: true +#mybatis +mybatis-plus: + mapper-locations: classpath*:/mapper/**/*.xml + #实体扫描,多个package用逗号或者分号分隔 + typeAliasesPackage: io.modules.*.entity + global-config: + #数据库相关配置 + db-config: + #主键类型 + id-type: AUTO + banner: false + #原生配置 + configuration: + map-underscore-to-camel-case: true + cache-enabled: false + call-setters-on-nulls: true + jdbc-type-for-null: 'null' + configuration-properties: + prefix: + blobType: BLOB + boolValue: TRUE diff --git a/admin/src/main/resources/logback-spring.xml b/admin/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..5deef21 --- /dev/null +++ b/admin/src/main/resources/logback-spring.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/admin/src/main/resources/mapper/job/ScheduleJobDao.xml b/admin/src/main/resources/mapper/job/ScheduleJobDao.xml new file mode 100644 index 0000000..b4c89e5 --- /dev/null +++ b/admin/src/main/resources/mapper/job/ScheduleJobDao.xml @@ -0,0 +1,14 @@ + + + + + + + + update schedule_job set status = #{status} where id in + + #{id} + + + + diff --git a/admin/src/main/resources/mapper/job/ScheduleJobLogDao.xml b/admin/src/main/resources/mapper/job/ScheduleJobLogDao.xml new file mode 100644 index 0000000..c4e6bf2 --- /dev/null +++ b/admin/src/main/resources/mapper/job/ScheduleJobLogDao.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/admin/src/main/resources/mapper/log/SysLogErrorDao.xml b/admin/src/main/resources/mapper/log/SysLogErrorDao.xml new file mode 100644 index 0000000..9f34750 --- /dev/null +++ b/admin/src/main/resources/mapper/log/SysLogErrorDao.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/admin/src/main/resources/mapper/log/SysLogLoginDao.xml b/admin/src/main/resources/mapper/log/SysLogLoginDao.xml new file mode 100644 index 0000000..e6af96a --- /dev/null +++ b/admin/src/main/resources/mapper/log/SysLogLoginDao.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/admin/src/main/resources/mapper/log/SysLogOperationDao.xml b/admin/src/main/resources/mapper/log/SysLogOperationDao.xml new file mode 100644 index 0000000..50c8f77 --- /dev/null +++ b/admin/src/main/resources/mapper/log/SysLogOperationDao.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/admin/src/main/resources/mapper/oss/SysOssDao.xml b/admin/src/main/resources/mapper/oss/SysOssDao.xml new file mode 100644 index 0000000..e0dd770 --- /dev/null +++ b/admin/src/main/resources/mapper/oss/SysOssDao.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/admin/src/main/resources/mapper/sys/CertificatesDao.xml b/admin/src/main/resources/mapper/sys/CertificatesDao.xml new file mode 100644 index 0000000..4153eb7 --- /dev/null +++ b/admin/src/main/resources/mapper/sys/CertificatesDao.xml @@ -0,0 +1,20 @@ + + + + + + + + + delete from sys_role_menu where role_id in + + #{roleId} + + + + + delete from sys_role_menu where menu_id = #{value} + + diff --git a/admin/src/main/resources/mapper/sys/SysDeptDao.xml b/admin/src/main/resources/mapper/sys/SysDeptDao.xml new file mode 100644 index 0000000..a2843f6 --- /dev/null +++ b/admin/src/main/resources/mapper/sys/SysDeptDao.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + diff --git a/admin/src/main/resources/mapper/sys/SysDictDataDao.xml b/admin/src/main/resources/mapper/sys/SysDictDataDao.xml new file mode 100644 index 0000000..462a873 --- /dev/null +++ b/admin/src/main/resources/mapper/sys/SysDictDataDao.xml @@ -0,0 +1,10 @@ + + + + + + + + diff --git a/admin/src/main/resources/mapper/sys/SysDictTypeDao.xml b/admin/src/main/resources/mapper/sys/SysDictTypeDao.xml new file mode 100644 index 0000000..eb1cb96 --- /dev/null +++ b/admin/src/main/resources/mapper/sys/SysDictTypeDao.xml @@ -0,0 +1,10 @@ + + + + + + + + diff --git a/admin/src/main/resources/mapper/sys/SysMenuDao.xml b/admin/src/main/resources/mapper/sys/SysMenuDao.xml new file mode 100644 index 0000000..aaf77bf --- /dev/null +++ b/admin/src/main/resources/mapper/sys/SysMenuDao.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + diff --git a/admin/src/main/resources/mapper/sys/SysParamsDao.xml b/admin/src/main/resources/mapper/sys/SysParamsDao.xml new file mode 100644 index 0000000..5aa3e34 --- /dev/null +++ b/admin/src/main/resources/mapper/sys/SysParamsDao.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + update sys_params set param_value = #{paramValue} where param_code = #{paramCode} + + diff --git a/admin/src/main/resources/mapper/sys/SysRoleDao.xml b/admin/src/main/resources/mapper/sys/SysRoleDao.xml new file mode 100644 index 0000000..a426338 --- /dev/null +++ b/admin/src/main/resources/mapper/sys/SysRoleDao.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/admin/src/main/resources/mapper/sys/SysRoleDataScopeDao.xml b/admin/src/main/resources/mapper/sys/SysRoleDataScopeDao.xml new file mode 100644 index 0000000..dced4b1 --- /dev/null +++ b/admin/src/main/resources/mapper/sys/SysRoleDataScopeDao.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + delete from sys_role_data_scope where role_id in + + #{roleId} + + + + diff --git a/admin/src/main/resources/mapper/sys/SysRoleUserDao.xml b/admin/src/main/resources/mapper/sys/SysRoleUserDao.xml new file mode 100644 index 0000000..df65177 --- /dev/null +++ b/admin/src/main/resources/mapper/sys/SysRoleUserDao.xml @@ -0,0 +1,24 @@ + + + + + + + delete from sys_role_user where role_id in + + #{roleId} + + + + + delete from sys_role_user where user_id in + + #{userId} + + + + + + diff --git a/admin/src/main/resources/mapper/sys/SysUserDao.xml b/admin/src/main/resources/mapper/sys/SysUserDao.xml new file mode 100644 index 0000000..da5bff6 --- /dev/null +++ b/admin/src/main/resources/mapper/sys/SysUserDao.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + update sys_user set password = #{newPassword} where id = #{id} + + + + + + + diff --git a/admin/src/main/resources/mapper/sys/SysUserTokenDao.xml b/admin/src/main/resources/mapper/sys/SysUserTokenDao.xml new file mode 100644 index 0000000..9ea898c --- /dev/null +++ b/admin/src/main/resources/mapper/sys/SysUserTokenDao.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + update sys_user_token set token = #{token} where user_id = #{userId} + + diff --git a/common/pom.xml b/common/pom.xml new file mode 100644 index 0000000..63394b8 --- /dev/null +++ b/common/pom.xml @@ -0,0 +1,16 @@ + + + io.renren + block-identity-auth + 5.4.0 + + 4.0.0 + common + jar + common + + + ${project.artifactId} + + + diff --git a/common/src/main/java/io/common/constant/Constant.java b/common/src/main/java/io/common/constant/Constant.java new file mode 100644 index 0000000..ac1bb87 --- /dev/null +++ b/common/src/main/java/io/common/constant/Constant.java @@ -0,0 +1,119 @@ +package io.common.constant; + +/** + * 常量 + * + + */ +public interface Constant { + /** + * 成功 + */ + int SUCCESS = 1; + /** + * 失败 + */ + int FAIL = 0; + /** + * 菜单根节点标识 + */ + Long MENU_ROOT = 0L; + /** + * 部门根节点标识 + */ + Long DEPT_ROOT = 0L; + /** + * 升序 + */ + String ASC = "asc"; + /** + * 降序 + */ + String DESC = "desc"; + /** + * 创建时间字段名 + */ + String CREATE_DATE = "create_date"; + + /** + * 数据权限过滤 + */ + String SQL_FILTER = "sqlFilter"; + /** + * 当前页码 + */ + String PAGE = "page"; + /** + * 每页显示记录数 + */ + String LIMIT = "limit"; + /** + * 排序字段 + */ + String ORDER_FIELD = "orderField"; + /** + * 排序方式 + */ + String ORDER = "order"; + /** + * token header + */ + String TOKEN_HEADER = "token"; + + /** + * 云存储配置KEY + */ + String CLOUD_STORAGE_CONFIG_KEY = "CLOUD_STORAGE_CONFIG_KEY"; + + /** + * 定时任务状态 + */ + enum ScheduleStatus { + /** + * 暂停 + */ + PAUSE(0), + /** + * 正常 + */ + NORMAL(1); + + private int value; + + ScheduleStatus(int value) { + this.value = value; + } + + public int getValue() { + return value; + } + } + + /** + * 云服务商 + */ + enum CloudService { + /** + * 七牛云 + */ + QINIU(1), + /** + * 阿里云 + */ + ALIYUN(2), + /** + * 腾讯云 + */ + QCLOUD(3); + + private int value; + + CloudService(int value) { + this.value = value; + } + + public int getValue() { + return value; + } + } +} diff --git a/common/src/main/java/io/common/convert/DateConverter.java b/common/src/main/java/io/common/convert/DateConverter.java new file mode 100644 index 0000000..00b75e6 --- /dev/null +++ b/common/src/main/java/io/common/convert/DateConverter.java @@ -0,0 +1,70 @@ +package io.common.convert; + +import cn.hutool.core.util.StrUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.core.convert.converter.Converter; +import org.springframework.stereotype.Component; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * 日期转换 + */ +@Component +public class DateConverter implements Converter { + private static final Logger logger = LoggerFactory.getLogger(DateConverter.class); + private static final List formatList = new ArrayList<>(5); + + static { + formatList.add("yyyy-MM"); + formatList.add("yyyy-MM-dd"); + formatList.add("yyyy-MM-dd HH:mm"); + formatList.add("yyyy-MM-dd HH:mm:ss"); + formatList.add("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + } + + @Override + public Date convert(String source) { + String value = source.trim(); + if (StrUtil.isEmpty(value)) { + return null; + } + + if (source.matches("^\\d{4}-\\d{1,2}$")) { + return parseDate(source, formatList.get(0)); + } else if (source.matches("^\\d{4}-\\d{1,2}-\\d{1,2}$")) { + return parseDate(source, formatList.get(1)); + } else if (source.matches("^\\d{4}-\\d{1,2}-\\d{1,2} {1}\\d{1,2}:\\d{1,2}$")) { + return parseDate(source, formatList.get(2)); + } else if (source.matches("^\\d{4}-\\d{1,2}-\\d{1,2} {1}\\d{1,2}:\\d{1,2}:\\d{1,2}$")) { + return parseDate(source, formatList.get(3)); + } else if (source.matches("^\\d{4}-\\d{1,2}-\\d{1,2}.*T.*\\d{1,2}:\\d{1,2}:\\d{1,2}.*..*$")) { + return parseDate(source, formatList.get(4)); + } else { + throw new IllegalArgumentException("Invalid boolean value '" + source + "'"); + } + } + + /** + * 格式化日期 + * @param dateStr String 字符型日期 + * @param format String 格式 + * @return Date 日期 + */ + public Date parseDate(String dateStr, String format) { + Date date = null; + try { + DateFormat dateFormat = new SimpleDateFormat(format); + date = dateFormat.parse(dateStr); + } catch (Exception e) { + logger.error("Formatted date with date: {} and format : {} ", dateStr, format); + } + return date; + } + +} diff --git a/common/src/main/java/io/common/dao/BaseDao.java b/common/src/main/java/io/common/dao/BaseDao.java new file mode 100644 index 0000000..97eda60 --- /dev/null +++ b/common/src/main/java/io/common/dao/BaseDao.java @@ -0,0 +1,10 @@ +package io.common.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * 基础Dao + */ +public interface BaseDao extends BaseMapper { + +} diff --git a/common/src/main/java/io/common/entity/BaseEntity.java b/common/src/main/java/io/common/entity/BaseEntity.java new file mode 100644 index 0000000..afbce8b --- /dev/null +++ b/common/src/main/java/io/common/entity/BaseEntity.java @@ -0,0 +1,33 @@ + + +package io.common.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 基础实体类,所有实体都需要继承 + */ +@Data +public abstract class BaseEntity implements Serializable { + /** + * id + */ + @TableId + private Long id; + /** + * 创建者 + */ + @TableField(fill = FieldFill.INSERT) + private Long creator; + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + private Date createDate; +} diff --git a/common/src/main/java/io/common/exception/ErrorCode.java b/common/src/main/java/io/common/exception/ErrorCode.java new file mode 100644 index 0000000..6f6705e --- /dev/null +++ b/common/src/main/java/io/common/exception/ErrorCode.java @@ -0,0 +1,14 @@ +package io.common.exception; + +/** + * 错误编码,由5位数字组成,前2位为模块编码,后3位为业务编码 + *

+ * 如:10001(10代表系统模块,001代表业务代码) + *

+ */ +public interface ErrorCode { + int INTERNAL_SERVER_ERROR = 500; + int UNAUTHORIZED = 401; + int NOT_NULL = 500; + +} diff --git a/common/src/main/java/io/common/exception/ExceptionUtils.java b/common/src/main/java/io/common/exception/ExceptionUtils.java new file mode 100644 index 0000000..0d5165f --- /dev/null +++ b/common/src/main/java/io/common/exception/ExceptionUtils.java @@ -0,0 +1,43 @@ +package io.common.exception; + +import java.io.IOException; +import java.io.PrintWriter; +import java.io.StringWriter; + +/** + * Exception工具类 + */ +public class ExceptionUtils { + + /** + * 获取异常信息 + * @param ex 异常 + * @return 返回异常信息 + */ + public static String getErrorStackTrace(Exception ex){ + StringWriter sw = null; + PrintWriter pw = null; + try { + sw = new StringWriter(); + pw = new PrintWriter(sw, true); + ex.printStackTrace(pw); + }finally { + try { + if(pw != null) { + pw.close(); + } + } catch (Exception e) { + + } + try { + if(sw != null) { + sw.close(); + } + } catch (IOException e) { + + } + } + + return sw.toString(); + } +} diff --git a/common/src/main/java/io/common/exception/RenException.java b/common/src/main/java/io/common/exception/RenException.java new file mode 100644 index 0000000..9bc2035 --- /dev/null +++ b/common/src/main/java/io/common/exception/RenException.java @@ -0,0 +1,46 @@ +package io.common.exception; + +import java.util.Arrays; + +/** + * 自定义异常 + * + */ +public class RenException extends RuntimeException { + private static final long serialVersionUID = 1L; + + private int code; + private String msg; + + public RenException(int code, String... params) { + this.code = code; + this.msg = Arrays.toString(params); + } + + public RenException(String msg) { + super(msg); + this.code = 500; + this.msg = msg; + } + + public RenException(String msg, Throwable e) { + super(msg, e); + this.code = ErrorCode.INTERNAL_SERVER_ERROR; + this.msg = msg; + } + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + public int getCode() { + return code; + } + public void setCode(int code) { + this.code = code; + } + +} diff --git a/common/src/main/java/io/common/page/PageData.java b/common/src/main/java/io/common/page/PageData.java new file mode 100644 index 0000000..0cd8287 --- /dev/null +++ b/common/src/main/java/io/common/page/PageData.java @@ -0,0 +1,32 @@ +package io.common.page; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * 分页工具类 + */ +@Data +@Schema(title = "分页数据") +public class PageData implements Serializable { + private static final long serialVersionUID = 1L; + + @Schema(title = "总记录数") + private int total; + + @Schema(title = "列表数据") + private List list; + + /** + * 分页 + * @param list 列表数据 + * @param total 总记录数 + */ + public PageData(List list, long total) { + this.list = list; + this.total = (int)total; + } +} diff --git a/common/src/main/java/io/common/service/BaseService.java b/common/src/main/java/io/common/service/BaseService.java new file mode 100644 index 0000000..67a4ed5 --- /dev/null +++ b/common/src/main/java/io/common/service/BaseService.java @@ -0,0 +1,106 @@ +package io.common.service; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; + +import java.io.Serializable; +import java.util.Collection; + +/** + * 基础服务接口,所有Service接口都要继承 + */ +public interface BaseService { + Class currentModelClass(); + + /** + *

+ * 插入一条记录(选择字段,策略插入) + *

+ * + * @param entity 实体对象 + */ + boolean insert(T entity); + + /** + *

+ * 插入(批量),该方法不支持 Oracle、SQL Server + *

+ * + * @param entityList 实体对象集合 + */ + boolean insertBatch(Collection entityList); + + /** + *

+ * 插入(批量),该方法不支持 Oracle、SQL Server + *

+ * + * @param entityList 实体对象集合 + * @param batchSize 插入批次数量 + */ + boolean insertBatch(Collection entityList, int batchSize); + + /** + *

+ * 根据 ID 选择修改 + *

+ * + * @param entity 实体对象 + */ + boolean updateById(T entity); + + /** + *

+ * 根据 whereEntity 条件,更新记录 + *

+ * + * @param entity 实体对象 + * @param updateWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper} + */ + boolean update(T entity, Wrapper updateWrapper); + + /** + *

+ * 根据ID 批量更新 + *

+ * + * @param entityList 实体对象集合 + */ + boolean updateBatchById(Collection entityList); + + /** + *

+ * 根据ID 批量更新 + *

+ * + * @param entityList 实体对象集合 + * @param batchSize 更新批次数量 + */ + boolean updateBatchById(Collection entityList, int batchSize); + + /** + *

+ * 根据 ID 查询 + *

+ * + * @param id 主键ID + */ + T selectById(Serializable id); + + /** + *

+ * 根据 ID 删除 + *

+ * + * @param id 主键ID + */ + boolean deleteById(Serializable id); + + /** + *

+ * 删除(根据ID 批量删除) + *

+ * + * @param idList 主键ID列表 + */ + boolean deleteBatchIds(Collection idList); +} diff --git a/common/src/main/java/io/common/service/CrudService.java b/common/src/main/java/io/common/service/CrudService.java new file mode 100644 index 0000000..05836b8 --- /dev/null +++ b/common/src/main/java/io/common/service/CrudService.java @@ -0,0 +1,25 @@ +package io.common.service; + +import io.common.page.PageData; + +import java.util.List; +import java.util.Map; + +/** + * CRUD基础服务接口 + */ +public interface CrudService extends BaseService { + + PageData page(Map params); + + List list(Map params); + + D get(Long id); + + void save(D dto); + + void update(D dto); + + void delete(Long[] ids); + +} diff --git a/common/src/main/java/io/common/service/impl/BaseServiceImpl.java b/common/src/main/java/io/common/service/impl/BaseServiceImpl.java new file mode 100644 index 0000000..e10a7ea --- /dev/null +++ b/common/src/main/java/io/common/service/impl/BaseServiceImpl.java @@ -0,0 +1,213 @@ + + +package io.common.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.enums.SqlMethod; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.metadata.OrderItem; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.core.toolkit.ReflectionKit; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.toolkit.SqlHelper; +import io.common.constant.Constant; +import io.common.page.PageData; +import io.common.service.BaseService; +import io.common.utils.ConvertUtils; +import org.apache.ibatis.binding.MapperMethod; +import org.apache.ibatis.logging.Log; +import org.apache.ibatis.logging.LogFactory; +import org.apache.ibatis.session.SqlSession; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; + +import java.io.Serializable; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.function.BiConsumer; + +/** + * 基础服务类,所有Service都要继承 + * + + */ +public abstract class BaseServiceImpl, T> implements BaseService { + @Autowired + protected M baseDao; + protected Log log = LogFactory.getLog(getClass()); + + /** + * 获取分页对象 + * @param params 分页查询参数 + * @param defaultOrderField 默认排序字段 + * @param isAsc 排序方式 + */ + protected IPage getPage(Map params, String defaultOrderField, boolean isAsc) { + //分页参数 + long curPage = 1; + long limit = 10; + + if (params.get(Constant.PAGE) != null) { + curPage = Long.parseLong((String) params.get(Constant.PAGE)); + } + if (params.get(Constant.LIMIT) != null) { + limit = Long.parseLong((String) params.get(Constant.LIMIT)); + } + + //分页对象 + Page page = new Page<>(curPage, limit); + + //分页参数 + params.put(Constant.PAGE, page); + + //排序字段 + String orderField = (String) params.get(Constant.ORDER_FIELD); + String order = (String) params.get(Constant.ORDER); + + //前端字段排序 + if (StrUtil.isNotBlank(orderField) && StrUtil.isNotBlank(order)) { + if (Constant.ASC.equalsIgnoreCase(order)) { + return page.addOrder(OrderItem.asc(orderField)); + } else { + return page.addOrder(OrderItem.desc(orderField)); + } + } + + //没有排序字段,则不排序 + if (StrUtil.isBlank(defaultOrderField)) { + return page; + } + + //默认排序 + if (isAsc) { + page.addOrder(OrderItem.asc(defaultOrderField)); + } else { + page.addOrder(OrderItem.desc(defaultOrderField)); + } + + return page; + } + + protected PageData getPageData(List list, long total, Class target) { + List targetList = ConvertUtils.sourceToTarget(list, target); + + return new PageData<>(targetList, total); + } + + protected PageData getPageData(IPage page, Class target) { + return getPageData(page.getRecords(), page.getTotal(), target); + } + + protected void paramsToLike(Map params, String... likes) { + for (String like : likes) { + String val = (String) params.get(like); + if (StrUtil.isNotBlank(val)) { + params.put(like, "%" + val + "%"); + } else { + params.put(like, null); + } + } + } + + /** + *

+ * 判断数据库操作是否成功 + *

+ *

+ * 注意!! 该方法为 Integer 判断,不可传入 int 基本类型 + *

+ * + * @param result 数据库操作返回影响条数 + * @return boolean + */ + protected static boolean retBool(Integer result) { + return SqlHelper.retBool(result); + } + + protected Class currentMapperClass() { + return (Class) ReflectionKit.getSuperClassGenericType(this.getClass(), BaseServiceImpl.class, 0); + } + + @Override + public Class currentModelClass() { + return (Class) ReflectionKit.getSuperClassGenericType(this.getClass(), BaseServiceImpl.class, 1); + } + + protected String getSqlStatement(SqlMethod sqlMethod) { + return SqlHelper.getSqlStatement(this.currentMapperClass(), sqlMethod); + } + + @Override + public boolean insert(T entity) { + return BaseServiceImpl.retBool(baseDao.insert(entity)); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean insertBatch(Collection entityList) { + return insertBatch(entityList, 100); + } + + /** + * 批量插入 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public boolean insertBatch(Collection entityList, int batchSize) { + String sqlStatement = getSqlStatement(SqlMethod.INSERT_ONE); + return executeBatch(entityList, batchSize, (sqlSession, entity) -> sqlSession.insert(sqlStatement, entity)); + } + + /** + * 执行批量操作 + */ + protected boolean executeBatch(Collection list, int batchSize, BiConsumer consumer) { + return SqlHelper.executeBatch(this.currentModelClass(), this.log, list, batchSize, consumer); + } + + + @Override + public boolean updateById(T entity) { + return BaseServiceImpl.retBool(baseDao.updateById(entity)); + } + + @Override + public boolean update(T entity, Wrapper updateWrapper) { + return BaseServiceImpl.retBool(baseDao.update(entity, updateWrapper)); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean updateBatchById(Collection entityList) { + return updateBatchById(entityList, 30); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean updateBatchById(Collection entityList, int batchSize) { + String sqlStatement = getSqlStatement(SqlMethod.UPDATE_BY_ID); + return executeBatch(entityList, batchSize, (sqlSession, entity) -> { + MapperMethod.ParamMap param = new MapperMethod.ParamMap<>(); + param.put(Constants.ENTITY, entity); + sqlSession.update(sqlStatement, param); + }); + } + + @Override + public T selectById(Serializable id) { + return baseDao.selectById(id); + } + + @Override + public boolean deleteById(Serializable id) { + return SqlHelper.retBool(baseDao.deleteById(id)); + } + + @Override + public boolean deleteBatchIds(Collection idList) { + return SqlHelper.retBool(baseDao.deleteBatchIds(idList)); + } +} diff --git a/common/src/main/java/io/common/service/impl/CrudServiceImpl.java b/common/src/main/java/io/common/service/impl/CrudServiceImpl.java new file mode 100644 index 0000000..e1822ee --- /dev/null +++ b/common/src/main/java/io/common/service/impl/CrudServiceImpl.java @@ -0,0 +1,74 @@ + + +package io.common.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.ReflectionKit; +import io.common.page.PageData; +import io.common.service.CrudService; +import io.common.utils.ConvertUtils; +import org.springframework.beans.BeanUtils; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** + * CRUD基础服务类 + * + + */ +public abstract class CrudServiceImpl, T, D> extends BaseServiceImpl implements CrudService { + + protected Class currentDtoClass() { + return (Class)ReflectionKit.getSuperClassGenericType(getClass(), CrudServiceImpl.class, 2); + } + + @Override + public PageData page(Map params) { + IPage page = baseDao.selectPage( + getPage(params, null, false), + getWrapper(params) + ); + + return getPageData(page, currentDtoClass()); + } + + @Override + public List list(Map params) { + List entityList = baseDao.selectList(getWrapper(params)); + + return ConvertUtils.sourceToTarget(entityList, currentDtoClass()); + } + + public abstract QueryWrapper getWrapper(Map params); + + @Override + public D get(Long id) { + T entity = baseDao.selectById(id); + + return ConvertUtils.sourceToTarget(entity, currentDtoClass()); + } + + @Override + public void save(D dto) { + T entity = ConvertUtils.sourceToTarget(dto, currentModelClass()); + insert(entity); + + //copy主键值到dto + BeanUtils.copyProperties(entity, dto); + } + + @Override + public void update(D dto) { + T entity = ConvertUtils.sourceToTarget(dto, currentModelClass()); + updateById(entity); + } + + @Override + public void delete(Long[] ids) { + baseDao.deleteBatchIds(Arrays.asList(ids)); + } +} diff --git a/common/src/main/java/io/common/utils/ConvertUtils.java b/common/src/main/java/io/common/utils/ConvertUtils.java new file mode 100644 index 0000000..f6f30ef --- /dev/null +++ b/common/src/main/java/io/common/utils/ConvertUtils.java @@ -0,0 +1,69 @@ +package io.common.utils; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +/** + * 转换工具类 + * + */ +public class ConvertUtils { + + private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class); + + public static T sourceToTarget(Object source, Class target){ + if(source == null){ + return null; + } + T targetObject = null; + try { + targetObject = target.newInstance(); + BeanUtils.copyProperties(source, targetObject); + } catch (Exception e) { + logger.error("convert error ", e); + } + + return targetObject; + } + + public static List sourceToTarget(Collection sourceList, Class target){ + if(sourceList == null){ + return null; + } + + List targetList = new ArrayList<>(sourceList.size()); + try { + for(Object source : sourceList){ + T targetObject = target.newInstance(); + BeanUtils.copyProperties(source, targetObject); + targetList.add(targetObject); + } + }catch (Exception e){ + logger.error("convert error ", e); + } + + return targetList; + } + + + /** + * 拼接域名 + */ + public static String appendDomain(String img){ + String path = "https://bs.oss.xunyingcloud.cn/upload/"; + if(img == null ){ + return null; + } + if (img.contains("http")) { + return img; + } + return path + img; + } + + +} diff --git a/common/src/main/java/io/common/utils/DateUtils.java b/common/src/main/java/io/common/utils/DateUtils.java new file mode 100644 index 0000000..0c8de70 --- /dev/null +++ b/common/src/main/java/io/common/utils/DateUtils.java @@ -0,0 +1,55 @@ +package io.common.utils; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + * 日期处理 + * + + */ +public class DateUtils { + /** 时间格式(yyyy-MM-dd) */ + public final static String DATE_PATTERN = "yyyy-MM-dd"; + /** 时间格式(yyyy-MM-dd HH:mm:ss) */ + public final static String DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss"; + + /** + * 日期格式化 日期格式为:yyyy-MM-dd + * @param date 日期 + * @return 返回yyyy-MM-dd格式日期 + */ + public static String format(Date date) { + return format(date, DATE_PATTERN); + } + + /** + * 日期格式化 日期格式为:yyyy-MM-dd + * @param date 日期 + * @param pattern 格式,如:DateUtils.DATE_TIME_PATTERN + * @return 返回yyyy-MM-dd格式日期 + */ + public static String format(Date date, String pattern) { + if (date != null) { + SimpleDateFormat df = new SimpleDateFormat(pattern); + return df.format(date); + } + return null; + } + + /** + * 日期解析 + * @param date 日期 + * @param pattern 格式,如:DateUtils.DATE_TIME_PATTERN + * @return 返回Date + */ + public static Date parse(String date, String pattern) { + try { + return new SimpleDateFormat(pattern).parse(date); + } catch (ParseException e) { + e.printStackTrace(); + } + return null; + } +} diff --git a/common/src/main/java/io/common/utils/HttpContextUtils.java b/common/src/main/java/io/common/utils/HttpContextUtils.java new file mode 100644 index 0000000..b52b073 --- /dev/null +++ b/common/src/main/java/io/common/utils/HttpContextUtils.java @@ -0,0 +1,55 @@ +package io.common.utils; + +import cn.hutool.core.util.StrUtil; +import jakarta.servlet.http.HttpServletRequest; +import org.springframework.http.HttpHeaders; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import java.util.Enumeration; +import java.util.HashMap; +import java.util.Map; + +/** + * Http + * + + */ +public class HttpContextUtils { + + public static HttpServletRequest getHttpServletRequest() { + RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); + if(requestAttributes == null){ + return null; + } + + return ((ServletRequestAttributes) requestAttributes).getRequest(); + } + + public static Map getParameterMap(HttpServletRequest request) { + Enumeration parameters = request.getParameterNames(); + + Map params = new HashMap<>(); + while (parameters.hasMoreElements()) { + String parameter = parameters.nextElement(); + String value = request.getParameter(parameter); + if (StrUtil.isNotBlank(value)) { + params.put(parameter, value); + } + } + + return params; + } + + public static String getDomain(){ + HttpServletRequest request = getHttpServletRequest(); + StringBuffer url = request.getRequestURL(); + return url.delete(url.length() - request.getRequestURI().length(), url.length()).toString(); + } + + public static String getOrigin(){ + HttpServletRequest request = getHttpServletRequest(); + return request.getHeader(HttpHeaders.ORIGIN); + } +} diff --git a/common/src/main/java/io/common/utils/IpUtils.java b/common/src/main/java/io/common/utils/IpUtils.java new file mode 100644 index 0000000..18d2f5c --- /dev/null +++ b/common/src/main/java/io/common/utils/IpUtils.java @@ -0,0 +1,50 @@ +package io.common.utils; + +import cn.hutool.core.util.StrUtil; +import jakarta.servlet.http.HttpServletRequest; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +/** + * IP地址 + * + + */ +public class IpUtils { + private static Logger logger = LoggerFactory.getLogger(IpUtils.class); + + /** + * 获取IP地址 + * + * 使用Nginx等反向代理软件, 则不能通过request.getRemoteAddr()获取IP地址 + * 如果使用了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP地址,X-Forwarded-For中第一个非unknown的有效IP字符串,则为真实IP地址 + */ + public static String getIpAddr(HttpServletRequest request) { + String unknown = "unknown"; + String ip = null; + try { + ip = request.getHeader("x-forwarded-for"); + if (StrUtil.isEmpty(ip) || unknown.equalsIgnoreCase(ip)) { + ip = request.getHeader("Proxy-Client-IP"); + } + if (StrUtil.isEmpty(ip) || ip.length() == 0 || unknown.equalsIgnoreCase(ip)) { + ip = request.getHeader("WL-Proxy-Client-IP"); + } + if (StrUtil.isEmpty(ip) || unknown.equalsIgnoreCase(ip)) { + ip = request.getHeader("HTTP_CLIENT_IP"); + } + if (StrUtil.isEmpty(ip) || unknown.equalsIgnoreCase(ip)) { + ip = request.getHeader("HTTP_X_FORWARDED_FOR"); + } + if (StrUtil.isEmpty(ip) || unknown.equalsIgnoreCase(ip)) { + ip = request.getRemoteAddr(); + } + } catch (Exception e) { + logger.error("IPUtils ERROR ", e); + } + + return ip; + } + +} diff --git a/common/src/main/java/io/common/utils/JsonUtils.java b/common/src/main/java/io/common/utils/JsonUtils.java new file mode 100644 index 0000000..8e03106 --- /dev/null +++ b/common/src/main/java/io/common/utils/JsonUtils.java @@ -0,0 +1,68 @@ +package io.common.utils; + +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.StrUtil; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; + +import java.util.ArrayList; +import java.util.List; + +/** + * JSON 工具类 + * + + */ +public class JsonUtils { + private static final ObjectMapper objectMapper = new ObjectMapper(); + + public static String toJsonString(Object object) { + try { + return objectMapper.writeValueAsString(object); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + public static T parseObject(String text, Class clazz) { + if (StrUtil.isEmpty(text)) { + return null; + } + try { + return objectMapper.readValue(text, clazz); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + public static T parseObject(byte[] bytes, Class clazz) { + if (ArrayUtil.isEmpty(bytes)) { + return null; + } + try { + return objectMapper.readValue(bytes, clazz); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + public static T parseObject(String text, TypeReference typeReference) { + try { + return objectMapper.readValue(text, typeReference); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + public static List parseArray(String text, Class clazz) { + if (StrUtil.isEmpty(text)) { + return new ArrayList<>(); + } + try { + return objectMapper.readValue(text, objectMapper.getTypeFactory().constructCollectionType(List.class, clazz)); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + +} diff --git a/common/src/main/java/io/common/utils/Result.java b/common/src/main/java/io/common/utils/Result.java new file mode 100644 index 0000000..58491cc --- /dev/null +++ b/common/src/main/java/io/common/utils/Result.java @@ -0,0 +1,76 @@ +package io.common.utils; + +import io.common.exception.ErrorCode; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serializable; + +/** + * 响应数据 + * + + * @since 1.0.0 + */ +@Schema(title = "响应") +public class Result implements Serializable { + private static final long serialVersionUID = 1L; + /** + * 编码:0表示成功,其他值表示失败 + */ + @Schema(title = "编码:0表示成功,其他值表示失败") + private int code = 0; + /** + * 消息内容 + */ + @Schema(title = "消息内容") + private String msg = "success"; + /** + * 响应数据 + */ + @Schema(title = "响应数据") + private T data; + + public Result ok(T data) { + this.setData(data); + return this; + } + public boolean success(){ + return code == 0; + } + + public Result error(int code, String msg) { + this.code = code; + this.msg = msg; + return this; + } + + public Result error(String msg) { + this.code = ErrorCode.INTERNAL_SERVER_ERROR; + this.msg = msg; + return this; + } + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + public T getData() { + return data; + } + + public void setData(T data) { + this.data = data; + } +} diff --git a/common/src/main/java/io/common/utils/SpringContextUtils.java b/common/src/main/java/io/common/utils/SpringContextUtils.java new file mode 100644 index 0000000..5b22d04 --- /dev/null +++ b/common/src/main/java/io/common/utils/SpringContextUtils.java @@ -0,0 +1,47 @@ +package io.common.utils; + +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.stereotype.Component; + +/** + * Spring Context 工具类 + * + + */ +@Component +public class SpringContextUtils implements ApplicationContextAware { + public static ApplicationContext applicationContext; + + @Override + public void setApplicationContext(ApplicationContext applicationContext) + throws BeansException { + SpringContextUtils.applicationContext = applicationContext; + } + + public static Object getBean(String name) { + return applicationContext.getBean(name); + } + + public static T getBean(Class requiredType) { + return applicationContext.getBean(requiredType); + } + + public static T getBean(String name, Class requiredType) { + return applicationContext.getBean(name, requiredType); + } + + public static boolean containsBean(String name) { + return applicationContext.containsBean(name); + } + + public static boolean isSingleton(String name) { + return applicationContext.isSingleton(name); + } + + public static Class getType(String name) { + return applicationContext.getType(name); + } + +} diff --git a/common/src/main/java/io/common/utils/TreeNode.java b/common/src/main/java/io/common/utils/TreeNode.java new file mode 100644 index 0000000..97e982a --- /dev/null +++ b/common/src/main/java/io/common/utils/TreeNode.java @@ -0,0 +1,26 @@ +package io.common.utils; + +import lombok.Data; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +/** + * 树节点,所有需要实现树节点的,都需要继承该类 + */ + @Data +public class TreeNode implements Serializable { + private static final long serialVersionUID = 1L; + /** + * 主键 + */ + private Long id; + /** + * 上级ID + */ + private Long pid; + /** + * 子节点列表 + */ + private List children = new ArrayList<>(); +} diff --git a/common/src/main/java/io/common/utils/TreeUtils.java b/common/src/main/java/io/common/utils/TreeUtils.java new file mode 100644 index 0000000..4cf33b8 --- /dev/null +++ b/common/src/main/java/io/common/utils/TreeUtils.java @@ -0,0 +1,72 @@ +package io.common.utils; + +import io.common.validator.AssertUtils; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +/** + * 树形结构工具类,如:菜单、部门等 + * + + * @since 1.0.0 + */ +public class TreeUtils { + + /** + * 根据pid,构建树节点 + */ + public static List build(List treeNodes, Long pid) { + //pid不能为空 + AssertUtils.isNull(pid, "pid"); + + List treeList = new ArrayList<>(); + for(T treeNode : treeNodes) { + if (pid.equals(treeNode.getPid())) { + treeList.add(findChildren(treeNodes, treeNode)); + } + } + + return treeList; + } + + /** + * 查找子节点 + */ + private static T findChildren(List treeNodes, T rootNode) { + for(T treeNode : treeNodes) { + if(rootNode.getId().equals(treeNode.getPid())) { + rootNode.getChildren().add(findChildren(treeNodes, treeNode)); + } + } + return rootNode; + } + + /** + * 构建树节点 + */ + public static List build(List treeNodes) { + List result = new ArrayList<>(); + + //list转map + Map nodeMap = new LinkedHashMap<>(treeNodes.size()); + for(T treeNode : treeNodes){ + nodeMap.put(treeNode.getId(), treeNode); + } + + for(T node : nodeMap.values()) { + T parent = nodeMap.get(node.getPid()); + if(parent != null && !(node.getId().equals(parent.getId()))){ + parent.getChildren().add(node); + continue; + } + + result.add(node); + } + + return result; + } + +} diff --git a/common/src/main/java/io/common/validator/AssertUtils.java b/common/src/main/java/io/common/validator/AssertUtils.java new file mode 100644 index 0000000..bb26520 --- /dev/null +++ b/common/src/main/java/io/common/validator/AssertUtils.java @@ -0,0 +1,90 @@ +package io.common.validator; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.ArrayUtil; +import io.common.exception.ErrorCode; +import io.common.exception.RenException; +import cn.hutool.core.util.StrUtil; + +import java.util.List; +import java.util.Map; + +/** + * 校验工具类 + * + + * @since 1.0.0 + */ +public class AssertUtils { + + public static void isBlank(String str, String... params) { + isBlank(str, ErrorCode.NOT_NULL, params); + } + + public static void isBlank(String str, Integer code, String... params) { + if(code == null){ + throw new RenException(ErrorCode.NOT_NULL, "code"); + } + + if (StrUtil.isBlank(str)) { + throw new RenException(code, params); + } + } + + public static void isNull(Object object, String... params) { + isNull(object, ErrorCode.NOT_NULL, params); + } + + public static void isNull(Object object, Integer code, String... params) { + if(code == null){ + throw new RenException(ErrorCode.NOT_NULL, "code"); + } + + if (object == null) { + throw new RenException(code, params); + } + } + + public static void isArrayEmpty(Object[] array, String... params) { + isArrayEmpty(array, ErrorCode.NOT_NULL, params); + } + + public static void isArrayEmpty(Object[] array, Integer code, String... params) { + if(code == null){ + throw new RenException(ErrorCode.NOT_NULL, "code"); + } + + if(ArrayUtil.isEmpty(array)){ + throw new RenException(code, params); + } + } + + public static void isListEmpty(List list, String... params) { + isListEmpty(list, ErrorCode.NOT_NULL, params); + } + + public static void isListEmpty(List list, Integer code, String... params) { + if(code == null){ + throw new RenException(ErrorCode.NOT_NULL, "code"); + } + + if(CollUtil.isEmpty(list)){ + throw new RenException(code, params); + } + } + + public static void isMapEmpty(Map map, String... params) { + isMapEmpty(map, ErrorCode.NOT_NULL, params); + } + + public static void isMapEmpty(Map map, Integer code, String... params) { + if(code == null){ + throw new RenException(ErrorCode.NOT_NULL, "code"); + } + + if(MapUtil.isEmpty(map)){ + throw new RenException(code, params); + } + } +} diff --git a/common/src/main/java/io/common/validator/ValidatorUtils.java b/common/src/main/java/io/common/validator/ValidatorUtils.java new file mode 100644 index 0000000..902325e --- /dev/null +++ b/common/src/main/java/io/common/validator/ValidatorUtils.java @@ -0,0 +1,47 @@ +package io.common.validator; + +import io.common.exception.RenException; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.Validation; +import jakarta.validation.Validator; +import org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator; +import org.springframework.context.i18n.LocaleContextHolder; +import org.springframework.context.support.ResourceBundleMessageSource; +import org.springframework.validation.beanvalidation.MessageSourceResourceBundleLocator; + +import java.util.Locale; +import java.util.Set; + +/** + * hibernate-validator校验工具类 + * 参考文档:http://docs.jboss.org/hibernate/validator/6.0/reference/en-US/html_single/ + * @since 1.0.0 + */ +public class ValidatorUtils { + + private static ResourceBundleMessageSource getMessageSource() { + ResourceBundleMessageSource bundleMessageSource = new ResourceBundleMessageSource(); + bundleMessageSource.setDefaultEncoding("UTF-8"); + bundleMessageSource.setBasenames("i18n/validation"); + return bundleMessageSource; + } + + /** + * 校验对象 + * @param object 待校验对象 + * @param groups 待校验的组 + */ + public static void validateEntity(Object object, Class... groups) + throws RenException { + Locale.setDefault(LocaleContextHolder.getLocale()); + Validator validator = Validation.byDefaultProvider().configure().messageInterpolator( + new ResourceBundleMessageInterpolator(new MessageSourceResourceBundleLocator(getMessageSource()))) + .buildValidatorFactory().getValidator(); + + Set> constraintViolations = validator.validate(object, groups); + if (!constraintViolations.isEmpty()) { + ConstraintViolation constraint = constraintViolations.iterator().next(); + throw new RenException(constraint.getMessage()); + } + } +} diff --git a/common/src/main/java/io/common/validator/group/AddGroup.java b/common/src/main/java/io/common/validator/group/AddGroup.java new file mode 100644 index 0000000..2a9455d --- /dev/null +++ b/common/src/main/java/io/common/validator/group/AddGroup.java @@ -0,0 +1,8 @@ +package io.common.validator.group; + +/** + * 新增 Group + */ +public interface AddGroup { + +} diff --git a/common/src/main/java/io/common/validator/group/DefaultGroup.java b/common/src/main/java/io/common/validator/group/DefaultGroup.java new file mode 100644 index 0000000..dd3d7e0 --- /dev/null +++ b/common/src/main/java/io/common/validator/group/DefaultGroup.java @@ -0,0 +1,11 @@ +package io.common.validator.group; + +/** + * 默认 Group + * + + * @since 1.0.0 + */ +public interface DefaultGroup { + +} diff --git a/common/src/main/java/io/common/validator/group/Group.java b/common/src/main/java/io/common/validator/group/Group.java new file mode 100644 index 0000000..caa9f9e --- /dev/null +++ b/common/src/main/java/io/common/validator/group/Group.java @@ -0,0 +1,15 @@ +package io.common.validator.group; + + +import jakarta.validation.GroupSequence; + +/** + * 定义校验顺序,如果AddGroup组失败,则UpdateGroup组不会再校验 + * + + * @since 1.0.0 + */ +@GroupSequence({AddGroup.class, UpdateGroup.class}) +public interface Group { + +} diff --git a/common/src/main/java/io/common/validator/group/UpdateGroup.java b/common/src/main/java/io/common/validator/group/UpdateGroup.java new file mode 100644 index 0000000..e7c9b24 --- /dev/null +++ b/common/src/main/java/io/common/validator/group/UpdateGroup.java @@ -0,0 +1,11 @@ +package io.common.validator.group; + +/** + * 修改 Group + * + + * @since 1.0.0 + */ +public interface UpdateGroup { + +} diff --git a/common/src/main/java/io/common/xss/XssFilter.java b/common/src/main/java/io/common/xss/XssFilter.java new file mode 100644 index 0000000..0eeb6ac --- /dev/null +++ b/common/src/main/java/io/common/xss/XssFilter.java @@ -0,0 +1,29 @@ +package io.common.xss; + +import jakarta.servlet.*; +import jakarta.servlet.http.HttpServletRequest; + +import java.io.IOException; + +/** + * XSS过滤 + */ +public class XssFilter implements Filter { + + @Override + public void init(FilterConfig config) { + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException { + XssHttpServletRequestWrapper xssRequest = new XssHttpServletRequestWrapper( + (HttpServletRequest) request); + chain.doFilter(xssRequest, response); + } + + @Override + public void destroy() { + } + +} diff --git a/common/src/main/java/io/common/xss/XssHttpServletRequestWrapper.java b/common/src/main/java/io/common/xss/XssHttpServletRequestWrapper.java new file mode 100644 index 0000000..a42be88 --- /dev/null +++ b/common/src/main/java/io/common/xss/XssHttpServletRequestWrapper.java @@ -0,0 +1,143 @@ +package io.common.xss; + +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.util.StrUtil; +import jakarta.servlet.ReadListener; +import jakarta.servlet.ServletInputStream; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequestWrapper; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.LinkedHashMap; +import java.util.Map; + + +/** + * XSS过滤处理 + */ +public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper { + HttpServletRequest orgRequest; + + public XssHttpServletRequestWrapper(HttpServletRequest request) { + super(request); + orgRequest = request; + } + + @Override + public ServletInputStream getInputStream() throws IOException { + //非json类型,直接返回 + if(!checkContentTypeIsJson()){ + return super.getInputStream(); + } + + //为空,直接返回 + String json = IoUtil.readUtf8(super.getInputStream()); + if (StrUtil.isBlank(json)) { + return super.getInputStream(); + } + + //xss过滤 + json = xssEncode(json); + final ByteArrayInputStream bis = new ByteArrayInputStream(json.getBytes(StandardCharsets.UTF_8)); + return new ServletInputStream() { + @Override + public boolean isFinished() { + return true; + } + + @Override + public boolean isReady() { + return true; + } + + @Override + public void setReadListener(ReadListener readListener) { + + } + + @Override + public int read() { + return bis.read(); + } + }; + } + + @Override + public String getParameter(String name) { + String value = super.getParameter(xssEncode(name)); + if (StrUtil.isNotBlank(value)) { + value = xssEncode(value); + } + return value; + } + + @Override + public String[] getParameterValues(String name) { + String[] parameters = super.getParameterValues(name); + if (parameters == null || parameters.length == 0) { + return null; + } + + for (int i = 0; i < parameters.length; i++) { + parameters[i] = xssEncode(parameters[i]); + } + return parameters; + } + + @Override + public Map getParameterMap() { + Map map = new LinkedHashMap<>(); + Map parameters = super.getParameterMap(); + for (String key : parameters.keySet()) { + String[] values = parameters.get(key); + for (int i = 0; i < values.length; i++) { + values[i] = xssEncode(values[i]); + } + map.put(key, values); + } + return map; + } + + @Override + public String getHeader(String name) { + String value = super.getHeader(xssEncode(name)); + if (StrUtil.isNotBlank(value)) { + value = xssEncode(value); + } + return value; + } + + private String xssEncode(String input) { + return XssUtils.filter(input); + } + + /** + * 获取最原始的request + */ + public HttpServletRequest getOrgRequest() { + return orgRequest; + } + + /** + * 获取最原始的request + */ + public static HttpServletRequest getOrgRequest(HttpServletRequest request) { + if (request instanceof XssHttpServletRequestWrapper) { + return ((XssHttpServletRequestWrapper) request).getOrgRequest(); + } + + return request; + } + /** + * 判断是否是json请求,以前缀的方式 + */ + private boolean checkContentTypeIsJson() + { + String header = super.getHeader(HttpHeaders.CONTENT_TYPE); + return StrUtil.startWithIgnoreCase(header, MediaType.APPLICATION_JSON_VALUE); + } +} diff --git a/common/src/main/java/io/common/xss/XssUtils.java b/common/src/main/java/io/common/xss/XssUtils.java new file mode 100644 index 0000000..7241fc0 --- /dev/null +++ b/common/src/main/java/io/common/xss/XssUtils.java @@ -0,0 +1,67 @@ +package io.common.xss; + +import org.jsoup.Jsoup; +import org.jsoup.safety.Safelist; + +/** + * XSS过滤工具类 + */ +public class XssUtils extends Safelist { + + /** + * XSS过滤 + */ + public static String filter(String html){ + return Jsoup.clean(html, xssWhitelist()); + } + + /** + * XSS过滤白名单 + */ + private static Safelist xssWhitelist(){ + return new Safelist() + //支持的标签 + .addTags("a", "b", "blockquote", "br", "caption", "cite", "code", "col", "colgroup", "dd", "div", "dl", + "dt", "em", "h1", "h2", "h3", "h4", "h5", "h6", "i", "img", "li", "ol", "p", "pre", "q", "small", + "strike", "strong","sub", "sup", "table", "tbody", "td","tfoot", "th", "thead", "tr", "u","ul", + "embed","object","param","span") + + //支持的标签属性 + .addAttributes("a", "href", "class", "style", "target", "rel", "nofollow") + .addAttributes("blockquote", "cite") + .addAttributes("code", "class", "style") + .addAttributes("col", "span", "width") + .addAttributes("colgroup", "span", "width") + .addAttributes("img", "align", "alt", "height", "src", "title", "width", "class", "style") + .addAttributes("ol", "start", "type") + .addAttributes("q", "cite") + .addAttributes("table", "summary", "width", "class", "style") + .addAttributes("tr", "abbr", "axis", "colspan", "rowspan", "width", "style") + .addAttributes("td", "abbr", "axis", "colspan", "rowspan", "width", "style") + .addAttributes("th", "abbr", "axis", "colspan", "rowspan", "scope","width", "style") + .addAttributes("ul", "type", "style") + .addAttributes("pre", "class", "style") + .addAttributes("div", "class", "id", "style") + .addAttributes("embed", "src", "wmode", "flashvars", "pluginspage", "allowFullScreen", "allowfullscreen", + "quality", "width", "height", "align", "allowScriptAccess", "allowscriptaccess", "allownetworking", "type") + .addAttributes("object", "type", "id", "name", "data", "width", "height", "style", "classid", "codebase") + .addAttributes("param", "name", "value") + .addAttributes("span", "class", "style") + + //标签属性对应的协议 + .addProtocols("a", "href", "ftp", "http", "https", "mailto") + .addProtocols("img", "src", "http", "https") + .addProtocols("blockquote", "cite", "http", "https") + .addProtocols("cite", "cite", "http", "https") + .addProtocols("q", "cite", "http", "https") + .addProtocols("embed", "src", "http", "https"); + } + + public static void main(String[] args) { + StringBuilder html = new StringBuilder(); + html.append(""); + + System.out.println(filter(html.toString())); + } + +} diff --git a/common/src/main/java/io/modules/item/dao/ApplicationsDao.java b/common/src/main/java/io/modules/item/dao/ApplicationsDao.java new file mode 100644 index 0000000..aa864b3 --- /dev/null +++ b/common/src/main/java/io/modules/item/dao/ApplicationsDao.java @@ -0,0 +1,13 @@ +package io.modules.item.dao; + +import io.common.dao.BaseDao; +import io.modules.item.entity.Applications; +import org.apache.ibatis.annotations.Mapper; + +/** + * certif申请表 + */ +@Mapper +public interface ApplicationsDao extends BaseDao { + +} diff --git a/common/src/main/java/io/modules/item/dao/CertificatesDao.java b/common/src/main/java/io/modules/item/dao/CertificatesDao.java new file mode 100644 index 0000000..b17826b --- /dev/null +++ b/common/src/main/java/io/modules/item/dao/CertificatesDao.java @@ -0,0 +1,15 @@ +package io.modules.item.dao; + + +import io.common.dao.BaseDao; +import io.modules.item.entity.CertificatesEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 主表 + + */ +@Mapper +public interface CertificatesDao extends BaseDao { + +} \ No newline at end of file diff --git a/common/src/main/java/io/modules/item/dao/UserDao.java b/common/src/main/java/io/modules/item/dao/UserDao.java new file mode 100644 index 0000000..ad3a890 --- /dev/null +++ b/common/src/main/java/io/modules/item/dao/UserDao.java @@ -0,0 +1,18 @@ +package io.modules.item.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import io.common.dao.BaseDao; +import io.modules.item.entity.FrontUserEntity; +import io.modules.item.entity.UserEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 用户 + * + */ +@Mapper +public interface UserDao extends BaseDao { + UserEntity getUserByUsername(String username); + + UserEntity getUserByUserId(Long userId); +} diff --git a/common/src/main/java/io/modules/item/dto/ApplicationsDTO.java b/common/src/main/java/io/modules/item/dto/ApplicationsDTO.java new file mode 100644 index 0000000..d5b8b83 --- /dev/null +++ b/common/src/main/java/io/modules/item/dto/ApplicationsDTO.java @@ -0,0 +1,28 @@ +package io.modules.item.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + + +/** + * certif申请表 + + */ +@Data +@Schema(name = "certif申请表") +public class ApplicationsDTO implements Serializable { + private static final long serialVersionUID = 1L; + + private Long id; + private Long userId; + private Long certId; + private Date auditTime; + private Date createTime; + private Integer auditStatus; + private String auditComments; + private UserDTO user; + private CertificatesDTO certificates; +} diff --git a/common/src/main/java/io/modules/item/dto/CartDTO.java b/common/src/main/java/io/modules/item/dto/CartDTO.java new file mode 100644 index 0000000..62580d2 --- /dev/null +++ b/common/src/main/java/io/modules/item/dto/CartDTO.java @@ -0,0 +1,42 @@ +package io.modules.item.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.media.SchemaProperty; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 购物车 + * + * @author Mark # + * @since 1.0.0 2025-03-12 + */ +@Data +@Schema(name = "购物车") +public class CartDTO implements Serializable { + private static final long serialVersionUID = 1L; + + @SchemaProperty(name = "编号") + private Long id; + + @SchemaProperty(name = "用户ID") + private Long userId; + + @SchemaProperty(name = "商品ID") + private Long productId; + + @SchemaProperty(name = "商品数量") + private Integer quantity; + + @SchemaProperty(name = "创建时间") + private Date createdTime; + + @SchemaProperty(name = "加入时价格") + private BigDecimal price; + private CertificatesDTO item; + + +} diff --git a/common/src/main/java/io/modules/item/dto/CertificatesDTO.java b/common/src/main/java/io/modules/item/dto/CertificatesDTO.java new file mode 100644 index 0000000..9a3f2bc --- /dev/null +++ b/common/src/main/java/io/modules/item/dto/CertificatesDTO.java @@ -0,0 +1,44 @@ +package io.modules.item.dto; + +import io.modules.item.entity.FrontUserEntity; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + + +/** + * 主表 + * + * @author Mark # + * @since 1.0.0 2025-01-24 + */ +@Data +@Schema(name = "主表") +public class CertificatesDTO implements Serializable { + private static final long serialVersionUID = 1L; + + private Long id; // 编号 + private Integer isBlock; + private Long certificateNumber; // 证书编号 + + private Long userId; // 用户 ID + + private Date issueDate; // 签发日期 + + private Date expireDate; // 过期日期 + + private String certificateData; // 详情(JSON 字符串) + private String img; + private String blockchainTxId; // 区块链交易 ID + + private Integer status; // 1: 有效,0: 撤销,2: 过期 + + private Date createdAt; // 创建时间 + + private Integer auditStatus; + private String auditComments; + private UserDTO user; + +} diff --git a/common/src/main/java/io/modules/item/dto/LoginDTO.java b/common/src/main/java/io/modules/item/dto/LoginDTO.java new file mode 100644 index 0000000..d62ee63 --- /dev/null +++ b/common/src/main/java/io/modules/item/dto/LoginDTO.java @@ -0,0 +1,22 @@ +package io.modules.item.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import lombok.Data; +/** + * 登录表单 + * + + */ +@Data +@Schema(title = "登录表单") +public class LoginDTO { + @Schema(title = "用户名") + @NotBlank(message="用户名不能为空~") + private String username; + + @Schema(title = "密码") + @NotBlank(message="密码不能为空~") + private String password; + +} diff --git a/common/src/main/java/io/modules/item/dto/UserDTO.java b/common/src/main/java/io/modules/item/dto/UserDTO.java new file mode 100644 index 0000000..fa8c701 --- /dev/null +++ b/common/src/main/java/io/modules/item/dto/UserDTO.java @@ -0,0 +1,40 @@ +package io.modules.item.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.media.SchemaProperty; +import lombok.Data; +import java.io.Serializable; +import java.util.Date; + + +/** + * 用户 + * + * @author Mark # + * @since 1.0.0 2025-01-14 + */ +@Data +@Schema(name = "用户") +public class UserDTO implements Serializable { + private static final long serialVersionUID = 1L; + + @SchemaProperty(name = "id") + private Long id; + + @SchemaProperty(name = "手机号") + private String username; + + @SchemaProperty(name = "密码") + private String password; + + @SchemaProperty(name = "创建时间") + private Date createDate; + + @SchemaProperty(name = "昵称") + private String nickName; + + @SchemaProperty(name = "介绍") + private String introduce; + + +} diff --git a/common/src/main/java/io/modules/item/entity/Applications.java b/common/src/main/java/io/modules/item/entity/Applications.java new file mode 100644 index 0000000..5c196d4 --- /dev/null +++ b/common/src/main/java/io/modules/item/entity/Applications.java @@ -0,0 +1,28 @@ +package io.modules.item.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +/** + * 申请记录表 + */ +@Data +@TableName("tb_certificate_applications") +public class Applications { + + /** + * 编号 + */ + @TableId(value = "id",type = IdType.AUTO) + private Long id; + private Long userId; + private Long certId; + private Date createTime; + private Integer auditStatus; + private Date auditTime; + private String auditComments; +} diff --git a/common/src/main/java/io/modules/item/entity/CertificatesEntity.java b/common/src/main/java/io/modules/item/entity/CertificatesEntity.java new file mode 100644 index 0000000..0cb2c65 --- /dev/null +++ b/common/src/main/java/io/modules/item/entity/CertificatesEntity.java @@ -0,0 +1,37 @@ +package io.modules.item.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 主表 + */ +@Data +@TableName("tb_certificates") +public class CertificatesEntity { + + private Long id; // 编号 + private Integer isBlock; + + private Integer auditStatus; + + private String auditComments; + private Long certificateNumber; // 证书编号 + + private Long userId; // 用户 ID + + private Date issueDate; // 签发日期 + + private Date expireDate; // 过期日期 + + private String certificateData; // 详情(JSON 字符串) + private String img; + private String blockchainTxId; // 区块链交易 ID + + private Integer status; // 1: 有效,0: 撤销,2: 过期 + + private Date createdAt; // 创建时间 +} \ No newline at end of file diff --git a/common/src/main/java/io/modules/item/entity/DictEntity.java b/common/src/main/java/io/modules/item/entity/DictEntity.java new file mode 100644 index 0000000..771b7d6 --- /dev/null +++ b/common/src/main/java/io/modules/item/entity/DictEntity.java @@ -0,0 +1,30 @@ +package io.modules.item.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +/** + * 敏感词 + * + * @author Mark # + * @since 1.0.0 2024-12-12 + */ +@Data +@TableName("tb_dict") +public class DictEntity { + + /** + * + */ + private Long id; + /** + * 内容 + */ + private String content; + /** + * 创建时间 + */ + private Date createTime; +} diff --git a/common/src/main/java/io/modules/item/entity/FrontUserEntity.java b/common/src/main/java/io/modules/item/entity/FrontUserEntity.java new file mode 100644 index 0000000..94e4be8 --- /dev/null +++ b/common/src/main/java/io/modules/item/entity/FrontUserEntity.java @@ -0,0 +1,37 @@ +package io.modules.item.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import java.util.Date; + +/** + * 用户 + */ +@Data +@TableName("tb_user") +public class FrontUserEntity { + /** + * id + */ + private Long id; + /** + * 手机号 + */ + private String username; + /** + * 密码 + */ + private String password; + /** + * 创建时间 + */ + private Date createDate; + /** + * 昵称 + */ + private String nickName; + /** + * 介绍 + */ + private String introduce; +} diff --git a/common/src/main/java/io/modules/item/entity/SetResponse.java b/common/src/main/java/io/modules/item/entity/SetResponse.java new file mode 100644 index 0000000..10c0c6d --- /dev/null +++ b/common/src/main/java/io/modules/item/entity/SetResponse.java @@ -0,0 +1,31 @@ +package io.modules.item.entity; + +public class SetResponse { + private String msg; + private String data; + + // Getter 和 Setter + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + @Override + public String toString() { + return "SetResponse{" + + "msg='" + msg + '\'' + + ", data='" + data + '\'' + + '}'; + } +} diff --git a/common/src/main/java/io/modules/item/entity/UserEntity.java b/common/src/main/java/io/modules/item/entity/UserEntity.java new file mode 100644 index 0000000..1343b4b --- /dev/null +++ b/common/src/main/java/io/modules/item/entity/UserEntity.java @@ -0,0 +1,50 @@ + + +package io.modules.item.entity; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 用户 + * + + */ +@Data +@TableName("tb_user") +public class UserEntity implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 用户ID + */ + @TableId + private Long id; + /** + * 昵称 + */ + private String nickName; + /** + * 介绍 + */ + private String introduce; + /** + * 用户名 + */ + private String username; + /** + * 密码 + */ + @JsonIgnore + private String password; + /** + * 创建时间 + */ + private Date createDate; + +} diff --git a/common/src/main/java/io/modules/item/service/ApplicationsService.java b/common/src/main/java/io/modules/item/service/ApplicationsService.java new file mode 100644 index 0000000..ef1bc58 --- /dev/null +++ b/common/src/main/java/io/modules/item/service/ApplicationsService.java @@ -0,0 +1,14 @@ +package io.modules.item.service; + + +import io.modules.item.dto.ApplicationsDTO; +import io.modules.item.entity.Applications; +import io.common.service.CrudService; + +/** + * certif申请表 + + */ +public interface ApplicationsService extends CrudService { + +} diff --git a/common/src/main/java/io/modules/item/service/CertificatesService.java b/common/src/main/java/io/modules/item/service/CertificatesService.java new file mode 100644 index 0000000..e04606d --- /dev/null +++ b/common/src/main/java/io/modules/item/service/CertificatesService.java @@ -0,0 +1,16 @@ +package io.modules.item.service; + + +import io.common.service.CrudService; +import io.modules.item.dto.CertificatesDTO; +import io.modules.item.entity.CertificatesEntity; + +/** + * 主表 + * + * @author Mark # + * @since 1.0.0 2025-01-24 + */ +public interface CertificatesService extends CrudService { + +} \ No newline at end of file diff --git a/common/src/main/java/io/modules/item/service/FrontUserService.java b/common/src/main/java/io/modules/item/service/FrontUserService.java new file mode 100644 index 0000000..fb45665 --- /dev/null +++ b/common/src/main/java/io/modules/item/service/FrontUserService.java @@ -0,0 +1,18 @@ + + +package io.modules.item.service; + +import io.common.service.BaseService; +import io.common.service.CrudService; +import io.modules.item.dto.UserDTO; +import io.modules.item.entity.FrontUserEntity; +import io.modules.item.entity.UserEntity; + +/** + * 用户 + * + + */ +public interface FrontUserService extends CrudService { + +} diff --git a/common/src/main/java/io/modules/item/service/SetRequestService.java b/common/src/main/java/io/modules/item/service/SetRequestService.java new file mode 100644 index 0000000..183ef1f --- /dev/null +++ b/common/src/main/java/io/modules/item/service/SetRequestService.java @@ -0,0 +1,20 @@ +package io.modules.item.service; + +import io.modules.item.entity.SetResponse; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; +import org.springframework.http.ResponseEntity; + +@Service +public class SetRequestService { + + public SetResponse sendSetRequest(String key, String value) { + RestTemplate restTemplate = new RestTemplate(); + String url = "http://localhost:8080/set?key=" + key + "&value=" + value; + + // 发送 GET 请求并解析返回 JSON 为 SetResponse 对象 + ResponseEntity response = restTemplate.getForEntity(url, SetResponse.class); + + return response.getBody(); + } +} diff --git a/common/src/main/java/io/modules/item/service/impl/ApplicationsServiceImpl.java b/common/src/main/java/io/modules/item/service/impl/ApplicationsServiceImpl.java new file mode 100644 index 0000000..ae39114 --- /dev/null +++ b/common/src/main/java/io/modules/item/service/impl/ApplicationsServiceImpl.java @@ -0,0 +1,32 @@ +package io.modules.item.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; + +import io.modules.item.dao.ApplicationsDao; +import io.modules.item.dto.ApplicationsDTO; +import io.modules.item.entity.Applications; +import io.modules.item.service.ApplicationsService; +import cn.hutool.core.util.StrUtil; +import io.common.service.impl.CrudServiceImpl; +import org.springframework.stereotype.Service; + +import java.util.Map; + +/** + * certif申请表 + */ +@Service +public class ApplicationsServiceImpl extends CrudServiceImpl implements ApplicationsService { + + @Override + public QueryWrapper getWrapper(Map params){ + String id = (String)params.get("id"); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq(StrUtil.isNotBlank(id), "id", id); + + return wrapper; + } + + + +} diff --git a/common/src/main/java/io/modules/item/service/impl/CertificatesServiceImpl.java b/common/src/main/java/io/modules/item/service/impl/CertificatesServiceImpl.java new file mode 100644 index 0000000..fa7675d --- /dev/null +++ b/common/src/main/java/io/modules/item/service/impl/CertificatesServiceImpl.java @@ -0,0 +1,47 @@ +package io.modules.item.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import cn.hutool.core.util.StrUtil; +import io.common.service.impl.CrudServiceImpl; +import io.modules.item.dao.CertificatesDao; +import io.modules.item.dao.UserDao; +import io.modules.item.dto.CertificatesDTO; +import io.modules.item.entity.CertificatesEntity; +import io.modules.item.service.CertificatesService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Map; + +/** + * 主表 + * + * @author Mark # + * @since 1.0.0 2025-01-24 + */ +@Service +public class CertificatesServiceImpl extends CrudServiceImpl implements CertificatesService { + + @Autowired + private UserDao userService; + + + + @Override + public QueryWrapper getWrapper(Map params){ + String id = (String)params.get("id"); + String status = (String)params.get("status"); + String isBlock = (String)params.get("isBlock"); + String auditStatus = (String)params.get("auditStatus"); + + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq(StrUtil.isNotBlank(id), "id", id); + wrapper.eq(StrUtil.isNotBlank(status), "status", status); + wrapper.eq(StrUtil.isNotBlank(isBlock), "is_block", isBlock); + wrapper.eq(StrUtil.isNotBlank(auditStatus) && !auditStatus.equals("all"), "audit_status", auditStatus); + return wrapper; + } + + + +} \ No newline at end of file diff --git a/common/src/main/java/io/modules/item/service/impl/FrontUserServiceImpl.java b/common/src/main/java/io/modules/item/service/impl/FrontUserServiceImpl.java new file mode 100644 index 0000000..990ccce --- /dev/null +++ b/common/src/main/java/io/modules/item/service/impl/FrontUserServiceImpl.java @@ -0,0 +1,31 @@ +package io.modules.item.service.impl; + + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import io.common.service.impl.BaseServiceImpl; +import io.common.service.impl.CrudServiceImpl; +import io.modules.item.dao.UserDao; +import io.modules.item.dto.UserDTO; +import io.modules.item.entity.FrontUserEntity; +import io.modules.item.entity.UserEntity; +import io.modules.item.service.FrontUserService; +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.Map; + +@Service +public class FrontUserServiceImpl extends CrudServiceImpl implements FrontUserService { + @Override + public QueryWrapper getWrapper(Map params){ + String id = (String)params.get("id"); + String username = (String)params.get("username"); + + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq(StrUtil.isNotBlank(id), "id", id); + wrapper.like(StrUtil.isNotBlank(username), "username", username); + return wrapper; + } + +} diff --git a/db/certify.sql b/db/certify.sql new file mode 100644 index 0000000..eff119f --- /dev/null +++ b/db/certify.sql @@ -0,0 +1,1528 @@ +/* + Navicat Premium Data Transfer + + Source Server : localhost + Source Server Type : MySQL + Source Server Version : 50744 + Source Host : localhost:3306 + Source Schema : certify + + Target Server Type : MySQL + Target Server Version : 50744 + File Encoding : 65001 + + Date: 24/03/2025 17:04:50 +*/ + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for sys_dept +-- ---------------------------- +DROP TABLE IF EXISTS `sys_dept`; +CREATE TABLE `sys_dept` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', + `pid` bigint(20) NULL DEFAULT NULL COMMENT '上级ID', + `pids` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '所有上级ID,用逗号分开', + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '部门名称', + `sort` int(10) UNSIGNED NULL DEFAULT NULL COMMENT '排序', + `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建者', + `create_date` datetime NULL DEFAULT NULL COMMENT '创建时间', + `updater` bigint(20) NULL DEFAULT NULL COMMENT '更新者', + `update_date` datetime NULL DEFAULT NULL COMMENT '更新时间', + PRIMARY KEY (`id`) USING BTREE, + INDEX `idx_pid`(`pid`) USING BTREE, + INDEX `idx_sort`(`sort`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1067246875800000069 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '部门管理' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of sys_dept +-- ---------------------------- +INSERT INTO `sys_dept` VALUES (1067246875800000062, 1067246875800000063, '1067246875800000066,1067246875800000063', '技术部', 2, 1067246875800000001, '2024-12-03 11:54:34', 1067246875800000001, '2024-12-03 11:54:34'); +INSERT INTO `sys_dept` VALUES (1067246875800000063, 1067246875800000066, '1067246875800000066', '长沙分公司', 1, 1067246875800000001, '2024-12-03 11:54:34', 1067246875800000001, '2024-12-03 11:54:34'); +INSERT INTO `sys_dept` VALUES (1067246875800000064, 1067246875800000066, '1067246875800000066', '上海分公司', 0, 1067246875800000001, '2024-12-03 11:54:34', 1067246875800000001, '2024-12-03 11:54:34'); +INSERT INTO `sys_dept` VALUES (1067246875800000065, 1067246875800000064, '1067246875800000066,1067246875800000064', '市场部', 0, 1067246875800000001, '2024-12-03 11:54:34', 1067246875800000001, '2024-12-03 11:54:34'); +INSERT INTO `sys_dept` VALUES (1067246875800000066, 0, '0', '文化系统总部', 0, 1067246875800000001, '2024-12-03 11:54:34', 1067246875800000001, '2024-12-10 22:08:03'); +INSERT INTO `sys_dept` VALUES (1067246875800000067, 1067246875800000064, '1067246875800000066,1067246875800000064', '销售部', 0, 1067246875800000001, '2024-12-03 11:54:34', 1067246875800000001, '2024-12-03 11:54:34'); +INSERT INTO `sys_dept` VALUES (1067246875800000068, 1067246875800000063, '1067246875800000066,1067246875800000063', '产品部', 1, 1067246875800000001, '2024-12-03 11:54:34', 1067246875800000001, '2024-12-03 11:54:34'); + +-- ---------------------------- +-- Table structure for sys_dict_data +-- ---------------------------- +DROP TABLE IF EXISTS `sys_dict_data`; +CREATE TABLE `sys_dict_data` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', + `dict_type_id` bigint(20) NOT NULL COMMENT '字典类型ID', + `dict_label` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '字典标签', + `dict_value` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '字典值', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', + `sort` int(10) UNSIGNED NULL DEFAULT NULL COMMENT '排序', + `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建者', + `create_date` datetime NULL DEFAULT NULL COMMENT '创建时间', + `updater` bigint(20) NULL DEFAULT NULL COMMENT '更新者', + `update_date` datetime NULL DEFAULT NULL COMMENT '更新时间', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `uk_dict_type_value`(`dict_type_id`, `dict_value`) USING BTREE, + INDEX `idx_sort`(`sort`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1225814271879340035 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '字典数据' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of sys_dict_data +-- ---------------------------- +INSERT INTO `sys_dict_data` VALUES (1160061112075464705, 1160061077912858625, '男', '0', '', 0, 1067246875800000001, '2024-12-03 11:54:34', 1067246875800000001, '2024-12-03 11:54:34'); +INSERT INTO `sys_dict_data` VALUES (1160061146967879681, 1160061077912858625, '女', '1', '', 1, 1067246875800000001, '2024-12-03 11:54:34', 1067246875800000001, '2024-12-03 11:54:34'); +INSERT INTO `sys_dict_data` VALUES (1160061190127267841, 1160061077912858625, '保密', '2', '', 2, 1067246875800000001, '2024-12-03 11:54:34', 1067246875800000001, '2024-12-03 11:54:34'); +INSERT INTO `sys_dict_data` VALUES (1225814069634195457, 1225813644059140097, '公告', '0', '', 0, 1067246875800000001, '2024-12-03 11:54:34', 1067246875800000001, '2024-12-03 11:54:34'); +INSERT INTO `sys_dict_data` VALUES (1225814107559092225, 1225813644059140097, '会议', '1', '', 1, 1067246875800000001, '2024-12-03 11:54:34', 1067246875800000001, '2024-12-03 11:54:34'); +INSERT INTO `sys_dict_data` VALUES (1225814271879340034, 1225813644059140097, '其他', '2', '', 2, 1067246875800000001, '2024-12-03 11:54:34', 1067246875800000001, '2024-12-03 11:54:34'); + +-- ---------------------------- +-- Table structure for sys_dict_type +-- ---------------------------- +DROP TABLE IF EXISTS `sys_dict_type`; +CREATE TABLE `sys_dict_type` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', + `dict_type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '字典类型', + `dict_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '字典名称', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', + `sort` int(10) UNSIGNED NULL DEFAULT NULL COMMENT '排序', + `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建者', + `create_date` datetime NULL DEFAULT NULL COMMENT '创建时间', + `updater` bigint(20) NULL DEFAULT NULL COMMENT '更新者', + `update_date` datetime NULL DEFAULT NULL COMMENT '更新时间', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `dict_type`(`dict_type`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1225813644059140098 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '字典类型' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of sys_dict_type +-- ---------------------------- +INSERT INTO `sys_dict_type` VALUES (1160061077912858625, 'gender', '性别', '', 0, 1067246875800000001, '2024-12-03 11:54:34', 1067246875800000001, '2024-12-03 11:54:34'); +INSERT INTO `sys_dict_type` VALUES (1225813644059140097, 'notice_type', '站内通知-类型', '', 1, 1067246875800000001, '2024-12-03 11:54:34', 1067246875800000001, '2024-12-03 11:54:34'); + +-- ---------------------------- +-- Table structure for sys_log_error +-- ---------------------------- +DROP TABLE IF EXISTS `sys_log_error`; +CREATE TABLE `sys_log_error` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', + `request_uri` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '请求URI', + `request_method` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '请求方式', + `request_params` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '请求参数', + `user_agent` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用户代理', + `ip` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '操作IP', + `error_info` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '异常信息', + `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建者', + `create_date` datetime NULL DEFAULT NULL COMMENT '创建时间', + PRIMARY KEY (`id`) USING BTREE, + INDEX `idx_create_date`(`create_date`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1863964860761514024 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '异常日志' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of sys_log_error +-- ---------------------------- +INSERT INTO `sys_log_error` VALUES (1863939448849317889, '/admin/item/article/page', 'GET', '{\"_t\":\"1733232769395\",\"limit\":\"10\",\"page\":\"1\"}', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 'org.springframework.web.servlet.resource.NoResourceFoundException: No static resource item/article/page.\r\n at org.springframework.web.servlet.resource.ResourceHttpRequestHandler.handleRequest(ResourceHttpRequestHandler.java:585)\r\n at org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:52)\r\n at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\r\n at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\r\n at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\r\n at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564)\r\n at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\r\n at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\r\n at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\r\n at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at io.common.xss.XssFilter.doFilter(XssFilter.java:25)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\r\n at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\r\n at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\r\n at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:352)\r\n at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:268)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)\r\n at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)\r\n at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)\r\n at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)\r\n at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\r\n at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\r\n at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)\r\n at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389)\r\n at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\r\n at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896)\r\n at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741)\r\n at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)\r\n at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\r\n at java.base/java.lang.Thread.run(Thread.java:840)\r\n', 1067246875800000001, '2024-12-03 21:32:50'); +INSERT INTO `sys_log_error` VALUES (1863939455224659970, '/admin/item/slides/page', 'GET', '{\"_t\":\"1733232770943\",\"limit\":\"10\",\"page\":\"1\"}', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 'org.springframework.web.servlet.resource.NoResourceFoundException: No static resource item/slides/page.\r\n at org.springframework.web.servlet.resource.ResourceHttpRequestHandler.handleRequest(ResourceHttpRequestHandler.java:585)\r\n at org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:52)\r\n at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\r\n at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\r\n at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\r\n at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564)\r\n at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\r\n at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\r\n at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\r\n at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at io.common.xss.XssFilter.doFilter(XssFilter.java:25)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\r\n at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\r\n at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\r\n at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:352)\r\n at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:268)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)\r\n at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)\r\n at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)\r\n at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)\r\n at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\r\n at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\r\n at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)\r\n at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389)\r\n at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\r\n at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896)\r\n at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741)\r\n at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)\r\n at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\r\n at java.base/java.lang.Thread.run(Thread.java:840)\r\n', 1067246875800000001, '2024-12-03 21:32:51'); +INSERT INTO `sys_log_error` VALUES (1863939515836547073, '/admin/sys/scheduleLog/page', 'GET', '{\"_t\":\"1733232785403\",\"limit\":\"10\",\"page\":\"1\"}', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 'org.springframework.web.servlet.resource.NoResourceFoundException: No static resource sys/scheduleLog/page.\r\n at org.springframework.web.servlet.resource.ResourceHttpRequestHandler.handleRequest(ResourceHttpRequestHandler.java:585)\r\n at org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:52)\r\n at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\r\n at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\r\n at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\r\n at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564)\r\n at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\r\n at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\r\n at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\r\n at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at io.common.xss.XssFilter.doFilter(XssFilter.java:25)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\r\n at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\r\n at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\r\n at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:352)\r\n at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:268)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)\r\n at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)\r\n at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)\r\n at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)\r\n at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\r\n at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\r\n at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)\r\n at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389)\r\n at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\r\n at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896)\r\n at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741)\r\n at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)\r\n at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\r\n at java.base/java.lang.Thread.run(Thread.java:840)\r\n', 1067246875800000001, '2024-12-03 21:33:06'); +INSERT INTO `sys_log_error` VALUES (1863939515891073026, '/admin/sys/schedule/page', 'GET', '{\"_t\":\"1733232785403\",\"limit\":\"10\",\"page\":\"1\"}', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 'org.springframework.web.servlet.resource.NoResourceFoundException: No static resource sys/schedule/page.\r\n at org.springframework.web.servlet.resource.ResourceHttpRequestHandler.handleRequest(ResourceHttpRequestHandler.java:585)\r\n at org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:52)\r\n at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\r\n at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\r\n at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\r\n at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564)\r\n at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\r\n at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\r\n at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\r\n at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at io.common.xss.XssFilter.doFilter(XssFilter.java:25)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\r\n at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\r\n at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\r\n at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:352)\r\n at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:268)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)\r\n at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)\r\n at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)\r\n at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)\r\n at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\r\n at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\r\n at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)\r\n at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389)\r\n at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\r\n at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896)\r\n at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741)\r\n at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)\r\n at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\r\n at java.base/java.lang.Thread.run(Thread.java:840)\r\n', 1067246875800000001, '2024-12-03 21:33:06'); +INSERT INTO `sys_log_error` VALUES (1863939944838348802, '/admin/item/slides/page', 'GET', '{\"_t\":\"1733232887683\",\"limit\":\"10\",\"page\":\"1\"}', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 'org.springframework.web.servlet.resource.NoResourceFoundException: No static resource item/slides/page.\r\n at org.springframework.web.servlet.resource.ResourceHttpRequestHandler.handleRequest(ResourceHttpRequestHandler.java:585)\r\n at org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:52)\r\n at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\r\n at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\r\n at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\r\n at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564)\r\n at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\r\n at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\r\n at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\r\n at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at io.common.xss.XssFilter.doFilter(XssFilter.java:25)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\r\n at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\r\n at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\r\n at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:352)\r\n at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:268)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)\r\n at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)\r\n at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)\r\n at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)\r\n at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\r\n at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\r\n at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)\r\n at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389)\r\n at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\r\n at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896)\r\n at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741)\r\n at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)\r\n at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\r\n at java.base/java.lang.Thread.run(Thread.java:840)\r\n', 1067246875800000001, '2024-12-03 21:34:48'); +INSERT INTO `sys_log_error` VALUES (1863939955965837313, '/admin/item/article/page', 'GET', '{\"_t\":\"1733232890329\",\"limit\":\"10\",\"page\":\"1\"}', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 'org.springframework.web.servlet.resource.NoResourceFoundException: No static resource item/article/page.\r\n at org.springframework.web.servlet.resource.ResourceHttpRequestHandler.handleRequest(ResourceHttpRequestHandler.java:585)\r\n at org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:52)\r\n at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\r\n at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\r\n at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\r\n at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564)\r\n at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\r\n at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\r\n at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\r\n at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at io.common.xss.XssFilter.doFilter(XssFilter.java:25)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\r\n at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\r\n at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\r\n at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:352)\r\n at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:268)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)\r\n at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)\r\n at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)\r\n at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)\r\n at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\r\n at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\r\n at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)\r\n at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389)\r\n at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\r\n at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896)\r\n at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741)\r\n at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)\r\n at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\r\n at java.base/java.lang.Thread.run(Thread.java:840)\r\n', 1067246875800000001, '2024-12-03 21:34:50'); +INSERT INTO `sys_log_error` VALUES (1863940373110341634, '/admin/item/slides/page', 'GET', '{\"_t\":\"1733232989824\",\"limit\":\"10\",\"page\":\"1\"}', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 'org.springframework.web.servlet.resource.NoResourceFoundException: No static resource item/slides/page.\r\n at org.springframework.web.servlet.resource.ResourceHttpRequestHandler.handleRequest(ResourceHttpRequestHandler.java:585)\r\n at org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:52)\r\n at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\r\n at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\r\n at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\r\n at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564)\r\n at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\r\n at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\r\n at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\r\n at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at io.common.xss.XssFilter.doFilter(XssFilter.java:25)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\r\n at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\r\n at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\r\n at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:352)\r\n at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:268)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)\r\n at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)\r\n at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)\r\n at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)\r\n at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\r\n at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\r\n at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)\r\n at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389)\r\n at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\r\n at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896)\r\n at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741)\r\n at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)\r\n at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\r\n at java.base/java.lang.Thread.run(Thread.java:840)\r\n', 1067246875800000001, '2024-12-03 21:36:30'); +INSERT INTO `sys_log_error` VALUES (1863940386829910018, '/admin/item/slides/page', 'GET', '{\"_t\":\"1733232993077\",\"limit\":\"10\",\"page\":\"1\"}', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 'org.springframework.web.servlet.resource.NoResourceFoundException: No static resource item/slides/page.\r\n at org.springframework.web.servlet.resource.ResourceHttpRequestHandler.handleRequest(ResourceHttpRequestHandler.java:585)\r\n at org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:52)\r\n at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\r\n at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\r\n at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\r\n at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564)\r\n at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\r\n at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\r\n at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\r\n at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at io.common.xss.XssFilter.doFilter(XssFilter.java:25)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\r\n at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\r\n at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\r\n at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:352)\r\n at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:268)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)\r\n at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)\r\n at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)\r\n at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)\r\n at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\r\n at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\r\n at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)\r\n at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389)\r\n at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\r\n at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896)\r\n at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741)\r\n at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)\r\n at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\r\n at java.base/java.lang.Thread.run(Thread.java:840)\r\n', 1067246875800000001, '2024-12-03 21:36:33'); +INSERT INTO `sys_log_error` VALUES (1863940415036604417, '/admin/item/slides/page', 'GET', '{\"_t\":\"1733232999819\",\"limit\":\"10\",\"page\":\"1\"}', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 'org.springframework.web.servlet.resource.NoResourceFoundException: No static resource item/slides/page.\r\n at org.springframework.web.servlet.resource.ResourceHttpRequestHandler.handleRequest(ResourceHttpRequestHandler.java:585)\r\n at org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:52)\r\n at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\r\n at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\r\n at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\r\n at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564)\r\n at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\r\n at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\r\n at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\r\n at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at io.common.xss.XssFilter.doFilter(XssFilter.java:25)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\r\n at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\r\n at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\r\n at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:352)\r\n at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:268)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)\r\n at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)\r\n at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)\r\n at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)\r\n at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\r\n at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\r\n at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)\r\n at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389)\r\n at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\r\n at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896)\r\n at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741)\r\n at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)\r\n at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\r\n at java.base/java.lang.Thread.run(Thread.java:840)\r\n', 1067246875800000001, '2024-12-03 21:36:40'); +INSERT INTO `sys_log_error` VALUES (1863964123386089473, '/admin/item/article/page', 'GET', '{\"_t\":\"1733238651329\",\"limit\":\"10\",\"page\":\"1\"}', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 'org.springframework.jdbc.BadSqlGrammarException: \r\n### Error querying database. Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near \'like,cover,create_time FROM tb_article) TOTAL\' at line 1\r\n### The error may exist in io/modules/item/dao/ArticleDao.java (best guess)\r\n### The error may involve defaultParameterMap\r\n### The error occurred while setting parameters\r\n### SQL: SELECT COUNT(*) FROM (SELECT id,title,introduction,user_id,content,sort,like,cover,create_time FROM tb_article) TOTAL\r\n### Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near \'like,cover,create_time FROM tb_article) TOTAL\' at line 1\n; bad SQL grammar []\r\n at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:246)\r\n at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:107)\r\n at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:92)\r\n at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:439)\r\n at jdk.proxy2/jdk.proxy2.$Proxy93.selectList(Unknown Source)\r\n at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:224)\r\n at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.executeForMany(MybatisMapperMethod.java:164)\r\n at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:77)\r\n at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:152)\r\n at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89)\r\n at jdk.proxy2/jdk.proxy2.$Proxy116.selectList(Unknown Source)\r\n at com.baomidou.mybatisplus.core.mapper.BaseMapper.selectPage(BaseMapper.java:348)\r\n at java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:732)\r\n at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$DefaultMethodInvoker.invoke(MybatisMapperProxy.java:166)\r\n at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89)\r\n at jdk.proxy2/jdk.proxy2.$Proxy116.selectPage(Unknown Source)\r\n at io.common.service.impl.CrudServiceImpl.page(CrudServiceImpl.java:31)\r\n at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\r\n at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\r\n at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\r\n at java.base/java.lang.reflect.Method.invoke(Method.java:568)\r\n at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:354)\r\n at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:716)\r\n at io.modules.item.service.impl.ArticleServiceImpl$$SpringCGLIB$$0.page()\r\n at io.modules.sys.controller.ArticleController.page(ArticleController.java:44)\r\n at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\r\n at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\r\n at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\r\n at java.base/java.lang.reflect.Method.invoke(Method.java:568)\r\n at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:354)\r\n at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196)\r\n at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)\r\n at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768)\r\n at org.apache.shiro.spring.security.interceptor.AopAllianceAnnotationsAuthorizingMethodInterceptor$1.proceed(AopAllianceAnnotationsAuthorizingMethodInterceptor.java:82)\r\n at org.apache.shiro.authz.aop.AuthorizingMethodInterceptor.invoke(AuthorizingMethodInterceptor.java:39)\r\n at org.apache.shiro.spring.security.interceptor.AopAllianceAnnotationsAuthorizingMethodInterceptor.invoke(AopAllianceAnnotationsAuthorizingMethodInterceptor.java:115)\r\n at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)\r\n at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768)\r\n at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)\r\n at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)\r\n at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768)\r\n at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:720)\r\n at io.modules.sys.controller.ArticleController$$SpringCGLIB$$0.page()\r\n at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\r\n at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\r\n at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\r\n at java.base/java.lang.reflect.Method.invoke(Method.java:568)\r\n at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:255)\r\n at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:188)\r\n at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:926)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831)\r\n at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\r\n at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\r\n at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\r\n at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\r\n at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564)\r\n at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\r\n at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\r\n at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\r\n at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at io.common.xss.XssFilter.doFilter(XssFilter.java:23)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\r\n at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\r\n at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\r\n at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:352)\r\n at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:268)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)\r\n at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)\r\n at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)\r\n at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)\r\n at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\r\n at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\r\n at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)\r\n at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389)\r\n at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\r\n at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896)\r\n at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741)\r\n at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)\r\n at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\r\n at java.base/java.lang.Thread.run(Thread.java:840)\r\nCaused by: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near \'like,cover,create_time FROM tb_article) TOTAL\' at line 1\r\n at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:121)\r\n at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)\r\n at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:912)\r\n at com.mysql.cj.jdbc.ClientPreparedStatement.execute(ClientPreparedStatement.java:354)\r\n at com.alibaba.druid.pool.DruidPooledPreparedStatement.execute(DruidPooledPreparedStatement.java:483)\r\n at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:65)\r\n at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:80)\r\n at jdk.internal.reflect.GeneratedMethodAccessor16.invoke(Unknown Source)\r\n at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\r\n at java.base/java.lang.reflect.Method.invoke(Method.java:568)\r\n at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)\r\n at jdk.proxy2/jdk.proxy2.$Proxy137.query(Unknown Source)\r\n at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:65)\r\n at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336)\r\n at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158)\r\n at com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor.willDoQuery(PaginationInnerInterceptor.java:135)\r\n at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:75)\r\n at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59)\r\n at jdk.proxy2/jdk.proxy2.$Proxy136.query(Unknown Source)\r\n at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154)\r\n at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147)\r\n at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142)\r\n at jdk.internal.reflect.GeneratedMethodAccessor61.invoke(Unknown Source)\r\n at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\r\n at java.base/java.lang.reflect.Method.invoke(Method.java:568)\r\n at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:425)\r\n ... 130 more\r\n', 1067246875800000001, '2024-12-03 23:10:52'); +INSERT INTO `sys_log_error` VALUES (1863964725365186561, '/admin/item/slides', 'POST', NULL, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 'org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize value of type `java.util.Date` from String \"1\": not a valid representation (error: Failed to parse Date value \'1\': Unparseable date: \"1\")\r\n at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:406)\r\n at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.read(AbstractJackson2HttpMessageConverter.java:354)\r\n at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:184)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:161)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:135)\r\n at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:122)\r\n at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:224)\r\n at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:178)\r\n at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:926)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831)\r\n at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\r\n at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\r\n at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\r\n at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\r\n at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590)\r\n at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\r\n at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\r\n at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\r\n at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at io.common.xss.XssFilter.doFilter(XssFilter.java:23)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\r\n at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\r\n at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\r\n at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:352)\r\n at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:268)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)\r\n at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)\r\n at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)\r\n at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)\r\n at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\r\n at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\r\n at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)\r\n at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389)\r\n at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\r\n at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896)\r\n at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741)\r\n at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)\r\n at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\r\n at java.base/java.lang.Thread.run(Thread.java:840)\r\nCaused by: com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `java.util.Date` from String \"1\": not a valid representation (error: Failed to parse Date value \'1\': Unparseable date: \"1\")\n at [Source: (org.springframework.util.StreamUtils$NonClosingInputStream); line: 1, column: 56] (through reference chain: io.modules.item.dto.SlidesDTO[\"createTime\"])\r\n at com.fasterxml.jackson.databind.exc.InvalidFormatException.from(InvalidFormatException.java:67)\r\n at com.fasterxml.jackson.databind.DeserializationContext.weirdStringException(DeserializationContext.java:2002)\r\n at com.fasterxml.jackson.databind.DeserializationContext.handleWeirdStringValue(DeserializationContext.java:1230)\r\n at com.fasterxml.jackson.databind.deser.std.StdDeserializer._parseDate(StdDeserializer.java:1362)\r\n at com.fasterxml.jackson.databind.deser.std.StdDeserializer._parseDate(StdDeserializer.java:1304)\r\n at com.fasterxml.jackson.databind.deser.std.DateDeserializers$DateBasedDeserializer._parseDate(DateDeserializers.java:201)\r\n at com.fasterxml.jackson.databind.deser.std.DateDeserializers$DateDeserializer.deserialize(DateDeserializers.java:303)\r\n at com.fasterxml.jackson.databind.deser.std.DateDeserializers$DateDeserializer.deserialize(DateDeserializers.java:281)\r\n at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:129)\r\n at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:314)\r\n at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:177)\r\n at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:323)\r\n at com.fasterxml.jackson.databind.ObjectReader._bindAndClose(ObjectReader.java:2105)\r\n at com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:1481)\r\n at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:395)\r\n ... 92 more\r\n', 1067246875800000001, '2024-12-03 23:13:16'); +INSERT INTO `sys_log_error` VALUES (1863964860761513985, '/admin/item/slides', 'POST', NULL, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 'org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize value of type `java.util.Date` from String \"1\": not a valid representation (error: Failed to parse Date value \'1\': Unparseable date: \"1\")\r\n at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:406)\r\n at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.read(AbstractJackson2HttpMessageConverter.java:354)\r\n at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:184)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:161)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:135)\r\n at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:122)\r\n at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:224)\r\n at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:178)\r\n at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:926)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831)\r\n at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\r\n at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\r\n at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\r\n at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\r\n at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590)\r\n at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\r\n at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\r\n at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\r\n at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at io.common.xss.XssFilter.doFilter(XssFilter.java:23)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\r\n at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\r\n at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\r\n at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:352)\r\n at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:268)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)\r\n at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)\r\n at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)\r\n at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)\r\n at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\r\n at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\r\n at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)\r\n at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389)\r\n at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\r\n at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896)\r\n at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741)\r\n at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)\r\n at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\r\n at java.base/java.lang.Thread.run(Thread.java:840)\r\nCaused by: com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `java.util.Date` from String \"1\": not a valid representation (error: Failed to parse Date value \'1\': Unparseable date: \"1\")\n at [Source: (org.springframework.util.StreamUtils$NonClosingInputStream); line: 1, column: 56] (through reference chain: io.modules.item.dto.SlidesDTO[\"createTime\"])\r\n at com.fasterxml.jackson.databind.exc.InvalidFormatException.from(InvalidFormatException.java:67)\r\n at com.fasterxml.jackson.databind.DeserializationContext.weirdStringException(DeserializationContext.java:2002)\r\n at com.fasterxml.jackson.databind.DeserializationContext.handleWeirdStringValue(DeserializationContext.java:1230)\r\n at com.fasterxml.jackson.databind.deser.std.StdDeserializer._parseDate(StdDeserializer.java:1362)\r\n at com.fasterxml.jackson.databind.deser.std.StdDeserializer._parseDate(StdDeserializer.java:1304)\r\n at com.fasterxml.jackson.databind.deser.std.DateDeserializers$DateBasedDeserializer._parseDate(DateDeserializers.java:201)\r\n at com.fasterxml.jackson.databind.deser.std.DateDeserializers$DateDeserializer.deserialize(DateDeserializers.java:303)\r\n at com.fasterxml.jackson.databind.deser.std.DateDeserializers$DateDeserializer.deserialize(DateDeserializers.java:281)\r\n at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:129)\r\n at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:314)\r\n at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:177)\r\n at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:323)\r\n at com.fasterxml.jackson.databind.ObjectReader._bindAndClose(ObjectReader.java:2105)\r\n at com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:1481)\r\n at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:395)\r\n ... 92 more\r\n', 1067246875800000001, '2024-12-03 23:13:48'); +INSERT INTO `sys_log_error` VALUES (1863964860761513986, '/admin/sys/oss/upload', 'POST', '{\"token\":\"e2e5bfa7cdb043a6b0934911ac9135a8\"}', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 'org.springframework.web.servlet.resource.NoResourceFoundException: No static resource sys/oss/upload.\r\n at org.springframework.web.servlet.resource.ResourceHttpRequestHandler.handleRequest(ResourceHttpRequestHandler.java:585)\r\n at org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:52)\r\n at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\r\n at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\r\n at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\r\n at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590)\r\n at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\r\n at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\r\n at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\r\n at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at io.common.xss.XssFilter.doFilter(XssFilter.java:23)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\r\n at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\r\n at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\r\n at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:352)\r\n at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:268)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)\r\n at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)\r\n at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)\r\n at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)\r\n at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\r\n at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\r\n at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)\r\n at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389)\r\n at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\r\n at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896)\r\n at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741)\r\n at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)\r\n at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\r\n at java.base/java.lang.Thread.run(Thread.java:840)\r\n', 1067246875800000001, '2024-12-10 21:24:05'); +INSERT INTO `sys_log_error` VALUES (1863964860761513987, '/admin/sys/oss/upload', 'POST', '{\"token\":\"e2e5bfa7cdb043a6b0934911ac9135a8\"}', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 'org.springframework.web.servlet.resource.NoResourceFoundException: No static resource sys/oss/upload.\r\n at org.springframework.web.servlet.resource.ResourceHttpRequestHandler.handleRequest(ResourceHttpRequestHandler.java:585)\r\n at org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:52)\r\n at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\r\n at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\r\n at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\r\n at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590)\r\n at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\r\n at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\r\n at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\r\n at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at io.common.xss.XssFilter.doFilter(XssFilter.java:23)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\r\n at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\r\n at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\r\n at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:352)\r\n at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:268)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)\r\n at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)\r\n at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)\r\n at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)\r\n at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\r\n at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\r\n at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)\r\n at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389)\r\n at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\r\n at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896)\r\n at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741)\r\n at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)\r\n at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\r\n at java.base/java.lang.Thread.run(Thread.java:840)\r\n', 1067246875800000001, '2024-12-10 21:24:23'); +INSERT INTO `sys_log_error` VALUES (1863964860761513988, '/admin/item/article', 'POST', NULL, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 'org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Illegal unquoted character ((CTRL-CHAR, code 10)): has to be escaped using backslash to be included in string value\r\n at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:406)\r\n at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.read(AbstractJackson2HttpMessageConverter.java:354)\r\n at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:184)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:161)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:135)\r\n at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:122)\r\n at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:224)\r\n at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:178)\r\n at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:926)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831)\r\n at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\r\n at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\r\n at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\r\n at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\r\n at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590)\r\n at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\r\n at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\r\n at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\r\n at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at io.common.xss.XssFilter.doFilter(XssFilter.java:23)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\r\n at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\r\n at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\r\n at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:352)\r\n at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:268)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)\r\n at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)\r\n at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)\r\n at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)\r\n at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\r\n at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\r\n at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)\r\n at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389)\r\n at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\r\n at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896)\r\n at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741)\r\n at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)\r\n at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\r\n at java.base/java.lang.Thread.run(Thread.java:840)\r\nCaused by: com.fasterxml.jackson.databind.JsonMappingException: Illegal unquoted character ((CTRL-CHAR, code 10)): has to be escaped using backslash to be included in string value\n at [Source: (org.springframework.util.StreamUtils$NonClosingInputStream); line: 1, column: 592] (through reference chain: io.modules.item.dto.ArticleDTO[\"content\"])\r\n at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:402)\r\n at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:361)\r\n at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.wrapAndThrow(BeanDeserializerBase.java:1863)\r\n at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:316)\r\n at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:177)\r\n at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:323)\r\n at com.fasterxml.jackson.databind.ObjectReader._bindAndClose(ObjectReader.java:2105)\r\n at com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:1481)\r\n at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:395)\r\n ... 92 more\r\nCaused by: com.fasterxml.jackson.core.JsonParseException: Illegal unquoted character ((CTRL-CHAR, code 10)): has to be escaped using backslash to be included in string value\n at [Source: (org.springframework.util.StreamUtils$NonClosingInputStream); line: 1, column: 592]\r\n at com.fasterxml.jackson.core.JsonParser._constructError(JsonParser.java:2477)\r\n at com.fasterxml.jackson.core.base.ParserMinimalBase._reportError(ParserMinimalBase.java:750)\r\n at com.fasterxml.jackson.core.base.ParserBase._throwUnquotedSpace(ParserBase.java:1374)\r\n at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._finishString2(UTF8StreamJsonParser.java:2631)\r\n at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._finishAndReturnString(UTF8StreamJsonParser.java:2560)\r\n at com.fasterxml.jackson.core.json.UTF8StreamJsonParser.getText(UTF8StreamJsonParser.java:335)\r\n at com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:42)\r\n at com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:11)\r\n at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:129)\r\n at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:314)\r\n ... 97 more\r\n', 1067246875800000001, '2024-12-10 21:37:18'); +INSERT INTO `sys_log_error` VALUES (1863964860761513989, '/admin/item/article', 'POST', NULL, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 'org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Illegal unquoted character ((CTRL-CHAR, code 10)): has to be escaped using backslash to be included in string value\r\n at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:406)\r\n at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.read(AbstractJackson2HttpMessageConverter.java:354)\r\n at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:184)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:161)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:135)\r\n at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:122)\r\n at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:224)\r\n at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:178)\r\n at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:926)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831)\r\n at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\r\n at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\r\n at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\r\n at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\r\n at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590)\r\n at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\r\n at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\r\n at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\r\n at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at io.common.xss.XssFilter.doFilter(XssFilter.java:23)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\r\n at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\r\n at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\r\n at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:352)\r\n at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:268)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)\r\n at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)\r\n at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)\r\n at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)\r\n at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\r\n at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\r\n at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)\r\n at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389)\r\n at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\r\n at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896)\r\n at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741)\r\n at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)\r\n at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\r\n at java.base/java.lang.Thread.run(Thread.java:840)\r\nCaused by: com.fasterxml.jackson.databind.JsonMappingException: Illegal unquoted character ((CTRL-CHAR, code 10)): has to be escaped using backslash to be included in string value\n at [Source: (org.springframework.util.StreamUtils$NonClosingInputStream); line: 1, column: 592] (through reference chain: io.modules.item.dto.ArticleDTO[\"content\"])\r\n at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:402)\r\n at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:361)\r\n at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.wrapAndThrow(BeanDeserializerBase.java:1863)\r\n at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:316)\r\n at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:177)\r\n at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:323)\r\n at com.fasterxml.jackson.databind.ObjectReader._bindAndClose(ObjectReader.java:2105)\r\n at com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:1481)\r\n at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:395)\r\n ... 92 more\r\nCaused by: com.fasterxml.jackson.core.JsonParseException: Illegal unquoted character ((CTRL-CHAR, code 10)): has to be escaped using backslash to be included in string value\n at [Source: (org.springframework.util.StreamUtils$NonClosingInputStream); line: 1, column: 592]\r\n at com.fasterxml.jackson.core.JsonParser._constructError(JsonParser.java:2477)\r\n at com.fasterxml.jackson.core.base.ParserMinimalBase._reportError(ParserMinimalBase.java:750)\r\n at com.fasterxml.jackson.core.base.ParserBase._throwUnquotedSpace(ParserBase.java:1374)\r\n at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._finishString2(UTF8StreamJsonParser.java:2631)\r\n at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._finishAndReturnString(UTF8StreamJsonParser.java:2560)\r\n at com.fasterxml.jackson.core.json.UTF8StreamJsonParser.getText(UTF8StreamJsonParser.java:335)\r\n at com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:42)\r\n at com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:11)\r\n at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:129)\r\n at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:314)\r\n ... 97 more\r\n', 1067246875800000001, '2024-12-10 21:37:44'); +INSERT INTO `sys_log_error` VALUES (1863964860761513990, '/admin/item/article', 'POST', NULL, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 'org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Illegal unquoted character ((CTRL-CHAR, code 10)): has to be escaped using backslash to be included in string value\r\n at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:406)\r\n at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.read(AbstractJackson2HttpMessageConverter.java:354)\r\n at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:184)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:161)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:135)\r\n at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:122)\r\n at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:224)\r\n at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:178)\r\n at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:926)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831)\r\n at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\r\n at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\r\n at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\r\n at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\r\n at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590)\r\n at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\r\n at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\r\n at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\r\n at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at io.common.xss.XssFilter.doFilter(XssFilter.java:23)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\r\n at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\r\n at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\r\n at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:352)\r\n at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:268)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)\r\n at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)\r\n at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)\r\n at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)\r\n at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\r\n at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\r\n at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)\r\n at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389)\r\n at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\r\n at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896)\r\n at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741)\r\n at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)\r\n at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\r\n at java.base/java.lang.Thread.run(Thread.java:840)\r\nCaused by: com.fasterxml.jackson.databind.JsonMappingException: Illegal unquoted character ((CTRL-CHAR, code 10)): has to be escaped using backslash to be included in string value\n at [Source: (org.springframework.util.StreamUtils$NonClosingInputStream); line: 1, column: 592] (through reference chain: io.modules.item.dto.ArticleDTO[\"content\"])\r\n at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:402)\r\n at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:361)\r\n at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.wrapAndThrow(BeanDeserializerBase.java:1863)\r\n at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:316)\r\n at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:177)\r\n at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:323)\r\n at com.fasterxml.jackson.databind.ObjectReader._bindAndClose(ObjectReader.java:2105)\r\n at com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:1481)\r\n at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:395)\r\n ... 92 more\r\nCaused by: com.fasterxml.jackson.core.JsonParseException: Illegal unquoted character ((CTRL-CHAR, code 10)): has to be escaped using backslash to be included in string value\n at [Source: (org.springframework.util.StreamUtils$NonClosingInputStream); line: 1, column: 592]\r\n at com.fasterxml.jackson.core.JsonParser._constructError(JsonParser.java:2477)\r\n at com.fasterxml.jackson.core.base.ParserMinimalBase._reportError(ParserMinimalBase.java:750)\r\n at com.fasterxml.jackson.core.base.ParserBase._throwUnquotedSpace(ParserBase.java:1374)\r\n at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._finishString2(UTF8StreamJsonParser.java:2631)\r\n at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._finishAndReturnString(UTF8StreamJsonParser.java:2560)\r\n at com.fasterxml.jackson.core.json.UTF8StreamJsonParser.getText(UTF8StreamJsonParser.java:335)\r\n at com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:42)\r\n at com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:11)\r\n at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:129)\r\n at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:314)\r\n ... 97 more\r\n', 1067246875800000001, '2024-12-10 21:37:55'); +INSERT INTO `sys_log_error` VALUES (1863964860761513991, '/admin/item/article/page', 'GET', '{\"_t\":\"1733838695115\",\"limit\":\"10\",\"page\":\"1\"}', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 'org.springframework.jdbc.BadSqlGrammarException: \r\n### Error querying database. Cause: java.sql.SQLSyntaxErrorException: Unknown column \'star\' in \'field list\'\r\n### The error may exist in io/modules/item/dao/ArticleDao.java (best guess)\r\n### The error may involve defaultParameterMap\r\n### The error occurred while setting parameters\r\n### SQL: SELECT id,title,introduction,user_id,content,sort,star,cover,create_time,type,tag FROM tb_article LIMIT ?\r\n### Cause: java.sql.SQLSyntaxErrorException: Unknown column \'star\' in \'field list\'\n; bad SQL grammar []\r\n at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:246)\r\n at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:107)\r\n at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:92)\r\n at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:439)\r\n at jdk.proxy2/jdk.proxy2.$Proxy93.selectList(Unknown Source)\r\n at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:224)\r\n at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.executeForMany(MybatisMapperMethod.java:164)\r\n at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:77)\r\n at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:152)\r\n at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89)\r\n at jdk.proxy2/jdk.proxy2.$Proxy116.selectList(Unknown Source)\r\n at com.baomidou.mybatisplus.core.mapper.BaseMapper.selectPage(BaseMapper.java:348)\r\n at java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:732)\r\n at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$DefaultMethodInvoker.invoke(MybatisMapperProxy.java:166)\r\n at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89)\r\n at jdk.proxy2/jdk.proxy2.$Proxy116.selectPage(Unknown Source)\r\n at io.common.service.impl.CrudServiceImpl.page(CrudServiceImpl.java:31)\r\n at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\r\n at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\r\n at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\r\n at java.base/java.lang.reflect.Method.invoke(Method.java:568)\r\n at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:354)\r\n at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:716)\r\n at io.modules.item.service.impl.ArticleServiceImpl$$SpringCGLIB$$0.page()\r\n at io.modules.sys.controller.ArticleController.page(ArticleController.java:44)\r\n at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\r\n at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\r\n at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\r\n at java.base/java.lang.reflect.Method.invoke(Method.java:568)\r\n at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:354)\r\n at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196)\r\n at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)\r\n at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768)\r\n at org.apache.shiro.spring.security.interceptor.AopAllianceAnnotationsAuthorizingMethodInterceptor$1.proceed(AopAllianceAnnotationsAuthorizingMethodInterceptor.java:82)\r\n at org.apache.shiro.authz.aop.AuthorizingMethodInterceptor.invoke(AuthorizingMethodInterceptor.java:39)\r\n at org.apache.shiro.spring.security.interceptor.AopAllianceAnnotationsAuthorizingMethodInterceptor.invoke(AopAllianceAnnotationsAuthorizingMethodInterceptor.java:115)\r\n at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)\r\n at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768)\r\n at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)\r\n at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)\r\n at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768)\r\n at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:720)\r\n at io.modules.sys.controller.ArticleController$$SpringCGLIB$$0.page()\r\n at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\r\n at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\r\n at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\r\n at java.base/java.lang.reflect.Method.invoke(Method.java:568)\r\n at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:255)\r\n at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:188)\r\n at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:926)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831)\r\n at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\r\n at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\r\n at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\r\n at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\r\n at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564)\r\n at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\r\n at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\r\n at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\r\n at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)\r\n at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)\r\n at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)\r\n at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)\r\n at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\r\n at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\r\n at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)\r\n at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389)\r\n at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\r\n at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896)\r\n at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741)\r\n at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)\r\n at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\r\n at java.base/java.lang.Thread.run(Thread.java:840)\r\nCaused by: java.sql.SQLSyntaxErrorException: Unknown column \'star\' in \'field list\'\r\n at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:121)\r\n at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)\r\n at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:912)\r\n at com.mysql.cj.jdbc.ClientPreparedStatement.execute(ClientPreparedStatement.java:354)\r\n at com.alibaba.druid.pool.DruidPooledPreparedStatement.execute(DruidPooledPreparedStatement.java:483)\r\n at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:65)\r\n at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:80)\r\n at jdk.internal.reflect.GeneratedMethodAccessor16.invoke(Unknown Source)\r\n at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\r\n at java.base/java.lang.reflect.Method.invoke(Method.java:568)\r\n at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)\r\n at jdk.proxy2/jdk.proxy2.$Proxy137.query(Unknown Source)\r\n at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:65)\r\n at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336)\r\n at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158)\r\n at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:81)\r\n at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59)\r\n at jdk.proxy2/jdk.proxy2.$Proxy136.query(Unknown Source)\r\n at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154)\r\n at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147)\r\n at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142)\r\n at jdk.internal.reflect.GeneratedMethodAccessor61.invoke(Unknown Source)\r\n at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\r\n at java.base/java.lang.reflect.Method.invoke(Method.java:568)\r\n at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:425)\r\n ... 107 more\r\n', 1067246875800000001, '2024-12-10 21:51:36'); +INSERT INTO `sys_log_error` VALUES (1863964860761513992, '/admin/sys/oss/page', 'GET', '{\"_t\":\"1733839620373\",\"limit\":\"10\",\"page\":\"1\"}', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 'org.springframework.web.servlet.resource.NoResourceFoundException: No static resource sys/oss/page.\r\n at org.springframework.web.servlet.resource.ResourceHttpRequestHandler.handleRequest(ResourceHttpRequestHandler.java:585)\r\n at org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:52)\r\n at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\r\n at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\r\n at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\r\n at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564)\r\n at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\r\n at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\r\n at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\r\n at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)\r\n at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)\r\n at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)\r\n at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)\r\n at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\r\n at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\r\n at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)\r\n at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389)\r\n at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\r\n at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896)\r\n at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741)\r\n at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)\r\n at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\r\n at java.base/java.lang.Thread.run(Thread.java:840)\r\n', 1067246875800000001, '2024-12-10 22:07:00'); +INSERT INTO `sys_log_error` VALUES (1863964860761513993, '/admin/sys/oss/page', 'GET', '{\"_t\":\"1733839655987\",\"limit\":\"10\",\"page\":\"1\"}', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 'org.springframework.web.servlet.resource.NoResourceFoundException: No static resource sys/oss/page.\r\n at org.springframework.web.servlet.resource.ResourceHttpRequestHandler.handleRequest(ResourceHttpRequestHandler.java:585)\r\n at org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:52)\r\n at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\r\n at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\r\n at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\r\n at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564)\r\n at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\r\n at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\r\n at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\r\n at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)\r\n at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)\r\n at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)\r\n at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)\r\n at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\r\n at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\r\n at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)\r\n at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389)\r\n at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\r\n at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896)\r\n at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741)\r\n at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)\r\n at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\r\n at java.base/java.lang.Thread.run(Thread.java:840)\r\n', 1067246875800000001, '2024-12-10 22:07:36'); +INSERT INTO `sys_log_error` VALUES (1863964860761513994, '/admin/item/dict', 'POST', NULL, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0', '0:0:0:0:0:0:0:1', 'org.springframework.dao.DataIntegrityViolationException: \r\n### Error updating database. Cause: java.sql.SQLException: Field \'id\' doesn\'t have a default value\r\n### The error may exist in io/modules/item/dao/DictDao.java (best guess)\r\n### The error may involve io.modules.item.dao.DictDao.insert-Inline\r\n### The error occurred while setting parameters\r\n### SQL: INSERT INTO tb_dict ( content ) VALUES ( ? )\r\n### Cause: java.sql.SQLException: Field \'id\' doesn\'t have a default value\n; Field \'id\' doesn\'t have a default value\r\n at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:258)\r\n at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:107)\r\n at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:92)\r\n at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:439)\r\n at jdk.proxy2/jdk.proxy2.$Proxy93.insert(Unknown Source)\r\n at org.mybatis.spring.SqlSessionTemplate.insert(SqlSessionTemplate.java:272)\r\n at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:59)\r\n at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:152)\r\n at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89)\r\n at jdk.proxy2/jdk.proxy2.$Proxy117.insert(Unknown Source)\r\n at io.common.service.impl.BaseServiceImpl.insert(BaseServiceImpl.java:145)\r\n at io.common.service.impl.CrudServiceImpl.save(CrudServiceImpl.java:58)\r\n at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\r\n at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\r\n at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\r\n at java.base/java.lang.reflect.Method.invoke(Method.java:568)\r\n at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:354)\r\n at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:716)\r\n at io.modules.item.service.impl.DictServiceImpl$$SpringCGLIB$$0.save()\r\n at io.modules.sys.controller.DictController.save(DictController.java:71)\r\n at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\r\n at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\r\n at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\r\n at java.base/java.lang.reflect.Method.invoke(Method.java:568)\r\n at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:354)\r\n at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196)\r\n at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)\r\n at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768)\r\n at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)\r\n at io.common.aspect.LogOperationAspect.around(LogOperationAspect.java:41)\r\n at jdk.internal.reflect.GeneratedMethodAccessor129.invoke(Unknown Source)\r\n at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\r\n at java.base/java.lang.reflect.Method.invoke(Method.java:568)\r\n at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:637)\r\n at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:627)\r\n at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:71)\r\n at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:173)\r\n at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768)\r\n at org.apache.shiro.spring.security.interceptor.AopAllianceAnnotationsAuthorizingMethodInterceptor$1.proceed(AopAllianceAnnotationsAuthorizingMethodInterceptor.java:82)\r\n at org.apache.shiro.authz.aop.AuthorizingMethodInterceptor.invoke(AuthorizingMethodInterceptor.java:39)\r\n at org.apache.shiro.spring.security.interceptor.AopAllianceAnnotationsAuthorizingMethodInterceptor.invoke(AopAllianceAnnotationsAuthorizingMethodInterceptor.java:115)\r\n at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)\r\n at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768)\r\n at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)\r\n at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)\r\n at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768)\r\n at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:720)\r\n at io.modules.sys.controller.DictController$$SpringCGLIB$$0.save()\r\n at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\r\n at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\r\n at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\r\n at java.base/java.lang.reflect.Method.invoke(Method.java:568)\r\n at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:255)\r\n at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:188)\r\n at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:926)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831)\r\n at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\r\n at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\r\n at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\r\n at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\r\n at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590)\r\n at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\r\n at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\r\n at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\r\n at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)\r\n at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)\r\n at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)\r\n at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)\r\n at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\r\n at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\r\n at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)\r\n at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389)\r\n at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\r\n at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896)\r\n at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741)\r\n at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)\r\n at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\r\n at java.base/java.lang.Thread.run(Thread.java:840)\r\nCaused by: java.sql.SQLException: Field \'id\' doesn\'t have a default value\r\n at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:130)\r\n at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)\r\n at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:912)\r\n at com.mysql.cj.jdbc.ClientPreparedStatement.execute(ClientPreparedStatement.java:354)\r\n at com.alibaba.druid.pool.DruidPooledPreparedStatement.execute(DruidPooledPreparedStatement.java:483)\r\n at org.apache.ibatis.executor.statement.PreparedStatementHandler.update(PreparedStatementHandler.java:48)\r\n at org.apache.ibatis.executor.statement.RoutingStatementHandler.update(RoutingStatementHandler.java:75)\r\n at jdk.internal.reflect.GeneratedMethodAccessor112.invoke(Unknown Source)\r\n at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\r\n at java.base/java.lang.reflect.Method.invoke(Method.java:568)\r\n at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)\r\n at jdk.proxy2/jdk.proxy2.$Proxy140.update(Unknown Source)\r\n at org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:50)\r\n at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:117)\r\n at jdk.internal.reflect.GeneratedMethodAccessor111.invoke(Unknown Source)\r\n at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\r\n at java.base/java.lang.reflect.Method.invoke(Method.java:568)\r\n at org.apache.ibatis.plugin.Invocation.proceed(Invocation.java:49)\r\n at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:106)\r\n at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59)\r\n at jdk.proxy2/jdk.proxy2.$Proxy139.update(Unknown Source)\r\n at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:197)\r\n at org.apache.ibatis.session.defaults.DefaultSqlSession.insert(DefaultSqlSession.java:184)\r\n at jdk.internal.reflect.GeneratedMethodAccessor131.invoke(Unknown Source)\r\n at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\r\n at java.base/java.lang.reflect.Method.invoke(Method.java:568)\r\n at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:425)\r\n ... 112 more\r\n', 1067246875800000001, '2024-12-12 23:18:07'); +INSERT INTO `sys_log_error` VALUES (1863964860761513995, '/admin/item/dict', 'POST', NULL, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0', '0:0:0:0:0:0:0:1', 'org.springframework.dao.DataIntegrityViolationException: \r\n### Error updating database. Cause: java.sql.SQLException: Field \'create_time\' doesn\'t have a default value\r\n### The error may exist in io/modules/item/dao/DictDao.java (best guess)\r\n### The error may involve io.modules.item.dao.DictDao.insert-Inline\r\n### The error occurred while setting parameters\r\n### SQL: INSERT INTO tb_dict ( content ) VALUES ( ? )\r\n### Cause: java.sql.SQLException: Field \'create_time\' doesn\'t have a default value\n; Field \'create_time\' doesn\'t have a default value\r\n at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:258)\r\n at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:107)\r\n at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:92)\r\n at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:439)\r\n at jdk.proxy2/jdk.proxy2.$Proxy93.insert(Unknown Source)\r\n at org.mybatis.spring.SqlSessionTemplate.insert(SqlSessionTemplate.java:272)\r\n at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:59)\r\n at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:152)\r\n at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89)\r\n at jdk.proxy2/jdk.proxy2.$Proxy117.insert(Unknown Source)\r\n at io.common.service.impl.BaseServiceImpl.insert(BaseServiceImpl.java:145)\r\n at io.common.service.impl.CrudServiceImpl.save(CrudServiceImpl.java:58)\r\n at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\r\n at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\r\n at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\r\n at java.base/java.lang.reflect.Method.invoke(Method.java:568)\r\n at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:354)\r\n at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:716)\r\n at io.modules.item.service.impl.DictServiceImpl$$SpringCGLIB$$0.save()\r\n at io.modules.sys.controller.DictController.save(DictController.java:71)\r\n at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\r\n at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\r\n at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\r\n at java.base/java.lang.reflect.Method.invoke(Method.java:568)\r\n at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:354)\r\n at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196)\r\n at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)\r\n at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768)\r\n at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)\r\n at io.common.aspect.LogOperationAspect.around(LogOperationAspect.java:41)\r\n at jdk.internal.reflect.GeneratedMethodAccessor129.invoke(Unknown Source)\r\n at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\r\n at java.base/java.lang.reflect.Method.invoke(Method.java:568)\r\n at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:637)\r\n at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:627)\r\n at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:71)\r\n at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:173)\r\n at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768)\r\n at org.apache.shiro.spring.security.interceptor.AopAllianceAnnotationsAuthorizingMethodInterceptor$1.proceed(AopAllianceAnnotationsAuthorizingMethodInterceptor.java:82)\r\n at org.apache.shiro.authz.aop.AuthorizingMethodInterceptor.invoke(AuthorizingMethodInterceptor.java:39)\r\n at org.apache.shiro.spring.security.interceptor.AopAllianceAnnotationsAuthorizingMethodInterceptor.invoke(AopAllianceAnnotationsAuthorizingMethodInterceptor.java:115)\r\n at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)\r\n at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768)\r\n at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)\r\n at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)\r\n at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768)\r\n at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:720)\r\n at io.modules.sys.controller.DictController$$SpringCGLIB$$0.save()\r\n at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\r\n at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\r\n at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\r\n at java.base/java.lang.reflect.Method.invoke(Method.java:568)\r\n at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:255)\r\n at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:188)\r\n at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:926)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831)\r\n at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\r\n at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\r\n at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\r\n at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\r\n at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590)\r\n at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\r\n at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\r\n at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\r\n at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)\r\n at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)\r\n at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)\r\n at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)\r\n at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\r\n at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\r\n at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)\r\n at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389)\r\n at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\r\n at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896)\r\n at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741)\r\n at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)\r\n at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\r\n at java.base/java.lang.Thread.run(Thread.java:840)\r\nCaused by: java.sql.SQLException: Field \'create_time\' doesn\'t have a default value\r\n at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:130)\r\n at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)\r\n at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:912)\r\n at com.mysql.cj.jdbc.ClientPreparedStatement.execute(ClientPreparedStatement.java:354)\r\n at com.alibaba.druid.pool.DruidPooledPreparedStatement.execute(DruidPooledPreparedStatement.java:483)\r\n at org.apache.ibatis.executor.statement.PreparedStatementHandler.update(PreparedStatementHandler.java:48)\r\n at org.apache.ibatis.executor.statement.RoutingStatementHandler.update(RoutingStatementHandler.java:75)\r\n at jdk.internal.reflect.GeneratedMethodAccessor112.invoke(Unknown Source)\r\n at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\r\n at java.base/java.lang.reflect.Method.invoke(Method.java:568)\r\n at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)\r\n at jdk.proxy2/jdk.proxy2.$Proxy140.update(Unknown Source)\r\n at org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:50)\r\n at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:117)\r\n at jdk.internal.reflect.GeneratedMethodAccessor111.invoke(Unknown Source)\r\n at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\r\n at java.base/java.lang.reflect.Method.invoke(Method.java:568)\r\n at org.apache.ibatis.plugin.Invocation.proceed(Invocation.java:49)\r\n at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:106)\r\n at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59)\r\n at jdk.proxy2/jdk.proxy2.$Proxy139.update(Unknown Source)\r\n at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:197)\r\n at org.apache.ibatis.session.defaults.DefaultSqlSession.insert(DefaultSqlSession.java:184)\r\n at jdk.internal.reflect.GeneratedMethodAccessor131.invoke(Unknown Source)\r\n at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\r\n at java.base/java.lang.reflect.Method.invoke(Method.java:568)\r\n at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:425)\r\n ... 112 more\r\n', 1067246875800000001, '2024-12-12 23:18:21'); +INSERT INTO `sys_log_error` VALUES (1863964860761513996, '/favicon.ico', 'GET', NULL, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0', '0:0:0:0:0:0:0:1', 'org.springframework.web.servlet.resource.NoResourceFoundException: No static resource favicon.ico.\r\n at org.springframework.web.servlet.resource.ResourceHttpRequestHandler.handleRequest(ResourceHttpRequestHandler.java:585)\r\n at org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:52)\r\n at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\r\n at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\r\n at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\r\n at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564)\r\n at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\r\n at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\r\n at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\r\n at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)\r\n at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)\r\n at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)\r\n at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)\r\n at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\r\n at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\r\n at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)\r\n at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389)\r\n at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\r\n at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896)\r\n at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741)\r\n at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)\r\n at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\r\n at java.base/java.lang.Thread.run(Thread.java:840)\r\n', NULL, '2025-01-07 22:33:14'); +INSERT INTO `sys_log_error` VALUES (1863964860761513997, '/favicon.ico', 'GET', NULL, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0', '0:0:0:0:0:0:0:1', 'org.springframework.web.servlet.resource.NoResourceFoundException: No static resource favicon.ico.\r\n at org.springframework.web.servlet.resource.ResourceHttpRequestHandler.handleRequest(ResourceHttpRequestHandler.java:585)\r\n at org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:52)\r\n at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\r\n at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\r\n at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\r\n at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564)\r\n at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\r\n at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\r\n at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\r\n at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)\r\n at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)\r\n at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)\r\n at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)\r\n at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\r\n at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\r\n at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)\r\n at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389)\r\n at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\r\n at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896)\r\n at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741)\r\n at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)\r\n at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\r\n at java.base/java.lang.Thread.run(Thread.java:840)\r\n', NULL, '2025-01-07 22:33:29'); +INSERT INTO `sys_log_error` VALUES (1863964860761513998, '/favicon.ico', 'GET', NULL, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36', '0:0:0:0:0:0:0:1', 'org.springframework.web.servlet.resource.NoResourceFoundException: No static resource favicon.ico.\r\n at org.springframework.web.servlet.resource.ResourceHttpRequestHandler.handleRequest(ResourceHttpRequestHandler.java:585)\r\n at org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:52)\r\n at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\r\n at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\r\n at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\r\n at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564)\r\n at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\r\n at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\r\n at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\r\n at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)\r\n at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)\r\n at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)\r\n at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)\r\n at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\r\n at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\r\n at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)\r\n at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389)\r\n at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\r\n at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896)\r\n at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741)\r\n at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)\r\n at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\r\n at java.base/java.lang.Thread.run(Thread.java:840)\r\n', NULL, '2025-01-07 22:39:08'); +INSERT INTO `sys_log_error` VALUES (1863964860761513999, '/favicon.ico', 'GET', NULL, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36', '0:0:0:0:0:0:0:1', 'org.springframework.web.servlet.resource.NoResourceFoundException: No static resource favicon.ico.\r\n at org.springframework.web.servlet.resource.ResourceHttpRequestHandler.handleRequest(ResourceHttpRequestHandler.java:585)\r\n at org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:52)\r\n at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\r\n at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\r\n at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\r\n at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564)\r\n at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\r\n at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\r\n at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\r\n at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)\r\n at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)\r\n at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)\r\n at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)\r\n at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\r\n at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\r\n at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)\r\n at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389)\r\n at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\r\n at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896)\r\n at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741)\r\n at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)\r\n at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\r\n at java.base/java.lang.Thread.run(Thread.java:840)\r\n', NULL, '2025-01-07 22:39:21'); +INSERT INTO `sys_log_error` VALUES (1863964860761514000, '/favicon.ico', 'GET', NULL, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36', '0:0:0:0:0:0:0:1', 'org.springframework.web.servlet.resource.NoResourceFoundException: No static resource favicon.ico.\r\n at org.springframework.web.servlet.resource.ResourceHttpRequestHandler.handleRequest(ResourceHttpRequestHandler.java:585)\r\n at org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:52)\r\n at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\r\n at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\r\n at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\r\n at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564)\r\n at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\r\n at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\r\n at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\r\n at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)\r\n at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)\r\n at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)\r\n at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)\r\n at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\r\n at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\r\n at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)\r\n at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389)\r\n at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\r\n at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896)\r\n at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741)\r\n at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)\r\n at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\r\n at java.base/java.lang.Thread.run(Thread.java:840)\r\n', NULL, '2025-01-07 22:45:41'); +INSERT INTO `sys_log_error` VALUES (1863964860761514001, '/favicon.ico', 'GET', NULL, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36', '0:0:0:0:0:0:0:1', 'org.springframework.web.servlet.resource.NoResourceFoundException: No static resource favicon.ico.\r\n at org.springframework.web.servlet.resource.ResourceHttpRequestHandler.handleRequest(ResourceHttpRequestHandler.java:585)\r\n at org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:52)\r\n at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\r\n at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\r\n at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\r\n at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564)\r\n at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\r\n at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\r\n at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\r\n at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)\r\n at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)\r\n at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)\r\n at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)\r\n at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\r\n at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\r\n at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)\r\n at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389)\r\n at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\r\n at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896)\r\n at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741)\r\n at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)\r\n at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\r\n at java.base/java.lang.Thread.run(Thread.java:840)\r\n', NULL, '2025-01-07 22:47:36'); +INSERT INTO `sys_log_error` VALUES (1863964860761514002, '/favicon.ico', 'GET', NULL, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36', '0:0:0:0:0:0:0:1', 'org.springframework.web.servlet.resource.NoResourceFoundException: No static resource favicon.ico.\r\n at org.springframework.web.servlet.resource.ResourceHttpRequestHandler.handleRequest(ResourceHttpRequestHandler.java:585)\r\n at org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:52)\r\n at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\r\n at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\r\n at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\r\n at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564)\r\n at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\r\n at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\r\n at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\r\n at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)\r\n at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)\r\n at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)\r\n at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)\r\n at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\r\n at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\r\n at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)\r\n at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389)\r\n at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\r\n at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896)\r\n at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741)\r\n at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)\r\n at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\r\n at java.base/java.lang.Thread.run(Thread.java:840)\r\n', NULL, '2025-01-07 22:58:58'); +INSERT INTO `sys_log_error` VALUES (1863964860761514003, '/captcha', 'POST', NULL, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36', '0:0:0:0:0:0:0:1', 'org.springframework.web.HttpRequestMethodNotSupportedException: Request method \'POST\' is not supported\r\n at org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.handleNoMatch(RequestMappingInfoHandlerMapping.java:267)\r\n at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.lookupHandlerMethod(AbstractHandlerMethodMapping.java:441)\r\n at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.java:382)\r\n at org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.getHandlerInternal(RequestMappingInfoHandlerMapping.java:127)\r\n at org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.getHandlerInternal(RequestMappingInfoHandlerMapping.java:68)\r\n at org.springframework.web.servlet.handler.AbstractHandlerMapping.getHandler(AbstractHandlerMapping.java:507)\r\n at org.springframework.web.servlet.DispatcherServlet.getHandler(DispatcherServlet.java:1283)\r\n at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1065)\r\n at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\r\n at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\r\n at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590)\r\n at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\r\n at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\r\n at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\r\n at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)\r\n at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)\r\n at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)\r\n at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)\r\n at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\r\n at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\r\n at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)\r\n at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389)\r\n at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\r\n at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896)\r\n at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741)\r\n at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)\r\n at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\r\n at java.base/java.lang.Thread.run(Thread.java:840)\r\n', NULL, '2025-01-07 23:00:40'); +INSERT INTO `sys_log_error` VALUES (1863964860761514004, '/captcha', 'POST', NULL, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0', '0:0:0:0:0:0:0:1', 'org.springframework.web.HttpRequestMethodNotSupportedException: Request method \'POST\' is not supported\r\n at org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.handleNoMatch(RequestMappingInfoHandlerMapping.java:267)\r\n at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.lookupHandlerMethod(AbstractHandlerMethodMapping.java:441)\r\n at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.java:382)\r\n at org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.getHandlerInternal(RequestMappingInfoHandlerMapping.java:127)\r\n at org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.getHandlerInternal(RequestMappingInfoHandlerMapping.java:68)\r\n at org.springframework.web.servlet.handler.AbstractHandlerMapping.getHandler(AbstractHandlerMapping.java:507)\r\n at org.springframework.web.servlet.DispatcherServlet.getHandler(DispatcherServlet.java:1283)\r\n at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1065)\r\n at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\r\n at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\r\n at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590)\r\n at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\r\n at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\r\n at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\r\n at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)\r\n at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)\r\n at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)\r\n at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)\r\n at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\r\n at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\r\n at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)\r\n at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389)\r\n at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\r\n at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896)\r\n at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741)\r\n at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)\r\n at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\r\n at java.base/java.lang.Thread.run(Thread.java:840)\r\n', NULL, '2025-01-07 23:00:40'); +INSERT INTO `sys_log_error` VALUES (1863964860761514005, '/captcha', 'POST', NULL, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0', '0:0:0:0:0:0:0:1', 'org.springframework.web.HttpRequestMethodNotSupportedException: Request method \'POST\' is not supported\r\n at org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.handleNoMatch(RequestMappingInfoHandlerMapping.java:267)\r\n at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.lookupHandlerMethod(AbstractHandlerMethodMapping.java:441)\r\n at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.java:382)\r\n at org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.getHandlerInternal(RequestMappingInfoHandlerMapping.java:127)\r\n at org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.getHandlerInternal(RequestMappingInfoHandlerMapping.java:68)\r\n at org.springframework.web.servlet.handler.AbstractHandlerMapping.getHandler(AbstractHandlerMapping.java:507)\r\n at org.springframework.web.servlet.DispatcherServlet.getHandler(DispatcherServlet.java:1283)\r\n at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1065)\r\n at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\r\n at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\r\n at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590)\r\n at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\r\n at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\r\n at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\r\n at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)\r\n at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)\r\n at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)\r\n at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)\r\n at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\r\n at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\r\n at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)\r\n at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389)\r\n at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\r\n at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896)\r\n at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741)\r\n at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)\r\n at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\r\n at java.base/java.lang.Thread.run(Thread.java:840)\r\n', NULL, '2025-01-07 23:00:40'); +INSERT INTO `sys_log_error` VALUES (1863964860761514006, '/captcha', 'POST', NULL, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36', '0:0:0:0:0:0:0:1', 'org.springframework.web.HttpRequestMethodNotSupportedException: Request method \'POST\' is not supported\r\n at org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.handleNoMatch(RequestMappingInfoHandlerMapping.java:267)\r\n at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.lookupHandlerMethod(AbstractHandlerMethodMapping.java:441)\r\n at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.java:382)\r\n at org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.getHandlerInternal(RequestMappingInfoHandlerMapping.java:127)\r\n at org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.getHandlerInternal(RequestMappingInfoHandlerMapping.java:68)\r\n at org.springframework.web.servlet.handler.AbstractHandlerMapping.getHandler(AbstractHandlerMapping.java:507)\r\n at org.springframework.web.servlet.DispatcherServlet.getHandler(DispatcherServlet.java:1283)\r\n at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1065)\r\n at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\r\n at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\r\n at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590)\r\n at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\r\n at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\r\n at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\r\n at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)\r\n at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)\r\n at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)\r\n at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)\r\n at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\r\n at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\r\n at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)\r\n at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389)\r\n at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\r\n at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896)\r\n at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741)\r\n at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)\r\n at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\r\n at java.base/java.lang.Thread.run(Thread.java:840)\r\n', NULL, '2025-01-07 23:00:47'); +INSERT INTO `sys_log_error` VALUES (1863964860761514007, '/login', 'POST', NULL, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36', '0:0:0:0:0:0:0:1', 'org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize value of type `java.lang.String` from Object value (token `JsonToken.START_OBJECT`)\r\n at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:406)\r\n at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.read(AbstractJackson2HttpMessageConverter.java:354)\r\n at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:184)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:161)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:135)\r\n at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:122)\r\n at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:224)\r\n at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:178)\r\n at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:926)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831)\r\n at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\r\n at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\r\n at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\r\n at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\r\n at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590)\r\n at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\r\n at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\r\n at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\r\n at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)\r\n at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)\r\n at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)\r\n at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)\r\n at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\r\n at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\r\n at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)\r\n at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389)\r\n at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\r\n at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896)\r\n at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741)\r\n at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)\r\n at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\r\n at java.base/java.lang.Thread.run(Thread.java:840)\r\nCaused by: com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize value of type `java.lang.String` from Object value (token `JsonToken.START_OBJECT`)\n at [Source: (org.springframework.util.StreamUtils$NonClosingInputStream); line: 1, column: 9] (through reference chain: io.modules.security.dto.LoginDTO[\"uuid\"])\r\n at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:59)\r\n at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1752)\r\n at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1526)\r\n at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1431)\r\n at com.fasterxml.jackson.databind.DeserializationContext.extractScalarFromObject(DeserializationContext.java:943)\r\n at com.fasterxml.jackson.databind.deser.std.StdDeserializer._parseString(StdDeserializer.java:1424)\r\n at com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:48)\r\n at com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:11)\r\n at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:129)\r\n at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:314)\r\n at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:177)\r\n at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:323)\r\n at com.fasterxml.jackson.databind.ObjectReader._bindAndClose(ObjectReader.java:2105)\r\n at com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:1481)\r\n at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:395)\r\n ... 69 more\r\n', NULL, '2025-01-07 23:36:00'); +INSERT INTO `sys_log_error` VALUES (1863964860761514008, '/login', 'POST', NULL, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0', '0:0:0:0:0:0:0:1', 'org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize value of type `java.lang.String` from Object value (token `JsonToken.START_OBJECT`)\r\n at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:406)\r\n at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.read(AbstractJackson2HttpMessageConverter.java:354)\r\n at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:184)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:161)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:135)\r\n at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:122)\r\n at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:224)\r\n at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:178)\r\n at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:926)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831)\r\n at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\r\n at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\r\n at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\r\n at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\r\n at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590)\r\n at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\r\n at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\r\n at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\r\n at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)\r\n at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)\r\n at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)\r\n at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)\r\n at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\r\n at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\r\n at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)\r\n at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389)\r\n at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\r\n at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896)\r\n at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741)\r\n at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)\r\n at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\r\n at java.base/java.lang.Thread.run(Thread.java:840)\r\nCaused by: com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize value of type `java.lang.String` from Object value (token `JsonToken.START_OBJECT`)\n at [Source: (org.springframework.util.StreamUtils$NonClosingInputStream); line: 1, column: 9] (through reference chain: io.modules.security.dto.LoginDTO[\"uuid\"])\r\n at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:59)\r\n at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1752)\r\n at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1526)\r\n at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1431)\r\n at com.fasterxml.jackson.databind.DeserializationContext.extractScalarFromObject(DeserializationContext.java:943)\r\n at com.fasterxml.jackson.databind.deser.std.StdDeserializer._parseString(StdDeserializer.java:1424)\r\n at com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:48)\r\n at com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:11)\r\n at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:129)\r\n at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:314)\r\n at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:177)\r\n at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:323)\r\n at com.fasterxml.jackson.databind.ObjectReader._bindAndClose(ObjectReader.java:2105)\r\n at com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:1481)\r\n at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:395)\r\n ... 69 more\r\n', NULL, '2025-01-07 23:36:02'); +INSERT INTO `sys_log_error` VALUES (1863964860761514009, '/login', 'POST', NULL, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0', '0:0:0:0:0:0:0:1', 'org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize value of type `java.lang.String` from Object value (token `JsonToken.START_OBJECT`)\r\n at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:406)\r\n at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.read(AbstractJackson2HttpMessageConverter.java:354)\r\n at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:184)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:161)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:135)\r\n at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:122)\r\n at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:224)\r\n at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:178)\r\n at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:926)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831)\r\n at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\r\n at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\r\n at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\r\n at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\r\n at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590)\r\n at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\r\n at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\r\n at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\r\n at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)\r\n at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)\r\n at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)\r\n at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)\r\n at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\r\n at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\r\n at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)\r\n at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389)\r\n at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\r\n at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896)\r\n at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741)\r\n at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)\r\n at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\r\n at java.base/java.lang.Thread.run(Thread.java:840)\r\nCaused by: com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize value of type `java.lang.String` from Object value (token `JsonToken.START_OBJECT`)\n at [Source: (org.springframework.util.StreamUtils$NonClosingInputStream); line: 1, column: 9] (through reference chain: io.modules.security.dto.LoginDTO[\"uuid\"])\r\n at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:59)\r\n at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1752)\r\n at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1526)\r\n at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1431)\r\n at com.fasterxml.jackson.databind.DeserializationContext.extractScalarFromObject(DeserializationContext.java:943)\r\n at com.fasterxml.jackson.databind.deser.std.StdDeserializer._parseString(StdDeserializer.java:1424)\r\n at com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:48)\r\n at com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:11)\r\n at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:129)\r\n at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:314)\r\n at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:177)\r\n at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:323)\r\n at com.fasterxml.jackson.databind.ObjectReader._bindAndClose(ObjectReader.java:2105)\r\n at com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:1481)\r\n at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:395)\r\n ... 69 more\r\n', NULL, '2025-01-07 23:36:02'); +INSERT INTO `sys_log_error` VALUES (1863964860761514010, '/login', 'POST', NULL, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36', '0:0:0:0:0:0:0:1', 'org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize value of type `java.lang.String` from Object value (token `JsonToken.START_OBJECT`)\r\n at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:406)\r\n at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.read(AbstractJackson2HttpMessageConverter.java:354)\r\n at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:184)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:161)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:135)\r\n at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:122)\r\n at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:224)\r\n at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:178)\r\n at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:926)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831)\r\n at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\r\n at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\r\n at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\r\n at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\r\n at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590)\r\n at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\r\n at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\r\n at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\r\n at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)\r\n at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)\r\n at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)\r\n at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)\r\n at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\r\n at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\r\n at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)\r\n at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389)\r\n at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\r\n at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896)\r\n at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741)\r\n at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)\r\n at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\r\n at java.base/java.lang.Thread.run(Thread.java:840)\r\nCaused by: com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize value of type `java.lang.String` from Object value (token `JsonToken.START_OBJECT`)\n at [Source: (org.springframework.util.StreamUtils$NonClosingInputStream); line: 1, column: 9] (through reference chain: io.modules.security.dto.LoginDTO[\"uuid\"])\r\n at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:59)\r\n at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1752)\r\n at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1526)\r\n at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1431)\r\n at com.fasterxml.jackson.databind.DeserializationContext.extractScalarFromObject(DeserializationContext.java:943)\r\n at com.fasterxml.jackson.databind.deser.std.StdDeserializer._parseString(StdDeserializer.java:1424)\r\n at com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:48)\r\n at com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:11)\r\n at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:129)\r\n at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:314)\r\n at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:177)\r\n at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:323)\r\n at com.fasterxml.jackson.databind.ObjectReader._bindAndClose(ObjectReader.java:2105)\r\n at com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:1481)\r\n at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:395)\r\n ... 69 more\r\n', NULL, '2025-01-07 23:36:58'); +INSERT INTO `sys_log_error` VALUES (1863964860761514011, '/login', 'POST', NULL, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0', '0:0:0:0:0:0:0:1', 'org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize value of type `java.lang.String` from Object value (token `JsonToken.START_OBJECT`)\r\n at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:406)\r\n at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.read(AbstractJackson2HttpMessageConverter.java:354)\r\n at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:184)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:161)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:135)\r\n at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:122)\r\n at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:224)\r\n at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:178)\r\n at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:926)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831)\r\n at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\r\n at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\r\n at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\r\n at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\r\n at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590)\r\n at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\r\n at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\r\n at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\r\n at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)\r\n at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)\r\n at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)\r\n at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)\r\n at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\r\n at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\r\n at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)\r\n at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389)\r\n at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\r\n at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896)\r\n at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741)\r\n at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)\r\n at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\r\n at java.base/java.lang.Thread.run(Thread.java:840)\r\nCaused by: com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize value of type `java.lang.String` from Object value (token `JsonToken.START_OBJECT`)\n at [Source: (org.springframework.util.StreamUtils$NonClosingInputStream); line: 1, column: 9] (through reference chain: io.modules.security.dto.LoginDTO[\"uuid\"])\r\n at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:59)\r\n at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1752)\r\n at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1526)\r\n at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1431)\r\n at com.fasterxml.jackson.databind.DeserializationContext.extractScalarFromObject(DeserializationContext.java:943)\r\n at com.fasterxml.jackson.databind.deser.std.StdDeserializer._parseString(StdDeserializer.java:1424)\r\n at com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:48)\r\n at com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:11)\r\n at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:129)\r\n at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:314)\r\n at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:177)\r\n at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:323)\r\n at com.fasterxml.jackson.databind.ObjectReader._bindAndClose(ObjectReader.java:2105)\r\n at com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:1481)\r\n at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:395)\r\n ... 69 more\r\n', NULL, '2025-01-07 23:36:59'); +INSERT INTO `sys_log_error` VALUES (1863964860761514012, '/login', 'POST', NULL, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0', '0:0:0:0:0:0:0:1', 'org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize value of type `java.lang.String` from Object value (token `JsonToken.START_OBJECT`)\r\n at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:406)\r\n at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.read(AbstractJackson2HttpMessageConverter.java:354)\r\n at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:184)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:161)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:135)\r\n at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:122)\r\n at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:224)\r\n at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:178)\r\n at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:926)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831)\r\n at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\r\n at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\r\n at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\r\n at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\r\n at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590)\r\n at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\r\n at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\r\n at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\r\n at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)\r\n at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)\r\n at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)\r\n at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)\r\n at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\r\n at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\r\n at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)\r\n at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389)\r\n at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\r\n at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896)\r\n at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741)\r\n at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)\r\n at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\r\n at java.base/java.lang.Thread.run(Thread.java:840)\r\nCaused by: com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize value of type `java.lang.String` from Object value (token `JsonToken.START_OBJECT`)\n at [Source: (org.springframework.util.StreamUtils$NonClosingInputStream); line: 1, column: 9] (through reference chain: io.modules.security.dto.LoginDTO[\"uuid\"])\r\n at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:59)\r\n at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1752)\r\n at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1526)\r\n at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1431)\r\n at com.fasterxml.jackson.databind.DeserializationContext.extractScalarFromObject(DeserializationContext.java:943)\r\n at com.fasterxml.jackson.databind.deser.std.StdDeserializer._parseString(StdDeserializer.java:1424)\r\n at com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:48)\r\n at com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:11)\r\n at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:129)\r\n at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:314)\r\n at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:177)\r\n at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:323)\r\n at com.fasterxml.jackson.databind.ObjectReader._bindAndClose(ObjectReader.java:2105)\r\n at com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:1481)\r\n at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:395)\r\n ... 69 more\r\n', NULL, '2025-01-07 23:36:59'); +INSERT INTO `sys_log_error` VALUES (1863964860761514013, '/login', 'POST', NULL, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36', '0:0:0:0:0:0:0:1', 'org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize value of type `java.lang.String` from Object value (token `JsonToken.START_OBJECT`)\r\n at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:406)\r\n at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.read(AbstractJackson2HttpMessageConverter.java:354)\r\n at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:184)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:161)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:135)\r\n at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:122)\r\n at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:224)\r\n at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:178)\r\n at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:926)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831)\r\n at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\r\n at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\r\n at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\r\n at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\r\n at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590)\r\n at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\r\n at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\r\n at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\r\n at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)\r\n at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)\r\n at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)\r\n at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)\r\n at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\r\n at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\r\n at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)\r\n at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389)\r\n at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\r\n at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896)\r\n at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741)\r\n at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)\r\n at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\r\n at java.base/java.lang.Thread.run(Thread.java:840)\r\nCaused by: com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize value of type `java.lang.String` from Object value (token `JsonToken.START_OBJECT`)\n at [Source: (org.springframework.util.StreamUtils$NonClosingInputStream); line: 1, column: 9] (through reference chain: io.modules.security.dto.LoginDTO[\"uuid\"])\r\n at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:59)\r\n at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1752)\r\n at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1526)\r\n at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1431)\r\n at com.fasterxml.jackson.databind.DeserializationContext.extractScalarFromObject(DeserializationContext.java:943)\r\n at com.fasterxml.jackson.databind.deser.std.StdDeserializer._parseString(StdDeserializer.java:1424)\r\n at com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:48)\r\n at com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:11)\r\n at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:129)\r\n at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:314)\r\n at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:177)\r\n at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:323)\r\n at com.fasterxml.jackson.databind.ObjectReader._bindAndClose(ObjectReader.java:2105)\r\n at com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:1481)\r\n at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:395)\r\n ... 69 more\r\n', NULL, '2025-01-07 23:37:02'); +INSERT INTO `sys_log_error` VALUES (1863964860761514014, '/login', 'POST', NULL, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36', '0:0:0:0:0:0:0:1', 'org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize value of type `java.lang.String` from Object value (token `JsonToken.START_OBJECT`)\r\n at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:406)\r\n at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.read(AbstractJackson2HttpMessageConverter.java:354)\r\n at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:184)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:161)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:135)\r\n at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:122)\r\n at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:224)\r\n at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:178)\r\n at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:926)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831)\r\n at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\r\n at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\r\n at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\r\n at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\r\n at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590)\r\n at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\r\n at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\r\n at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\r\n at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)\r\n at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)\r\n at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)\r\n at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)\r\n at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\r\n at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\r\n at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)\r\n at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389)\r\n at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\r\n at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896)\r\n at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741)\r\n at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)\r\n at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\r\n at java.base/java.lang.Thread.run(Thread.java:840)\r\nCaused by: com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize value of type `java.lang.String` from Object value (token `JsonToken.START_OBJECT`)\n at [Source: (org.springframework.util.StreamUtils$NonClosingInputStream); line: 1, column: 9] (through reference chain: io.modules.security.dto.LoginDTO[\"uuid\"])\r\n at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:59)\r\n at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1752)\r\n at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1526)\r\n at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1431)\r\n at com.fasterxml.jackson.databind.DeserializationContext.extractScalarFromObject(DeserializationContext.java:943)\r\n at com.fasterxml.jackson.databind.deser.std.StdDeserializer._parseString(StdDeserializer.java:1424)\r\n at com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:48)\r\n at com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:11)\r\n at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:129)\r\n at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:314)\r\n at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:177)\r\n at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:323)\r\n at com.fasterxml.jackson.databind.ObjectReader._bindAndClose(ObjectReader.java:2105)\r\n at com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:1481)\r\n at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:395)\r\n ... 69 more\r\n', NULL, '2025-01-07 23:37:13'); +INSERT INTO `sys_log_error` VALUES (1863964860761514015, '/login', 'POST', NULL, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0', '0:0:0:0:0:0:0:1', 'org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize value of type `java.lang.String` from Object value (token `JsonToken.START_OBJECT`)\r\n at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:406)\r\n at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.read(AbstractJackson2HttpMessageConverter.java:354)\r\n at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:184)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:161)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:135)\r\n at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:122)\r\n at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:224)\r\n at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:178)\r\n at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:926)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831)\r\n at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\r\n at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\r\n at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\r\n at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\r\n at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590)\r\n at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\r\n at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\r\n at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\r\n at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)\r\n at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)\r\n at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)\r\n at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)\r\n at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\r\n at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\r\n at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)\r\n at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389)\r\n at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\r\n at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896)\r\n at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741)\r\n at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)\r\n at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\r\n at java.base/java.lang.Thread.run(Thread.java:840)\r\nCaused by: com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize value of type `java.lang.String` from Object value (token `JsonToken.START_OBJECT`)\n at [Source: (org.springframework.util.StreamUtils$NonClosingInputStream); line: 1, column: 9] (through reference chain: io.modules.security.dto.LoginDTO[\"uuid\"])\r\n at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:59)\r\n at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1752)\r\n at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1526)\r\n at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1431)\r\n at com.fasterxml.jackson.databind.DeserializationContext.extractScalarFromObject(DeserializationContext.java:943)\r\n at com.fasterxml.jackson.databind.deser.std.StdDeserializer._parseString(StdDeserializer.java:1424)\r\n at com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:48)\r\n at com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:11)\r\n at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:129)\r\n at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:314)\r\n at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:177)\r\n at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:323)\r\n at com.fasterxml.jackson.databind.ObjectReader._bindAndClose(ObjectReader.java:2105)\r\n at com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:1481)\r\n at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:395)\r\n ... 69 more\r\n', NULL, '2025-01-07 23:37:14'); +INSERT INTO `sys_log_error` VALUES (1863964860761514016, '/login', 'POST', NULL, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0', '0:0:0:0:0:0:0:1', 'org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize value of type `java.lang.String` from Object value (token `JsonToken.START_OBJECT`)\r\n at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:406)\r\n at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.read(AbstractJackson2HttpMessageConverter.java:354)\r\n at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:184)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:161)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:135)\r\n at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:122)\r\n at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:224)\r\n at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:178)\r\n at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:926)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831)\r\n at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\r\n at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\r\n at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\r\n at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\r\n at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590)\r\n at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\r\n at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\r\n at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\r\n at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)\r\n at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)\r\n at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)\r\n at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)\r\n at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\r\n at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\r\n at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)\r\n at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389)\r\n at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\r\n at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896)\r\n at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741)\r\n at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)\r\n at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\r\n at java.base/java.lang.Thread.run(Thread.java:840)\r\nCaused by: com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize value of type `java.lang.String` from Object value (token `JsonToken.START_OBJECT`)\n at [Source: (org.springframework.util.StreamUtils$NonClosingInputStream); line: 1, column: 9] (through reference chain: io.modules.security.dto.LoginDTO[\"uuid\"])\r\n at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:59)\r\n at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1752)\r\n at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1526)\r\n at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1431)\r\n at com.fasterxml.jackson.databind.DeserializationContext.extractScalarFromObject(DeserializationContext.java:943)\r\n at com.fasterxml.jackson.databind.deser.std.StdDeserializer._parseString(StdDeserializer.java:1424)\r\n at com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:48)\r\n at com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:11)\r\n at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:129)\r\n at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:314)\r\n at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:177)\r\n at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:323)\r\n at com.fasterxml.jackson.databind.ObjectReader._bindAndClose(ObjectReader.java:2105)\r\n at com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:1481)\r\n at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:395)\r\n ... 69 more\r\n', NULL, '2025-01-07 23:37:14'); +INSERT INTO `sys_log_error` VALUES (1863964860761514017, '/login', 'POST', NULL, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36', '0:0:0:0:0:0:0:1', 'org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize value of type `java.lang.String` from Object value (token `JsonToken.START_OBJECT`)\r\n at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:406)\r\n at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.read(AbstractJackson2HttpMessageConverter.java:354)\r\n at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:184)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:161)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:135)\r\n at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:122)\r\n at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:224)\r\n at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:178)\r\n at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:926)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831)\r\n at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\r\n at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\r\n at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\r\n at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\r\n at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590)\r\n at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\r\n at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\r\n at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\r\n at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)\r\n at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)\r\n at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)\r\n at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)\r\n at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\r\n at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\r\n at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)\r\n at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389)\r\n at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\r\n at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896)\r\n at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741)\r\n at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)\r\n at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\r\n at java.base/java.lang.Thread.run(Thread.java:840)\r\nCaused by: com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize value of type `java.lang.String` from Object value (token `JsonToken.START_OBJECT`)\n at [Source: (org.springframework.util.StreamUtils$NonClosingInputStream); line: 1, column: 9] (through reference chain: io.modules.security.dto.LoginDTO[\"uuid\"])\r\n at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:59)\r\n at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1752)\r\n at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1526)\r\n at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1431)\r\n at com.fasterxml.jackson.databind.DeserializationContext.extractScalarFromObject(DeserializationContext.java:943)\r\n at com.fasterxml.jackson.databind.deser.std.StdDeserializer._parseString(StdDeserializer.java:1424)\r\n at com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:48)\r\n at com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:11)\r\n at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:129)\r\n at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:314)\r\n at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:177)\r\n at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:323)\r\n at com.fasterxml.jackson.databind.ObjectReader._bindAndClose(ObjectReader.java:2105)\r\n at com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:1481)\r\n at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:395)\r\n ... 69 more\r\n', NULL, '2025-01-07 23:37:14'); +INSERT INTO `sys_log_error` VALUES (1863964860761514018, '/login', 'POST', NULL, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0', '0:0:0:0:0:0:0:1', 'org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize value of type `java.lang.String` from Object value (token `JsonToken.START_OBJECT`)\r\n at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:406)\r\n at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.read(AbstractJackson2HttpMessageConverter.java:354)\r\n at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:184)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:161)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:135)\r\n at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:122)\r\n at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:224)\r\n at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:178)\r\n at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:926)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831)\r\n at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\r\n at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\r\n at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\r\n at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\r\n at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590)\r\n at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\r\n at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\r\n at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\r\n at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)\r\n at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)\r\n at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)\r\n at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)\r\n at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\r\n at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\r\n at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)\r\n at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389)\r\n at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\r\n at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896)\r\n at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741)\r\n at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)\r\n at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\r\n at java.base/java.lang.Thread.run(Thread.java:840)\r\nCaused by: com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize value of type `java.lang.String` from Object value (token `JsonToken.START_OBJECT`)\n at [Source: (org.springframework.util.StreamUtils$NonClosingInputStream); line: 1, column: 9] (through reference chain: io.modules.security.dto.LoginDTO[\"uuid\"])\r\n at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:59)\r\n at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1752)\r\n at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1526)\r\n at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1431)\r\n at com.fasterxml.jackson.databind.DeserializationContext.extractScalarFromObject(DeserializationContext.java:943)\r\n at com.fasterxml.jackson.databind.deser.std.StdDeserializer._parseString(StdDeserializer.java:1424)\r\n at com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:48)\r\n at com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:11)\r\n at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:129)\r\n at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:314)\r\n at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:177)\r\n at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:323)\r\n at com.fasterxml.jackson.databind.ObjectReader._bindAndClose(ObjectReader.java:2105)\r\n at com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:1481)\r\n at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:395)\r\n ... 69 more\r\n', NULL, '2025-01-07 23:37:42'); +INSERT INTO `sys_log_error` VALUES (1863964860761514019, '/login', 'POST', NULL, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0', '0:0:0:0:0:0:0:1', 'org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize value of type `java.lang.String` from Object value (token `JsonToken.START_OBJECT`)\r\n at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:406)\r\n at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.read(AbstractJackson2HttpMessageConverter.java:354)\r\n at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:184)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:161)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:135)\r\n at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:122)\r\n at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:224)\r\n at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:178)\r\n at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:926)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831)\r\n at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\r\n at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\r\n at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\r\n at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\r\n at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590)\r\n at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\r\n at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\r\n at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\r\n at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)\r\n at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)\r\n at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)\r\n at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)\r\n at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\r\n at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\r\n at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)\r\n at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389)\r\n at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\r\n at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896)\r\n at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741)\r\n at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)\r\n at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\r\n at java.base/java.lang.Thread.run(Thread.java:840)\r\nCaused by: com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize value of type `java.lang.String` from Object value (token `JsonToken.START_OBJECT`)\n at [Source: (org.springframework.util.StreamUtils$NonClosingInputStream); line: 1, column: 9] (through reference chain: io.modules.security.dto.LoginDTO[\"uuid\"])\r\n at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:59)\r\n at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1752)\r\n at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1526)\r\n at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1431)\r\n at com.fasterxml.jackson.databind.DeserializationContext.extractScalarFromObject(DeserializationContext.java:943)\r\n at com.fasterxml.jackson.databind.deser.std.StdDeserializer._parseString(StdDeserializer.java:1424)\r\n at com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:48)\r\n at com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:11)\r\n at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:129)\r\n at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:314)\r\n at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:177)\r\n at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:323)\r\n at com.fasterxml.jackson.databind.ObjectReader._bindAndClose(ObjectReader.java:2105)\r\n at com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:1481)\r\n at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:395)\r\n ... 69 more\r\n', NULL, '2025-01-07 23:37:42'); +INSERT INTO `sys_log_error` VALUES (1863964860761514020, '/login', 'POST', NULL, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36', '0:0:0:0:0:0:0:1', 'org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize value of type `java.lang.String` from Object value (token `JsonToken.START_OBJECT`)\r\n at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:406)\r\n at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.read(AbstractJackson2HttpMessageConverter.java:354)\r\n at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:184)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:161)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:135)\r\n at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:122)\r\n at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:224)\r\n at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:178)\r\n at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:926)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831)\r\n at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\r\n at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\r\n at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\r\n at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\r\n at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590)\r\n at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\r\n at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\r\n at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\r\n at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)\r\n at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)\r\n at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)\r\n at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)\r\n at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\r\n at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\r\n at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)\r\n at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389)\r\n at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\r\n at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896)\r\n at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741)\r\n at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)\r\n at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\r\n at java.base/java.lang.Thread.run(Thread.java:840)\r\nCaused by: com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize value of type `java.lang.String` from Object value (token `JsonToken.START_OBJECT`)\n at [Source: (org.springframework.util.StreamUtils$NonClosingInputStream); line: 1, column: 9] (through reference chain: io.modules.security.dto.LoginDTO[\"uuid\"])\r\n at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:59)\r\n at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1752)\r\n at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1526)\r\n at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1431)\r\n at com.fasterxml.jackson.databind.DeserializationContext.extractScalarFromObject(DeserializationContext.java:943)\r\n at com.fasterxml.jackson.databind.deser.std.StdDeserializer._parseString(StdDeserializer.java:1424)\r\n at com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:48)\r\n at com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:11)\r\n at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:129)\r\n at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:314)\r\n at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:177)\r\n at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:323)\r\n at com.fasterxml.jackson.databind.ObjectReader._bindAndClose(ObjectReader.java:2105)\r\n at com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:1481)\r\n at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:395)\r\n ... 69 more\r\n', NULL, '2025-01-07 23:37:43'); +INSERT INTO `sys_log_error` VALUES (1863964860761514021, '/login', 'POST', NULL, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36', '0:0:0:0:0:0:0:1', 'org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize value of type `java.lang.String` from Object value (token `JsonToken.START_OBJECT`)\r\n at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:406)\r\n at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.read(AbstractJackson2HttpMessageConverter.java:354)\r\n at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:184)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:161)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:135)\r\n at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:122)\r\n at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:224)\r\n at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:178)\r\n at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:926)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831)\r\n at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\r\n at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\r\n at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\r\n at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\r\n at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590)\r\n at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\r\n at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\r\n at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\r\n at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)\r\n at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)\r\n at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)\r\n at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)\r\n at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\r\n at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\r\n at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)\r\n at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389)\r\n at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\r\n at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896)\r\n at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741)\r\n at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)\r\n at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\r\n at java.base/java.lang.Thread.run(Thread.java:840)\r\nCaused by: com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize value of type `java.lang.String` from Object value (token `JsonToken.START_OBJECT`)\n at [Source: (org.springframework.util.StreamUtils$NonClosingInputStream); line: 1, column: 9] (through reference chain: io.modules.security.dto.LoginDTO[\"uuid\"])\r\n at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:59)\r\n at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1752)\r\n at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1526)\r\n at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1431)\r\n at com.fasterxml.jackson.databind.DeserializationContext.extractScalarFromObject(DeserializationContext.java:943)\r\n at com.fasterxml.jackson.databind.deser.std.StdDeserializer._parseString(StdDeserializer.java:1424)\r\n at com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:48)\r\n at com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:11)\r\n at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:129)\r\n at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:314)\r\n at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:177)\r\n at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:323)\r\n at com.fasterxml.jackson.databind.ObjectReader._bindAndClose(ObjectReader.java:2105)\r\n at com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:1481)\r\n at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:395)\r\n ... 69 more\r\n', NULL, '2025-01-07 23:37:44'); +INSERT INTO `sys_log_error` VALUES (1863964860761514022, '/login', 'POST', NULL, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36', '0:0:0:0:0:0:0:1', 'org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize value of type `java.lang.String` from Object value (token `JsonToken.START_OBJECT`)\r\n at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:406)\r\n at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.read(AbstractJackson2HttpMessageConverter.java:354)\r\n at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:184)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:161)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:135)\r\n at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:122)\r\n at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:224)\r\n at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:178)\r\n at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:926)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831)\r\n at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\r\n at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\r\n at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\r\n at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\r\n at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590)\r\n at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\r\n at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\r\n at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\r\n at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)\r\n at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)\r\n at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)\r\n at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)\r\n at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\r\n at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\r\n at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)\r\n at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389)\r\n at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\r\n at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896)\r\n at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741)\r\n at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)\r\n at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\r\n at java.base/java.lang.Thread.run(Thread.java:840)\r\nCaused by: com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize value of type `java.lang.String` from Object value (token `JsonToken.START_OBJECT`)\n at [Source: (org.springframework.util.StreamUtils$NonClosingInputStream); line: 1, column: 9] (through reference chain: io.modules.security.dto.LoginDTO[\"uuid\"])\r\n at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:59)\r\n at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1752)\r\n at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1526)\r\n at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1431)\r\n at com.fasterxml.jackson.databind.DeserializationContext.extractScalarFromObject(DeserializationContext.java:943)\r\n at com.fasterxml.jackson.databind.deser.std.StdDeserializer._parseString(StdDeserializer.java:1424)\r\n at com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:48)\r\n at com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:11)\r\n at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:129)\r\n at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:314)\r\n at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:177)\r\n at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:323)\r\n at com.fasterxml.jackson.databind.ObjectReader._bindAndClose(ObjectReader.java:2105)\r\n at com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:1481)\r\n at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:395)\r\n ... 69 more\r\n', NULL, '2025-01-07 23:38:09'); +INSERT INTO `sys_log_error` VALUES (1863964860761514023, '/login', 'POST', NULL, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36', '0:0:0:0:0:0:0:1', 'org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize value of type `java.lang.String` from Object value (token `JsonToken.START_OBJECT`)\r\n at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:406)\r\n at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.read(AbstractJackson2HttpMessageConverter.java:354)\r\n at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:184)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:161)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:135)\r\n at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:122)\r\n at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:224)\r\n at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:178)\r\n at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:926)\r\n at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831)\r\n at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\r\n at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\r\n at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\r\n at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\r\n at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590)\r\n at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\r\n at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\r\n at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\r\n at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\r\n at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\r\n at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\r\n at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\r\n at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\r\n at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\r\n at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\r\n at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)\r\n at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)\r\n at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)\r\n at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)\r\n at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\r\n at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\r\n at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)\r\n at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389)\r\n at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\r\n at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896)\r\n at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741)\r\n at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190)\r\n at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)\r\n at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\r\n at java.base/java.lang.Thread.run(Thread.java:840)\r\nCaused by: com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize value of type `java.lang.String` from Object value (token `JsonToken.START_OBJECT`)\n at [Source: (org.springframework.util.StreamUtils$NonClosingInputStream); line: 1, column: 9] (through reference chain: io.modules.security.dto.LoginDTO[\"uuid\"])\r\n at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:59)\r\n at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1752)\r\n at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1526)\r\n at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1431)\r\n at com.fasterxml.jackson.databind.DeserializationContext.extractScalarFromObject(DeserializationContext.java:943)\r\n at com.fasterxml.jackson.databind.deser.std.StdDeserializer._parseString(StdDeserializer.java:1424)\r\n at com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:48)\r\n at com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:11)\r\n at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:129)\r\n at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:314)\r\n at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:177)\r\n at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:323)\r\n at com.fasterxml.jackson.databind.ObjectReader._bindAndClose(ObjectReader.java:2105)\r\n at com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:1481)\r\n at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:395)\r\n ... 69 more\r\n', NULL, '2025-01-07 23:38:25'); + +-- ---------------------------- +-- Table structure for sys_log_login +-- ---------------------------- +DROP TABLE IF EXISTS `sys_log_login`; +CREATE TABLE `sys_log_login` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', + `operation` tinyint(3) UNSIGNED NULL DEFAULT NULL COMMENT '用户操作 0:用户登录 1:用户退出', + `status` tinyint(3) UNSIGNED NOT NULL COMMENT '状态 0:失败 1:成功 2:账号已锁定', + `user_agent` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用户代理', + `ip` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '操作IP', + `creator_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用户名', + `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建者', + `create_date` datetime NULL DEFAULT NULL COMMENT '创建时间', + PRIMARY KEY (`id`) USING BTREE, + INDEX `idx_status`(`status`) USING BTREE, + INDEX `idx_create_date`(`create_date`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1863964089647108108 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '登录日志' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of sys_log_login +-- ---------------------------- +INSERT INTO `sys_log_login` VALUES (1863925297460568066, 0, 0, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 'admin', 1067246875800000001, '2024-12-03 20:36:36'); +INSERT INTO `sys_log_login` VALUES (1863925300618878977, 0, 1, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 'admin', 1067246875800000001, '2024-12-03 20:36:36'); +INSERT INTO `sys_log_login` VALUES (1863925345682481153, 0, 1, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 'admin', 1067246875800000001, '2024-12-03 20:36:47'); +INSERT INTO `sys_log_login` VALUES (1863939381203582977, 0, 0, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 'admin', 1067246875800000001, '2024-12-03 21:32:33'); +INSERT INTO `sys_log_login` VALUES (1863939412719583234, 0, 1, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 'admin', 1067246875800000001, '2024-12-03 21:32:41'); +INSERT INTO `sys_log_login` VALUES (1863947491083382785, 0, 0, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 'admin', 1067246875800000001, '2024-12-03 22:04:47'); +INSERT INTO `sys_log_login` VALUES (1863953209471557633, 0, 0, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 'admin', 1067246875800000001, '2024-12-03 22:27:30'); +INSERT INTO `sys_log_login` VALUES (1863955672345878530, 0, 0, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 'admin', 1067246875800000001, '2024-12-03 22:37:17'); +INSERT INTO `sys_log_login` VALUES (1863956227231440897, 0, 0, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 'admin', 1067246875800000001, '2024-12-03 22:39:30'); +INSERT INTO `sys_log_login` VALUES (1863956599366844417, 0, 0, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 'admin', 1067246875800000001, '2024-12-03 22:40:58'); +INSERT INTO `sys_log_login` VALUES (1863957112552456193, 0, 0, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 'admin', 1067246875800000001, '2024-12-03 22:43:01'); +INSERT INTO `sys_log_login` VALUES (1863957603990654977, 0, 0, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 'admin', 1067246875800000001, '2024-12-03 22:44:50'); +INSERT INTO `sys_log_login` VALUES (1863959345478250497, 0, 1, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 'admin', 1067246875800000001, '2024-12-03 22:51:53'); +INSERT INTO `sys_log_login` VALUES (1863959358333792258, 1, 1, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 'admin', 1067246875800000001, '2024-12-03 22:51:56'); +INSERT INTO `sys_log_login` VALUES (1863959391993081857, 0, 0, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 'admin', 1067246875800000001, '2024-12-03 22:52:04'); +INSERT INTO `sys_log_login` VALUES (1863960454070546433, 0, 0, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 'admin', 1067246875800000001, '2024-12-03 22:56:18'); +INSERT INTO `sys_log_login` VALUES (1863961204721041410, 0, 0, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 'admin', 1067246875800000001, '2024-12-03 22:59:16'); +INSERT INTO `sys_log_login` VALUES (1863964042377302018, 0, 0, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 'admin', 1067246875800000001, '2024-12-03 23:10:33'); +INSERT INTO `sys_log_login` VALUES (1863964089647108098, 0, 1, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 'admin', 1067246875800000001, '2024-12-03 23:10:44'); +INSERT INTO `sys_log_login` VALUES (1863964089647108099, 0, 1, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 'admin', 1067246875800000001, '2024-12-10 18:42:33'); +INSERT INTO `sys_log_login` VALUES (1863964089647108100, 0, 1, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 'admin', 1067246875800000001, '2024-12-10 21:12:51'); +INSERT INTO `sys_log_login` VALUES (1863964089647108101, 0, 0, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 'admin', 1067246875800000001, '2024-12-10 21:58:13'); +INSERT INTO `sys_log_login` VALUES (1863964089647108102, 0, 0, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 'admin', 1067246875800000001, '2024-12-10 21:58:18'); +INSERT INTO `sys_log_login` VALUES (1863964089647108103, 0, 1, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 'admin', 1067246875800000001, '2024-12-10 21:58:24'); +INSERT INTO `sys_log_login` VALUES (1863964089647108104, 0, 1, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0', '0:0:0:0:0:0:0:1', 'admin', 1067246875800000001, '2024-12-12 19:42:48'); +INSERT INTO `sys_log_login` VALUES (1863964089647108105, 0, 1, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0', '0:0:0:0:0:0:0:1', 'admin', 1067246875800000001, '2024-12-12 23:03:14'); +INSERT INTO `sys_log_login` VALUES (1863964089647108106, 0, 1, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0', '0:0:0:0:0:0:0:1', 'admin', 1067246875800000001, '2024-12-12 23:06:24'); +INSERT INTO `sys_log_login` VALUES (1863964089647108107, 0, 0, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0', '0:0:0:0:0:0:0:1', 'admin', 1067246875800000001, '2025-01-07 20:11:56'); + +-- ---------------------------- +-- Table structure for sys_log_operation +-- ---------------------------- +DROP TABLE IF EXISTS `sys_log_operation`; +CREATE TABLE `sys_log_operation` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', + `operation` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用户操作', + `request_uri` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '请求URI', + `request_method` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '请求方式', + `request_params` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '请求参数', + `request_time` int(10) UNSIGNED NOT NULL COMMENT '请求时长(毫秒)', + `user_agent` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用户代理', + `ip` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '操作IP', + `status` tinyint(3) UNSIGNED NOT NULL COMMENT '状态 0:失败 1:成功', + `creator_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用户名', + `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建者', + `create_date` datetime NULL DEFAULT NULL COMMENT '创建时间', + PRIMARY KEY (`id`) USING BTREE, + INDEX `idx_create_date`(`create_date`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1863969089488199751 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '操作日志' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of sys_log_operation +-- ---------------------------- +INSERT INTO `sys_log_operation` VALUES (1863926049885151233, '导出', '/admin/sys/log/operation/export', 'GET', '{\"status\":\"\",\"token\":\"257b44393c74734d55fcf0378403657a\"}', 624, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-03 20:39:35'); +INSERT INTO `sys_log_operation` VALUES (1863939926471491586, '修改', '/admin/sys/menu', 'PUT', '{\"id\":1863937571759878146,\"pid\":0,\"children\":[],\"name\":\"轮播管理\",\"url\":\"item/slides\",\"menuType\":0,\"icon\":\"icon-desktop\",\"permissions\":null,\"sort\":0,\"createDate\":null,\"parentName\":\"一级菜单\"}', 90, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-03 21:34:43'); +INSERT INTO `sys_log_operation` VALUES (1863940095816515586, '保存', '/admin/sys/menu', 'POST', '{\"id\":null,\"pid\":0,\"children\":[],\"name\":\"文章\",\"url\":\"\",\"menuType\":0,\"icon\":\"icon-layout-fill\",\"permissions\":\"\",\"sort\":0,\"createDate\":null,\"parentName\":\"一级菜单\"}', 91, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-03 21:35:24'); +INSERT INTO `sys_log_operation` VALUES (1863940157212737537, '修改', '/admin/sys/menu', 'PUT', '{\"id\":1863937572162531329,\"pid\":1863940095447416834,\"children\":[],\"name\":\"文章管理\",\"url\":\"item/article\",\"menuType\":0,\"icon\":\"icon-desktop\",\"permissions\":null,\"sort\":0,\"createDate\":null,\"parentName\":\"文章\"}', 87, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-03 21:35:38'); +INSERT INTO `sys_log_operation` VALUES (1863940221251371009, '修改', '/admin/sys/menu', 'PUT', '{\"id\":1067246875800000053,\"pid\":0,\"children\":[],\"name\":\"系统监控\",\"url\":null,\"menuType\":0,\"icon\":\"icon-desktop\",\"permissions\":null,\"sort\":900,\"createDate\":null,\"parentName\":\"一级菜单\"}', 84, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-03 21:35:54'); +INSERT INTO `sys_log_operation` VALUES (1863940242122227714, '修改', '/admin/sys/menu', 'PUT', '{\"id\":1067246875800000046,\"pid\":0,\"children\":[],\"name\":\"日志管理\",\"url\":null,\"menuType\":0,\"icon\":\"icon-container\",\"permissions\":null,\"sort\":890,\"createDate\":null,\"parentName\":\"一级菜单\"}', 93, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-03 21:35:59'); +INSERT INTO `sys_log_operation` VALUES (1863940265404809217, '修改', '/admin/sys/menu', 'PUT', '{\"id\":1067246875800000035,\"pid\":0,\"children\":[],\"name\":\"系统设置\",\"url\":null,\"menuType\":0,\"icon\":\"icon-setting\",\"permissions\":null,\"sort\":880,\"createDate\":null,\"parentName\":\"一级菜单\"}', 79, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-03 21:36:04'); +INSERT INTO `sys_log_operation` VALUES (1863940291984113665, '修改', '/admin/sys/menu', 'PUT', '{\"id\":1863937571759878146,\"pid\":0,\"children\":[],\"name\":\"轮播管理\",\"url\":\"item/slides\",\"menuType\":0,\"icon\":\"icon-desktop\",\"permissions\":null,\"sort\":100,\"createDate\":null,\"parentName\":\"一级菜单\"}', 80, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-03 21:36:11'); +INSERT INTO `sys_log_operation` VALUES (1863940317191880705, '修改', '/admin/sys/menu', 'PUT', '{\"id\":1067246875800000002,\"pid\":0,\"children\":[],\"name\":\"权限管理\",\"url\":null,\"menuType\":0,\"icon\":\"icon-safetycertificate\",\"permissions\":null,\"sort\":870,\"createDate\":null,\"parentName\":\"一级菜单\"}', 83, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-03 21:36:17'); +INSERT INTO `sys_log_operation` VALUES (1863940355401990145, '修改', '/admin/sys/menu', 'PUT', '{\"id\":1863940095447416834,\"pid\":0,\"children\":[],\"name\":\"文章\",\"url\":\"\",\"menuType\":0,\"icon\":\"icon-layout-fill\",\"permissions\":\"\",\"sort\":105,\"createDate\":null,\"parentName\":\"一级菜单\"}', 81, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-03 21:36:26'); +INSERT INTO `sys_log_operation` VALUES (1863964878180458499, '保存', '/admin/item/slides', 'POST', '{\"id\":1863964878180458498,\"name\":\"1\",\"sort\":1,\"path\":\"1\",\"createTime\":null}', 43, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-03 23:13:52'); +INSERT INTO `sys_log_operation` VALUES (1863968483197411330, '保存', '/admin/item/slides', 'POST', '{\"id\":1863968483197411329,\"name\":\"1\",\"sort\":1,\"path\":\"1\",\"createTime\":null}', 33, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-03 23:28:12'); +INSERT INTO `sys_log_operation` VALUES (1863969039039111169, '保存', '/admin/item/slides', 'POST', '{\"id\":1863969038963613698,\"name\":\"1\",\"sort\":1,\"path\":\"1\",\"createTime\":null}', 55, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-03 23:30:24'); +INSERT INTO `sys_log_operation` VALUES (1863969089488199681, '保存', '/admin/item/slides', 'POST', '{\"id\":1863969089421090818,\"name\":\"1\",\"sort\":1,\"path\":\"1\",\"createTime\":null}', 8, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-03 23:30:36'); +INSERT INTO `sys_log_operation` VALUES (1863969089488199682, '保存', '/admin/item/slides', 'POST', '{\"id\":2,\"name\":\"1\",\"sort\":1,\"path\":\"1\",\"createTime\":null}', 8, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-03 23:34:39'); +INSERT INTO `sys_log_operation` VALUES (1863969089488199683, '保存', '/admin/item/slides', 'POST', '{\"id\":3,\"name\":\"1\",\"sort\":1,\"path\":\"http://localhost:8081/front/upload/1733330281401.png\",\"createTime\":null}', 38, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-10 20:31:29'); +INSERT INTO `sys_log_operation` VALUES (1863969089488199684, '删除', '/admin/item/slides', 'DELETE', '[1]', 423, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-10 20:34:59'); +INSERT INTO `sys_log_operation` VALUES (1863969089488199685, '删除', '/admin/item/slides', 'DELETE', '[2]', 3, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-10 20:35:01'); +INSERT INTO `sys_log_operation` VALUES (1863969089488199686, '修改', '/admin/item/slides', 'PUT', '{\"id\":3,\"name\":\"1\",\"sort\":1,\"path\":\"http://localhost:8081/front/upload/1733330281401.png\",\"createTime\":1733833889000}', 10, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-10 20:37:05'); +INSERT INTO `sys_log_operation` VALUES (1863969089488199687, '修改', '/admin/item/slides', 'PUT', '{\"id\":3,\"name\":\"1\",\"sort\":1,\"path\":\"http://localhost:8081/front/upload/1733330281401.png\",\"createTime\":1733833889000}', 9, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-10 20:37:12'); +INSERT INTO `sys_log_operation` VALUES (1863969089488199688, '修改', '/admin/item/slides', 'PUT', '{\"id\":3,\"name\":\"1\",\"sort\":1,\"path\":\"http://localhost:8081/front/upload/1733330281401.png\",\"createTime\":1733833889000}', 8, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-10 20:38:10'); +INSERT INTO `sys_log_operation` VALUES (1863969089488199689, '修改', '/admin/item/slides', 'PUT', '{\"id\":3,\"name\":\"2\",\"sort\":1,\"path\":\"http://localhost:8081/front/upload/1733330281401.png\",\"createTime\":1733833889000}', 8, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-10 20:38:26'); +INSERT INTO `sys_log_operation` VALUES (1863969089488199690, '修改', '/admin/item/slides', 'PUT', '{\"id\":3,\"name\":\"2\",\"sort\":1,\"path\":\"http://localhost:8081/front/upload/1733330281401.png\",\"type\":\"首页轮播\",\"createTime\":1733833889000}', 103, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-10 20:39:17'); +INSERT INTO `sys_log_operation` VALUES (1863969089488199691, '保存', '/admin/item/article', 'POST', '{\"id\":1,\"title\":\"沙雅小刀:真传1000年\",\"introduction\":\"新疆的很多少数民族,无论是维吾尔族或是哈萨克族、柯尔克孜族的男子,都喜爱在腰间佩戴一把小刀。夏日瓜果飘香之时,在路旁买上一个大西瓜或哈密瓜,用不着把瓜掰得四分五裂,只需拿出随身携带的小刀切开,就可以大快朵颐;新疆少数民族爱吃牛羊肉,当美味飘香的牛羊肉端上桌时,宾客们纷纷亮出各式各样的刀子,让宴席顿时生辉。其中,沙雅小刀十分引人注目。\",\"userId\":null,\"content\":\"

沙雅小刀:真传1000年

  新疆的很多少数民族,无论是维吾尔族或是哈萨克族、柯尔克孜族的男子,都喜爱在腰间佩戴一把小刀。夏日瓜果飘香之时,在路旁买上一个大西瓜或哈密瓜,用不着把瓜掰得四分五裂,只需拿出随身携带的小刀切开,就可以大快朵颐;新疆少数民族爱吃牛羊肉,当美味飘香的牛羊肉端上桌时,宾客们纷纷亮出各式各样的刀子,让宴席顿时生辉。其中,沙雅小刀十分引人注目。

  穆巴拉克是新疆沙雅县一个普通的维吾尔族刀匠。来到他的作坊时,他正在聚精会神地磨刀。他的小刀作坊位于当地维吾尔族称为“依盖尔齐巴扎”的商业街,意思是做鞍具、套具者的集市。在上世纪之初,这里是匠人的天下,铁匠、皮匠、“皮洽克奇”(精通小刀制作的人)、钉马掌的,应有尽有。现在,这条街上像穆巴拉克这样的刀匠依然很多。这归功于当地政府和文化部门、旅游部门的慧眼。2005年3月,沙雅县成立了沙雅小刀协会;2008年3月,沙雅民族手工艺制作专业合作社成立,发展社员150名。该合作社年产10类130余种规格的小刀,远销天山南北和西亚、欧洲等地。现在已经成为沙雅县一个标志性的品牌。

  穆巴拉克开始向我展示制刀技艺。他一手用长铁钳夹住小刀的造型锻件,一手拿起小铁锤敲打,同时示意徒弟手持大铁锤锻打,并不时用小锤试一试砸的力度。两人配合很是默契,你一下、我一下,铁锤不时划着优美的弧线,发出叮叮当当的声响。

  感觉差不多了,他停下来,仔细观察锻打的情况。看起来徒弟不仅卖力气,砸得也很到位,穆巴拉克露出了赞许的笑容。他指着小刀说:“你看,经过锻打,小刀的基本造型就确定了,等一会儿还要烧红,然后淬火。”淬火就是将烧得发红的钢放入液体中快速冷却。放在凉水中淬火的钢硬度高但是发脆,因此淬火不能用凉水,而要用清油。“淬火是小刀工匠们世代传承的绝技,相互保密,绝不外传。”穆巴拉克说。据说,经名师淬火处理过的小刀锋刃锐利,用其削刮铁条,但见铁屑迎刃而起,而小刀锋却不曾崩口、卷刃。

  由于有言在先,我们只好忍住好奇心理,退出了作坊,无缘欣赏到这一家传绝技。穆巴拉克把淬火后的小刀交给徒弟去打磨。打磨必须用手动砂轮和磨光轮,现在传统工艺中稍微发生变化的是,有的匠人也用电动砂轮。打磨虽然简单,但却是必不可少的工序。穆巴拉克的徒弟已经是这方面的熟练工了,很快就把小刀磨得光洁锃亮。

  刀的制作历史就是一部人类生产力的演进史。公元10世纪以后,维吾尔族成为塔里木盆地周缘绿洲中农业民族的主体,悠久的锻铁历史加上农耕文化的积淀,使小刀的制作技艺愈加精湛。早在魏晋时期,当地制作小刀的民间艺人就不断探索小刀的制作工艺,坚韧锋利的小刀常镶配自然脱落的珍稀野生动物角骨、宝石等珍宝,图案明丽,匠心独具,颇具观赏和收藏价值。

  史料记载,宋真宗大中祥符三年(公元1010年),龟兹回鹘大臣左温把小刀作为贡品献给了中央王廷。那时的龟兹,包括今天的库车、沙雅、新和、拜城和阿克苏诸地。从这段可信的历史看,沙雅小刀的制作历史可谓由来已久,且在当时就负有盛名。

  最后一道工艺,在过去算是秘密,现在已经众所周知,就是用油煮、蜡磨的方法使小刀光亮,不生锈。

  由于制作一把沙雅小刀需要经过200多道工序,即使穆巴拉克手脚再麻利,每天最多也只能做两把,一个月总产量仅四五十把,利润很低。现在,很多匠人使用不锈钢或镀铬工艺来节省时间,提高效率。“我们用手工!”穆巴拉克郑重地强调。

  这使我油然而生一种敬意。毕竟,我们需要一种深刻的记忆,它来自于祖先,这是古代延续至今的血脉、智慧和力量的记录。

  [故事]

  “塔石罕”小刀的由来

  沙雅小刀最有名的要算“塔石罕”小刀了。“塔石罕”是群众对一位匠人的尊称,他的原名叫“塔石·塔里甫”。由于他制作的刀别具一格,所以人们在他的名字后面加了一个“罕”字来命名。

  上世纪20年代,塔石·塔力甫为了有别于当时同样出名的英吉沙小刀,开始把沙雅小刀的刀型往小尺寸上发展。他用上等的好钢做原料,冶炼并打制成玲珑小巧的折把刀、弯把刀、直把刀,特点是实用、小巧、美观。他还把象牙、翡翠、宝石等镶嵌在刀把上,刀把的纹饰与图案色彩丰富,小刀因此而名贵。“塔石罕”小刀就成了沙雅小刀的一个代名词。

  [小贴士]

  挑选小刀的技巧

  除了沙雅小刀外,新疆著名的小刀还有:英吉沙工艺小刀、伊犁沙木萨克折刀、焉耆陈正套刀、莎车买买提折刀、库车小刀、姑墨小靴刀、和田墨玉奎雅折刀。

  从制作工艺上分,新疆小刀主要分为白钢、黑钢两类。 所谓白钢,就是不锈钢刀身的,这种刀子一般都是机器模具压出来的,看着漂亮,其实钢口不好,中看不中用,主要针对内地人市场,新疆本地人一般不会买这种刀子。黑钢的刀子,就是纯手工打制出来的,虽然不太漂亮,但很实用。

\",\"sort\":1,\"star\":null,\"cover\":\"http://localhost:8081/front/upload/2018081314001394443.png\",\"createTime\":null,\"tag\":\"文件\",\"type\":\"文化鉴赏\"}', 52, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-10 21:48:52'); +INSERT INTO `sys_log_operation` VALUES (1863969089488199692, '修改', '/admin/item/article', 'PUT', '{\"id\":1,\"title\":\"沙雅小刀:真传1000年\",\"introduction\":\"新疆的很多少数民族,无论是维吾尔族或是哈萨克族、柯尔克孜族的男子,都喜爱在腰间佩戴一把小刀。夏日瓜果飘香之时,在路旁买上一个大西瓜或哈密瓜,用不着把瓜掰得四分五裂,只需拿出随身携带的小刀切开,就可以大快朵颐;新疆少数民族爱吃牛羊肉,当美味飘香的牛羊肉端上桌时,宾客们纷纷亮出各式各样的刀子,让宴席顿时生辉。其中,沙雅小刀十分引人注目。\",\"userId\":null,\"content\":\"

沙雅小刀:真传1000年

  新疆的很多少数民族,无论是维吾尔族或是哈萨克族、柯尔克孜族的男子,都喜爱在腰间佩戴一把小刀。夏日瓜果飘香之时,在路旁买上一个大西瓜或哈密瓜,用不着把瓜掰得四分五裂,只需拿出随身携带的小刀切开,就可以大快朵颐;新疆少数民族爱吃牛羊肉,当美味飘香的牛羊肉端上桌时,宾客们纷纷亮出各式各样的刀子,让宴席顿时生辉。其中,沙雅小刀十分引人注目。

  穆巴拉克是新疆沙雅县一个普通的维吾尔族刀匠。来到他的作坊时,他正在聚精会神地磨刀。他的小刀作坊位于当地维吾尔族称为“依盖尔齐巴扎”的商业街,意思是做鞍具、套具者的集市。在上世纪之初,这里是匠人的天下,铁匠、皮匠、“皮洽克奇”(精通小刀制作的人)、钉马掌的,应有尽有。现在,这条街上像穆巴拉克这样的刀匠依然很多。这归功于当地政府和文化部门、旅游部门的慧眼。2005年3月,沙雅县成立了沙雅小刀协会;2008年3月,沙雅民族手工艺制作专业合作社成立,发展社员150名。该合作社年产10类130余种规格的小刀,远销天山南北和西亚、欧洲等地。现在已经成为沙雅县一个标志性的品牌。

  穆巴拉克开始向我展示制刀技艺。他一手用长铁钳夹住小刀的造型锻件,一手拿起小铁锤敲打,同时示意徒弟手持大铁锤锻打,并不时用小锤试一试砸的力度。两人配合很是默契,你一下、我一下,铁锤不时划着优美的弧线,发出叮叮当当的声响。

  感觉差不多了,他停下来,仔细观察锻打的情况。看起来徒弟不仅卖力气,砸得也很到位,穆巴拉克露出了赞许的笑容。他指着小刀说:“你看,经过锻打,小刀的基本造型就确定了,等一会儿还要烧红,然后淬火。”淬火就是将烧得发红的钢放入液体中快速冷却。放在凉水中淬火的钢硬度高但是发脆,因此淬火不能用凉水,而要用清油。“淬火是小刀工匠们世代传承的绝技,相互保密,绝不外传。”穆巴拉克说。据说,经名师淬火处理过的小刀锋刃锐利,用其削刮铁条,但见铁屑迎刃而起,而小刀锋却不曾崩口、卷刃。

  由于有言在先,我们只好忍住好奇心理,退出了作坊,无缘欣赏到这一家传绝技。穆巴拉克把淬火后的小刀交给徒弟去打磨。打磨必须用手动砂轮和磨光轮,现在传统工艺中稍微发生变化的是,有的匠人也用电动砂轮。打磨虽然简单,但却是必不可少的工序。穆巴拉克的徒弟已经是这方面的熟练工了,很快就把小刀磨得光洁锃亮。

  刀的制作历史就是一部人类生产力的演进史。公元10世纪以后,维吾尔族成为塔里木盆地周缘绿洲中农业民族的主体,悠久的锻铁历史加上农耕文化的积淀,使小刀的制作技艺愈加精湛。早在魏晋时期,当地制作小刀的民间艺人就不断探索小刀的制作工艺,坚韧锋利的小刀常镶配自然脱落的珍稀野生动物角骨、宝石等珍宝,图案明丽,匠心独具,颇具观赏和收藏价值。

  史料记载,宋真宗大中祥符三年(公元1010年),龟兹回鹘大臣左温把小刀作为贡品献给了中央王廷。那时的龟兹,包括今天的库车、沙雅、新和、拜城和阿克苏诸地。从这段可信的历史看,沙雅小刀的制作历史可谓由来已久,且在当时就负有盛名。

  最后一道工艺,在过去算是秘密,现在已经众所周知,就是用油煮、蜡磨的方法使小刀光亮,不生锈。

  由于制作一把沙雅小刀需要经过200多道工序,即使穆巴拉克手脚再麻利,每天最多也只能做两把,一个月总产量仅四五十把,利润很低。现在,很多匠人使用不锈钢或镀铬工艺来节省时间,提高效率。“我们用手工!”穆巴拉克郑重地强调。

  这使我油然而生一种敬意。毕竟,我们需要一种深刻的记忆,它来自于祖先,这是古代延续至今的血脉、智慧和力量的记录。

  [故事]

  “塔石罕”小刀的由来

  沙雅小刀最有名的要算“塔石罕”小刀了。“塔石罕”是群众对一位匠人的尊称,他的原名叫“塔石·塔里甫”。由于他制作的刀别具一格,所以人们在他的名字后面加了一个“罕”字来命名。

  上世纪20年代,塔石·塔力甫为了有别于当时同样出名的英吉沙小刀,开始把沙雅小刀的刀型往小尺寸上发展。他用上等的好钢做原料,冶炼并打制成玲珑小巧的折把刀、弯把刀、直把刀,特点是实用、小巧、美观。他还把象牙、翡翠、宝石等镶嵌在刀把上,刀把的纹饰与图案色彩丰富,小刀因此而名贵。“塔石罕”小刀就成了沙雅小刀的一个代名词。

  [小贴士]

  挑选小刀的技巧

  除了沙雅小刀外,新疆著名的小刀还有:英吉沙工艺小刀、伊犁沙木萨克折刀、焉耆陈正套刀、莎车买买提折刀、库车小刀、姑墨小靴刀、和田墨玉奎雅折刀。

  从制作工艺上分,新疆小刀主要分为白钢、黑钢两类。 所谓白钢,就是不锈钢刀身的,这种刀子一般都是机器模具压出来的,看着漂亮,其实钢口不好,中看不中用,主要针对内地人市场,新疆本地人一般不会买这种刀子。黑钢的刀子,就是纯手工打制出来的,虽然不太漂亮,但很实用。

\",\"sort\":1,\"star\":0,\"cover\":\"http://localhost:8081/front/upload/2018081314001394443.png\",\"createTime\":1733838669000,\"tag\":\"文化\",\"type\":null}', 9, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-10 21:59:16'); +INSERT INTO `sys_log_operation` VALUES (1863969089488199693, '修改', '/admin/item/article', 'PUT', '{\"id\":1,\"title\":\"沙雅小刀:真传1000年\",\"introduction\":\"新疆的很多少数民族,无论是维吾尔族或是哈萨克族、柯尔克孜族的男子,都喜爱在腰间佩戴一把小刀。夏日瓜果飘香之时,在路旁买上一个大西瓜或哈密瓜,用不着把瓜掰得四分五裂,只需拿出随身携带的小刀切开,就可以大快朵颐;新疆少数民族爱吃牛羊肉,当美味飘香的牛羊肉端上桌时,宾客们纷纷亮出各式各样的刀子,让宴席顿时生辉。其中,沙雅小刀十分引人注目。\",\"userId\":null,\"content\":\"

沙雅小刀:真传1000年

  新疆的很多少数民族,无论是维吾尔族或是哈萨克族、柯尔克孜族的男子,都喜爱在腰间佩戴一把小刀。夏日瓜果飘香之时,在路旁买上一个大西瓜或哈密瓜,用不着把瓜掰得四分五裂,只需拿出随身携带的小刀切开,就可以大快朵颐;新疆少数民族爱吃牛羊肉,当美味飘香的牛羊肉端上桌时,宾客们纷纷亮出各式各样的刀子,让宴席顿时生辉。其中,沙雅小刀十分引人注目。

  穆巴拉克是新疆沙雅县一个普通的维吾尔族刀匠。来到他的作坊时,他正在聚精会神地磨刀。他的小刀作坊位于当地维吾尔族称为“依盖尔齐巴扎”的商业街,意思是做鞍具、套具者的集市。在上世纪之初,这里是匠人的天下,铁匠、皮匠、“皮洽克奇”(精通小刀制作的人)、钉马掌的,应有尽有。现在,这条街上像穆巴拉克这样的刀匠依然很多。这归功于当地政府和文化部门、旅游部门的慧眼。2005年3月,沙雅县成立了沙雅小刀协会;2008年3月,沙雅民族手工艺制作专业合作社成立,发展社员150名。该合作社年产10类130余种规格的小刀,远销天山南北和西亚、欧洲等地。现在已经成为沙雅县一个标志性的品牌。

  穆巴拉克开始向我展示制刀技艺。他一手用长铁钳夹住小刀的造型锻件,一手拿起小铁锤敲打,同时示意徒弟手持大铁锤锻打,并不时用小锤试一试砸的力度。两人配合很是默契,你一下、我一下,铁锤不时划着优美的弧线,发出叮叮当当的声响。

  感觉差不多了,他停下来,仔细观察锻打的情况。看起来徒弟不仅卖力气,砸得也很到位,穆巴拉克露出了赞许的笑容。他指着小刀说:“你看,经过锻打,小刀的基本造型就确定了,等一会儿还要烧红,然后淬火。”淬火就是将烧得发红的钢放入液体中快速冷却。放在凉水中淬火的钢硬度高但是发脆,因此淬火不能用凉水,而要用清油。“淬火是小刀工匠们世代传承的绝技,相互保密,绝不外传。”穆巴拉克说。据说,经名师淬火处理过的小刀锋刃锐利,用其削刮铁条,但见铁屑迎刃而起,而小刀锋却不曾崩口、卷刃。

  由于有言在先,我们只好忍住好奇心理,退出了作坊,无缘欣赏到这一家传绝技。穆巴拉克把淬火后的小刀交给徒弟去打磨。打磨必须用手动砂轮和磨光轮,现在传统工艺中稍微发生变化的是,有的匠人也用电动砂轮。打磨虽然简单,但却是必不可少的工序。穆巴拉克的徒弟已经是这方面的熟练工了,很快就把小刀磨得光洁锃亮。

  刀的制作历史就是一部人类生产力的演进史。公元10世纪以后,维吾尔族成为塔里木盆地周缘绿洲中农业民族的主体,悠久的锻铁历史加上农耕文化的积淀,使小刀的制作技艺愈加精湛。早在魏晋时期,当地制作小刀的民间艺人就不断探索小刀的制作工艺,坚韧锋利的小刀常镶配自然脱落的珍稀野生动物角骨、宝石等珍宝,图案明丽,匠心独具,颇具观赏和收藏价值。

  史料记载,宋真宗大中祥符三年(公元1010年),龟兹回鹘大臣左温把小刀作为贡品献给了中央王廷。那时的龟兹,包括今天的库车、沙雅、新和、拜城和阿克苏诸地。从这段可信的历史看,沙雅小刀的制作历史可谓由来已久,且在当时就负有盛名。

  最后一道工艺,在过去算是秘密,现在已经众所周知,就是用油煮、蜡磨的方法使小刀光亮,不生锈。

  由于制作一把沙雅小刀需要经过200多道工序,即使穆巴拉克手脚再麻利,每天最多也只能做两把,一个月总产量仅四五十把,利润很低。现在,很多匠人使用不锈钢或镀铬工艺来节省时间,提高效率。“我们用手工!”穆巴拉克郑重地强调。

  这使我油然而生一种敬意。毕竟,我们需要一种深刻的记忆,它来自于祖先,这是古代延续至今的血脉、智慧和力量的记录。

  [故事]

  “塔石罕”小刀的由来

  沙雅小刀最有名的要算“塔石罕”小刀了。“塔石罕”是群众对一位匠人的尊称,他的原名叫“塔石·塔里甫”。由于他制作的刀别具一格,所以人们在他的名字后面加了一个“罕”字来命名。

  上世纪20年代,塔石·塔力甫为了有别于当时同样出名的英吉沙小刀,开始把沙雅小刀的刀型往小尺寸上发展。他用上等的好钢做原料,冶炼并打制成玲珑小巧的折把刀、弯把刀、直把刀,特点是实用、小巧、美观。他还把象牙、翡翠、宝石等镶嵌在刀把上,刀把的纹饰与图案色彩丰富,小刀因此而名贵。“塔石罕”小刀就成了沙雅小刀的一个代名词。

  [小贴士]

  挑选小刀的技巧

  除了沙雅小刀外,新疆著名的小刀还有:英吉沙工艺小刀、伊犁沙木萨克折刀、焉耆陈正套刀、莎车买买提折刀、库车小刀、姑墨小靴刀、和田墨玉奎雅折刀。

  从制作工艺上分,新疆小刀主要分为白钢、黑钢两类。 所谓白钢,就是不锈钢刀身的,这种刀子一般都是机器模具压出来的,看着漂亮,其实钢口不好,中看不中用,主要针对内地人市场,新疆本地人一般不会买这种刀子。黑钢的刀子,就是纯手工打制出来的,虽然不太漂亮,但很实用。

\",\"sort\":1,\"star\":0,\"cover\":\"http://localhost:8081/front/upload/2018081314001394443.png\",\"createTime\":1733838669000,\"tag\":\"文化\",\"type\":null}', 7, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-10 22:00:26'); +INSERT INTO `sys_log_operation` VALUES (1863969089488199694, '修改', '/admin/item/article', 'PUT', '{\"id\":1,\"title\":\"沙雅小刀:真传1000年\",\"introduction\":\"新疆的很多少数民族,无论是维吾尔族或是哈萨克族、柯尔克孜族的男子,都喜爱在腰间佩戴一把小刀。夏日瓜果飘香之时,在路旁买上一个大西瓜或哈密瓜,用不着把瓜掰得四分五裂,只需拿出随身携带的小刀切开,就可以大快朵颐;新疆少数民族爱吃牛羊肉,当美味飘香的牛羊肉端上桌时,宾客们纷纷亮出各式各样的刀子,让宴席顿时生辉。其中,沙雅小刀十分引人注目。\",\"userId\":null,\"content\":\"

沙雅小刀:真传1000年

  新疆的很多少数民族,无论是维吾尔族或是哈萨克族、柯尔克孜族的男子,都喜爱在腰间佩戴一把小刀。夏日瓜果飘香之时,在路旁买上一个大西瓜或哈密瓜,用不着把瓜掰得四分五裂,只需拿出随身携带的小刀切开,就可以大快朵颐;新疆少数民族爱吃牛羊肉,当美味飘香的牛羊肉端上桌时,宾客们纷纷亮出各式各样的刀子,让宴席顿时生辉。其中,沙雅小刀十分引人注目。

  穆巴拉克是新疆沙雅县一个普通的维吾尔族刀匠。来到他的作坊时,他正在聚精会神地磨刀。他的小刀作坊位于当地维吾尔族称为“依盖尔齐巴扎”的商业街,意思是做鞍具、套具者的集市。在上世纪之初,这里是匠人的天下,铁匠、皮匠、“皮洽克奇”(精通小刀制作的人)、钉马掌的,应有尽有。现在,这条街上像穆巴拉克这样的刀匠依然很多。这归功于当地政府和文化部门、旅游部门的慧眼。2005年3月,沙雅县成立了沙雅小刀协会;2008年3月,沙雅民族手工艺制作专业合作社成立,发展社员150名。该合作社年产10类130余种规格的小刀,远销天山南北和西亚、欧洲等地。现在已经成为沙雅县一个标志性的品牌。

  穆巴拉克开始向我展示制刀技艺。他一手用长铁钳夹住小刀的造型锻件,一手拿起小铁锤敲打,同时示意徒弟手持大铁锤锻打,并不时用小锤试一试砸的力度。两人配合很是默契,你一下、我一下,铁锤不时划着优美的弧线,发出叮叮当当的声响。

  感觉差不多了,他停下来,仔细观察锻打的情况。看起来徒弟不仅卖力气,砸得也很到位,穆巴拉克露出了赞许的笑容。他指着小刀说:“你看,经过锻打,小刀的基本造型就确定了,等一会儿还要烧红,然后淬火。”淬火就是将烧得发红的钢放入液体中快速冷却。放在凉水中淬火的钢硬度高但是发脆,因此淬火不能用凉水,而要用清油。“淬火是小刀工匠们世代传承的绝技,相互保密,绝不外传。”穆巴拉克说。据说,经名师淬火处理过的小刀锋刃锐利,用其削刮铁条,但见铁屑迎刃而起,而小刀锋却不曾崩口、卷刃。

  由于有言在先,我们只好忍住好奇心理,退出了作坊,无缘欣赏到这一家传绝技。穆巴拉克把淬火后的小刀交给徒弟去打磨。打磨必须用手动砂轮和磨光轮,现在传统工艺中稍微发生变化的是,有的匠人也用电动砂轮。打磨虽然简单,但却是必不可少的工序。穆巴拉克的徒弟已经是这方面的熟练工了,很快就把小刀磨得光洁锃亮。

  刀的制作历史就是一部人类生产力的演进史。公元10世纪以后,维吾尔族成为塔里木盆地周缘绿洲中农业民族的主体,悠久的锻铁历史加上农耕文化的积淀,使小刀的制作技艺愈加精湛。早在魏晋时期,当地制作小刀的民间艺人就不断探索小刀的制作工艺,坚韧锋利的小刀常镶配自然脱落的珍稀野生动物角骨、宝石等珍宝,图案明丽,匠心独具,颇具观赏和收藏价值。

  史料记载,宋真宗大中祥符三年(公元1010年),龟兹回鹘大臣左温把小刀作为贡品献给了中央王廷。那时的龟兹,包括今天的库车、沙雅、新和、拜城和阿克苏诸地。从这段可信的历史看,沙雅小刀的制作历史可谓由来已久,且在当时就负有盛名。

  最后一道工艺,在过去算是秘密,现在已经众所周知,就是用油煮、蜡磨的方法使小刀光亮,不生锈。

  由于制作一把沙雅小刀需要经过200多道工序,即使穆巴拉克手脚再麻利,每天最多也只能做两把,一个月总产量仅四五十把,利润很低。现在,很多匠人使用不锈钢或镀铬工艺来节省时间,提高效率。“我们用手工!”穆巴拉克郑重地强调。

  这使我油然而生一种敬意。毕竟,我们需要一种深刻的记忆,它来自于祖先,这是古代延续至今的血脉、智慧和力量的记录。

  [故事]

  “塔石罕”小刀的由来

  沙雅小刀最有名的要算“塔石罕”小刀了。“塔石罕”是群众对一位匠人的尊称,他的原名叫“塔石·塔里甫”。由于他制作的刀别具一格,所以人们在他的名字后面加了一个“罕”字来命名。

  上世纪20年代,塔石·塔力甫为了有别于当时同样出名的英吉沙小刀,开始把沙雅小刀的刀型往小尺寸上发展。他用上等的好钢做原料,冶炼并打制成玲珑小巧的折把刀、弯把刀、直把刀,特点是实用、小巧、美观。他还把象牙、翡翠、宝石等镶嵌在刀把上,刀把的纹饰与图案色彩丰富,小刀因此而名贵。“塔石罕”小刀就成了沙雅小刀的一个代名词。

  [小贴士]

  挑选小刀的技巧

  除了沙雅小刀外,新疆著名的小刀还有:英吉沙工艺小刀、伊犁沙木萨克折刀、焉耆陈正套刀、莎车买买提折刀、库车小刀、姑墨小靴刀、和田墨玉奎雅折刀。

  从制作工艺上分,新疆小刀主要分为白钢、黑钢两类。 所谓白钢,就是不锈钢刀身的,这种刀子一般都是机器模具压出来的,看着漂亮,其实钢口不好,中看不中用,主要针对内地人市场,新疆本地人一般不会买这种刀子。黑钢的刀子,就是纯手工打制出来的,虽然不太漂亮,但很实用。

\",\"sort\":1,\"star\":0,\"cover\":\"http://localhost:8081/front/upload/2018081314001394443.png\",\"createTime\":1733838669000,\"tag\":\"文化\",\"type\":\"文化鉴赏\"}', 11, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-10 22:02:06'); +INSERT INTO `sys_log_operation` VALUES (1863969089488199695, '修改', '/admin/item/article', 'PUT', '{\"id\":1,\"title\":\"沙雅小刀:真传1000年\",\"introduction\":\"新疆的很多少数民族,无论是维吾尔族或是哈萨克族、柯尔克孜族的男子,都喜爱在腰间佩戴一把小刀。夏日瓜果飘香之时,在路旁买上一个大西瓜或哈密瓜,用不着把瓜掰得四分五裂,只需拿出随身携带的小刀切开,就可以大快朵颐;新疆少数民族爱吃牛羊肉,当美味飘香的牛羊肉端上桌时,宾客们纷纷亮出各式各样的刀子,让宴席顿时生辉。其中,沙雅小刀十分引人注目。\",\"userId\":null,\"content\":\"

沙雅小刀:真传1000年

  新疆的很多少数民族,无论是维吾尔族或是哈萨克族、柯尔克孜族的男子,都喜爱在腰间佩戴一把小刀。夏日瓜果飘香之时,在路旁买上一个大西瓜或哈密瓜,用不着把瓜掰得四分五裂,只需拿出随身携带的小刀切开,就可以大快朵颐;新疆少数民族爱吃牛羊肉,当美味飘香的牛羊肉端上桌时,宾客们纷纷亮出各式各样的刀子,让宴席顿时生辉。其中,沙雅小刀十分引人注目。

  穆巴拉克是新疆沙雅县一个普通的维吾尔族刀匠。来到他的作坊时,他正在聚精会神地磨刀。他的小刀作坊位于当地维吾尔族称为“依盖尔齐巴扎”的商业街,意思是做鞍具、套具者的集市。在上世纪之初,这里是匠人的天下,铁匠、皮匠、“皮洽克奇”(精通小刀制作的人)、钉马掌的,应有尽有。现在,这条街上像穆巴拉克这样的刀匠依然很多。这归功于当地政府和文化部门、旅游部门的慧眼。2005年3月,沙雅县成立了沙雅小刀协会;2008年3月,沙雅民族手工艺制作专业合作社成立,发展社员150名。该合作社年产10类130余种规格的小刀,远销天山南北和西亚、欧洲等地。现在已经成为沙雅县一个标志性的品牌。

  穆巴拉克开始向我展示制刀技艺。他一手用长铁钳夹住小刀的造型锻件,一手拿起小铁锤敲打,同时示意徒弟手持大铁锤锻打,并不时用小锤试一试砸的力度。两人配合很是默契,你一下、我一下,铁锤不时划着优美的弧线,发出叮叮当当的声响。

  感觉差不多了,他停下来,仔细观察锻打的情况。看起来徒弟不仅卖力气,砸得也很到位,穆巴拉克露出了赞许的笑容。他指着小刀说:“你看,经过锻打,小刀的基本造型就确定了,等一会儿还要烧红,然后淬火。”淬火就是将烧得发红的钢放入液体中快速冷却。放在凉水中淬火的钢硬度高但是发脆,因此淬火不能用凉水,而要用清油。“淬火是小刀工匠们世代传承的绝技,相互保密,绝不外传。”穆巴拉克说。据说,经名师淬火处理过的小刀锋刃锐利,用其削刮铁条,但见铁屑迎刃而起,而小刀锋却不曾崩口、卷刃。

  由于有言在先,我们只好忍住好奇心理,退出了作坊,无缘欣赏到这一家传绝技。穆巴拉克把淬火后的小刀交给徒弟去打磨。打磨必须用手动砂轮和磨光轮,现在传统工艺中稍微发生变化的是,有的匠人也用电动砂轮。打磨虽然简单,但却是必不可少的工序。穆巴拉克的徒弟已经是这方面的熟练工了,很快就把小刀磨得光洁锃亮。

  刀的制作历史就是一部人类生产力的演进史。公元10世纪以后,维吾尔族成为塔里木盆地周缘绿洲中农业民族的主体,悠久的锻铁历史加上农耕文化的积淀,使小刀的制作技艺愈加精湛。早在魏晋时期,当地制作小刀的民间艺人就不断探索小刀的制作工艺,坚韧锋利的小刀常镶配自然脱落的珍稀野生动物角骨、宝石等珍宝,图案明丽,匠心独具,颇具观赏和收藏价值。

  史料记载,宋真宗大中祥符三年(公元1010年),龟兹回鹘大臣左温把小刀作为贡品献给了中央王廷。那时的龟兹,包括今天的库车、沙雅、新和、拜城和阿克苏诸地。从这段可信的历史看,沙雅小刀的制作历史可谓由来已久,且在当时就负有盛名。

  最后一道工艺,在过去算是秘密,现在已经众所周知,就是用油煮、蜡磨的方法使小刀光亮,不生锈。

  由于制作一把沙雅小刀需要经过200多道工序,即使穆巴拉克手脚再麻利,每天最多也只能做两把,一个月总产量仅四五十把,利润很低。现在,很多匠人使用不锈钢或镀铬工艺来节省时间,提高效率。“我们用手工!”穆巴拉克郑重地强调。

  这使我油然而生一种敬意。毕竟,我们需要一种深刻的记忆,它来自于祖先,这是古代延续至今的血脉、智慧和力量的记录。

  [故事]

  “塔石罕”小刀的由来

  沙雅小刀最有名的要算“塔石罕”小刀了。“塔石罕”是群众对一位匠人的尊称,他的原名叫“塔石·塔里甫”。由于他制作的刀别具一格,所以人们在他的名字后面加了一个“罕”字来命名。

  上世纪20年代,塔石·塔力甫为了有别于当时同样出名的英吉沙小刀,开始把沙雅小刀的刀型往小尺寸上发展。他用上等的好钢做原料,冶炼并打制成玲珑小巧的折把刀、弯把刀、直把刀,特点是实用、小巧、美观。他还把象牙、翡翠、宝石等镶嵌在刀把上,刀把的纹饰与图案色彩丰富,小刀因此而名贵。“塔石罕”小刀就成了沙雅小刀的一个代名词。

  [小贴士]

  挑选小刀的技巧

  除了沙雅小刀外,新疆著名的小刀还有:英吉沙工艺小刀、伊犁沙木萨克折刀、焉耆陈正套刀、莎车买买提折刀、库车小刀、姑墨小靴刀、和田墨玉奎雅折刀。

  从制作工艺上分,新疆小刀主要分为白钢、黑钢两类。 所谓白钢,就是不锈钢刀身的,这种刀子一般都是机器模具压出来的,看着漂亮,其实钢口不好,中看不中用,主要针对内地人市场,新疆本地人一般不会买这种刀子。黑钢的刀子,就是纯手工打制出来的,虽然不太漂亮,但很实用。

\",\"sort\":1,\"star\":0,\"cover\":\"http://localhost:8081/front/upload/2018081314001394443.png\",\"createTime\":1733838669000,\"tag\":\"文化\",\"type\":\"文化鉴赏\"}', 10, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-10 22:02:32'); +INSERT INTO `sys_log_operation` VALUES (1863969089488199696, '修改', '/admin/item/article', 'PUT', '{\"id\":1,\"title\":\"沙雅小刀:真传1000年\",\"introduction\":\"新疆的很多少数民族,无论是维吾尔族或是哈萨克族、柯尔克孜族的男子,都喜爱在腰间佩戴一把小刀。夏日瓜果飘香之时,在路旁买上一个大西瓜或哈密瓜,用不着把瓜掰得四分五裂,只需拿出随身携带的小刀切开,就可以大快朵颐;新疆少数民族爱吃牛羊肉,当美味飘香的牛羊肉端上桌时,宾客们纷纷亮出各式各样的刀子,让宴席顿时生辉。其中,沙雅小刀十分引人注目。\",\"userId\":null,\"content\":\"

沙雅小刀:真传1000年

  新疆的很多少数民族,无论是维吾尔族或是哈萨克族、柯尔克孜族的男子,都喜爱在腰间佩戴一把小刀。夏日瓜果飘香之时,在路旁买上一个大西瓜或哈密瓜,用不着把瓜掰得四分五裂,只需拿出随身携带的小刀切开,就可以大快朵颐;新疆少数民族爱吃牛羊肉,当美味飘香的牛羊肉端上桌时,宾客们纷纷亮出各式各样的刀子,让宴席顿时生辉。其中,沙雅小刀十分引人注目。

  穆巴拉克是新疆沙雅县一个普通的维吾尔族刀匠。来到他的作坊时,他正在聚精会神地磨刀。他的小刀作坊位于当地维吾尔族称为“依盖尔齐巴扎”的商业街,意思是做鞍具、套具者的集市。在上世纪之初,这里是匠人的天下,铁匠、皮匠、“皮洽克奇”(精通小刀制作的人)、钉马掌的,应有尽有。现在,这条街上像穆巴拉克这样的刀匠依然很多。这归功于当地政府和文化部门、旅游部门的慧眼。2005年3月,沙雅县成立了沙雅小刀协会;2008年3月,沙雅民族手工艺制作专业合作社成立,发展社员150名。该合作社年产10类130余种规格的小刀,远销天山南北和西亚、欧洲等地。现在已经成为沙雅县一个标志性的品牌。

  穆巴拉克开始向我展示制刀技艺。他一手用长铁钳夹住小刀的造型锻件,一手拿起小铁锤敲打,同时示意徒弟手持大铁锤锻打,并不时用小锤试一试砸的力度。两人配合很是默契,你一下、我一下,铁锤不时划着优美的弧线,发出叮叮当当的声响。

  感觉差不多了,他停下来,仔细观察锻打的情况。看起来徒弟不仅卖力气,砸得也很到位,穆巴拉克露出了赞许的笑容。他指着小刀说:“你看,经过锻打,小刀的基本造型就确定了,等一会儿还要烧红,然后淬火。”淬火就是将烧得发红的钢放入液体中快速冷却。放在凉水中淬火的钢硬度高但是发脆,因此淬火不能用凉水,而要用清油。“淬火是小刀工匠们世代传承的绝技,相互保密,绝不外传。”穆巴拉克说。据说,经名师淬火处理过的小刀锋刃锐利,用其削刮铁条,但见铁屑迎刃而起,而小刀锋却不曾崩口、卷刃。

  由于有言在先,我们只好忍住好奇心理,退出了作坊,无缘欣赏到这一家传绝技。穆巴拉克把淬火后的小刀交给徒弟去打磨。打磨必须用手动砂轮和磨光轮,现在传统工艺中稍微发生变化的是,有的匠人也用电动砂轮。打磨虽然简单,但却是必不可少的工序。穆巴拉克的徒弟已经是这方面的熟练工了,很快就把小刀磨得光洁锃亮。

  刀的制作历史就是一部人类生产力的演进史。公元10世纪以后,维吾尔族成为塔里木盆地周缘绿洲中农业民族的主体,悠久的锻铁历史加上农耕文化的积淀,使小刀的制作技艺愈加精湛。早在魏晋时期,当地制作小刀的民间艺人就不断探索小刀的制作工艺,坚韧锋利的小刀常镶配自然脱落的珍稀野生动物角骨、宝石等珍宝,图案明丽,匠心独具,颇具观赏和收藏价值。

  史料记载,宋真宗大中祥符三年(公元1010年),龟兹回鹘大臣左温把小刀作为贡品献给了中央王廷。那时的龟兹,包括今天的库车、沙雅、新和、拜城和阿克苏诸地。从这段可信的历史看,沙雅小刀的制作历史可谓由来已久,且在当时就负有盛名。

  最后一道工艺,在过去算是秘密,现在已经众所周知,就是用油煮、蜡磨的方法使小刀光亮,不生锈。

  由于制作一把沙雅小刀需要经过200多道工序,即使穆巴拉克手脚再麻利,每天最多也只能做两把,一个月总产量仅四五十把,利润很低。现在,很多匠人使用不锈钢或镀铬工艺来节省时间,提高效率。“我们用手工!”穆巴拉克郑重地强调。

  这使我油然而生一种敬意。毕竟,我们需要一种深刻的记忆,它来自于祖先,这是古代延续至今的血脉、智慧和力量的记录。

  [故事]

  “塔石罕”小刀的由来

  沙雅小刀最有名的要算“塔石罕”小刀了。“塔石罕”是群众对一位匠人的尊称,他的原名叫“塔石·塔里甫”。由于他制作的刀别具一格,所以人们在他的名字后面加了一个“罕”字来命名。

  上世纪20年代,塔石·塔力甫为了有别于当时同样出名的英吉沙小刀,开始把沙雅小刀的刀型往小尺寸上发展。他用上等的好钢做原料,冶炼并打制成玲珑小巧的折把刀、弯把刀、直把刀,特点是实用、小巧、美观。他还把象牙、翡翠、宝石等镶嵌在刀把上,刀把的纹饰与图案色彩丰富,小刀因此而名贵。“塔石罕”小刀就成了沙雅小刀的一个代名词。

  [小贴士]

  挑选小刀的技巧

  除了沙雅小刀外,新疆著名的小刀还有:英吉沙工艺小刀、伊犁沙木萨克折刀、焉耆陈正套刀、莎车买买提折刀、库车小刀、姑墨小靴刀、和田墨玉奎雅折刀。

  从制作工艺上分,新疆小刀主要分为白钢、黑钢两类。 所谓白钢,就是不锈钢刀身的,这种刀子一般都是机器模具压出来的,看着漂亮,其实钢口不好,中看不中用,主要针对内地人市场,新疆本地人一般不会买这种刀子。黑钢的刀子,就是纯手工打制出来的,虽然不太漂亮,但很实用。

\",\"sort\":1,\"star\":0,\"cover\":\"http://localhost:8081/front/upload/2018081314001394443.png\",\"createTime\":1733838669000,\"tag\":\"文化\",\"type\":\"文化鉴赏\"}', 99, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-10 22:05:15'); +INSERT INTO `sys_log_operation` VALUES (1863969089488199697, '修改', '/admin/sys/dept', 'PUT', '{\"id\":1067246875800000066,\"pid\":0,\"children\":[],\"name\":\"文化系统总部\",\"sort\":0,\"createDate\":null,\"parentName\":\"一级部门\"}', 33, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-10 22:08:03'); +INSERT INTO `sys_log_operation` VALUES (1863969089488199698, '保存', '/admin/sys/menu', 'POST', '{\"id\":null,\"pid\":1863940095447416834,\"children\":[],\"name\":\"视频鉴赏\",\"url\":\"item/video\",\"menuType\":0,\"icon\":\"\",\"permissions\":\"\",\"sort\":0,\"createDate\":null,\"parentName\":\"文章\"}', 15, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-10 22:10:59'); +INSERT INTO `sys_log_operation` VALUES (1863969089488199699, '保存', '/admin/sys/menu', 'POST', '{\"id\":null,\"pid\":1863940095447416835,\"children\":[],\"name\":\"查看\",\"url\":null,\"menuType\":1,\"icon\":null,\"permissions\":\"item:article:page,item:article:info\",\"sort\":0,\"createDate\":null,\"parentName\":\"视频鉴赏\"}', 11, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-10 22:11:17'); +INSERT INTO `sys_log_operation` VALUES (1863969089488199700, '保存', '/admin/sys/menu', 'POST', '{\"id\":null,\"pid\":1863940095447416835,\"children\":[],\"name\":\"新增\",\"url\":null,\"menuType\":1,\"icon\":null,\"permissions\":\"item:article:save\",\"sort\":0,\"createDate\":null,\"parentName\":\"视频鉴赏\"}', 9, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-10 22:11:27'); +INSERT INTO `sys_log_operation` VALUES (1863969089488199701, '保存', '/admin/sys/menu', 'POST', '{\"id\":null,\"pid\":1863940095447416835,\"children\":[],\"name\":\"修改\",\"url\":null,\"menuType\":1,\"icon\":null,\"permissions\":\"item:article:update\",\"sort\":0,\"createDate\":null,\"parentName\":\"视频鉴赏\"}', 9, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-10 22:11:37'); +INSERT INTO `sys_log_operation` VALUES (1863969089488199702, '保存', '/admin/sys/menu', 'POST', '{\"id\":null,\"pid\":1863940095447416835,\"children\":[],\"name\":\"删除\",\"url\":null,\"menuType\":1,\"icon\":null,\"permissions\":\"item:article:delete\",\"sort\":0,\"createDate\":null,\"parentName\":\"视频鉴赏\"}', 10, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-10 22:11:47'); +INSERT INTO `sys_log_operation` VALUES (1863969089488199703, '修改', '/admin/item/article', 'PUT', '{\"id\":8,\"title\":\"121\",\"path\":null,\"introduction\":\"2121\",\"userId\":1863920777825390593,\"content\":\"

21

\",\"sort\":1,\"star\":null,\"cover\":\"http://localhost:8081/front/upload/37549fca2a0efb4d0a4c6330bc6ab75.jpg\",\"createTime\":1733931207000,\"tag\":\"\",\"type\":\"视频鉴赏\",\"audit\":2}', 20, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-12 20:28:30'); +INSERT INTO `sys_log_operation` VALUES (1863969089488199704, '修改', '/admin/item/article', 'PUT', '{\"id\":8,\"title\":\"121\",\"path\":null,\"introduction\":\"2121\",\"userId\":1863920777825390593,\"content\":\"

21

\",\"sort\":1,\"star\":null,\"cover\":\"http://localhost:8081/front/upload/37549fca2a0efb4d0a4c6330bc6ab75.jpg\",\"createTime\":1733931207000,\"tag\":\"\",\"type\":\"视频鉴赏\",\"audit\":2}', 9, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-12 20:29:37'); +INSERT INTO `sys_log_operation` VALUES (1863969089488199705, '修改', '/admin/item/article', 'PUT', '{\"id\":8,\"title\":\"121\",\"path\":null,\"introduction\":\"2121\",\"userId\":1863920777825390593,\"content\":\"

21

\",\"sort\":1,\"star\":null,\"cover\":\"http://localhost:8081/front/upload/37549fca2a0efb4d0a4c6330bc6ab75.jpg\",\"createTime\":1733931207000,\"tag\":\"\",\"type\":\"视频鉴赏\",\"audit\":2}', 11, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-12 20:29:50'); +INSERT INTO `sys_log_operation` VALUES (1863969089488199706, '修改', '/admin/item/article', 'PUT', '{\"id\":8,\"title\":\"121\",\"path\":null,\"introduction\":\"2121\",\"userId\":1863920777825390593,\"content\":\"

21

\",\"sort\":1,\"star\":null,\"cover\":\"http://localhost:8081/front/upload/37549fca2a0efb4d0a4c6330bc6ab75.jpg\",\"createTime\":1733931207000,\"tag\":\"\",\"type\":\"视频鉴赏\",\"audit\":2}', 9, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-12 20:30:12'); +INSERT INTO `sys_log_operation` VALUES (1863969089488199707, '修改', '/admin/item/article', 'PUT', '{\"id\":8,\"title\":\"121\",\"path\":null,\"introduction\":\"2121\",\"userId\":1863920777825390593,\"content\":\"

21

\",\"sort\":1,\"star\":null,\"cover\":\"http://localhost:8081/front/upload/37549fca2a0efb4d0a4c6330bc6ab75.jpg\",\"createTime\":1733931207000,\"tag\":\"\",\"type\":\"视频鉴赏\",\"audit\":2}', 14, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-12 20:30:23'); +INSERT INTO `sys_log_operation` VALUES (1863969089488199708, '修改', '/admin/item/article', 'PUT', '{\"id\":8,\"title\":\"121\",\"path\":null,\"introduction\":\"2121\",\"userId\":1863920777825390593,\"content\":\"

21

\",\"sort\":1,\"star\":null,\"cover\":\"http://localhost:8081/front/upload/37549fca2a0efb4d0a4c6330bc6ab75.jpg\",\"createTime\":1733931207000,\"tag\":\"\",\"type\":\"视频鉴赏\",\"audit\":2}', 12, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-12 20:30:34'); +INSERT INTO `sys_log_operation` VALUES (1863969089488199709, '修改', '/admin/item/article', 'PUT', '{\"id\":8,\"title\":\"121\",\"path\":null,\"introduction\":\"2121\",\"userId\":1863920777825390593,\"content\":\"

21

\",\"sort\":1,\"star\":null,\"cover\":\"http://localhost:8081/front/upload/37549fca2a0efb4d0a4c6330bc6ab75.jpg\",\"createTime\":1733931207000,\"tag\":\"\",\"type\":\"视频鉴赏\",\"audit\":2}', 7, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-12 20:30:39'); +INSERT INTO `sys_log_operation` VALUES (1863969089488199710, '修改', '/admin/item/article', 'PUT', '{\"id\":8,\"title\":\"121\",\"path\":null,\"introduction\":\"2121\",\"userId\":1863920777825390593,\"content\":\"

21

\",\"sort\":1,\"star\":null,\"cover\":\"http://localhost:8081/front/upload/37549fca2a0efb4d0a4c6330bc6ab75.jpg\",\"createTime\":1733931207000,\"tag\":\"\",\"type\":\"视频鉴赏\",\"audit\":2}', 12, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-12 20:30:48'); +INSERT INTO `sys_log_operation` VALUES (1863969089488199711, '修改', '/admin/item/article', 'PUT', '{\"id\":8,\"title\":\"121\",\"path\":null,\"introduction\":\"2121\",\"userId\":1863920777825390593,\"content\":\"

21

\",\"sort\":1,\"star\":null,\"cover\":\"http://localhost:8081/front/upload/37549fca2a0efb4d0a4c6330bc6ab75.jpg\",\"createTime\":1733931207000,\"tag\":\"\",\"type\":\"视频鉴赏\",\"audit\":2}', 8, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-12 20:31:12'); +INSERT INTO `sys_log_operation` VALUES (1863969089488199712, '修改', '/admin/item/article', 'PUT', '{\"id\":8,\"title\":\"121\",\"path\":null,\"introduction\":\"2121\",\"userId\":1863920777825390593,\"content\":\"

21

\",\"sort\":1,\"star\":null,\"cover\":\"http://localhost:8081/front/upload/37549fca2a0efb4d0a4c6330bc6ab75.jpg\",\"createTime\":1733931207000,\"tag\":\"\",\"type\":\"视频鉴赏\",\"audit\":2}', 14, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-12 20:31:37'); +INSERT INTO `sys_log_operation` VALUES (1863969089488199713, '修改', '/admin/item/article', 'PUT', '{\"id\":8,\"title\":\"121\",\"path\":null,\"introduction\":\"2121\",\"userId\":1863920777825390593,\"content\":\"

21

\",\"sort\":1,\"star\":null,\"cover\":\"http://localhost:8081/front/upload/37549fca2a0efb4d0a4c6330bc6ab75.jpg\",\"createTime\":1733931207000,\"tag\":\"\",\"type\":\"视频鉴赏\",\"audit\":1}', 10, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-12 20:32:06'); +INSERT INTO `sys_log_operation` VALUES (1863969089488199714, '修改', '/admin/item/article', 'PUT', '{\"id\":8,\"title\":\"121\",\"path\":null,\"introduction\":\"2121\",\"userId\":1863920777825390593,\"content\":\"

21

\",\"sort\":1,\"star\":null,\"cover\":\"http://localhost:8081/front/upload/37549fca2a0efb4d0a4c6330bc6ab75.jpg\",\"createTime\":1733931207000,\"tag\":\"视频\",\"type\":\"视频鉴赏\",\"audit\":1}', 8, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-12 20:32:25'); +INSERT INTO `sys_log_operation` VALUES (1863969089488199715, '保存', '/admin/item/article', 'POST', '{\"id\":9,\"title\":\"壮族织锦技艺\",\"path\":null,\"introduction\":\" 壮锦是我国四大名锦之一,历史极为悠久,壮族先民在汉代织出的“斑布”就是其前身。壮族织锦技艺主要包括壮锦、绣球等编织技术。壮锦的制作,一般是用麻线或棉线染上各种色彩,以原色麻线或棉线为经,以染色麻线或棉线为纬,使用装有支撑系统、传动装置、分综装置和提花装置的竹笼机精编而成。\",\"userId\":null,\"content\":\"

壮锦是我国四大名锦之一,历史极为悠久,壮族先民在汉代织出的“斑布”就是其前身。壮族织锦技艺主要包括壮锦、绣球等编织技术。壮锦的制作,一般是用麻线或棉线染上各种色彩,以原色麻线或棉线为经,以染色麻线或棉线为纬,使用装有支撑系统、传动装置、分综装置和提花装置的竹笼机精编而成。壮锦种类齐全,花纹图案各种各样。其色彩鲜艳对比强烈,菱形几何图纹较多,结构严谨变化丰富,多用于壮锦被面、壮锦床单、壮锦台布、壮锦坐垫、壮锦头巾、壮锦披巾、壮锦背带、壮锦枕巾等品种,旅游纪念品以壮锦壁挂系列为主。壮族织锦艺人对壮锦的颜色搭配要求较严格,直观上要鲜艳生动,而且保持时间要长。一幅壮锦的完成,常常会用十几种颜色组合,由于搭配相得益彰,成品显得色彩斑斓、丰富多变、和谐统一、经久耐看。

  经历了千年的发展,现在的壮锦已经形成了自己的体系,主要有三大类、20品种和50图案,以壮锦艺术为典型代表的广西民族织锦艺术已成为我国传统民间艺术的重要组成部分。反映了广西各族人民对自然的热爱和崇敬对美好生活的向往和珍惜,承载了民族文化记忆。织锦工艺得到广泛发展,很大的一个因素是它是壮族妇女赖以为生的基本技能。织锦工艺代代相传,姑娘们会把师傅传给她的一些基本原理,再加上自己对生活的感受,创作揉合在壮锦里面,使得壮锦不断地发展、补充和升华。现在的织锦技艺已不再需要承载着生存的压力,而是单纯地还原到一种民间工艺的身份,壮锦的意义作为一种民族工艺美术品为人们接受。壮锦的传承延续大都靠言传身授,我们需要保护壮锦艺人巧匠,组织学习壮锦技艺,更好地传承下去。

  壮锦织锦技艺具有丰富的文化内涵和独特的艺术价值,在中国的纺织术上实属宝贵,是研究中国少数民族刺绣不可多得的生动材料,它还为中国乃至世界的纺织史增添活态的例证,对继承和弘扬民族文化,增强民族自尊心起到积极的作用。2006年,作为传统手工技艺的壮锦由广西壮族自治区靖西县申报“国家级非物质文化遗产名录”,成为了首批国家级非物质文化遗产。

\\\"\\\"

\\\"\\\"

\",\"sort\":1,\"star\":null,\"cover\":\"http://localhost:8081/front/upload/2017120517493235169.png\",\"createTime\":null,\"tag\":\"技艺\",\"type\":\"文化鉴赏\",\"audit\":1}', 9, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-12 20:44:07'); +INSERT INTO `sys_log_operation` VALUES (1863969089488199716, '保存', '/admin/item/article', 'POST', '{\"id\":10,\"title\":\"壮族习俗:多彩文化与传统!\",\"path\":null,\"introduction\":\"壮族是中国人口最多的一个少数民族,主要分布在广西壮族自治区。\",\"userId\":null,\"content\":\"

一、歌圩

歌圩是壮族传统的群众集会,主要以唱歌和举办比赛的方式来庆祝。歌圩通常在春季和秋季举行,人们会唱山歌、跳舞、进行体育比赛等。在壮族地区,无论男女老少,都能唱山歌,因此歌圩是壮族人民展示才艺和交流情感的重要平台。在歌圩上,人们还会进行一些特殊的比赛,如壮语演讲比赛、壮族舞蹈比赛等。这些比赛不仅能让人们展示自己的才华,还能传承和弘扬壮族的传统文化。

二、三音壮锦

三音壮锦是壮族的传统音乐形式,由铜鼓、皮鼓和木鱼三种打击乐器演奏而成。三音壮锦的音乐节奏明快,富有激情,是壮族人民喜庆和节日活动的重要元素。在壮族地区,人们会在各种场合演奏三音壮锦,如婚礼、庆典、祭祀等。三音壮锦的演奏形式多样,有时是独奏,有时是合奏,有时还会加入其他乐器进行伴奏。在演奏三音壮锦时,人们会随着音乐的节奏翩翩起舞,场面热烈而欢快。

三、壮族嘹歌

壮族嘹歌是壮族传统的长篇抒情民歌,通常以男女对唱的形式出现。壮族嘹歌的内容广泛,涉及爱情、劳动、生活等方面,是壮族人民生活中不可或缺的一部分。嘹歌的歌词优美,旋律悠扬,演唱时需要运用丰富的声音和情感来表达歌曲的内涵。在壮族地区,人们会在各种场合唱嘹歌,如田间地头、山林里、河边等。唱嘹歌已经成为壮族人民生活中不可或缺的一部分,通过唱嘹歌来表达自己的情感和思想,也成为了壮族文化的重要标志之一。

四、牛魂节

每年四月初八是壮族的牛魂节,也叫“牛王节”。这一天,人们会给牛洗澡,喂它精美的食物,以感激牛的辛勤劳动和对农业生产的贡献。在壮族地区,牛是农业生产中最重要的劳动力之一,因此人们对牛有着深厚的感情。牛魂节的庆祝活动不仅体现了人们对牛的感激之情,也反映了壮族人民对农业生产的重视和对生命的敬畏。在这一天,人们还会举行一些祭祀和祈福的活动,祈求牛的健康和农业的丰收。

五、蛙图腾与蚂节

在壮族的神话和传说中,蛙和蚂分别代表女性的生育和男性的劳动。因此,蛙和蚂在壮族的习俗中具有重要的地位。人们会在特定的时间举行祭祀和庆祝活动,祈求丰收和平安。在壮族地区,蛙和蚂不仅是自然界中的生物,更是人们心中的神灵和图腾。人们认为蛙能够带来雨水,保障农业生产的顺利进行;而蚂则是男性劳动力的象征,代表勤劳和力量。因此,在蛙图腾和蚂节中,人们会举行各种祭祀和庆祝活动,祈求丰收和平安。这些活动不仅体现了壮族人民对自然的敬畏和感恩之情,也反映了他们对劳动和生活的热爱和追求。

六、壮族的建筑风格

壮族的建筑风格独特,以干栏式建筑为主,房屋建在木桩和石基上,离地面较高,可以防潮防湿。在建筑形式上,壮族民居通常采用“一厅两房”的结构,正房设神龛供奉祖先神位,是全家的精神支柱。干栏式建筑是壮族地区特有的建筑形式,其特点是房屋离地面较高,采用木桩和石基作为基础,可以有效地防潮防湿。这种建筑形式不仅适应了壮族地区的气候特点和生活方式,也成为壮族文化的重要标志之一。此外,在壮族的建筑中,通常采用“一厅两房”的结构,正房设有神龛供奉祖先神位,这是全家的精神支柱。这种建筑布局体现了壮族人民对祖先的敬仰和对家族观念的重视。

七、婚俗

壮族传统的婚俗十分独特,有“父母之命媒妁之言”的传统婚姻观念。在婚前,男方要向女方送订婚礼物,如鸡、鸭、猪肉等。结婚时,新郎新娘要穿着传统的民族服装,举行盛大的宴会和庆祝活动。在壮族地区,婚姻是一件非常庄重的事情。传统的婚俗包括提亲、送订婚礼物、结婚等几个步骤。在提亲时,男方会向女方家表达求婚的意愿并送上礼物;在送订婚礼物时,男方会送上鸡、鸭、猪肉等食品作为订婚的信物;

八、食俗

壮族的食物以大米为主,喜欢吃糯米和玉米等杂粮。壮族的菜肴口味偏辣、酸、甜,常见的菜肴有五色糯米饭、糍粑、酸笋鱼等。在壮族地区,人们的主食是大米和糯米,而玉米则是重要的杂粮之一。壮族菜肴的口味偏辣、酸、甜,这种独特的口味是壮族人民在长期的生活和饮食习惯中形成的。其中,五色糯米饭是一种具有代表性的壮族传统食品,它是由糯米加入天然植物色素蒸制而成,色泽鲜艳,味道清香。糍粑则是壮族人民在节日和庆典时制作的食品,以糯米为主料,经过浸泡、蒸熟、捣碎、成型等工序制作而成,口感软糯,味道香甜。酸笋鱼则是壮族的一道特色菜肴,以酸笋和鱼为主要原料,口味酸辣可口。

九、节庆

壮族有许多传统节日,如春节、三月三歌节、中元鬼节、中秋节等。在这些节日里,人们会举行各种庆祝活动,如唱歌、跳舞、赛龙舟等。春节是壮族最重要的传统节日之一,人们会进行祭祀祖先、贴春联、放鞭炮等活动。三月三歌节则是壮族传统的歌圩节日,人们会唱山歌、跳舞、进行体育比赛等。中元鬼节则是祭祀祖先和超度亡魂的节日,人们会举行祭祀活动和放河灯等仪式。中秋节则是团圆和赏月的节日,人们会吃月饼、赏月、团圆聚会等。

总的来说,壮族的习俗文化丰富多彩,涵盖了生活的方方面面。这些习俗和传统文化表现形式不仅是壮族人民生活的重要组成部分,也是中华文化多样性和民族团结的体现。在现代社会中,随着经济的发展和文化的交流,壮族的习俗文化也在不断地发展和创新。我们应该尊重和传承这些宝贵的文化遗产,让它们在新的时代里继续发扬光大。同时,我们也应该通过教育和宣传,提高人们对少数民族文化的认识和了解,促进各民族之间的交流和融合,共同推动中华文化的繁荣和发展。

\",\"sort\":1,\"star\":null,\"cover\":\"http://localhost:8081/front/upload/c995d143ad4bd1132d37cac5955adc0249fb0555.png\",\"createTime\":null,\"tag\":\"传统\",\"type\":\"文化鉴赏\",\"audit\":1}', 10, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-12 20:46:58'); +INSERT INTO `sys_log_operation` VALUES (1863969089488199717, '保存', '/admin/item/article', 'POST', '{\"id\":11,\"title\":\"辣白菜\",\"path\":null,\"introduction\":\"辣白菜是壮族人民非常喜欢的一种泡菜,也是百姓家中餐桌上不可或缺的一道小菜,风味独特,久负盛名。\",\"userId\":null,\"content\":\"

辣白菜是壮族人民非常喜欢的一种泡菜,也是百姓家中餐桌上不可或缺的一道小菜,风味独特,久负盛名。

  辣白菜比一般泡菜或咸菜营养丰富,它能保持多种维生素,因此在朝鲜族人的餐桌上无论丰俭都少不了它。朝鲜泡菜的酱汁,可以补充米饭中缺乏的蛋白质。另外,泡菜中的虾酱、凤尾鱼酱、黄石鱼酱等含有的蛋白质,可分解为氨基酸。蔬菜中含有钙、铜、磷、铁、盐等丰富的无机物,促进维生素C和对以米饭主食的人尤为重要的维生素B的吸收。

\\\"\\\"

辣白菜

  

  其制作方法有三种:

  方法一:

  原料:白菜2公斤、萝卜500克、辣椒面20克、水芹菜5克、辣椒面20克、虾酱20克、梨200克、姜末5克、精盐50克

  制作:

  (1)白菜收拾干净后,大的切一半用10%的盐水腌24小时左右。辣椒面和水以1:1.2的比例搅拌均匀后备用。将萝卜的1/3部分切成丝,剩下的切成两三块。把梨切成大块,把水芹菜切成3厘米长度。

  (2)白菜丝中放入拌匀的辣椒面和白糖、虾酱、蒜、梨、水芹菜、姜、葱、精盐拌匀,做成泡菜调料。

  (3)把腌好的白菜洗净后,白菜叶之间均匀地抹上泡菜调料。在缸里铺上一层萝卜,撒一点精盐,将白菜的切开面向上放,然后放萝卜,这样重复几次,直到填满为止。最后覆一层白菜帮压上石头,三天后倒入辣白菜汤,密封保存。大约三星期后,待辣白菜腌下味以后,切成3~4厘米的段条放到盘子里,然后倒入一点辣白菜汤即可食用。

  方法二:

  原料:卷心菜200克,红辣椒丝25克,姜丝25克,糖1/2碗,醋1/2碗,干辣椒10克,花椒粒10粒,香油2汤匙,油3汤匙

  制法:

  1、将红辣椒丝、姜丝、糖、醋同入一大碗中

  2、卷心菜撕成碎片,放入开水氽烫,捞出冲清水沥干水份,倒入制法1的大碗中腌渍

  3、锅热,放入油及香油烧热,将干辣椒及花椒粒放入锅中炒香,捞出渣,淋入大碗中同腌,入味即可装盘食用。

  注:泡的时间越长越有味,冰过再吃,爽口,开胃,高丽菜,又名甘蓝菜(圆白菜),可生食,熟食,绿叶的较白色的营养丰富

  方法三:

  原料:卷心菜 600克、白糖1大匙、柠檬汁1大匙、盐1/4茶匙、干辣椒丝1/2茶匙、花椒10粒、姜丝少许

  做法:

  1、卷心菜洗净,去老叶剥成块状,用盐腌30分钟后,挤去水分。

  2、锅中放2匙油,爆香花椒粒,捞出,将干辣椒丝炸至红色焦脆时捞出。

  3、把糖、柠檬汁、辣椒丝、姜丝放入高丽菜上,倒入炸好之辣油,30分钟后即可进食

\\\"\\\"

辣白菜

\",\"sort\":1,\"star\":null,\"cover\":\"http://localhost:8081/front/upload/2017122611003541448.png\",\"createTime\":1734007617000,\"tag\":\"美食,文化\",\"type\":\"壮族美食\",\"audit\":1}', 10, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-12 20:49:15'); +INSERT INTO `sys_log_operation` VALUES (1863969089488199718, '修改', '/admin/item/article', 'PUT', '{\"id\":8,\"title\":\"向世界讲述中国故事之「壮族--麽乜」(壮语版)\",\"path\":null,\"introduction\":\"2121\",\"userId\":1863920777825390593,\"content\":\"

向世界讲述中国故事之「壮族--麽乜」(壮语版)

\",\"sort\":1,\"star\":null,\"cover\":\"http://localhost:8081/front/upload/1734007907809.jpg\",\"createTime\":1733931207000,\"tag\":\"视频\",\"type\":\"视频鉴赏\",\"audit\":1}', 12, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-12 20:54:07'); +INSERT INTO `sys_log_operation` VALUES (1863969089488199719, '修改', '/admin/item/article', 'PUT', '{\"id\":8,\"title\":\"向世界讲述中国故事之「壮族--麽乜」(壮语版)\",\"path\":\"http://localhost:8081/front/upload/20241212_205256.mp4\",\"introduction\":\"2121\",\"userId\":1863920777825390593,\"content\":\"

向世界讲述中国故事之「壮族--麽乜」(壮语版)

\",\"sort\":1,\"star\":null,\"cover\":\"http://localhost:8081/front/upload/1734007907809.jpg\",\"createTime\":1733931207000,\"tag\":\"视频\",\"type\":\"视频鉴赏\",\"audit\":1}', 16, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-12 20:58:56'); +INSERT INTO `sys_log_operation` VALUES (1863969089488199720, '保存', '/admin/item/article', 'POST', '{\"id\":12,\"title\":\"壮族神话:千万人口口相传的古老传说\",\"path\":\"http://localhost:8081/front/upload/【阿昌族神话】遮帕麻与遮米麻造天织地,葫芦娃创造九姓部族.mp4\",\"introduction\":\"2121\",\"userId\":1863920777825390593,\"content\":\"

壮族神话:千万人口口相传的古老传说

\",\"sort\":1,\"star\":null,\"cover\":\"http://localhost:8081/front/upload/459eb00f0b4f4b2725d8f06cf30a65ed6c01299c.jpg\",\"createTime\":1733931207000,\"tag\":\"文化,神话\",\"type\":\"视频鉴赏\",\"audit\":1}', 8, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-12 21:03:53'); +INSERT INTO `sys_log_operation` VALUES (1863969089488199721, '保存', '/admin/item/article', 'POST', '{\"id\":13,\"title\":\"1.了不起的中华服饰之壮族\",\"path\":\"http://localhost:8081/front/upload/7.了不起的中华服饰——藏族.mp4\",\"introduction\":\"2121\",\"userId\":1863920777825390593,\"content\":\"

1.了不起的中华服饰之壮族

\",\"sort\":1,\"star\":null,\"cover\":\"http://localhost:8081/front/upload/a7e0eb98992634cd98ab1a8817887a58708afff7.jpg\",\"createTime\":1733931207000,\"tag\":null,\"type\":\"视频鉴赏\",\"audit\":1}', 8, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-12 21:05:29'); +INSERT INTO `sys_log_operation` VALUES (1863969089488199722, '保存', '/admin/item/article', 'POST', '{\"id\":14,\"title\":\"《相约广西》-广西壮族自治区成立60周年宣传片\",\"path\":\"http://localhost:8081/front/upload/《相约广西》-广西壮族自治区成立60周年宣传片.mp4\",\"introduction\":\"2121\",\"userId\":1863920777825390593,\"content\":\"

《相约广西》-广西壮族自治区成立60周年宣传片

\",\"sort\":1,\"star\":null,\"cover\":\"http://localhost:8081/front/upload/eb34cd3b05766b5149376157df7182d1c87aaa91.jpg\",\"createTime\":1733931207000,\"tag\":\"宣传片\",\"type\":\"视频鉴赏\",\"audit\":1}', 7, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-12 21:06:28'); +INSERT INTO `sys_log_operation` VALUES (1863969089488199723, '保存', '/admin/item/article', 'POST', '{\"id\":15,\"title\":\"壮族传统美食五色糯米饭\",\"path\":\"http://localhost:8081/front/upload/壮族传统美食五色糯米饭.mp4\",\"introduction\":\"2121\",\"userId\":1863920777825390593,\"content\":\"

壮族传统美食五色糯米饭

\",\"sort\":1,\"star\":null,\"cover\":\"http://localhost:8081/front/upload/4e62d8053ee4d6318593cabd81046cf2242febd2.jpg\",\"createTime\":1733931207000,\"tag\":\"美食\",\"type\":\"视频鉴赏\",\"audit\":1}', 9, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-12 21:07:32'); +INSERT INTO `sys_log_operation` VALUES (1863969089488199724, '修改', '/admin/sys/menu', 'PUT', '{\"id\":1867219841996353538,\"pid\":0,\"children\":[],\"name\":\"吐槽墙\",\"url\":\"item/wall\",\"menuType\":0,\"icon\":\"icon-desktop\",\"permissions\":null,\"sort\":0,\"createDate\":null,\"parentName\":\"一级菜单\"}', 22, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-12 23:06:43'); +INSERT INTO `sys_log_operation` VALUES (1863969089488199725, '修改', '/admin/sys/menu', 'PUT', '{\"id\":1867219841996353538,\"pid\":0,\"children\":[],\"name\":\"吐槽墙\",\"url\":\"item/wall\",\"menuType\":0,\"icon\":\"icon-desktop\",\"permissions\":null,\"sort\":108,\"createDate\":null,\"parentName\":\"一级菜单\"}', 14, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-12 23:06:54'); +INSERT INTO `sys_log_operation` VALUES (1863969089488199726, '保存', '/admin/item/wall', 'POST', '{\"id\":1867221170365947965,\"content\":\"壮族的传统节庆,气氛特别好,每年都期待!\",\"userId\":1863920777825390593,\"createTime\":1734015192000}', 8, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-12 23:07:37'); +INSERT INTO `sys_log_operation` VALUES (1863969089488199727, '删除', '/admin/item/wall', 'DELETE', '[1867221170365947906]', 212, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-12 23:08:09'); +INSERT INTO `sys_log_operation` VALUES (1863969089488199728, '修改', '/admin/sys/menu', 'PUT', '{\"id\":1867226118034092034,\"pid\":0,\"children\":[],\"name\":\"敏感词\",\"url\":\"item/dict\",\"menuType\":0,\"icon\":\"icon-desktop\",\"permissions\":null,\"sort\":110,\"createDate\":null,\"parentName\":\"一级菜单\"}', 68, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-12 23:16:08'); +INSERT INTO `sys_log_operation` VALUES (1863969089488199729, '删除', '/admin/sys/menu/1067246875800000050', 'DELETE', '1067246875800000050', 7, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-12 23:16:21'); +INSERT INTO `sys_log_operation` VALUES (1863969089488199730, '删除', '/admin/sys/menu/1067246875800000049', 'DELETE', '1067246875800000049', 4, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-12 23:16:23'); +INSERT INTO `sys_log_operation` VALUES (1863969089488199731, '删除', '/admin/sys/menu/1067246875800000048', 'DELETE', '1067246875800000048', 6, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-12 23:16:26'); +INSERT INTO `sys_log_operation` VALUES (1863969089488199732, '删除', '/admin/sys/menu/1067246875800000046', 'DELETE', '1067246875800000046', 4, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-12 23:16:28'); +INSERT INTO `sys_log_operation` VALUES (1863969089488199733, '删除', '/admin/sys/menu/1067246875800000045', 'DELETE', '1067246875800000045', 4, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-12 23:16:46'); +INSERT INTO `sys_log_operation` VALUES (1863969089488199734, '删除', '/admin/sys/menu/1067246875800000044', 'DELETE', '1067246875800000044', 5, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-12 23:16:48'); +INSERT INTO `sys_log_operation` VALUES (1863969089488199735, '删除', '/admin/sys/menu/1067246875800000043', 'DELETE', '1067246875800000043', 5, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-12 23:16:51'); +INSERT INTO `sys_log_operation` VALUES (1863969089488199736, '删除', '/admin/sys/menu/1067246875800000042', 'DELETE', '1067246875800000042', 5, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-12 23:16:54'); +INSERT INTO `sys_log_operation` VALUES (1863969089488199737, '删除', '/admin/sys/menu/1067246875800000041', 'DELETE', '1067246875800000041', 18, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-12 23:16:56'); +INSERT INTO `sys_log_operation` VALUES (1863969089488199738, '删除', '/admin/sys/menu/1067246875800000058', 'DELETE', '1067246875800000058', 4, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-12 23:16:59'); +INSERT INTO `sys_log_operation` VALUES (1863969089488199739, '删除', '/admin/sys/menu/1067246875800000061', 'DELETE', '1067246875800000061', 3, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-12 23:17:01'); +INSERT INTO `sys_log_operation` VALUES (1863969089488199740, '删除', '/admin/sys/menu/1067246875800000060', 'DELETE', '1067246875800000060', 5, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-12 23:17:03'); +INSERT INTO `sys_log_operation` VALUES (1863969089488199741, '删除', '/admin/sys/menu/1067246875800000057', 'DELETE', '1067246875800000057', 6, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-12 23:17:06'); +INSERT INTO `sys_log_operation` VALUES (1863969089488199742, '删除', '/admin/sys/menu/1067246875800000059', 'DELETE', '1067246875800000059', 3, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-12 23:17:08'); +INSERT INTO `sys_log_operation` VALUES (1863969089488199743, '删除', '/admin/sys/menu/1067246875800000040', 'DELETE', '1067246875800000040', 3, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-12 23:17:10'); +INSERT INTO `sys_log_operation` VALUES (1863969089488199744, '修改', '/admin/sys/menu', 'PUT', '{\"id\":1867226118034092034,\"pid\":0,\"children\":[],\"name\":\"敏感词\",\"url\":\"item/dict\",\"menuType\":0,\"icon\":\"icon-expend\",\"permissions\":null,\"sort\":110,\"createDate\":null,\"parentName\":\"一级菜单\"}', 11, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-12 23:17:22'); +INSERT INTO `sys_log_operation` VALUES (1863969089488199745, '修改', '/admin/sys/menu', 'PUT', '{\"id\":1867219841996353538,\"pid\":0,\"children\":[],\"name\":\"吐槽墙\",\"url\":\"item/wall\",\"menuType\":0,\"icon\":\"icon-appstore-fill\",\"permissions\":null,\"sort\":108,\"createDate\":null,\"parentName\":\"一级菜单\"}', 11, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-12 23:17:31'); +INSERT INTO `sys_log_operation` VALUES (1863969089488199746, '保存', '/admin/item/dict', 'POST', '{\"id\":null,\"content\":\"政治\",\"createTime\":null}', 232, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0', '0:0:0:0:0:0:0:1', 0, 'admin', 1067246875800000001, '2024-12-12 23:18:07'); +INSERT INTO `sys_log_operation` VALUES (1863969089488199747, '保存', '/admin/item/dict', 'POST', '{\"id\":null,\"content\":\"政治\",\"createTime\":null}', 7, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0', '0:0:0:0:0:0:0:1', 0, 'admin', 1067246875800000001, '2024-12-12 23:18:21'); +INSERT INTO `sys_log_operation` VALUES (1863969089488199748, '保存', '/admin/item/dict', 'POST', '{\"id\":1,\"content\":\"政治\",\"createTime\":null}', 8, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-12 23:18:31'); +INSERT INTO `sys_log_operation` VALUES (1863969089488199749, '保存', '/admin/item/dict', 'POST', '{\"id\":null,\"content\":\"政治\",\"createTime\":1734016711000}', 29, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-12 23:32:32'); +INSERT INTO `sys_log_operation` VALUES (1863969089488199750, '保存', '/admin/item/dict', 'POST', '{\"id\":null,\"content\":\"色情\",\"createTime\":1734016711000}', 6, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0', '0:0:0:0:0:0:0:1', 1, 'admin', 1067246875800000001, '2024-12-12 23:32:39'); + +-- ---------------------------- +-- Table structure for sys_menu +-- ---------------------------- +DROP TABLE IF EXISTS `sys_menu`; +CREATE TABLE `sys_menu` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', + `pid` bigint(20) NULL DEFAULT NULL COMMENT '上级ID,一级菜单为0', + `name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '名称', + `url` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '菜单URL', + `permissions` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '授权(多个用逗号分隔,如:sys:user:list,sys:user:save)', + `menu_type` tinyint(3) UNSIGNED NULL DEFAULT NULL COMMENT '类型 0:菜单 1:按钮', + `icon` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '菜单图标', + `sort` int(11) NULL DEFAULT NULL COMMENT '排序', + `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建者', + `create_date` datetime NULL DEFAULT NULL COMMENT '创建时间', + `updater` bigint(20) NULL DEFAULT NULL COMMENT '更新者', + `update_date` datetime NULL DEFAULT NULL COMMENT '更新时间', + PRIMARY KEY (`id`) USING BTREE, + INDEX `idx_pid`(`pid`) USING BTREE, + INDEX `idx_sort`(`sort`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1867226118034092040 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '菜单管理' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of sys_menu +-- ---------------------------- +INSERT INTO `sys_menu` VALUES (1067246875800000002, 0, '权限管理', NULL, NULL, 0, 'icon-safetycertificate', 870, 1067246875800000001, '2024-12-03 11:54:34', 1067246875800000001, '2024-12-03 21:36:17'); +INSERT INTO `sys_menu` VALUES (1067246875800000003, 1067246875800000055, '新增', NULL, 'sys:user:save,sys:dept:list,sys:role:list', 1, NULL, 1, 1067246875800000001, '2024-12-03 11:54:34', 1067246875800000001, '2024-12-03 11:54:34'); +INSERT INTO `sys_menu` VALUES (1067246875800000004, 1067246875800000055, '修改', NULL, 'sys:user:update,sys:dept:list,sys:role:list', 1, NULL, 2, 1067246875800000001, '2024-12-03 11:54:34', 1067246875800000001, '2024-12-03 11:54:34'); +INSERT INTO `sys_menu` VALUES (1067246875800000005, 1067246875800000055, '删除', NULL, 'sys:user:delete', 1, NULL, 3, 1067246875800000001, '2024-12-03 11:54:34', 1067246875800000001, '2024-12-03 11:54:34'); +INSERT INTO `sys_menu` VALUES (1067246875800000006, 1067246875800000055, '导出', NULL, 'sys:user:export', 1, NULL, 4, 1067246875800000001, '2024-12-03 11:54:34', 1067246875800000001, '2024-12-03 11:54:34'); +INSERT INTO `sys_menu` VALUES (1067246875800000007, 1067246875800000002, '角色管理', 'sys/role', NULL, 0, 'icon-team', 2, 1067246875800000001, '2024-12-03 11:54:34', 1067246875800000001, '2024-12-03 11:54:34'); +INSERT INTO `sys_menu` VALUES (1067246875800000008, 1067246875800000007, '查看', NULL, 'sys:role:page,sys:role:info', 1, NULL, 0, 1067246875800000001, '2024-12-03 11:54:34', 1067246875800000001, '2024-12-03 11:54:34'); +INSERT INTO `sys_menu` VALUES (1067246875800000009, 1067246875800000007, '新增', NULL, 'sys:role:save,sys:menu:select,sys:dept:list', 1, NULL, 1, 1067246875800000001, '2024-12-03 11:54:34', 1067246875800000001, '2024-12-03 11:54:34'); +INSERT INTO `sys_menu` VALUES (1067246875800000010, 1067246875800000007, '修改', NULL, 'sys:role:update,sys:menu:select,sys:dept:list', 1, NULL, 2, 1067246875800000001, '2024-12-03 11:54:34', 1067246875800000001, '2024-12-03 11:54:34'); +INSERT INTO `sys_menu` VALUES (1067246875800000011, 1067246875800000007, '删除', NULL, 'sys:role:delete', 1, NULL, 3, 1067246875800000001, '2024-12-03 11:54:34', 1067246875800000001, '2024-12-03 11:54:34'); +INSERT INTO `sys_menu` VALUES (1067246875800000012, 1067246875800000002, '部门管理', 'sys/dept', NULL, 0, 'icon-apartment', 1, 1067246875800000001, '2024-12-03 11:54:34', 1067246875800000001, '2024-12-03 11:54:34'); +INSERT INTO `sys_menu` VALUES (1067246875800000014, 1067246875800000012, '查看', NULL, 'sys:dept:list,sys:dept:info', 1, NULL, 0, 1067246875800000001, '2024-12-03 11:54:34', 1067246875800000001, '2024-12-03 11:54:34'); +INSERT INTO `sys_menu` VALUES (1067246875800000015, 1067246875800000012, '新增', NULL, 'sys:dept:save', 1, NULL, 1, 1067246875800000001, '2024-12-03 11:54:34', 1067246875800000001, '2024-12-03 11:54:34'); +INSERT INTO `sys_menu` VALUES (1067246875800000016, 1067246875800000012, '修改', NULL, 'sys:dept:update', 1, NULL, 2, 1067246875800000001, '2024-12-03 11:54:34', 1067246875800000001, '2024-12-03 11:54:34'); +INSERT INTO `sys_menu` VALUES (1067246875800000017, 1067246875800000012, '删除', NULL, 'sys:dept:delete', 1, NULL, 3, 1067246875800000001, '2024-12-03 11:54:34', 1067246875800000001, '2024-12-03 11:54:34'); +INSERT INTO `sys_menu` VALUES (1067246875800000025, 1067246875800000035, '菜单管理', 'sys/menu', NULL, 0, 'icon-unorderedlist', 0, 1067246875800000001, '2024-12-03 11:54:34', 1067246875800000001, '2024-12-03 11:54:34'); +INSERT INTO `sys_menu` VALUES (1067246875800000026, 1067246875800000025, '查看', NULL, 'sys:menu:list,sys:menu:info', 1, NULL, 0, 1067246875800000001, '2024-12-03 11:54:34', 1067246875800000001, '2024-12-03 11:54:34'); +INSERT INTO `sys_menu` VALUES (1067246875800000027, 1067246875800000025, '新增', NULL, 'sys:menu:save', 1, NULL, 1, 1067246875800000001, '2024-12-03 11:54:34', 1067246875800000001, '2024-12-03 11:54:34'); +INSERT INTO `sys_menu` VALUES (1067246875800000028, 1067246875800000025, '修改', NULL, 'sys:menu:update', 1, NULL, 2, 1067246875800000001, '2024-12-03 11:54:34', 1067246875800000001, '2024-12-03 11:54:34'); +INSERT INTO `sys_menu` VALUES (1067246875800000029, 1067246875800000025, '删除', NULL, 'sys:menu:delete', 1, NULL, 3, 1067246875800000001, '2024-12-03 11:54:34', 1067246875800000001, '2024-12-03 11:54:34'); +INSERT INTO `sys_menu` VALUES (1067246875800000035, 0, '系统设置', NULL, NULL, 0, 'icon-setting', 880, 1067246875800000001, '2024-12-03 11:54:34', 1067246875800000001, '2024-12-03 21:36:04'); +INSERT INTO `sys_menu` VALUES (1067246875800000036, 1067246875800000030, '暂停', NULL, 'sys:schedule:pause', 1, NULL, 4, 1067246875800000001, '2024-12-03 11:54:34', 1067246875800000001, '2024-12-03 11:54:34'); +INSERT INTO `sys_menu` VALUES (1067246875800000037, 1067246875800000030, '恢复', NULL, 'sys:schedule:resume', 1, NULL, 5, 1067246875800000001, '2024-12-03 11:54:34', 1067246875800000001, '2024-12-03 11:54:34'); +INSERT INTO `sys_menu` VALUES (1067246875800000038, 1067246875800000030, '立即执行', NULL, 'sys:schedule:run', 1, NULL, 6, 1067246875800000001, '2024-12-03 11:54:34', 1067246875800000001, '2024-12-03 11:54:34'); +INSERT INTO `sys_menu` VALUES (1067246875800000039, 1067246875800000030, '日志列表', NULL, 'sys:schedule:log', 1, NULL, 7, 1067246875800000001, '2024-12-03 11:54:34', 1067246875800000001, '2024-12-03 11:54:34'); +INSERT INTO `sys_menu` VALUES (1067246875800000055, 1067246875800000002, '用户管理', 'sys/user', NULL, 0, 'icon-user', 0, 1067246875800000001, '2024-12-03 11:54:34', 1067246875800000001, '2024-12-03 11:54:34'); +INSERT INTO `sys_menu` VALUES (1067246875800000056, 1067246875800000055, '查看', NULL, 'sys:user:page,sys:user:info', 1, NULL, 0, 1067246875800000001, '2024-12-03 11:54:34', 1067246875800000001, '2024-12-03 11:54:34'); +INSERT INTO `sys_menu` VALUES (1863937571759878146, 0, '轮播管理', 'item/slides', NULL, 0, 'icon-desktop', 100, 1067246875800000001, '2024-12-03 13:26:46', 1067246875800000001, '2024-12-03 21:36:11'); +INSERT INTO `sys_menu` VALUES (1863937571759878147, 1863937571759878146, '查看', NULL, 'item:slides:page,item:slides:info', 1, NULL, 0, 1067246875800000001, '2024-12-03 13:26:46', 1067246875800000001, '2024-12-03 13:26:46'); +INSERT INTO `sys_menu` VALUES (1863937571759878148, 1863937571759878146, '新增', NULL, 'item:slides:save', 1, NULL, 1, 1067246875800000001, '2024-12-03 13:26:46', 1067246875800000001, '2024-12-03 13:26:46'); +INSERT INTO `sys_menu` VALUES (1863937571759878149, 1863937571759878146, '修改', NULL, 'item:slides:update', 1, NULL, 2, 1067246875800000001, '2024-12-03 13:26:46', 1067246875800000001, '2024-12-03 13:26:46'); +INSERT INTO `sys_menu` VALUES (1863937571759878150, 1863937571759878146, '删除', NULL, 'item:slides:delete', 1, NULL, 3, 1067246875800000001, '2024-12-03 13:26:46', 1067246875800000001, '2024-12-03 13:26:46'); +INSERT INTO `sys_menu` VALUES (1863937571759878151, 1863937571759878146, '导出', NULL, 'item:slides:export', 1, NULL, 4, 1067246875800000001, '2024-12-03 13:26:46', 1067246875800000001, '2024-12-03 13:26:46'); +INSERT INTO `sys_menu` VALUES (1863937572162531329, 1863940095447416834, '文章管理', 'item/article', NULL, 0, 'icon-desktop', 0, 1067246875800000001, '2024-12-03 13:26:28', 1067246875800000001, '2024-12-03 21:35:38'); +INSERT INTO `sys_menu` VALUES (1863937572162531330, 1863937572162531329, '查看', NULL, 'item:article:page,item:article:info', 1, NULL, 0, 1067246875800000001, '2024-12-03 13:26:28', 1067246875800000001, '2024-12-03 13:26:28'); +INSERT INTO `sys_menu` VALUES (1863937572162531331, 1863937572162531329, '新增', NULL, 'item:article:save', 1, NULL, 1, 1067246875800000001, '2024-12-03 13:26:28', 1067246875800000001, '2024-12-03 13:26:28'); +INSERT INTO `sys_menu` VALUES (1863937572162531332, 1863937572162531329, '修改', NULL, 'item:article:update', 1, NULL, 2, 1067246875800000001, '2024-12-03 13:26:28', 1067246875800000001, '2024-12-03 13:26:28'); +INSERT INTO `sys_menu` VALUES (1863937572162531333, 1863937572162531329, '删除', NULL, 'item:article:delete', 1, NULL, 3, 1067246875800000001, '2024-12-03 13:26:28', 1067246875800000001, '2024-12-03 13:26:28'); +INSERT INTO `sys_menu` VALUES (1863937572162531334, 1863937572162531329, '导出', NULL, 'item:article:export', 1, NULL, 4, 1067246875800000001, '2024-12-03 13:26:28', 1067246875800000001, '2024-12-03 13:26:28'); +INSERT INTO `sys_menu` VALUES (1863940095447416834, 0, '文章', '', '', 0, 'icon-layout-fill', 105, 1067246875800000001, '2024-12-03 21:35:24', 1067246875800000001, '2024-12-03 21:36:26'); +INSERT INTO `sys_menu` VALUES (1863940095447416835, 1863940095447416834, '视频鉴赏', 'item/video', '', 0, '', 0, 1067246875800000001, '2024-12-10 22:10:59', 1067246875800000001, '2024-12-10 22:10:59'); +INSERT INTO `sys_menu` VALUES (1863940095447416836, 1863940095447416835, '查看', NULL, 'item:article:page,item:article:info', 1, NULL, 0, 1067246875800000001, '2024-12-10 22:11:17', 1067246875800000001, '2024-12-10 22:11:17'); +INSERT INTO `sys_menu` VALUES (1863940095447416837, 1863940095447416835, '新增', NULL, 'item:article:save', 1, NULL, 0, 1067246875800000001, '2024-12-10 22:11:27', 1067246875800000001, '2024-12-10 22:11:27'); +INSERT INTO `sys_menu` VALUES (1863940095447416838, 1863940095447416835, '修改', NULL, 'item:article:update', 1, NULL, 0, 1067246875800000001, '2024-12-10 22:11:37', 1067246875800000001, '2024-12-10 22:11:37'); +INSERT INTO `sys_menu` VALUES (1863940095447416839, 1863940095447416835, '删除', NULL, 'item:article:delete', 1, NULL, 0, 1067246875800000001, '2024-12-10 22:11:47', 1067246875800000001, '2024-12-10 22:11:47'); +INSERT INTO `sys_menu` VALUES (1867219841996353538, 0, '吐槽墙', 'item/wall', NULL, 0, 'icon-appstore-fill', 108, 1067246875800000001, '2024-12-12 23:04:55', 1067246875800000001, '2024-12-12 23:17:31'); +INSERT INTO `sys_menu` VALUES (1867219841996353539, 1867219841996353538, '查看', NULL, 'item:wall:page,item:wall:info', 1, NULL, 0, 1067246875800000001, '2024-12-12 23:04:55', 1067246875800000001, '2024-12-12 23:04:55'); +INSERT INTO `sys_menu` VALUES (1867219841996353540, 1867219841996353538, '新增', NULL, 'item:wall:save', 1, NULL, 1, 1067246875800000001, '2024-12-12 23:04:55', 1067246875800000001, '2024-12-12 23:04:55'); +INSERT INTO `sys_menu` VALUES (1867219841996353541, 1867219841996353538, '修改', NULL, 'item:wall:update', 1, NULL, 2, 1067246875800000001, '2024-12-12 23:04:55', 1067246875800000001, '2024-12-12 23:04:55'); +INSERT INTO `sys_menu` VALUES (1867219841996353542, 1867219841996353538, '删除', NULL, 'item:wall:delete', 1, NULL, 3, 1067246875800000001, '2024-12-12 23:04:55', 1067246875800000001, '2024-12-12 23:04:55'); +INSERT INTO `sys_menu` VALUES (1867219841996353543, 1867219841996353538, '导出', NULL, 'item:wall:export', 1, NULL, 4, 1067246875800000001, '2024-12-12 23:04:55', 1067246875800000001, '2024-12-12 23:04:55'); +INSERT INTO `sys_menu` VALUES (1867226118034092034, 0, '敏感词', 'item/dict', NULL, 0, 'icon-expend', 110, 1067246875800000001, '2024-12-12 23:13:41', 1067246875800000001, '2024-12-12 23:17:22'); +INSERT INTO `sys_menu` VALUES (1867226118034092035, 1867226118034092034, '查看', NULL, 'item:dict:page,item:dict:info', 1, NULL, 0, 1067246875800000001, '2024-12-12 23:13:41', 1067246875800000001, '2024-12-12 23:13:41'); +INSERT INTO `sys_menu` VALUES (1867226118034092036, 1867226118034092034, '新增', NULL, 'item:dict:save', 1, NULL, 1, 1067246875800000001, '2024-12-12 23:13:41', 1067246875800000001, '2024-12-12 23:13:41'); +INSERT INTO `sys_menu` VALUES (1867226118034092037, 1867226118034092034, '修改', NULL, 'item:dict:update', 1, NULL, 2, 1067246875800000001, '2024-12-12 23:13:41', 1067246875800000001, '2024-12-12 23:13:41'); +INSERT INTO `sys_menu` VALUES (1867226118034092038, 1867226118034092034, '删除', NULL, 'item:dict:delete', 1, NULL, 3, 1067246875800000001, '2024-12-12 23:13:41', 1067246875800000001, '2024-12-12 23:13:41'); +INSERT INTO `sys_menu` VALUES (1867226118034092039, 1867226118034092034, '导出', NULL, 'item:dict:export', 1, NULL, 4, 1067246875800000001, '2024-12-12 23:13:41', 1067246875800000001, '2024-12-12 23:13:41'); + +-- ---------------------------- +-- Table structure for sys_params +-- ---------------------------- +DROP TABLE IF EXISTS `sys_params`; +CREATE TABLE `sys_params` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', + `param_code` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '参数编码', + `param_value` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '参数值', + `param_type` tinyint(3) UNSIGNED NULL DEFAULT 1 COMMENT '类型 0:系统参数 1:非系统参数', + `remark` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', + `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建者', + `create_date` datetime NULL DEFAULT NULL COMMENT '创建时间', + `updater` bigint(20) NULL DEFAULT NULL COMMENT '更新者', + `update_date` datetime NULL DEFAULT NULL COMMENT '更新时间', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `uk_param_code`(`param_code`) USING BTREE, + INDEX `idx_create_date`(`create_date`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1067246875800000074 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '参数管理' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of sys_params +-- ---------------------------- +INSERT INTO `sys_params` VALUES (1067246875800000073, 'CLOUD_STORAGE_CONFIG_KEY', '{\"type\":1,\"qiniuDomain\":\"http://test.oss.renren.io\",\"qiniuPrefix\":\"upload\",\"qiniuAccessKey\":\"NrgMfABZxWLo5B-YYSjoE8-AZ1EISdi1Z3ubLOeZ\",\"qiniuSecretKey\":\"uIwJHevMRWU0VLxFvgy0tAcOdGqasdtVlJkdy6vV\",\"qiniuBucketName\":\"renren-oss\",\"aliyunDomain\":\"\",\"aliyunPrefix\":\"\",\"aliyunEndPoint\":\"\",\"aliyunAccessKeyId\":\"\",\"aliyunAccessKeySecret\":\"\",\"aliyunBucketName\":\"\",\"qcloudDomain\":\"\",\"qcloudPrefix\":\"\",\"qcloudSecretId\":\"\",\"qcloudSecretKey\":\"\",\"qcloudBucketName\":\"\"}', 0, '云存储配置信息', 1067246875800000001, '2024-12-03 11:54:34', 1067246875800000001, '2024-12-03 11:54:34'); + +-- ---------------------------- +-- Table structure for sys_role +-- ---------------------------- +DROP TABLE IF EXISTS `sys_role`; +CREATE TABLE `sys_role` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '角色名称', + `remark` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', + `dept_id` bigint(20) NULL DEFAULT NULL COMMENT '部门ID', + `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建者', + `create_date` datetime NULL DEFAULT NULL COMMENT '创建时间', + `updater` bigint(20) NULL DEFAULT NULL COMMENT '更新者', + `update_date` datetime NULL DEFAULT NULL COMMENT '更新时间', + PRIMARY KEY (`id`) USING BTREE, + INDEX `idx_dept_id`(`dept_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '角色管理' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of sys_role +-- ---------------------------- + +-- ---------------------------- +-- Table structure for sys_role_data_scope +-- ---------------------------- +DROP TABLE IF EXISTS `sys_role_data_scope`; +CREATE TABLE `sys_role_data_scope` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', + `role_id` bigint(20) NULL DEFAULT NULL COMMENT '角色ID', + `dept_id` bigint(20) NULL DEFAULT NULL COMMENT '部门ID', + `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建者', + `create_date` datetime NULL DEFAULT NULL COMMENT '创建时间', + PRIMARY KEY (`id`) USING BTREE, + INDEX `idx_role_id`(`role_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '角色数据权限' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of sys_role_data_scope +-- ---------------------------- + +-- ---------------------------- +-- Table structure for sys_role_menu +-- ---------------------------- +DROP TABLE IF EXISTS `sys_role_menu`; +CREATE TABLE `sys_role_menu` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', + `role_id` bigint(20) NULL DEFAULT NULL COMMENT '角色ID', + `menu_id` bigint(20) NULL DEFAULT NULL COMMENT '菜单ID', + `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建者', + `create_date` datetime NULL DEFAULT NULL COMMENT '创建时间', + PRIMARY KEY (`id`) USING BTREE, + INDEX `idx_role_id`(`role_id`) USING BTREE, + INDEX `idx_menu_id`(`menu_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '角色菜单关系' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of sys_role_menu +-- ---------------------------- + +-- ---------------------------- +-- Table structure for sys_role_user +-- ---------------------------- +DROP TABLE IF EXISTS `sys_role_user`; +CREATE TABLE `sys_role_user` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', + `role_id` bigint(20) NULL DEFAULT NULL COMMENT '角色ID', + `user_id` bigint(20) NULL DEFAULT NULL COMMENT '用户ID', + `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建者', + `create_date` datetime NULL DEFAULT NULL COMMENT '创建时间', + PRIMARY KEY (`id`) USING BTREE, + INDEX `idx_role_id`(`role_id`) USING BTREE, + INDEX `idx_user_id`(`user_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '角色用户关系' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of sys_role_user +-- ---------------------------- + +-- ---------------------------- +-- Table structure for sys_user +-- ---------------------------- +DROP TABLE IF EXISTS `sys_user`; +CREATE TABLE `sys_user` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', + `username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户名', + `password` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '密码', + `real_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '姓名', + `head_url` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '头像', + `gender` tinyint(3) UNSIGNED NULL DEFAULT NULL COMMENT '性别 0:男 1:女 2:保密', + `email` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '邮箱', + `mobile` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '手机号', + `dept_id` bigint(20) NULL DEFAULT NULL COMMENT '部门ID', + `super_admin` tinyint(3) UNSIGNED NULL DEFAULT NULL COMMENT '超级管理员 0:否 1:是', + `status` tinyint(4) NULL DEFAULT NULL COMMENT '状态 0:停用 1:正常', + `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建者', + `create_date` datetime NULL DEFAULT NULL COMMENT '创建时间', + `updater` bigint(20) NULL DEFAULT NULL COMMENT '更新者', + `update_date` datetime NULL DEFAULT NULL COMMENT '更新时间', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `uk_username`(`username`) USING BTREE, + INDEX `idx_create_date`(`create_date`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1067246875800000002 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '系统用户' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of sys_user +-- ---------------------------- +INSERT INTO `sys_user` VALUES (1067246875800000001, 'admin', '$2a$10$o1Pzp8hYhwmTQgH0k7dTeuEie3aRHjlnG778N./258ZF8Fd7RxFlW', '管理员', NULL, 0, 'root@renren.io', '13612345678', NULL, 1, 1, 1067246875800000001, '2024-12-03 11:54:34', 1067246875800000001, '2024-12-03 11:54:34'); + +-- ---------------------------- +-- Table structure for sys_user_token +-- ---------------------------- +DROP TABLE IF EXISTS `sys_user_token`; +CREATE TABLE `sys_user_token` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', + `user_id` bigint(20) NOT NULL COMMENT '用户id', + `token` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户token', + `expire_date` datetime NULL DEFAULT NULL COMMENT '过期时间', + `update_date` datetime NULL DEFAULT NULL COMMENT '更新时间', + `create_date` datetime NULL DEFAULT NULL COMMENT '创建时间', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `user_id`(`user_id`) USING BTREE, + UNIQUE INDEX `token`(`token`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1863925300941840386 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '系统用户Token' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of sys_user_token +-- ---------------------------- +INSERT INTO `sys_user_token` VALUES (1863925300941840385, 1067246875800000001, '1229140856bcc8c41a38090478d95fff', '2025-03-25 04:53:47', '2025-03-24 16:53:47', '2024-12-03 20:36:36'); + +-- ---------------------------- +-- Table structure for tb_certificate_applications +-- ---------------------------- +DROP TABLE IF EXISTS `tb_certificate_applications`; +CREATE TABLE `tb_certificate_applications` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '编号', + `user_id` bigint(20) NULL DEFAULT NULL COMMENT '用户ID', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '申请提交时间', + `audit_status` tinyint(1) NOT NULL DEFAULT 0 COMMENT '值为0表示待审核,1表示审核通过,2表示审核拒绝', + `audit_time` datetime NULL DEFAULT NULL COMMENT '审核时间', + `audit_comments` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '审核备注', + `cert_id` bigint(20) NULL DEFAULT NULL COMMENT '证书编号', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '敏感词' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of tb_certificate_applications +-- ---------------------------- +INSERT INTO `tb_certificate_applications` VALUES (4, 1893836584118173697, '2025-03-24 08:44:02', 1, '2025-03-24 16:44:02', '通过', 1); +INSERT INTO `tb_certificate_applications` VALUES (6, 1893836584118173697, '2025-03-24 08:54:08', 1, '2025-03-24 16:54:08', '通过', 2); + +-- ---------------------------- +-- Table structure for tb_certificates +-- ---------------------------- +DROP TABLE IF EXISTS `tb_certificates`; +CREATE TABLE `tb_certificates` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '编号', + `certificate_number` bigint(20) NULL DEFAULT NULL COMMENT '证书编号', + `user_id` bigint(20) NULL DEFAULT NULL COMMENT '用户 ID', + `issue_date` datetime NULL DEFAULT NULL COMMENT '签发日期', + `expire_date` datetime NULL DEFAULT NULL COMMENT '过期日期', + `certificate_data` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL COMMENT '详情', + `blockchain_tx_id` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '区块链交易 ID', + `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '1:有效\n\n0:撤销\n\n2:过期\n默认状态为有效(1)。', + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `img` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, + `is_block` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否上链', + `audit_status` tinyint(1) NOT NULL DEFAULT 0 COMMENT '值为0表示待审核,1表示审核通过,2表示审核拒绝', + `audit_comments` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '审核备注', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 11 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of tb_certificates +-- ---------------------------- +INSERT INTO `tb_certificates` VALUES (1, 110110, 1863920777825390593, '2025-03-21 00:00:00', '2025-02-27 00:00:00', '证书', '', 1, '2025-03-24 02:13:52', 'upload/46ec4155-4519-4740-baba-228dae38940c.jpg', 0, 0, NULL); +INSERT INTO `tb_certificates` VALUES (2, 110111, 1893836584118174806, '2025-03-27 00:00:00', '2025-03-07 00:03:00', '证书', '', 1, '2025-03-24 04:33:36', 'upload/46ec4155-4519-4740-baba-228dae38940c.jpg', 1, 1, NULL); +INSERT INTO `tb_certificates` VALUES (6, 110112, 1893836584118173697, '2025-03-14 00:00:00', '2025-03-14 00:00:00', '证书', '0x9f1d6d445a6d4953a6531956a0c3a994d2c8d446d7ab322b86c3d6d8b83ff1a1', 1, '2025-03-24 05:39:00', 'upload/46ec4155-4519-4740-baba-228dae38940c.jpg', 1, 1, NULL); +INSERT INTO `tb_certificates` VALUES (7, 110113, 1893836584118173697, '2025-03-14 00:00:00', '2025-03-14 00:00:00', '证书', NULL, 1, '2025-03-24 05:39:22', 'upload/46ec4155-4519-4740-baba-228dae38940c.jpg', 0, 0, NULL); +INSERT INTO `tb_certificates` VALUES (8, 110114, 1893836584118173697, '2025-03-25 00:00:00', '2025-03-11 00:00:00', '证书', NULL, 1, '2025-03-24 06:14:23', 'upload/46ec4155-4519-4740-baba-228dae38940c.jpg', 0, 2, '证书污染'); +INSERT INTO `tb_certificates` VALUES (9, 5412, 1893836584118173697, '2025-02-27 00:01:00', '2025-03-12 12:00:00', '证书测试', NULL, 1, '2025-03-24 06:39:53', 'upload/46ec4155-4519-4740-baba-228dae38940c.jpg', 0, 1, NULL); +INSERT INTO `tb_certificates` VALUES (10, 5678, 1893836584118173697, '2025-03-14 09:00:00', '2027-03-11 09:00:00', '体育证书', NULL, 1, '2025-03-24 08:52:58', '', 0, 0, NULL); + +-- ---------------------------- +-- Table structure for tb_comment +-- ---------------------------- +DROP TABLE IF EXISTS `tb_comment`; +CREATE TABLE `tb_comment` ( + `id` bigint(20) NOT NULL COMMENT '编号', + `user_id` bigint(20) NULL DEFAULT NULL COMMENT '患者编号', + `doctors_id` bigint(20) NULL DEFAULT NULL COMMENT '医生编号', + `content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL COMMENT '内容', + `item_id` bigint(20) NULL DEFAULT NULL COMMENT '关联编号', + `score` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '评分', + `type` int(1) NULL DEFAULT NULL COMMENT '0在线问答', + `sender_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '类型', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '评论表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of tb_comment +-- ---------------------------- +INSERT INTO `tb_comment` VALUES (1891762466988466178, 1863920777825390593, 1, '您好', NULL, 'A', 0, 'patient', '2025-02-21 14:02:39'); +INSERT INTO `tb_comment` VALUES (1891762466988466179, 1863920777825390593, 1, '您好,我需要一些帮助。', NULL, 'A', 0, 'patient', '2025-02-21 14:02:50'); +INSERT INTO `tb_comment` VALUES (1891762466988466180, 1888931423629377538, 1, '医生,我今天感觉有些不舒服。', NULL, 'A', 0, 'patient', '2025-02-21 14:02:51'); +INSERT INTO `tb_comment` VALUES (1891762466988466181, 1863920777825390593, 2, '感谢医生的帮助,已经好转了!', NULL, 'A', 1, 'patient', '2025-02-21 14:02:54'); +INSERT INTO `tb_comment` VALUES (1891762466988466182, 1888931423629377538, 3, '能否帮我预约下周的检查?', NULL, 'A', 0, 'doctor', '2025-02-21 14:03:34'); +INSERT INTO `tb_comment` VALUES (1891762466988466183, 1863920777825390593, 1, '昨天的检查结果需要多关注一点。', NULL, 'B', 0, 'doctor', '2025-02-21 14:03:34'); +INSERT INTO `tb_comment` VALUES (1891762466988466184, 1888931423629377538, 1, '我很满意这次的治疗,谢谢医生!', NULL, 'A', 1, 'patient', '2025-02-21 14:03:02'); +INSERT INTO `tb_comment` VALUES (1891762466988466185, 1863920777825390593, 2, '麻烦医生提供一些关于我的病历信息。', NULL, 'B', 0, 'patient', '2025-02-21 14:03:05'); +INSERT INTO `tb_comment` VALUES (1891762466988466186, 1888931423629377538, 1, '我的病情有些反复,需要再次诊断。', NULL, 'A', 0, 'patient', '2025-02-21 14:03:07'); +INSERT INTO `tb_comment` VALUES (1891762466988466187, 1863920777825390593, 1, '今天感觉好些了,感谢治疗!', NULL, 'A', 1, 'patient', '2025-02-21 14:03:08'); +INSERT INTO `tb_comment` VALUES (1891762466988466188, 1888931423629377538, 3, '医生,能告诉我这个药物的副作用吗?', NULL, 'B', 0, 'patient', '2025-02-21 14:03:12'); +INSERT INTO `tb_comment` VALUES (1891762466988466189, 1863920777825390593, 2, '希望能增加复诊次数,我感到有些不安。', NULL, 'A', 0, 'patient', '2025-02-21 14:03:14'); +INSERT INTO `tb_comment` VALUES (1891762466988466190, 1888931423629377538, 1, '下次检查是否可以选择其他的检查项目?', NULL, 'A', 0, 'patient', '2025-02-21 14:03:15'); +INSERT INTO `tb_comment` VALUES (1891762466988466191, 1863920777825390593, 1, '再次感谢医生的耐心讲解。', NULL, 'A', 1, 'patient', '2025-02-21 14:03:18'); +INSERT INTO `tb_comment` VALUES (1891762466988466192, 1888931423629377538, 2, '希望能了解更多关于治疗方案的信息。', NULL, 'B', 0, 'patient', '2025-02-21 14:03:19'); +INSERT INTO `tb_comment` VALUES (1891762466988466193, 1863920777825390593, 3, '我的症状已经缓解很多,谢谢!', NULL, 'A', 1, 'patient', '2025-02-21 14:03:22'); +INSERT INTO `tb_comment` VALUES (1891762466988466194, 1888931423629377538, 1, '是否需要进行后续的检查呢?', NULL, 'A', 0, 'patient', '2025-03-20 07:38:57'); +INSERT INTO `tb_comment` VALUES (1891762466988466195, 1863920777825390593, 2, '我最近的身体情况越来越好,谢谢医生!', NULL, 'A', 1, 'patient', '2025-02-21 14:03:24'); +INSERT INTO `tb_comment` VALUES (1891762466988466196, 1888931423629377538, 3, '我的症状一直没缓解,能再咨询一下吗?', NULL, 'B', 0, 'patient', '2025-02-21 14:03:25'); +INSERT INTO `tb_comment` VALUES (1891762466988466197, 1863920777825390593, 1, '谢谢医生一直以来的照顾。', NULL, 'A', 1, 'patient', '2025-02-21 14:03:28'); +INSERT INTO `tb_comment` VALUES (1891762466988466198, 1888931423629377538, 2, '我有些不确定现在是否需要调整药量。', NULL, 'B', 0, 'patient', '2025-02-21 14:03:28'); +INSERT INTO `tb_comment` VALUES (1891762758538649601, 1863920777825390593, 1, '还在吗', NULL, 'B', 0, 'patient', '2025-02-21 14:03:29'); +INSERT INTO `tb_comment` VALUES (1891763007885930497, 1863920777825390593, 1, '?', NULL, 'B', 0, 'patient', '2025-02-21 14:03:33'); +INSERT INTO `tb_comment` VALUES (1902618612896673794, 1893836584118173697, 1, '在吗医生', NULL, 'B', 0, 'patient', '2025-03-20 15:09:59'); + +-- ---------------------------- +-- Table structure for tb_departments +-- ---------------------------- +DROP TABLE IF EXISTS `tb_departments`; +CREATE TABLE `tb_departments` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '科室编号', + `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '科室名称', + `description` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '科室描述', + `location` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '科室位置', + `phone` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '科室联系电话', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 11 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '科室管理表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of tb_departments +-- ---------------------------- +INSERT INTO `tb_departments` VALUES (1, '内科', '负责内科疾病的诊断和治疗', '一楼', '010-12345678', '2025-03-03 10:00:00'); +INSERT INTO `tb_departments` VALUES (2, '外科', '负责外科手术和治疗', '二楼', '010-23456789', '2025-03-03 11:00:00'); +INSERT INTO `tb_departments` VALUES (3, '儿科', '专注于儿童疾病诊断与治疗', '三楼', '010-34567890', '2025-03-03 12:00:00'); +INSERT INTO `tb_departments` VALUES (4, '妇科', '提供妇科相关医疗服务', '一楼', '010-45678901', '2025-03-03 13:00:00'); +INSERT INTO `tb_departments` VALUES (5, '眼科', '专门进行眼科检查和手术', '二楼', '010-56789012', '2025-03-03 14:00:00'); +INSERT INTO `tb_departments` VALUES (6, '耳鼻喉科', '诊治耳鼻喉疾病', '三楼', '010-67890123', '2025-03-03 15:00:00'); +INSERT INTO `tb_departments` VALUES (7, '口腔科', '提供口腔医疗服务', '一楼', '010-78901234', '2025-03-03 16:00:00'); +INSERT INTO `tb_departments` VALUES (8, '皮肤科', '处理各类皮肤病症', '二楼', '010-89012345', '2025-03-03 17:00:00'); +INSERT INTO `tb_departments` VALUES (9, '肿瘤科', '进行肿瘤相关检查与治疗', '三楼', '010-90123456', '2025-03-03 18:00:00'); +INSERT INTO `tb_departments` VALUES (10, '急诊科', '处理急诊情况', '一楼', '010-01234567', '2025-03-03 19:00:00'); + +-- ---------------------------- +-- Table structure for tb_doctors +-- ---------------------------- +DROP TABLE IF EXISTS `tb_doctors`; +CREATE TABLE `tb_doctors` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '编号', + `user_name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '用户名', + `nick_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '姓名', + `years_experience` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '工作经验', + `graduation_school` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '毕业学校', + `phone` bigint(20) NULL DEFAULT NULL COMMENT '联系电话', + `sex` int(1) NULL DEFAULT NULL COMMENT '性别', + `specialty` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '专业领域', + `img` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '医生图片', + `intro` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL COMMENT '简介', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `position` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '职称', + `reviews` int(10) NULL DEFAULT NULL COMMENT '评价数量', + `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '密码', + `audit` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否审核 0 无 1 是2 不通过', + `aptitude` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '资质', + `total_amount` double(10, 2) NULL DEFAULT NULL COMMENT '挂号费用', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '医生表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of tb_doctors +-- ---------------------------- +INSERT INTO `tb_doctors` VALUES (1, '孟召伟', '1101', '10', '南京大学', 13355224488, 1, '心理咨询', 'upload/qoYBAFL2RfyAII16AAI3GWnVwog375_200_200_1.jpg', '国家二级心理咨询师,婚姻家庭咨询师,家庭教育指导师,婚恋专家,个人成长', '2025-03-20 15:18:21', '专家', 35, '36ab771eba23f49d7ae43af88c601f3de8fccb201250906a4085444ae765f2db', 1, 'upload/144ad380-0866-4507-b603-f00e73b06660.jpg', 35.00); +INSERT INTO `tb_doctors` VALUES (2, '徐蕾', '1102', '10', '南京大学', 13355224488, 2, '科室主任', 'upload/1780513872931848194.png', '国家二级心理咨询师,婚姻家庭咨询师,家庭教育指导师,婚恋专家,个人成长', '2025-03-20 15:18:22', '专家', 35, '36ab771eba23f49d7ae43af88c601f3de8fccb201250906a4085444ae765f2db', 1, 'upload/144ad380-0866-4507-b603-f00e73b06660.jpg', 35.00); +INSERT INTO `tb_doctors` VALUES (3, '周建中', '1103', '10', '南京大学', 13355224488, 0, '心理咨询', 'upload/1696091800588128256.jpg', '国家二级心理咨询师,婚姻家庭咨询师,家庭教育指导师,婚恋专家,个人成长', '2025-03-20 15:18:23', '主任医师', 35, '36ab771eba23f49d7ae43af88c601f3de8fccb201250906a4085444ae765f2db', 1, 'upload/144ad380-0866-4507-b603-f00e73b06660.jpg', 28.00); +INSERT INTO `tb_doctors` VALUES (4, '石红乔', '1104', '10', '南京大学', 13355224488, 0, '心理咨询', 'upload/avatar_doctor.png', '国家二级心理咨询师,婚姻家庭咨询师,家庭教育指导师,婚恋专家,个人成长', '2025-03-20 15:18:24', '专家', 35, '36ab771eba23f49d7ae43af88c601f3de8fccb201250906a4085444ae765f2db', 1, 'upload/144ad380-0866-4507-b603-f00e73b06660.jpg', 35.00); +INSERT INTO `tb_doctors` VALUES (5, '金保方', '1105', '10', '南京大学', 13355224488, 0, '心理咨询', 'upload/avatar_doctor.png', '国家二级心理咨询师,婚姻家庭咨询师,家庭教育指导师,婚恋专家,个人成长', '2025-03-20 15:18:26', '专家', 35, '36ab771eba23f49d7ae43af88c601f3de8fccb201250906a4085444ae765f2db', 0, 'upload/144ad380-0866-4507-b603-f00e73b06660.jpg', 35.00); + +-- ---------------------------- +-- Table structure for tb_item +-- ---------------------------- +DROP TABLE IF EXISTS `tb_item`; +CREATE TABLE `tb_item` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '编号', + `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '电影名称', + `card_subtitle` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '电影副标题', + `rating_value` decimal(3, 1) NULL DEFAULT NULL COMMENT '评分', + `rating_count` int(11) NULL DEFAULT NULL COMMENT '评分人数', + `rating_star_count` decimal(3, 1) NULL DEFAULT NULL COMMENT '星级评分', + `year` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '上映时间', + `large_pic` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '大图文件名', + `normal_pic` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '小图文件名', + `country` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '国家', + `movie_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '电影类型', + `director` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '导演', + `actor` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '主演', + `sort` int(10) NULL DEFAULT NULL COMMENT '排序', + `tag` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, + `aptitude` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '资质', + `audit` tinyint(1) NULL DEFAULT 0 COMMENT '是否审核 0 无 1 是', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '电影表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of tb_item +-- ---------------------------- + +-- ---------------------------- +-- Table structure for tb_order +-- ---------------------------- +DROP TABLE IF EXISTS `tb_order`; +CREATE TABLE `tb_order` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '预约编号', + `user_id` bigint(20) NOT NULL COMMENT '用户编号', + `item_id` bigint(20) NOT NULL COMMENT '医生编号', + `age` bigint(20) NULL DEFAULT NULL COMMENT '年龄', + `order_status` tinyint(1) NOT NULL DEFAULT 0 COMMENT '状态 0已预约 1 已完成 2取消', + `appointment_time` datetime NULL DEFAULT NULL COMMENT '预约时间', + `total_amount` decimal(10, 2) NULL DEFAULT NULL COMMENT '订单总金额', + `payment_status` tinyint(1) NOT NULL DEFAULT 0 COMMENT '支付状态', + `payment_date` datetime NULL DEFAULT NULL COMMENT '支付时间', + `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间', + `score` int(5) NULL DEFAULT NULL COMMENT '订单评价分数', + `score_content` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '评价内容', + `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '病例内容', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', + `sex` tinyint(1) NULL DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1902631117740093443 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '预约表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of tb_order +-- ---------------------------- +INSERT INTO `tb_order` VALUES (1, 1863920777825390593, 1, 32, 1, '2025-02-28 00:00:00', NULL, 0, NULL, '2025-02-21 12:48:10', NULL, NULL, '

姓名:张某某
性别:男/女
年龄:45岁
就诊日期:2023年XX月XX日



主诉

患者自述“腰骶部酸痛伴双下肢乏力、疼痛1个月,加重3天”。



现病史

  1. 患者1个月前无明显诱因出现腰部酸痛,以腰骶部为主,久坐、弯腰后加重,休息后可稍缓解。
  2. 症状逐渐进展,近3天疼痛加重,并放射至双侧大腿后侧及小腿外侧,伴下肢麻木感,无夜间静息痛。
  3. 日常活动受限,步行超过30分钟需休息,无发热、尿便异常、体重下降等全身症状。
  4. 自行外用膏药及热敷效果不佳,遂来就诊。


既往史

  • 否认外伤、腰椎手术史。
  • 高血压病史5年,规律服药控制;否认糖尿病、风湿性疾病史。


体格检查

  • 一般情况:神清,生命体征平稳。
  • 腰椎检查:腰椎生理曲度变直,L4-L5、L5-S1棘突及椎旁压痛(+),叩击痛(+)。腰椎活动度:前屈60°(受限),后伸10°(疼痛加重)。
  • 神经系统:双下肢肌力Ⅳ级,直腿抬高试验左侧50°(+)、右侧60°(+),加强试验(+)。双侧膝反射、跟腱反射减弱,病理征未引出。
  • 其他:双下肢无肿胀,皮温正常,足背动脉搏动正常。


辅助检查

  1. 腰椎X线:腰椎退行性变,L4-L5椎间隙狭窄。
  2. 腰椎MRI(建议):待查,初步提示L4-L5椎间盘突出(未压迫硬膜囊)。
  3. 血常规、CRP、血沉:均未见明显异常。


初步诊断

  1. 腰椎间盘突出症(L4-L5)
  2. 腰肌劳损
  3. 腰椎退行性病变


处理措施

  1. 药物治疗:非甾体类抗炎药(如塞来昔布 200mg qd)口服,缓解疼痛。甲钴胺片(0.5mg tid)营养神经。外用氟比洛芬凝胶贴膏局部镇痛。
  2. 物理治疗:建议腰椎牵引、局部热疗、针灸治疗。
  3. 生活方式指导:避免久坐、弯腰负重,睡硬板床,加强腰背肌锻炼(如小燕飞)。
  4. 随访:1周后复诊,若症状无缓解或加重,需进一步行MRI检查并考虑康复科会诊。


医生签名:XXX
日期:2023年XX月XX日



', '四肢酸痛', 1); +INSERT INTO `tb_order` VALUES (2, 1863920777825390593, 1, 32, 0, '2025-02-28 00:00:00', NULL, 0, NULL, '2025-02-21 13:02:12', NULL, NULL, '', '四肢酸痛', 1); +INSERT INTO `tb_order` VALUES (1902631117740093442, 1893836584118173697, 3, NULL, 0, '2025-03-21 00:00:00', 28.00, 0, NULL, '2025-03-20 07:59:42', NULL, NULL, NULL, '1', 0); + +-- ---------------------------- +-- Table structure for tb_slides +-- ---------------------------- +DROP TABLE IF EXISTS `tb_slides`; +CREATE TABLE `tb_slides` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '编号', + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '轮播名称', + `sort` int(10) NULL DEFAULT NULL COMMENT '排序', + `path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '图片地址', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间', + `type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '类型', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 16 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '轮播图' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of tb_slides +-- ---------------------------- +INSERT INTO `tb_slides` VALUES (3, '轮播1', 1, 'upload/abdf27a87205498e854bc86bc69fa3f8.jpg', '2025-02-18 10:15:53', '首页轮播'); +INSERT INTO `tb_slides` VALUES (15, '轮播2', NULL, 'upload/c6b60d4894088614fbe09b910a9dac5461210.jpg', '2025-02-18 10:17:15', NULL); + +-- ---------------------------- +-- Table structure for tb_token +-- ---------------------------- +DROP TABLE IF EXISTS `tb_token`; +CREATE TABLE `tb_token` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', + `user_id` bigint(20) NOT NULL COMMENT '用户ID', + `token` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 'token', + `expire_date` datetime NULL DEFAULT NULL COMMENT '过期时间', + `update_date` datetime NULL DEFAULT NULL COMMENT '更新时间', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `user_id`(`user_id`) USING BTREE, + UNIQUE INDEX `token`(`token`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1893836595690258434 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '用户Token' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of tb_token +-- ---------------------------- +INSERT INTO `tb_token` VALUES (1863921548927258625, 1863920777825390593, 'bf8b9bc76776429081b0b0828c61d8ce', '2025-02-24 10:02:23', '2025-02-24 10:02:23'); +INSERT INTO `tb_token` VALUES (1888853374313553922, 1888852840605147137, 'ed407976795e4df88d56e7a00c1d5154', '2025-02-11 07:37:24', '2025-02-10 19:37:24'); +INSERT INTO `tb_token` VALUES (1888931479396843521, 1888931423629377538, 'df266350cbab4165a770e32a41e821cd', '2025-02-12 00:12:33', '2025-02-12 00:12:33'); +INSERT INTO `tb_token` VALUES (1893836595690258433, 1893836584118173697, 'ffd85c96c4cc418694e49d7e3041d7cb', '2025-03-24 16:53:41', '2025-03-24 16:53:41'); + +-- ---------------------------- +-- Table structure for tb_topic +-- ---------------------------- +DROP TABLE IF EXISTS `tb_topic`; +CREATE TABLE `tb_topic` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '编号', + `title` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '标题', + `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL COMMENT '内容', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间', + `view` int(10) NOT NULL DEFAULT 0, + `sort` int(10) NOT NULL DEFAULT 1, + `type` int(11) NULL DEFAULT 0 COMMENT '类型0 话题 1 文创', + `user_id` bigint(20) NULL DEFAULT NULL COMMENT '用户编号', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1893843706562265090 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '健康资讯' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of tb_topic +-- ---------------------------- +INSERT INTO `tb_topic` VALUES (1867221170365947966, '确诊为自我奖励型人格', '

自我奖励型人格,是一种倾向于通过自我激励与奖励来保持积极动力、达成目标的人格特质。不论是完成小任务后的甜点奖励,还是实现大目标后的旅行计划,都是我们的自我奖励。快来分享你是如何设定目标、实现自我提升,并在过程中给予自己恰到好处的鼓励与奖赏的吧。

', '2025-02-11 13:09:02', 59, 1, 0, NULL); +INSERT INTO `tb_topic` VALUES (1867221170365947967, '我的春节戒断反应', '

春节,这个承载着中华民族深厚情感与传统文化的重要节日,总是以它独有的方式,将喜庆、热闹与温馨的氛围弥漫在每一寸空气中。但当节日的喧嚣逐渐散去,许多人却会不由自主地陷入一种特殊的“戒断反应”之中——那是一种对春节热闹与年味的深深怀念。你是否有这种春节戒断反应呢?

', '2025-02-11 13:09:04', 0, 1, 0, NULL); +INSERT INTO `tb_topic` VALUES (1867221170365947968, '你身边的数字时代边缘人', '

在数字时代,信息如潮水般涌来,但有些人却仿佛站在了时代的边缘,无法完全融入其中。他们可能是老年人,对智能手机和互联网感到陌生;也可能是忙碌于生计,无暇顾及新兴科技的年轻人。你是否属于数字时代的边缘人?请分享你的“边缘人”生活见闻。

', '2025-02-11 13:35:25', 500, 1, 0, NULL); +INSERT INTO `tb_topic` VALUES (1867221170365947969, '你所去过的藏地秘境', '

发现壮丽的西部藏地秘境,栖居于简朴的大地之上,看草长莺飞 ,看万物复苏,追寻最自由的生活方式。

', '2025-02-11 13:35:23', 100, 1, 0, NULL); +INSERT INTO `tb_topic` VALUES (1867221170365947970, '我想要拥有不过春节的自由', '

当“过年”变成压力,有人开始反思:能否拥有不过春节的自由?有人因催婚催生、社交内耗或单纯渴望安静而抗拒传统仪式,却也面临“不孝”“冷漠”的质疑。你的春节是“必选项”还是“可选项”?来聊聊你的态度与困惑。

', '2025-02-11 13:09:06', 0, 1, 0, NULL); +INSERT INTO `tb_topic` VALUES (1867221170365947971, '别再线下去物业配门禁卡了!', '

家里的单元门禁卡丢了,物业要10r一个

自己在pxx找了,基本都是要求看是IC还是ID卡,然后发卡背面的十位数字

一开始父母还不信觉得必须得把钥匙邮寄过去人家才能给配出来

结果只需要给出卡背面的十位数字,到货后完全匹配单元门,三个一共8.6

\"\"

\"null\"

', '2025-02-11 15:15:00', 7, 1, 1, NULL); +INSERT INTO `tb_topic` VALUES (1867221170365947972, '经验分享|女人事业一定是最最最重要的 ', '

和姐妹们分享下我自己的路径 出生于18线小镇,父母小学文化,父亲长期喝酒,家庭暴力,出轨,混社会,发脾气,是个软饭硬吃的大男主主义到极致的男人,我妈过得也非常痛苦,她自身难保,所以每当我爸欺负我,她也都不会保护我!所以从小我的目标就是远离这个家,有多远有多远! 后面我拼命学习,考上了985,取得了世界级竞赛比赛的奖牌,直接保研,但是研究生在北京我换上了焦虑症,当时以为男朋友就是自己的依靠,由于我极度缺爱,对他也是100分信任,所以选择去了央企,两个人互补,他去互联网赚钱,我负责稳定,结果当我们都觉得要结婚的时候,他遇见了白月光,直接就把我踹了。 出轨这件事对我影响非常大,后来也颓废了很久,甚至想过自我了结了,因为觉得自己太恋爱脑把自己的未来毁了,没有选择去互联网。但是自我调整后,我开始在公司好好发展,现在逐渐适应了,经过三年在公司的摸爬滚打,逐渐明确自己的定位,也建立了目标,存款也达到了百万! 告诉各位平凡的女性,永远不要想着让男人托举自己!要以最高优先级对待自己的事业发展,你的钱,你的工作,你的能力,你的健康才是你自己唯一的托举

', '2025-02-11 15:35:30', 0, 1, 1, NULL); +INSERT INTO `tb_topic` VALUES (1867221170365947973, '亲手搞出更健康的奶茶', '

第一步:选茶叶别纠结!红茶绿茶乌龙茶,你家茶叶罐里有什么就用什么!爷爷的茉莉花茶、老爸的普洱茶包、甚至你泡剩下的立顿红茶渣,通通都能废物利用!记住黄金口诀——茶叶越便宜越耐造!抓一把丢进锅里,加水煮到咕嘟冒泡就关火,别学奶茶店煮半小时,茶汤苦得能去演苦情剧!煮好的茶汤拿滤网过一遍渣渣,懒得洗滤网?用蒸包子的纱布也行,主打一个就地取材!

第二步:倒奶别手抖!全脂牛奶是灵魂伴侣,脱脂奶喝起来像掺了水的寂寞?教你个狠招——半盒全脂奶+半盒燕麦奶混着来!热量砍半,香味翻倍,还能喝出坚果香!乳糖不耐的姐妹看这里!杏仁奶椰奶豆奶随便换,但记住植物奶容易结块,倒进热茶前先拿打蛋器搅10秒,保你丝滑得像德芙广告!

第三步:控糖大作战!白砂糖?那是上个世纪的古董!挖两勺零卡糖打底,再挤一丢丢蜂蜜增加层次感,最后撒点海盐——对!就是炒菜那个盐!魔法来了:咸味能让甜味放大3倍!信我,这样搞出来的甜度刚刚好,喝完不用疯狂跑厕所!爱加料的看过来:煮奶茶时扔几颗红枣进去,天然甜味剂+养生Buff,隔壁养生阿姨都要找你取经!

第四步:搅拌有玄机!别拿筷子瞎搅和!找个带盖的保温杯,茶和奶倒进去,加入你的灵魂配料(肉桂粉/姜汁/可可粉都行),然后疯狂摇它20秒!看着奶泡慢慢浮起来,恭喜你解锁奶茶店同款绵密口感!没保温杯?电饭煲内胆也行!抡起胳膊当健身,奶茶还没喝先消耗50大卡!

第五步:冰块要心机!直接加白水冰?达咩!把冷泡茶冻成冰块,化开也不怕味道变淡!更绝的是把牛奶冻成冰球,喝到后面越来越浓!夏天想喝冰奶茶又怕姨妈痛?把红枣茶冻成冰块,养生冰饮直接拿捏!

重点来了:所有材料比例记不住?教你万能公式!1拳头茶叶+2拳头水+3拳头奶=不会翻车的基础款!进阶玩家可以玩混搭:普洱+燕麦奶=中年养生局,茉莉花茶+椰奶=小清新约会款,乌龙茶+杏仁奶=职场摸鱼必备!倒进马克杯就是办公室下午茶,装进玻璃瓶就是ins风摆拍神器!

别被网红教程吓到!什么温度计量杯电子秤,咱们普通人不需要!煮茶看气泡——小泡泡是\"可以喝了\",大泡泡是\"要烧干了\"!加糖靠手感——先加一勺尝一口,不够甜就再来一勺!最最重要的是:做完记得对着奶茶说\"我可真牛\",味道立马提升50%!

', '2025-02-11 15:35:48', 0, 1, 1, NULL); +INSERT INTO `tb_topic` VALUES (1867221170365947974, '和人类幼崽聊数学', '

幼年时,他有个邻居。有一天,邻居问他,3乘以5等于多少?他说:15。那5乘以3呢?他从头算了一遍,还是15。邻居笑他:你为什么花这么大劲儿呢,3乘以5和5乘以3不是一回事吗?他想追问邻居为什么,但邻居只是说:小孩儿,你在学校里学了就会了。后来两三年,他心里总有个期待,他想十岁我就知道为什么5乘以3等于3乘以5了。

终于,那天来临。他兴高采烈翻开课本,却发现课本上只是冷冰冰一行乘法交换律a*b=b*a,没有解释为什么。他失望地几乎哭了出来。后来又过了很多年,他才自己意识到,这只是算术的方式不同,三行五列和五行三列,其实是一样的排列。

这是今年76岁的数学家Alexandre Avonkine(后文称亚历山大)的童年回忆。

第一个孩子三岁那年,他想起这段经历,决定试试看给孩子们上数学课。听众里还有孩子的好朋友们,都是三四岁的年纪。他把每一节都用日记的形式记录下来,后来整理成书:《Maths from Three to Seven》。这本书我非常喜欢。如果你没时间看书,或者不想看英文(没有中文译本),我把书中的几个我很赞同的点整理在本文中。当然,或多或少,也掺杂了我本人粗浅的理解和思考。惭愧。

Math from Three to Seven评价人数不足Alexander Zvonkin / 2011 / American Mathematical Society

我对学前教育几乎一无所知甚至毫无兴趣,但从一个已经进入系统数学大厦的数学工作者的角度,看书的过程中,还是不断感受到成人成熟却定性的思维和孩子天然的思维能力之间的差异。这种差异让我觉得非常有趣,原来从其实并不遥远的孩童时期走到现在,教育系统和社会法则把我的思维方式塑造成了如今这样,我虽然知道如何按部就班解薛定谔方程,却并不比一个三岁孩子高明。

孩子如何能最好最高效地理解一些数学概念,对成年人后天学习也会有一些启发:毕竟,作为某一个专业领域的门外汉,只要你不是盲目自信,不懂装懂,你一开始对这个领域的感受是和孩子一样的。

成年人做数学,思维是高度抽象的。《数学的雨伞下》这本书里多次提到,在数学之美的其中一点是,它是高度概括具象世界的:1就是1,2就是2,并不存在1一定要指一个苹果,2一定要指两块钱。1+2=3这件事,不论你是一个苹果加两个苹果,还是一块钱加两块钱,结论都是一样的,和具体所指的物体几乎是不相关的。(这本书我非常非常推荐,可读性很强。)

数学的雨伞下8.9[法] 米卡埃尔·洛奈(Mickaël Launay) / 2023 / 人民邮电出版社

但是一个三岁孩子很难理解这一点,他通常需要通过具体的物质来帮助理解抽象的结论。亚历山大经常做的一件事情是,用不同的形式重复一个本质完全相同的数学问题。一个很简单的例子是,与其让他记住2乘以4是多少,不如今天你问他小猫每次能跳上 4 级楼梯,它跳了 2次,请问它一共跳了多少级楼梯?明天你问他:小明 2辆个玩具车,每个玩具车有4个轮子,请问有几个轮子?

我也常常需要回答一些小孩子的问题:“为什么3+4等于4+3啊?”“比无穷大更大的是什么啊?”我必须要给出非常具体的,联系生活的答案。插播一下,这位让我解释了两个月什么是无穷大的人类幼崽,这周忽然发出了”我要买无穷大个巧克力”的希望,我觉得他是懂了。

小孩子的另外一个特点的是,他们的记性非常好,对于感兴趣的话题,即使一时不能找到解法,会暂时把问题和疑问都储存在大脑里,随时用自己的能力储备进行思考,一旦他们觉得成熟,就会给出正确答案。亚历山大有一次问了他的孩子一个问题,当时孩子没有办法解出来。三年后,又一次在森林里,他忽然说:“爸爸你记得你问我的那个数学问题吗?我现在有答案了。”所以,他今天不知道2乘以4是多少没有关系,那些生活中具体的例子和他通过实践的经验,会在某个时刻让恍然问题的解法和深层的道理。而如果真的他永远也想不明白,你让他死记硬背,也没有意义。他也许能够用一个答案通过某次考试,某次选拔,但这很难成为他的知识,总有一天,他会完全忘记这些抽象的概念。

有一点是残酷的:我们固然可以用自律努力来达到近处的目标,但数学并不是死记硬背就能获得成功的学科。天赋,很重要。他有两个孩子,大孩子从小就在他的数学课上表达出了很大的兴趣,有时候晚饭时间也会思考爸爸出的题目;但他的第二个孩子,就更喜欢写写画画,父亲给她的训练固然让她拥有了一定的逻辑思考能力,但她明显更喜欢艺术。他当然也没有逼孩子学,大孩子的数学课持续了多年,二孩子却很快结课。同时,和他第二个孩子一起上课的另一个女孩子,却对数学表达了极大的兴趣,喜欢摆弄几何形状。若干年后他写了后记,他自己的大孩子拿到数学PhD,我在网上找了找,他如今是法国数学研究院CNRS的数学家;而那个女孩去了美国,现在在做数学教育,并编写了相关书籍。

我之前提到过几次,我出生在文科之家,母亲是中文教授,对明清小说多有研究;父亲是历史教授。我曾以为自己对数学热爱至斯是基因突变,但母亲前不久告诉我自己中学时候数学成绩极好,非常喜欢数学,只是因为当年家里很差,外婆倾尽所有送她读书到大学。她不想冒险让家人的积蓄打了水漂,知道若失败便没有再来一次的可能,便选择了招生名额很多的中文系。但她依然喜欢数学,如今退休后,家里又买了些数学书,每天都要打卡做题。

不过,不是人人都要成为数学家。我不是画家,但也喜欢看展,平均一个月一定要去一次博物馆;一个人可以不会算很多题目,但也感受到数学之美。

我不知道对数学的热爱如何培养,是否有可能培养,但拔苗助长是会扼杀掉本来的热爱的。我高中的时候数学老师对我不好,每天盯着我,我和男生出去玩就会被她说“不自爱”,我在逆反心理下逐渐厌恶数学,甚至考过不及格。我大学选择数学专业其实是赌了一口气,觉得我必须比老师数学好。赌对了。我心里隐藏着的热爱从大一开始疯狂觉醒,陷入了高等数学的美好中不能自拔,直到现在。

亚历山大的书中也提到,他作为数学家,知道自己的孩子数学思维非常优秀,孩子上学后,他却发现孩子的数学成绩并不是太好。他有自己的思维模式,和学校教育的步调不完全一致,或多或少扼杀了他一些信心。我的意思是,数学固然是有标准答案的学科,但就如同登山一样,在登顶之前,你走什么路,用什么方式走路,并没有那么重要。很多时候,我们才走到半山腰,就有人跟我们说:你们这样不能走到终点的。但也许,每个人都有每个人的走法。

三年前,我和一个当时小学一年级的孩子交流,他让我给他出很难的算数。我已经不记得我给他出了什么题,只记得他用一种我意想不到的方式,把数字拆分成了奇怪的组合,但得出了正确答案。我当时就觉得,可能标准答案唯一,但每个孩子,有最适合自己的理解方式和解题方法。我在他找到答案之前,不能打断他。

下面是我记录的几个书中提到的,有趣的问题。我自己归纳了一下可能考察的能力。如果大家有兴趣,可以拿去问问身边的人类幼崽:

  1. 一个孩子坐电梯去13楼,但每次只能按到8楼,是为什么?考察能力:逻辑推理、现实生活常识。
  2. 正方形多还是平行四边形多?考察能力:集合关系、分类与归纳。
  3. 两个父亲和两个孩子分三个苹果,每人都有一个,为什么?考察能力:代数思维、归纳与分类。
  4. 有个人带着包菜,羊,狼坐船,每次只能带一样东西,要怎么坐(狼会吃羊,羊会吃白菜)考察能力:逻辑推理、递归思维、约束条件下的最优解。
  5. 在桌子上用积木搭建一座塔,怎么样从地板上搭建一样塔高的塔呢?考察能力:空间思维、等量代换。
  6. 爸爸妈妈有三个儿子,每个儿子都有两个姐妹,这户人家有几个孩子呢?考察能力:逻辑推理、反直觉思维。

成年人在学习时常常希望有捷径,希望迅速掌握一门语言,一门技能,可以直接转化成个人能力,但孩子并不不是这样。人类幼崽比成年人愿意花时间去摸索玩耍,在反复验证中思考。读这篇的人里如果有为人父母的,想要给学龄前儿童培养一些数学思维的,我很推荐可以一边玩一边解的问题。比如:一块面包切三刀,最多可以切几片啊?然后你给他一片软面包,一把安全的小刀,他或许能玩一个小时。就像我刚才我提到的,他们或许会在某一天,想起多年前你问他的一个问题,然后告诉你:“我有答案了!”

而我不想说数学数学只是冷冰冰的抽象计算,它本来就来自于人类对世界的观察概括和归纳。我们大部分人都觉得这种能力来自于课堂,来自于做题,但有可能,它其实隐藏在一个电梯按钮的高度里,隐藏在桌子上的积木塔里,隐藏在我们对为什么 3 × 5 和 5 × 3 是一样的”的思考里。标准答案或许只是对规则的概括,但我们对世界的理解,或许超越规则本身。

我希望无论是否成为数学家,都有那么一些幼崽也好,成年人也好,会在每个瞬间,忽然理解某个问题,然后快乐地欢呼起来,只为这片刻的数学之美。

\"\"

最后展示一下一个四岁小孩的数学计算(他每天睡前都要求做一些)

', '2025-02-11 15:36:17', 0, 1, 1, NULL); +INSERT INTO `tb_topic` VALUES (1889341410696552450, '一些参观感受', '

年初去了安阳殷墟博物馆(新馆2024年开放)、郑州博物馆(新馆2021年开放)、长沙博物馆(2015年开放)、湖南博物院(新馆2017年开放),连同去年年底逛过的北京大运河博物馆,感受到了猫儒老师提过的一个词儿叫文博大X进。


共同的特点是占地极大,建筑大、广场大,内外空间留白都大,设计思路不像是给人民群众休闲和体验文化的场所,像皇帝陵,但皇帝坟头也有树啊,它们又都不种树。我觉得体力不太好的人得租轮椅参观,但内部无障碍设施也很差。


但节假日这些巨大的展馆真的会被装满。这时另一个现象就明显起来,即它们地方虽大,入口却很小。人为营造逆向桃花源,从远处看土地平旷、屋舍俨然,排队数百米,始得一巨屋,开一小侧门,仿佛若有光,内有安检机二,极狭,才通人。结合这些新馆巨大的体量和猎奇的造型(郑州和湖南新馆外形都像古代帝王的冠冕,长沙像一堆牛屎,殷墟像一个大盒),那队伍中的人显得非常渺小,极具蝼蚁感,仿佛X酸检测情景再现。

', '2025-02-11 15:51:50', 0, 1, 1, 1888931423629377538); +INSERT INTO `tb_topic` VALUES (1893843706562265089, '1', '

1

', '2025-02-24 10:01:39', 0, 1, 1, NULL); + +-- ---------------------------- +-- Table structure for tb_user +-- ---------------------------- +DROP TABLE IF EXISTS `tb_user`; +CREATE TABLE `tb_user` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', + `username` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '手机号', + `password` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '密码', + `create_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间', + `nick_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '昵称', + `introduce` varchar(600) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '介绍', + `role` tinyint(1) NULL DEFAULT NULL COMMENT '性别', + `profile` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '头像', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1893836584118175698 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '用户' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of tb_user +-- ---------------------------- +INSERT INTO `tb_user` VALUES (1863920777825390593, '18796357645', '', '2025-03-24 01:40:42', '李静', '·11', 0, 'http://localhost:18081/81ecfb66-5f94-4997-8f2c-430b63415212.jpg'); +INSERT INTO `tb_user` VALUES (1893836584118173697, '123456', '8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92', '2025-03-24 06:16:07', '区块霸总', '', 1, 'http://localhost:18081/81ecfb66-5f94-4997-8f2c-430b63415212.jpg'); +INSERT INTO `tb_user` VALUES (1893836584118174698, '76005929642', '8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92', '2025-03-24 01:40:39', '毛致远', '', 1, 'http://localhost:18081/81ecfb66-5f94-4997-8f2c-430b63415212.jpg'); +INSERT INTO `tb_user` VALUES (1893836584118174806, '17024265121', 'LA9vxJIXrT', '2025-02-24 09:55:32', '夏岚', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175079, '18077837268', 'VJfD1mDgK1', '2025-02-24 09:55:32', '谭岚', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175080, '16993118716', '1oEbgFLF4V', '2025-02-24 09:55:32', '董晓明', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175081, '19255839458', 'j83qleGTTP', '2025-02-24 09:55:32', '谢岚', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175082, '2198715981', 'NULlBHcc0l', '2025-02-24 09:55:32', '唐岚', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175083, '7603837030', '2CDe6HJYGL', '2025-02-24 09:55:32', '傅詩涵', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175084, '16833033086', 'Cl8B1bPwTd', '2025-02-24 09:55:32', '顾杰宏', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175085, '13523373513', '6GC0cLLWcq', '2025-02-24 09:55:32', '黎岚', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175086, '280324754', '9KewLMOCpm', '2025-02-24 09:55:32', '汪致远', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175087, '208955775', 'JU01ugq6fE', '2025-02-24 09:55:32', '余子异', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175088, '16565095028', '4H2a5IdJbs', '2025-02-24 09:55:32', '余詩涵', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175089, '18967023267', 'pC4ieQ8HvQ', '2025-02-24 09:55:32', '王云熙', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175090, '18944454254', 'IaNIhxutkS', '2025-02-24 09:55:32', '宋子韬', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175091, '7695552635', 'MePEmJYe4A', '2025-02-24 09:55:32', '武岚', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175092, '2005104524', 'i2sXJOD0sY', '2025-02-24 09:55:32', '傅子韬', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175093, '1021661714', 'amXPMuhq2e', '2025-02-24 09:55:32', '林宇宁', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175094, '19575521379', 'R4ZkqdPtZ4', '2025-02-24 09:55:32', '贺詩涵', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175095, '17298916797', 'rFU1ZX7LHM', '2025-02-24 09:55:32', '侯璐', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175096, '2139691895', '4N2Hb4Fz1g', '2025-02-24 09:55:32', '汪子异', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175097, '2011582460', 'NABbDkNYWU', '2025-02-24 09:55:32', '顾宇宁', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175098, '14220741694', 'bTnkCJK0mF', '2025-02-24 09:55:32', '秦岚', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175099, '76962706529', 'KlWRFMdfrS', '2025-02-24 09:55:32', '韩晓明', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175100, '15730695343', 'FJMbwMyXKx', '2025-02-24 09:55:32', '高云熙', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175101, '16858721602', 'DkH1XYEMoh', '2025-02-24 09:55:32', '薛震南', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175102, '19554235203', 'poqdqQronS', '2025-02-24 09:55:32', '史詩涵', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175103, '2012202568', 'v2w4xlHw1G', '2025-02-24 09:55:32', '崔子韬', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175104, '16633781825', 'MPHT5zYVmv', '2025-02-24 09:55:32', '许子韬', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175105, '282946662', 'NVvyXNMxHy', '2025-02-24 09:55:32', '钟云熙', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175106, '17524075986', 'z7uiSbrWVA', '2025-02-24 09:55:32', '郝嘉伦', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175107, '15302714309', 'TP5LmvU2V6', '2025-02-24 09:55:32', '邓岚', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175108, '75575347425', 'rT9AakfHKD', '2025-02-24 09:55:32', '杜嘉伦', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175109, '286148868', 's3Hy3OK5CM', '2025-02-24 09:55:32', '马晓明', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175110, '286581420', 'IsLD41dFRP', '2025-02-24 09:55:32', '毛詩涵', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175111, '283464255', 'yok6y52nAx', '2025-02-24 09:55:32', '尹詩涵', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175112, '13319186219', 'irZe7K2ysY', '2025-02-24 09:55:32', '邹云熙', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175113, '209463852', 'rUlRHsxYvN', '2025-02-24 09:55:32', '金宇宁', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175114, '13704139711', 'vJ1OYDMmn9', '2025-02-24 09:55:32', '侯岚', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175115, '15219164413', '7nFzzHQzls', '2025-02-24 09:55:32', '武詩涵', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175116, '76985804966', 'JBN8WushL8', '2025-02-24 09:55:32', '毛詩涵', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175117, '16345594607', '9kiGESL6o4', '2025-02-24 09:55:32', '雷秀英', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175118, '76052729209', 'LHcFb9mF0I', '2025-02-24 09:55:32', '黎嘉伦', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175119, '15250312254', 'mVJXD2wleK', '2025-02-24 09:55:32', '汤致远', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175120, '14083054273', 'ZDmeFhXfjk', '2025-02-24 09:55:32', '顾云熙', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175121, '18424290783', 'c7JhQ7ynSk', '2025-02-24 09:55:32', '梁云熙', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175122, '282101310', 'DLOB3cZO7V', '2025-02-24 09:55:32', '卢安琪', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175123, '13425681771', 'XznVsY9x8g', '2025-02-24 09:55:32', '金子韬', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175124, '18774052097', 'pPt3kh1WQW', '2025-02-24 09:55:32', '薛睿', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175125, '15527510597', '0hgk4PHcI4', '2025-02-24 09:55:32', '赵安琪', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175126, '1086643185', '2b5Z519SkT', '2025-02-24 09:55:32', '江子韬', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175127, '19997217361', 'MUXXfV8jld', '2025-02-24 09:55:32', '杨杰宏', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175128, '287367033', 'jNPZLDfOJD', '2025-02-24 09:55:32', '郝云熙', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175129, '16848500984', 'QPlIeKswzw', '2025-02-24 09:55:32', '戴岚', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175130, '75585508252', 'xklLX8Pi4Z', '2025-02-24 09:55:32', '陆震南', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175131, '19369356562', 'DcVNccO3RV', '2025-02-24 09:55:32', '姚岚', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175132, '104066859', 'sw4QunRbo0', '2025-02-24 09:55:32', '唐詩涵', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175133, '1031396553', 'OSMJfmTYVy', '2025-02-24 09:55:32', '黄睿', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175134, '2080365064', 'zRdQlkN9DI', '2025-02-24 09:55:32', '方子韬', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175135, '75537455946', 'tKzwLqt75O', '2025-02-24 09:55:32', '吕睿', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175136, '75533563144', 'FFd3L42djP', '2025-02-24 09:55:32', '常子异', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175137, '18540854137', 'YVnwMuk5ya', '2025-02-24 09:55:32', '陆安琪', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175138, '14801055131', 'q4kNEf1EIz', '2025-02-24 09:55:32', '郑岚', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175139, '19819224454', 'sSfvzKsP4a', '2025-02-24 09:55:32', '史宇宁', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175140, '7697263744', 'FveuTd0gN1', '2025-02-24 09:55:32', '谢云熙', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175141, '75522276752', '3DdQ4rlKXf', '2025-02-24 09:55:32', '任璐', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175142, '7605682387', 'OrdwEQ8Wa2', '2025-02-24 09:55:32', '方晓明', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175143, '15539787008', 'VwRKDSbRGg', '2025-02-24 09:55:32', '彭晓明', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175144, '7609423531', 'Hevqi7u096', '2025-02-24 09:55:32', '范詩涵', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175145, '17654250839', 'RrhzmxBQVf', '2025-02-24 09:55:32', '贾云熙', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175146, '15131457156', '4gWcJMt4hP', '2025-02-24 09:55:32', '于秀英', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175147, '7553722084', 'kI8s3rWLR6', '2025-02-24 09:55:32', '彭晓明', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175148, '208938805', 'qX0Dqk92gi', '2025-02-24 09:55:32', '邹岚', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175149, '2838884202', 'K7m2a3WZCQ', '2025-02-24 09:55:32', '方秀英', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175150, '17437681323', '5VoPPyGrLL', '2025-02-24 09:55:32', '陆致远', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175151, '17747470741', 'bJuTXdViJR', '2025-02-24 09:55:32', '萧睿', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175152, '2088307402', 'iq1BSGHUaQ', '2025-02-24 09:55:32', '黄致远', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175153, '13522644945', 'OmptB88Buo', '2025-02-24 09:55:32', '莫云熙', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175154, '14195317825', 'sDiHXx3ytj', '2025-02-24 09:55:32', '杨岚', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175155, '16181344769', 'D9doskE6CM', '2025-02-24 09:55:32', '孟云熙', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175156, '15109279115', 'dpSugpLKKW', '2025-02-24 09:55:32', '顾岚', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175157, '13920211490', 'wHWmG1cd3q', '2025-02-24 09:55:32', '邵岚', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175158, '18281332005', 'ZF4Gn0hzPq', '2025-02-24 09:55:32', '江子韬', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175159, '19334648353', 'spAE644TH0', '2025-02-24 09:55:32', '田睿', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175160, '75569284475', '9YAWU8oBSM', '2025-02-24 09:55:32', '韦震南', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175161, '7559027296', 'CmUzw8Kraw', '2025-02-24 09:55:32', '董子异', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175162, '284390523', '8gdoABTLrc', '2025-02-24 09:55:32', '金致远', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175163, '15985984497', 'Ah60PTXsE5', '2025-02-24 09:55:32', '侯嘉伦', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175164, '289569770', 'xR5BCmDFF9', '2025-02-24 09:55:32', '苏宇宁', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175165, '15243533098', 'f45EhQ7YIr', '2025-02-24 09:55:32', '丁震南', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175166, '14131485053', 'OyuGKY72X6', '2025-02-24 09:55:32', '傅秀英', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175167, '1040731027', 'OownzDwtiX', '2025-02-24 09:55:32', '沈璐', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175168, '14832696220', 'Kyb5kFlsyN', '2025-02-24 09:55:32', '沈致远', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175169, '15679446665', 'Mk0QlUah43', '2025-02-24 09:55:32', '潘安琪', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175170, '13774129962', 'GhojP6E7kf', '2025-02-24 09:55:32', '孟岚', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175171, '13354586845', 'EWx6IJ9MdA', '2025-02-24 09:55:32', '田致远', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175172, '7607383661', 'IguHYCjDR2', '2025-02-24 09:55:32', '常震南', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175173, '286751052', 'rwtMGCQTct', '2025-02-24 09:55:32', '汪嘉伦', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175174, '101442574', '1ZK0BdsFN5', '2025-02-24 09:55:32', '傅子韬', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175175, '15527406658', '2FnaEjDvbg', '2025-02-24 09:55:32', '郝致远', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175176, '14989184588', 'zrneamLTGS', '2025-02-24 09:55:32', '孔子韬', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175177, '18030477274', 'T32ZyoEkZs', '2025-02-24 09:55:32', '邵子韬', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175178, '283458495', 'ikIQfERVHO', '2025-02-24 09:55:32', '夏云熙', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175179, '17928057324', 'AIs4JJqune', '2025-02-24 09:55:32', '姚杰宏', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175180, '17563519789', 'COHMgEeuxi', '2025-02-24 09:55:32', '熊杰宏', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175181, '109609191', 'OpDWOwkw5T', '2025-02-24 09:55:32', '黎詩涵', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175182, '13062440454', 'gGGZa1aX20', '2025-02-24 09:55:32', '张子韬', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175183, '15882864174', 'Orqs1NHhel', '2025-02-24 09:55:32', '周杰宏', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175184, '75501355129', 'BpGTluJsbP', '2025-02-24 09:55:32', '梁岚', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175185, '14911124611', 'IEG3jnweOU', '2025-02-24 09:55:32', '谢杰宏', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175186, '7604174897', 'WJFt8rtOqD', '2025-02-24 09:55:32', '孟璐', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175187, '287667422', 'Nvww5yeTOG', '2025-02-24 09:55:32', '郭詩涵', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175188, '16135134540', 'sQyjKE2Hy6', '2025-02-24 09:55:32', '袁子韬', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175189, '19200440757', 'f2dIHLoFf0', '2025-02-24 09:55:32', '崔云熙', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175190, '17895422671', 'WPwR8HJptQ', '2025-02-24 09:55:32', '周璐', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175191, '2173134602', 'inNVbBsWkE', '2025-02-24 09:55:32', '郭致远', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175192, '14919362537', 'SMQKUEISVR', '2025-02-24 09:55:32', '高安琪', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175193, '215881418', 'AuXhLmtMqe', '2025-02-24 09:55:32', '戴宇宁', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175194, '14013961468', 'VRcp8gET0u', '2025-02-24 09:55:32', '潘璐', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175195, '19481356747', 'VT0YCkIR1n', '2025-02-24 09:55:32', '赵秀英', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175196, '7607591491', 'LqYDz0Erz7', '2025-02-24 09:55:32', '林宇宁', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175197, '7555933552', 'RGvUNCU5t6', '2025-02-24 09:55:32', '夏秀英', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175198, '19268045984', 'w5N7hYIJ6l', '2025-02-24 09:55:32', '方璐', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175199, '19226498158', '4isFlmNl2q', '2025-02-24 09:55:32', '彭宇宁', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175200, '19073733694', 'vkSgI1x8Tr', '2025-02-24 09:55:32', '彭詩涵', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175201, '201545312', 'rhx3PerM9U', '2025-02-24 09:55:32', '韦秀英', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175202, '2886609079', '2FDVOqBD1s', '2025-02-24 09:55:32', '黎岚', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175203, '15920852458', 'qKYpp0ZkOB', '2025-02-24 09:55:32', '杨安琪', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175204, '15582122119', 'jucnseEd4O', '2025-02-24 09:55:32', '蒋震南', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175205, '13085238623', 'XNIB4CLSkj', '2025-02-24 09:55:32', '叶子异', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175206, '2023071082', 'mmUlvxf1wI', '2025-02-24 09:55:32', '杨云熙', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175207, '13901868178', 'JXOGUMiOOL', '2025-02-24 09:55:32', '袁晓明', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175208, '14997944532', 'oEp0o7cC5A', '2025-02-24 09:55:32', '吕睿', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175209, '7551658646', '0m4AohQHLf', '2025-02-24 09:55:32', '彭岚', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175210, '76098549178', 'IAhR31flEQ', '2025-02-24 09:55:32', '黎子异', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175211, '219230707', '580QjzX1Xp', '2025-02-24 09:55:32', '潘岚', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175212, '7608802964', 'XeLrBCEMYT', '2025-02-24 09:55:32', '邹震南', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175213, '76977313272', 'ZDvbUlk3qc', '2025-02-24 09:55:32', '吕晓明', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175214, '13835660922', 'zgDWOIm0tj', '2025-02-24 09:55:32', '段嘉伦', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175215, '18539840609', '4KeH5FFrzR', '2025-02-24 09:55:32', '于嘉伦', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175216, '19684452724', 'y016JOu2yt', '2025-02-24 09:55:32', '冯安琪', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175217, '2112219990', '1K8uInQQcw', '2025-02-24 09:55:32', '顾子韬', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175218, '76907161049', 'KuxgGqhY6f', '2025-02-24 09:55:32', '高致远', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175219, '17876694913', 'LfX6UuNfNy', '2025-02-24 09:55:32', '谭子异', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175220, '2179262909', '1Yyw9sCvZT', '2025-02-24 09:55:32', '秦震南', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175221, '17611841181', 'pC2X4opV1l', '2025-02-24 09:55:32', '黄嘉伦', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175222, '2833217700', 'gFSRBeyqV4', '2025-02-24 09:55:32', '郝致远', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175223, '15906870564', 'H4s5F396fJ', '2025-02-24 09:55:32', '崔杰宏', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175224, '2008330740', 'GLRjQRylsl', '2025-02-24 09:55:32', '孙子韬', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175225, '207590619', 'ofFPxicXKC', '2025-02-24 09:55:32', '孙秀英', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175226, '16790211408', 'JvExjTDptn', '2025-02-24 09:55:32', '江安琪', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175227, '17684156940', 'Max8FhYdui', '2025-02-24 09:55:32', '莫晓明', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175228, '14776292897', 'cG6gDHt2vr', '2025-02-24 09:55:32', '许宇宁', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175229, '1017137336', 'zrDB5K90WZ', '2025-02-24 09:55:32', '郭安琪', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175230, '214547220', '8oPxb4Qkls', '2025-02-24 09:55:32', '汤詩涵', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175231, '13211662068', 'I2WiBjIT3g', '2025-02-24 09:55:32', '傅子异', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175232, '13123887039', '7t3YoiPlyJ', '2025-02-24 09:55:32', '朱云熙', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175233, '14841861334', 'hRqBRZlQQP', '2025-02-24 09:55:32', '余秀英', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175234, '17900348259', 'pfJPzU2xtt', '2025-02-24 09:55:32', '孔震南', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175235, '15124617867', 'G277QeINNE', '2025-02-24 09:55:32', '谭云熙', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175236, '2088525746', 'dlstxwYNhJ', '2025-02-24 09:55:32', '孟子韬', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175237, '217253692', 'PqqhNCsMhT', '2025-02-24 09:55:32', '叶岚', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175238, '13892129615', 'luDSSvyZL2', '2025-02-24 09:55:32', '范致远', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175239, '17015549469', 'pE6UPTzeLG', '2025-02-24 09:55:32', '潘晓明', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175240, '19940908774', 'uEOrh9if0e', '2025-02-24 09:55:32', '王子韬', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175241, '287882918', 'oi51Ic56Ko', '2025-02-24 09:55:32', '余岚', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175242, '13062339016', 'BCaLxcXeiI', '2025-02-24 09:55:32', '杨秀英', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175243, '76999263186', 'nn2U9FcZqG', '2025-02-24 09:55:32', '曹嘉伦', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175244, '216994907', 'pICPqdxEI7', '2025-02-24 09:55:32', '李安琪', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175245, '16559220157', 'ElfVxDeFT6', '2025-02-24 09:55:32', '谭杰宏', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175246, '2039476689', '1LRmxyw30S', '2025-02-24 09:55:32', '赵嘉伦', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175247, '15321899106', 'Yf6wOvZELE', '2025-02-24 09:55:32', '韦云熙', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175248, '76048735868', 'PntyDXM1we', '2025-02-24 09:55:32', '唐詩涵', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175249, '7557018728', 'FP7ewzvIuJ', '2025-02-24 09:55:32', '薛詩涵', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175250, '16958841264', 'hRLUPpFXvt', '2025-02-24 09:55:32', '黎璐', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175251, '15709503576', 'eJx5mdK5xK', '2025-02-24 09:55:32', '汤云熙', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175252, '1047967422', 'Ty8OYP6w1V', '2025-02-24 09:55:32', '彭秀英', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175253, '13671448090', 'PnDoiPpvrm', '2025-02-24 09:55:32', '萧子异', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175254, '13647735571', 'CAqip9ub4e', '2025-02-24 09:55:32', '韦子异', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175255, '13326189770', 'nIusiwdgau', '2025-02-24 09:55:32', '黄子韬', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175256, '107221180', 'B2lhZA3Z7f', '2025-02-24 09:55:32', '莫安琪', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175257, '75504747729', 'tADljl9n49', '2025-02-24 09:55:32', '赵子韬', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175258, '75593636856', 'QRhgFzdpuE', '2025-02-24 09:55:32', '黎嘉伦', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175259, '76962939027', 'KM0W9ayRAz', '2025-02-24 09:55:32', '谭杰宏', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175260, '13014541732', 'Tvy81TxfOP', '2025-02-24 09:55:32', '陈杰宏', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175261, '283775539', '9XS8vK60B9', '2025-02-24 09:55:32', '郝云熙', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175262, '2873712038', 'OfK8MSUczG', '2025-02-24 09:55:32', '黎安琪', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175263, '210975235', '5MiIChAuX8', '2025-02-24 09:55:32', '郭嘉伦', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175264, '76911505559', 'P34sF9C4ty', '2025-02-24 09:55:32', '周嘉伦', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175265, '17502362647', 'MYbUM3vmEK', '2025-02-24 09:55:32', '沈晓明', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175266, '15215552079', 'cKXSlUOLs8', '2025-02-24 09:55:32', '钟秀英', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175267, '1078180229', 'vopTYmilHl', '2025-02-24 09:55:32', '秦嘉伦', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175268, '214494574', '5uG8nPZ8Pu', '2025-02-24 09:55:32', '傅宇宁', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175269, '2136748303', '5iOKhSYjTr', '2025-02-24 09:55:32', '龚晓明', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175270, '15822543786', 'DfWDZvCno3', '2025-02-24 09:55:32', '邱云熙', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175271, '215429825', 'Ud7Biu28pg', '2025-02-24 09:55:32', '蔡宇宁', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175272, '18036521535', 'ftAVp2vPOR', '2025-02-24 09:55:32', '蔡云熙', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175273, '14580417271', 'i3JAZ95kPV', '2025-02-24 09:55:32', '韩子韬', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175274, '13295202268', 'iUHpPMMWsF', '2025-02-24 09:55:32', '董子韬', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175275, '2841295695', 'S1AuaF7i8K', '2025-02-24 09:55:32', '程璐', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175276, '14190540753', 'q5IUFhgDkp', '2025-02-24 09:55:32', '于詩涵', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175277, '2871530161', 'hA8eDmgByO', '2025-02-24 09:55:32', '陈岚', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175278, '13987760554', 'yEBdB1FFF0', '2025-02-24 09:55:32', '王嘉伦', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175279, '17900415438', 'nBtDdN8rfJ', '2025-02-24 09:55:32', '姚晓明', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175280, '2133860486', 'GyWnqNTqeK', '2025-02-24 09:55:32', '郭宇宁', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175281, '16095363516', 'SHWYlmP3cF', '2025-02-24 09:55:32', '程晓明', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175282, '1038848397', 'FPl2VjT7tC', '2025-02-24 09:55:32', '吕宇宁', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175283, '19213509906', 'J8lKInjwH9', '2025-02-24 09:55:32', '蔡云熙', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175284, '16881411519', '7uV2IeBiW1', '2025-02-24 09:55:32', '杜震南', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175285, '16252766668', '2sttCEv5bJ', '2025-02-24 09:55:32', '段秀英', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175286, '211445098', '8PbOpksKOs', '2025-02-24 09:55:32', '范嘉伦', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175287, '2188000186', 'NLa0g5FxKu', '2025-02-24 09:55:32', '江璐', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175288, '7608854144', 'zuE1cG1UPh', '2025-02-24 09:55:32', '高震南', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175289, '16339432182', 'TtAlRz4JvJ', '2025-02-24 09:55:32', '雷致远', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175290, '204987043', 'ZanNq8KEvE', '2025-02-24 09:55:32', '贾嘉伦', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175291, '215326029', 'JCyXVpv4qB', '2025-02-24 09:55:32', '丁璐', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175292, '18093404589', 'oLq55RyaAy', '2025-02-24 09:55:32', '林睿', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175293, '100378875', 'cQNmUS8ZAx', '2025-02-24 09:55:32', '韦震南', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175294, '2860579823', 'GYCRWfvDpM', '2025-02-24 09:55:32', '杨安琪', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175295, '210941495', 'M1q69Q3V7F', '2025-02-24 09:55:32', '田睿', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175296, '2052557960', 'Zy88EfGzOe', '2025-02-24 09:55:32', '曾璐', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175297, '2170299177', '8QRvxXwICe', '2025-02-24 09:55:32', '范子异', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175298, '200845953', '3fckpqtA6W', '2025-02-24 09:55:32', '何璐', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175299, '19391000305', 'u2v87Ga1dg', '2025-02-24 09:55:32', '廖安琪', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175300, '16332567079', '8d2T8cUo9d', '2025-02-24 09:55:32', '段云熙', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175301, '7690711097', 'ftHrxgqShs', '2025-02-24 09:55:32', '程安琪', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175302, '13600200955', 'V0PFirMpLv', '2025-02-24 09:55:32', '卢睿', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175303, '2108103872', 'eXWnHGZjin', '2025-02-24 09:55:32', '杜安琪', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175304, '2056927098', 'IaVGq645SO', '2025-02-24 09:55:32', '韩睿', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175305, '19322263704', 'vQ4rjKmq7b', '2025-02-24 09:55:32', '曾子韬', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175306, '19778317484', 'j5dvdZNlpL', '2025-02-24 09:55:32', '胡子韬', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175307, '16957069300', 'YUmIVRprJs', '2025-02-24 09:55:32', '叶致远', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175308, '16598402750', '8a3rNw2BKb', '2025-02-24 09:55:32', '傅安琪', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175309, '7699605115', 'agCmn1pN8M', '2025-02-24 09:55:32', '金子异', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175310, '214946984', 'wsnfSaetUr', '2025-02-24 09:55:32', '高安琪', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175311, '7604504963', 'JiEGPLq8Qk', '2025-02-24 09:55:32', '卢云熙', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175312, '13631177385', 'DywWPxPxJx', '2025-02-24 09:55:32', '王震南', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175313, '18394855365', '7Uv7qzCW5S', '2025-02-24 09:55:32', '彭子韬', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175314, '7693887891', 'tDHLI2vAGy', '2025-02-24 09:55:32', '潘秀英', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175315, '13131077871', 'xNdqWpPmxC', '2025-02-24 09:55:32', '董子异', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175316, '19312775216', '2VUYo31X96', '2025-02-24 09:55:32', '熊致远', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175317, '14313521667', 'XB1HH3NODa', '2025-02-24 09:55:32', '张璐', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175318, '2124825736', 'k0Kd0QT7ti', '2025-02-24 09:55:32', '郝秀英', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175319, '17689135011', 'McLp577ugt', '2025-02-24 09:55:32', '郝杰宏', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175320, '17422454994', 'OyiVSZOgof', '2025-02-24 09:55:32', '范岚', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175321, '7692426435', 'I7hANC5yOf', '2025-02-24 09:55:32', '吕睿', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175322, '17957710265', 'LbKpakPTLP', '2025-02-24 09:55:32', '潘子异', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175323, '75569858044', '8uW6Ue2Puu', '2025-02-24 09:55:32', '钟云熙', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175324, '18950975307', 'Hh1PK2Dawx', '2025-02-24 09:55:32', '朱宇宁', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175325, '100637749', 'GeUu7LMUSF', '2025-02-24 09:55:32', '蒋秀英', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175326, '1057427384', '0WV0utLD0P', '2025-02-24 09:55:32', '徐嘉伦', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175327, '13059483832', 'b8mwojxmgP', '2025-02-24 09:55:32', '沈子异', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175328, '15018201532', 'jIGaaRohxZ', '2025-02-24 09:55:32', '谭宇宁', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175329, '289697440', 'X3WP7mV0a7', '2025-02-24 09:55:32', '王晓明', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175330, '75594311430', 'sfGvvEqGZM', '2025-02-24 09:55:32', '邓岚', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175331, '17694490099', 'bmAH49nl46', '2025-02-24 09:55:32', '韦子韬', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175332, '17287384707', 'tLpZh62QoJ', '2025-02-24 09:55:32', '黎云熙', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175333, '2135089429', 'qVhvlS6snH', '2025-02-24 09:55:32', '蔡岚', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175334, '13166952875', '7s2ASI0mgB', '2025-02-24 09:55:32', '唐睿', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175335, '13564170927', 'Kran9xvd6z', '2025-02-24 09:55:32', '许云熙', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175336, '213807942', 'lvfN44R9HR', '2025-02-24 09:55:32', '傅詩涵', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175337, '17986534824', 'P8sQf3edD1', '2025-02-24 09:55:32', '钱秀英', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175338, '16412404849', 'QVPwHPGZyU', '2025-02-24 09:55:32', '邹云熙', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175339, '2034131028', 'Na76UpyWsf', '2025-02-24 09:55:32', '蔡子异', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175340, '14364040345', 'BMZATtAjQb', '2025-02-24 09:55:32', '潘致远', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175341, '19178056079', 'e0Uqm8DBDI', '2025-02-24 09:55:32', '陆璐', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175342, '14717430819', 'ClvWUhSvq7', '2025-02-24 09:55:32', '陈震南', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175343, '288916979', '6WEcKO14at', '2025-02-24 09:55:32', '邱岚', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175344, '13441799621', 'UPhTSzCqNO', '2025-02-24 09:55:32', '金岚', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175345, '19960875772', 'TnDxPHy9uC', '2025-02-24 09:55:32', '彭震南', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175346, '19045724501', 'Rq7pJyEfy0', '2025-02-24 09:55:32', '高嘉伦', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175347, '17999547858', 'FeI1MJtJGK', '2025-02-24 09:55:32', '唐璐', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175348, '1065535011', 'liuU3cCHvK', '2025-02-24 09:55:32', '莫致远', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175349, '2862370705', 'wRYd3NxdBF', '2025-02-24 09:55:32', '叶宇宁', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175350, '15848528621', 'Z5ilA8j3Y2', '2025-02-24 09:55:32', '夏安琪', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175351, '280672236', 'LCTbOgOaw5', '2025-02-24 09:55:32', '宋安琪', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175352, '2193067149', '7EF7PbPd0e', '2025-02-24 09:55:32', '余晓明', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175353, '16283083855', 'FsV4p2nCPK', '2025-02-24 09:55:32', '钱嘉伦', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175354, '2018488977', 'LtEBILTGkV', '2025-02-24 09:55:32', '严詩涵', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175355, '13421487544', 'e3Lw8KeIvf', '2025-02-24 09:55:32', '刘詩涵', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175356, '15803957618', 'LlHUkOz8uB', '2025-02-24 09:55:32', '李安琪', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175357, '2059276116', 'Kav9yXnYQm', '2025-02-24 09:55:32', '侯安琪', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175358, '14166592569', '2q8gC5xOjO', '2025-02-24 09:55:32', '唐嘉伦', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175359, '17778910850', 'KgOCC8J1OW', '2025-02-24 09:55:32', '周云熙', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175360, '19475541964', 'b1wXNBI84J', '2025-02-24 09:55:32', '冯睿', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175361, '2888376553', 'd9Zu9tx68D', '2025-02-24 09:55:32', '任宇宁', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175362, '15757190143', 'p93RwizrD2', '2025-02-24 09:55:32', '谢詩涵', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175363, '283191377', 'RRe1e2N6a1', '2025-02-24 09:55:32', '蔡云熙', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175364, '201729586', 'DUko7dGVT4', '2025-02-24 09:55:32', '夏睿', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175365, '1019243637', '7OJ4d7vtOS', '2025-02-24 09:55:32', '赵睿', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175366, '75535831672', 'PcsK3rN1aX', '2025-02-24 09:55:32', '钟詩涵', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175367, '76029016304', 'JiKts7VEnI', '2025-02-24 09:55:32', '阎睿', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175368, '17594483544', 'aWun4Xwl6S', '2025-02-24 09:55:32', '彭震南', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175369, '2158206284', 'Qa2oCqcyF7', '2025-02-24 09:55:32', '徐晓明', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175370, '17135540403', 'Skj9w1al65', '2025-02-24 09:55:32', '谢詩涵', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175371, '219629470', '944YXMw8vd', '2025-02-24 09:55:32', '萧子韬', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175372, '7600340164', '7XOTrOn9hd', '2025-02-24 09:55:32', '周睿', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175373, '15940015595', 'fnSu6UirBB', '2025-02-24 09:55:32', '顾詩涵', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175374, '282731568', 'WMHdGGjvYB', '2025-02-24 09:55:32', '顾睿', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175375, '19349462465', '5aADeTZpED', '2025-02-24 09:55:32', '段杰宏', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175376, '17328925436', 'ugfZgZQek3', '2025-02-24 09:55:32', '邱杰宏', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175377, '16231536787', 'YWp2BPquoX', '2025-02-24 09:55:32', '廖震南', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175378, '18376226934', 'LjOLpaal5q', '2025-02-24 09:55:32', '雷詩涵', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175379, '75537885686', 'eroBnIld4M', '2025-02-24 09:55:32', '顾致远', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175380, '18064425936', '7XYrVehiGK', '2025-02-24 09:55:32', '孟杰宏', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175381, '16901944906', 'upLi5BiOQq', '2025-02-24 09:55:32', '梁嘉伦', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175382, '288235264', 'AQMCKyKfZ7', '2025-02-24 09:55:32', '邓安琪', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175383, '15595353312', 'VoneHNwNw8', '2025-02-24 09:55:32', '孙璐', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175384, '18621983558', 'aJDk5ZiSAZ', '2025-02-24 09:55:32', '崔嘉伦', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175385, '16348252890', 'Zt4oHevDpN', '2025-02-24 09:55:32', '金秀英', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175386, '19848900482', 'WCRfa8tFWx', '2025-02-24 09:55:32', '尹子异', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175387, '14704101913', 'OVNcKpinGn', '2025-02-24 09:55:32', '沈宇宁', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175388, '7551084999', 'vaW95z7moe', '2025-02-24 09:55:32', '郝秀英', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175389, '76020043269', 'AeicIx2Oqz', '2025-02-24 09:55:32', '冯岚', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175390, '75578641489', 'oRcx9ao03V', '2025-02-24 09:55:32', '孟安琪', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175391, '14346715588', 'OFUotDikot', '2025-02-24 09:55:32', '熊晓明', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175392, '14472298395', 'rueQ2Y8oDs', '2025-02-24 09:55:32', '雷秀英', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175393, '2892363302', 'T5bknrDaGT', '2025-02-24 09:55:32', '卢震南', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175394, '16807692768', 'DRazq0E5iX', '2025-02-24 09:55:32', '雷震南', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175395, '19418747132', 'bf34x8AzDs', '2025-02-24 09:55:32', '孔云熙', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175396, '13332000321', 'OHyByomNSx', '2025-02-24 09:55:32', '苏秀英', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175397, '19369462058', 'N0LCIiPvBB', '2025-02-24 09:55:32', '钟睿', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175398, '103688595', '4l4oKxSgWs', '2025-02-24 09:55:32', '冯睿', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175399, '7604072240', 'jfCZRfXFDR', '2025-02-24 09:55:32', '朱云熙', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175400, '75595099262', 'Z33lKRNfeH', '2025-02-24 09:55:32', '任杰宏', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175401, '102628293', '5YOXLCRPIR', '2025-02-24 09:55:32', '唐岚', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175402, '17924779243', 'MemDwCHBSr', '2025-02-24 09:55:32', '陆杰宏', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175403, '7556720398', 'ydXE6CkvwC', '2025-02-24 09:55:32', '李秀英', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175404, '16318685316', 'DKqcjowOLP', '2025-02-24 09:55:32', '蔡杰宏', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175405, '14501715644', 'IxfFieeXt7', '2025-02-24 09:55:32', '傅晓明', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175406, '283503849', 'VgJoPWi9tz', '2025-02-24 09:55:32', '田璐', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175407, '7606029166', 'zudQoMbnBn', '2025-02-24 09:55:32', '刘云熙', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175408, '215622349', 'K2qGPdO50G', '2025-02-24 09:55:32', '邹致远', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175409, '202383303', 'AT2UFnWcWI', '2025-02-24 09:55:32', '汪晓明', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175410, '18347753397', '5fdmqRrgqc', '2025-02-24 09:55:32', '朱璐', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175411, '14909517007', 'NEioxu2OMZ', '2025-02-24 09:55:32', '陈嘉伦', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175412, '14143092644', 'kRTo95yfCE', '2025-02-24 09:55:32', '莫子韬', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175413, '7556520858', 'f17Dww3ggd', '2025-02-24 09:55:32', '曾晓明', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175414, '18604120512', '7pwCmXfxWp', '2025-02-24 09:55:32', '薛晓明', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175415, '15228940329', 'zCHBJBf4Ga', '2025-02-24 09:55:32', '向晓明', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175416, '15903250870', 'CdK7tvAtY0', '2025-02-24 09:55:32', '杜云熙', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175417, '7694989927', '57HD6RSHXK', '2025-02-24 09:55:32', '杜安琪', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175418, '219364599', 'oex4jVVUot', '2025-02-24 09:55:32', '蔡云熙', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175419, '17431510766', '3Irb9DR03o', '2025-02-24 09:55:32', '张云熙', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175420, '202121841', 'RFZQAZPqVT', '2025-02-24 09:55:32', '武秀英', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175421, '14948281626', 'Gikgv3dDsX', '2025-02-24 09:55:32', '汤秀英', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175422, '1032805054', 'SS9V4YpUGf', '2025-02-24 09:55:32', '杨岚', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175423, '1043834399', 'GpAsYm4akY', '2025-02-24 09:55:32', '梁詩涵', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175424, '17382199777', 'EvY6KmkeVo', '2025-02-24 09:55:32', '范岚', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175425, '16750195453', 'gwYCLXRrac', '2025-02-24 09:55:32', '冯宇宁', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175426, '76037780269', 'oYJsT339Mu', '2025-02-24 09:55:32', '彭璐', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175427, '19415446636', 'vD2Cdhz3DG', '2025-02-24 09:55:32', '蒋岚', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175428, '18036112261', 'hOm5Bk94zN', '2025-02-24 09:55:32', '潘震南', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175429, '19299185522', 'uOZQgHrvmr', '2025-02-24 09:55:32', '郭詩涵', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175430, '215555641', 'EmXbX5Lys0', '2025-02-24 09:55:32', '蔡嘉伦', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175431, '13160478661', '3NEzFe9XSA', '2025-02-24 09:55:32', '王杰宏', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175432, '19305352659', 'MMCTmk54Yj', '2025-02-24 09:55:32', '袁岚', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175433, '13091261914', '3atZml15CR', '2025-02-24 09:55:32', '韦子异', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175434, '17559105834', 'c0K42Rjwp8', '2025-02-24 09:55:32', '侯子异', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175435, '210449426', 'RX0XS2L5Gs', '2025-02-24 09:55:32', '范嘉伦', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175436, '7608314454', 'uebYIYhuZL', '2025-02-24 09:55:32', '常震南', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175437, '19294585720', 'AzAag1oqRA', '2025-02-24 09:55:32', '郑詩涵', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175438, '1068914631', 'ncc4Vx2IlT', '2025-02-24 09:55:32', '贺云熙', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175439, '19503335661', 'H7jCsNovyd', '2025-02-24 09:55:32', '江睿', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175440, '2822728206', 'FYwcXmeC40', '2025-02-24 09:55:32', '董安琪', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175441, '15360515913', 'j9SLLFtYMF', '2025-02-24 09:55:32', '金致远', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175442, '2043723194', 'AJq0Z6B1wj', '2025-02-24 09:55:32', '姚安琪', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175443, '17522164061', 'NXA5FGrz4O', '2025-02-24 09:55:32', '萧嘉伦', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175444, '17949495216', 'M3vWODvmhw', '2025-02-24 09:55:32', '赵詩涵', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175445, '2075822255', 'mT5cBe0f3m', '2025-02-24 09:55:32', '赵晓明', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175446, '18899834492', 'FDQhIJguVb', '2025-02-24 09:55:32', '王岚', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175447, '2102066593', 'QdjTH5LF0E', '2025-02-24 09:55:32', '韦安琪', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175448, '17480269547', 'co3NZralFZ', '2025-02-24 09:55:32', '谢睿', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175449, '18765690132', 'Hr1p2La0Jh', '2025-02-24 09:55:32', '杨子异', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175450, '14492747156', '46rhV4XMU6', '2025-02-24 09:55:32', '傅晓明', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175451, '1086341034', 'vutBx8e4VH', '2025-02-24 09:55:32', '贺詩涵', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175452, '76038623194', 'nmU3SDErNY', '2025-02-24 09:55:32', '廖睿', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175453, '17893494379', 'WoMfZTLfgj', '2025-02-24 09:55:32', '陶睿', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175454, '75522179618', '73UTZ8Glmu', '2025-02-24 09:55:32', '钟子异', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175455, '19289926153', 'xWNGcd0zOt', '2025-02-24 09:55:32', '邱云熙', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175456, '17248398489', 'vKc0NgCkw2', '2025-02-24 09:55:32', '阎子异', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175457, '14645277081', 'P5aAaAmQla', '2025-02-24 09:55:32', '韩震南', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175458, '214730476', '9UOWPYRDMc', '2025-02-24 09:55:32', '赵璐', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175459, '7695631763', 'NH1S0rYwlw', '2025-02-24 09:55:32', '汤睿', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175460, '19866767198', '7OV4k0f6IG', '2025-02-24 09:55:32', '钱璐', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175461, '7603925445', 'lFl2GyoMBC', '2025-02-24 09:55:32', '刘詩涵', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175462, '19605567255', 'kGgvwLfFeE', '2025-02-24 09:55:32', '向致远', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175463, '7604139372', 'JcDcbCax8H', '2025-02-24 09:55:32', '韩宇宁', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175464, '13772211504', 'qlaweQIMsw', '2025-02-24 09:55:32', '熊晓明', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175465, '19548063195', 'EY52F00k7m', '2025-02-24 09:55:32', '李嘉伦', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175466, '15773845614', 'Yl4NotCJfb', '2025-02-24 09:55:32', '高子异', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175467, '76961624591', 'KB86t4r4Ns', '2025-02-24 09:55:32', '钟致远', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175468, '75564425415', 'lrmoclKQpQ', '2025-02-24 09:55:32', '余睿', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175469, '17232841400', 'UN4u0xeFJS', '2025-02-24 09:55:32', '陆岚', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175470, '14925931302', '07gc4JRuW2', '2025-02-24 09:55:32', '罗震南', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175471, '19410148121', '5pzV4DlfPb', '2025-02-24 09:55:32', '熊宇宁', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175472, '14166055420', 'zjEGlMPyyn', '2025-02-24 09:55:32', '曹睿', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175473, '202248626', 'ZZYZK8JPqs', '2025-02-24 09:55:32', '黄子异', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175474, '17095433374', 'hEedLrGLUi', '2025-02-24 09:55:32', '傅睿', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175475, '2824415275', 'TrZwsGAa86', '2025-02-24 09:55:32', '郭致远', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175476, '16386926127', 'aWYbBqjtw2', '2025-02-24 09:55:32', '贾晓明', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175477, '2174465934', '9yK833zGPH', '2025-02-24 09:55:32', '任秀英', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175478, '2842517826', 'X8lYSclQs2', '2025-02-24 09:55:32', '郭震南', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175479, '16380229904', '4QhqTbFMD6', '2025-02-24 09:55:32', '魏致远', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175480, '15872160332', 'UBurCrm2wE', '2025-02-24 09:55:32', '梁致远', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175481, '14020431741', '63ank2nAxR', '2025-02-24 09:55:32', '熊子异', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175482, '14500740864', 'UBt7SX1Nif', '2025-02-24 09:55:32', '汪宇宁', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175483, '203876803', 'ww8qDkCxSd', '2025-02-24 09:55:32', '李睿', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175484, '17307848084', 'EVfkxeu0ed', '2025-02-24 09:55:32', '夏晓明', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175485, '2194117382', 'Bu6nJVJPYQ', '2025-02-24 09:55:32', '姚云熙', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175486, '19310810677', 'FLdpmbk76F', '2025-02-24 09:55:32', '赵云熙', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175487, '204147088', 'suixDho4v4', '2025-02-24 09:55:32', '钟云熙', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175488, '2125827959', 'MDbFRpTnfG', '2025-02-24 09:55:32', '吴子异', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175489, '7554151897', 'brSzorom6p', '2025-02-24 09:55:32', '马秀英', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175490, '15996799657', 'fKUVCgExJy', '2025-02-24 09:55:32', '秦安琪', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175491, '17590038872', 'eHTC6Mt4SP', '2025-02-24 09:55:32', '徐詩涵', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175492, '75599032083', 'UXOPNrrOsh', '2025-02-24 09:55:32', '于云熙', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175493, '75572456720', 'v4iIHb52Ei', '2025-02-24 09:55:32', '武宇宁', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175494, '13171015780', 'H2oi44uGwO', '2025-02-24 09:55:32', '吴子异', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175495, '7695166994', 'gYugAupCYH', '2025-02-24 09:55:32', '武岚', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175496, '2837182487', '0vKcHchB2Y', '2025-02-24 09:55:32', '陶睿', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175497, '7550351590', 'i1jPtuHOZj', '2025-02-24 09:55:32', '苏致远', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175498, '7602755224', 'wx66arXqc9', '2025-02-24 09:55:32', '邹安琪', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175499, '18619230846', 'PgnJte8eQd', '2025-02-24 09:55:32', '徐嘉伦', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175500, '13302021818', 'W2SDAuLqRh', '2025-02-24 09:55:32', '邱致远', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175501, '103510844', 'xturZ285al', '2025-02-24 09:55:32', '彭晓明', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175502, '15913189123', 'MCb0J90or0', '2025-02-24 09:55:32', '萧璐', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175503, '287619464', 'lGofUSHGrT', '2025-02-24 09:55:32', '王云熙', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175504, '16738387953', 'Tt7zuCancy', '2025-02-24 09:55:32', '陶秀英', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175505, '13927848169', 'SfVy2LtDkR', '2025-02-24 09:55:32', '林震南', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175506, '2028165684', 'CrkBgsViZL', '2025-02-24 09:55:32', '胡子韬', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175507, '2842015138', 'ohJ9lF06it', '2025-02-24 09:55:32', '钱詩涵', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175508, '15477973328', 'yK6PFqkzyf', '2025-02-24 09:55:32', '谭璐', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175509, '15253823328', '4RbF8qY6sc', '2025-02-24 09:55:32', '陆岚', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175510, '76052117877', 'wuVMq5zvK2', '2025-02-24 09:55:32', '姚安琪', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175511, '75517448999', 'xWwvugAn48', '2025-02-24 09:55:32', '任子韬', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175512, '289026271', 'FPEPDAxe0t', '2025-02-24 09:55:32', '龚子异', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175513, '2196140412', '8SXdFUED1z', '2025-02-24 09:55:32', '唐致远', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175514, '17063414930', 'EyIF0xuJWC', '2025-02-24 09:55:32', '贾詩涵', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175515, '102675544', '1BDb8VsMzB', '2025-02-24 09:55:32', '蔡云熙', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175516, '15668627665', '6NuIDB7bJa', '2025-02-24 09:55:32', '魏嘉伦', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175517, '16253453290', '1tYMOpfPRp', '2025-02-24 09:55:32', '袁安琪', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175518, '18440922839', 'ubuFUipxm0', '2025-02-24 09:55:32', '廖岚', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175519, '15765016048', 'adqXTjfUeu', '2025-02-24 09:55:32', '傅云熙', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175520, '76000267688', 'Nd57Urv7gf', '2025-02-24 09:55:32', '方嘉伦', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175521, '2101833516', 'YXoT4OWt5d', '2025-02-24 09:55:32', '杨璐', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175522, '7603739536', 'rx4bO6VhmK', '2025-02-24 09:55:32', '廖嘉伦', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175523, '102522529', 'WiEkHBbPno', '2025-02-24 09:55:32', '苏致远', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175524, '2116697198', 'tY47FronfW', '2025-02-24 09:55:32', '邓岚', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175525, '219404309', 'q9RTjaxeB8', '2025-02-24 09:55:32', '彭子韬', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175526, '108397052', '45F3g5ZtCh', '2025-02-24 09:55:32', '梁震南', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175527, '7558989094', 'AnZAfs7sTH', '2025-02-24 09:55:32', '江子异', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175528, '17924249643', '7Mop2JQoNk', '2025-02-24 09:55:32', '丁致远', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175529, '281646138', 'G8MEaQog62', '2025-02-24 09:55:32', '许璐', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175530, '16378365609', 'j9U7tKh707', '2025-02-24 09:55:32', '范璐', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175531, '13676842017', 'vjOAMymKYh', '2025-02-24 09:55:32', '尹子韬', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175532, '16933788864', 'YjwcSQ267J', '2025-02-24 09:55:32', '武詩涵', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175533, '100001804', 'PejEt0nJMc', '2025-02-24 09:55:32', '方岚', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175534, '107788817', 'lQAyRpIUF6', '2025-02-24 09:55:32', '周杰宏', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175535, '76991225227', 'vKrcUvsl8i', '2025-02-24 09:55:32', '杨致远', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175536, '2056381203', 'Lf0G6NM4HT', '2025-02-24 09:55:32', '任睿', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175537, '18199140814', '54Po3Y2GaE', '2025-02-24 09:55:32', '宋睿', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175538, '14469323890', 'MwuqUeVeXp', '2025-02-24 09:55:32', '石璐', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175539, '13466449000', 'JPj8eMHWpY', '2025-02-24 09:55:32', '钱致远', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175540, '14904066375', 'jOsHSwFY1f', '2025-02-24 09:55:32', '潘秀英', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175541, '19452933436', 'bNNKMEoshC', '2025-02-24 09:55:32', '吕震南', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175542, '18015602305', 'aFGp93qArN', '2025-02-24 09:55:32', '吴子韬', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175543, '2860822673', '5cL5WZrwZ6', '2025-02-24 09:55:32', '孟致远', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175544, '2147136611', 'XtT1JlbAg4', '2025-02-24 09:55:32', '李杰宏', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175545, '2189595745', 'UIFSE9wq41', '2025-02-24 09:55:32', '夏云熙', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175546, '76991319782', 'yWo9oHDyEb', '2025-02-24 09:55:32', '梁璐', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175547, '2041862584', 'fIaLcKQMfb', '2025-02-24 09:55:32', '史子异', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175548, '207012404', 'f2tHNfGFXg', '2025-02-24 09:55:32', '任睿', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175549, '286771022', 'Sqk1PFaeSp', '2025-02-24 09:55:32', '钟睿', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175550, '16569565939', 'LtvvIDZFNo', '2025-02-24 09:55:32', '何嘉伦', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175551, '101871576', 'AgMSmurK0R', '2025-02-24 09:55:32', '田詩涵', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175552, '75575411219', 'wYQXAMMCGP', '2025-02-24 09:55:32', '陆致远', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175553, '19357839118', '0XScUbcKIG', '2025-02-24 09:55:32', '严睿', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175554, '18924956610', 'KE6q5NhO6e', '2025-02-24 09:55:32', '于詩涵', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175555, '108418587', '4r4CIwod1c', '2025-02-24 09:55:32', '崔子韬', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175556, '13326320549', 'uf4lj3JYRk', '2025-02-24 09:55:32', '雷子韬', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175557, '13950973129', 'iEhGVxc14G', '2025-02-24 09:55:32', '邱璐', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175558, '2826713157', 'JTr4AVfEyf', '2025-02-24 09:55:32', '方子异', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175559, '18864907904', 'IKq3leCHnw', '2025-02-24 09:55:32', '尹致远', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175560, '2120253959', 'kirSkKpvMs', '2025-02-24 09:55:32', '邹岚', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175561, '1069083438', 'xVPGvGS6bY', '2025-02-24 09:55:32', '唐睿', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175562, '19035627505', 'qhIraq8Tzl', '2025-02-24 09:55:32', '戴子异', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175563, '16611513838', 'MN9ioj3cgB', '2025-02-24 09:55:32', '曹云熙', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175564, '17676918427', 'w7UnfZES9t', '2025-02-24 09:55:32', '龙震南', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175565, '18016389810', 'lAM792bo94', '2025-02-24 09:55:32', '彭子韬', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175566, '18206146288', 'IxDs8xjMXQ', '2025-02-24 09:55:32', '崔秀英', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175567, '76009297604', 'GAbBvMfTVA', '2025-02-24 09:55:32', '邓安琪', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175568, '17938622488', 'iA5sS7OUPA', '2025-02-24 09:55:32', '郭致远', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175569, '108464084', 'O9Yhxjiyaz', '2025-02-24 09:55:32', '钱致远', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175570, '106620402', 'u0c97BF8Z1', '2025-02-24 09:55:32', '董秀英', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175571, '16245454436', 'G8PCoDM7hf', '2025-02-24 09:55:32', '黎云熙', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175572, '16689102630', 'oZwygGEOEd', '2025-02-24 09:55:32', '朱安琪', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175573, '76982352988', 'T5i2OOGq4Q', '2025-02-24 09:55:32', '于晓明', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175574, '7600973316', 'FggSvZqO0P', '2025-02-24 09:55:32', '邓詩涵', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175575, '1064293641', 'OTpuDkf8W5', '2025-02-24 09:55:32', '方子韬', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175576, '17724351837', 'kRhxn0FgI0', '2025-02-24 09:55:32', '孔致远', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175577, '14399516755', 'VsndrmCYOp', '2025-02-24 09:55:32', '钟安琪', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175578, '2008919704', 'cSrsjlvTAy', '2025-02-24 09:55:32', '朱震南', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175579, '100782489', 'ThdtSRG013', '2025-02-24 09:55:32', '范致远', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175580, '101493555', 'USX2K8wT3b', '2025-02-24 09:55:32', '吴岚', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175581, '76991708385', 'QCfW9lROSi', '2025-02-24 09:55:32', '林宇宁', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175582, '76097940916', 'JsmudVD8TZ', '2025-02-24 09:55:32', '蒋子异', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175583, '7559959237', 'ARvWLFVv4y', '2025-02-24 09:55:32', '钱宇宁', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175584, '15954467957', 'cScrJiJJOQ', '2025-02-24 09:55:32', '贾秀英', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175585, '2112947509', 'djcpfrfbqN', '2025-02-24 09:55:32', '龙震南', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175586, '205987095', 'UsCXZpt1dd', '2025-02-24 09:55:32', '高秀英', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175587, '16952259719', 's5vhamTitP', '2025-02-24 09:55:32', '罗安琪', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175588, '15092794057', 'rvplnJh4Rs', '2025-02-24 09:55:32', '郑岚', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175589, '7553247214', 'd9A5jSBa4E', '2025-02-24 09:55:32', '侯璐', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175590, '14174692843', '3h3Uxsh6bY', '2025-02-24 09:55:32', '冯杰宏', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175591, '106497723', 'qnMYvIx0fC', '2025-02-24 09:55:32', '萧睿', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175592, '7553963789', '2iJJH27kFw', '2025-02-24 09:55:32', '严云熙', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175593, '210551251', 'u7yQb49PZO', '2025-02-24 09:55:32', '潘宇宁', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175594, '217063768', '2rxPCSTrUk', '2025-02-24 09:55:32', '刘嘉伦', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175595, '17157182527', 'd2LOSA2T2i', '2025-02-24 09:55:32', '王子异', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175596, '1051541684', 'fLyzAr3lYh', '2025-02-24 09:55:32', '谢岚', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175597, '7601841771', 'Z5cs4kAMYk', '2025-02-24 09:55:32', '苏岚', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175598, '18604032343', 'zp3PkMvr5C', '2025-02-24 09:55:32', '龙岚', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175599, '2092322807', 'K5eKq9mXpV', '2025-02-24 09:55:32', '何杰宏', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175600, '2136265908', 'a7gjuk9LQx', '2025-02-24 09:55:32', '杜宇宁', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175601, '17461171761', 'jQR6MFvVGS', '2025-02-24 09:55:32', '潘晓明', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175602, '7604305394', 'TVvmH2lxe1', '2025-02-24 09:55:32', '廖宇宁', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175603, '7604086612', '7sXfdF6uaV', '2025-02-24 09:55:32', '夏杰宏', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175604, '76050865161', 'VOzue4Z5UB', '2025-02-24 09:55:32', '侯子异', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175605, '16128719754', 'LWBSKRhaJu', '2025-02-24 09:55:32', '任璐', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175606, '13080753379', 'ej0Eh5ZlPz', '2025-02-24 09:55:32', '卢安琪', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175607, '19599067151', 'jafGK85bnl', '2025-02-24 09:55:32', '陈晓明', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175608, '13361849472', 'SxUPLuafiz', '2025-02-24 09:55:32', '刘嘉伦', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175609, '2814677697', 'iXNyGVWlBA', '2025-02-24 09:55:32', '魏璐', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175610, '19107797628', 'TrnOw7DbSE', '2025-02-24 09:55:32', '胡嘉伦', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175611, '2185523349', '9KqveqLFeu', '2025-02-24 09:55:32', '曹震南', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175612, '206385662', 'xupEZJZpVv', '2025-02-24 09:55:32', '魏晓明', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175613, '201244427', 'bZ6FLmjxHh', '2025-02-24 09:55:32', '程致远', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175614, '280967614', 'FW6FaLeiPb', '2025-02-24 09:55:32', '冯震南', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175615, '283527442', 'Z6HoXE2zGE', '2025-02-24 09:55:32', '丁致远', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175616, '202494498', 'zPYWM9FKmm', '2025-02-24 09:55:32', '宋宇宁', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175617, '19140440951', '9tt7PCn3id', '2025-02-24 09:55:32', '雷晓明', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175618, '13579253659', 'n9HtdOlRaD', '2025-02-24 09:55:32', '于杰宏', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175619, '280044775', 'ZNXxZzOdw2', '2025-02-24 09:55:32', '陈宇宁', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175620, '287325600', 'v8005qgbDU', '2025-02-24 09:55:32', '陈宇宁', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175621, '16076719256', '0gGbJ09fnl', '2025-02-24 09:55:32', '董璐', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175622, '207140267', 'HaIo1MFRyL', '2025-02-24 09:55:32', '黎嘉伦', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175623, '7604516552', 'e5pEuLUW66', '2025-02-24 09:55:32', '石晓明', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175624, '13536294186', 'dTSPDiKCrA', '2025-02-24 09:55:32', '董秀英', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175625, '16259496002', '1X6bB34OKd', '2025-02-24 09:55:32', '罗致远', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175626, '18600822283', '87a0bzPGKp', '2025-02-24 09:55:32', '邱岚', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175627, '15688276790', 'tSSoKWB8lG', '2025-02-24 09:55:32', '何子韬', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175628, '18325966867', 'MOqHjXFRGh', '2025-02-24 09:55:32', '黄云熙', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175629, '19056751562', 'y89AvpT7u3', '2025-02-24 09:55:32', '徐璐', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175630, '2166539340', 'BVAWA0owqW', '2025-02-24 09:55:32', '吴杰宏', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175631, '19137045507', 'EeXnXrYIYD', '2025-02-24 09:55:32', '姜岚', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175632, '75530524648', 'GsE9hI2DRj', '2025-02-24 09:55:32', '蔡璐', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175633, '7691648922', 'SO7DwBNdjq', '2025-02-24 09:55:32', '陆秀英', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175634, '13299325154', 'OFt3Gx0h8r', '2025-02-24 09:55:32', '邓秀英', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175635, '2835667356', 'MkwVQkaNlL', '2025-02-24 09:55:32', '吕秀英', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175636, '107343205', 'n2SKeFi0sM', '2025-02-24 09:55:32', '任安琪', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175637, '14054165398', '87Lfn6kdD0', '2025-02-24 09:55:32', '尹云熙', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175638, '15591792586', 'gj39n3MxPY', '2025-02-24 09:55:32', '张子异', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175639, '13854516375', 'dB0OFtBf6t', '2025-02-24 09:55:32', '何璐', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175640, '13097014303', 'px1jenOxQK', '2025-02-24 09:55:32', '汪子韬', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175641, '7555437909', 'rb5qRM9Qo3', '2025-02-24 09:55:32', '张杰宏', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175642, '200219914', 'kbNsU0kNLX', '2025-02-24 09:55:32', '邓詩涵', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175643, '204099379', 'e5yctIfALF', '2025-02-24 09:55:32', '徐秀英', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175644, '17501484980', 'igIA1WqVHU', '2025-02-24 09:55:32', '薛子异', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175645, '2040903822', 'eRY77FAd6H', '2025-02-24 09:55:32', '龚璐', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175646, '14237366811', 'MxWQT4EVE2', '2025-02-24 09:55:32', '唐致远', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175647, '217031101', 'oxq5UvxdLE', '2025-02-24 09:55:32', '邓璐', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175648, '18364839483', 'qKeAzPl0pY', '2025-02-24 09:55:32', '黎子异', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175649, '18175456512', 'NfzmUpovYg', '2025-02-24 09:55:32', '郭致远', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175650, '7555160947', 'uv1luyn9VJ', '2025-02-24 09:55:32', '林子异', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175651, '15729693028', 'wuoTtN4rcC', '2025-02-24 09:55:32', '向安琪', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175652, '19627710411', 'iVK5EGEze5', '2025-02-24 09:55:32', '方璐', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175653, '75583621811', 'CFYexlF7Kj', '2025-02-24 09:55:32', '汪睿', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175654, '211821256', 'NPTqEo52OK', '2025-02-24 09:55:32', '郝璐', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175655, '17051729681', 'caWYvUTVU9', '2025-02-24 09:55:32', '石璐', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175656, '1026565131', '5hbMFDeUp9', '2025-02-24 09:55:32', '向詩涵', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175657, '1058408030', 'SOqEPnCtIS', '2025-02-24 09:55:32', '陶嘉伦', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175658, '18012623647', '1KZ62RpXce', '2025-02-24 09:55:32', '贾晓明', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175659, '2171647294', '3Pjc2V0w9z', '2025-02-24 09:55:32', '陈晓明', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175660, '19910415395', 'DQdZsIO8Yp', '2025-02-24 09:55:32', '董震南', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175661, '13031937667', 'HBvsFtaaVr', '2025-02-24 09:55:32', '孟子异', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175662, '2126890629', '0bgvXrLpkR', '2025-02-24 09:55:32', '于岚', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175663, '14454003478', 'trbhCmVIfx', '2025-02-24 09:55:32', '冯詩涵', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175664, '17816095633', 'bqvJLLEso2', '2025-02-24 09:55:32', '杜秀英', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175665, '14259827652', 'zhEVSdfHU0', '2025-02-24 09:55:32', '顾震南', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175666, '18062148875', 'FKusm6112l', '2025-02-24 09:55:32', '赵子韬', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175667, '17318358199', 'yDAVxOXq9J', '2025-02-24 09:55:32', '何晓明', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175668, '108744125', 'J5XFj5LNbY', '2025-02-24 09:55:32', '朱秀英', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175669, '7602370667', 'sqOAU1mT3s', '2025-02-24 09:55:32', '冯致远', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175670, '18636531539', 'iFU1cLrbLL', '2025-02-24 09:55:32', '吴晓明', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175671, '7556220959', 'Bwm3s0vKnQ', '2025-02-24 09:55:32', '姚震南', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175672, '76993823345', 'rDFP8ujbZu', '2025-02-24 09:55:32', '胡子异', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175673, '14322858976', '99WfyJV6PL', '2025-02-24 09:55:32', '郝岚', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175674, '17025673628', 'OhcIxYsZhJ', '2025-02-24 09:55:32', '叶云熙', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175675, '7602817060', 'jAqA2c2xEX', '2025-02-24 09:55:32', '邹宇宁', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175676, '7699179343', 'BWEXMcuNb3', '2025-02-24 09:55:32', '杨云熙', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175677, '76932429532', 'mdjDI5III3', '2025-02-24 09:55:32', '龙璐', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175678, '15319954157', '9n8KggIPlz', '2025-02-24 09:55:32', '龚安琪', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175679, '1009821043', 'Gmxc0kiawo', '2025-02-24 09:55:32', '孟安琪', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175680, '2055116727', 'R9JVNMwWMT', '2025-02-24 09:55:32', '尹睿', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175681, '18834269585', 'ZUDPqbgEHd', '2025-02-24 09:55:32', '陶璐', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175682, '18182460179', 'X0HGBIuOYj', '2025-02-24 09:55:32', '罗璐', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175683, '15578023108', 'N0NxyoE7lZ', '2025-02-24 09:55:32', '苏宇宁', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175684, '1001145810', '3dokS2dnHr', '2025-02-24 09:55:32', '潘云熙', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175685, '16935767754', 'LyCp1QlwF0', '2025-02-24 09:55:32', '顾宇宁', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175686, '18177197265', 'aO9eQbRpxg', '2025-02-24 09:55:32', '卢安琪', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175687, '75567953532', '554xXhlldj', '2025-02-24 09:55:32', '钟嘉伦', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175688, '14896954695', 'cRDHVlZCH5', '2025-02-24 09:55:32', '袁璐', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175689, '216686232', 'bo2sIupgJm', '2025-02-24 09:55:32', '夏子韬', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175690, '76925730372', 'PSCFMailnJ', '2025-02-24 09:55:32', '魏晓明', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175691, '15312714153', 'Se9dJG0r19', '2025-02-24 09:55:32', '常嘉伦', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175692, '2060476754', 'YOak1pRggQ', '2025-02-24 09:55:32', '苏子异', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175693, '14556714633', 'HtDAppbhKr', '2025-02-24 09:55:32', '魏秀英', NULL, 0, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175694, '15731837428', 'mZDZlEAbBd', '2025-02-24 09:55:32', '金子异', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175695, '13117848800', 'Ie6XTdx7Aj', '2025-02-24 09:55:32', '林晓明', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175696, '2070896268', 'iz1Cp38SRK', '2025-02-24 09:55:32', '卢睿', NULL, 1, NULL); +INSERT INTO `tb_user` VALUES (1893836584118175697, '19753631803', 'PlFvCmamFh', '2025-02-24 09:55:32', '黄岚', NULL, 0, NULL); + +-- ---------------------------- +-- Table structure for tb_user_behavior +-- ---------------------------- +DROP TABLE IF EXISTS `tb_user_behavior`; +CREATE TABLE `tb_user_behavior` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '编号', + `user_id` bigint(20) NULL DEFAULT NULL COMMENT '用户编号', + `item_id` bigint(20) NULL DEFAULT NULL COMMENT '商品编号', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `type` tinyint(1) NULL DEFAULT NULL COMMENT '1 收藏 2 喜欢', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1888959539441606658 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '用户行为表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of tb_user_behavior +-- ---------------------------- +INSERT INTO `tb_user_behavior` VALUES (1868663856318935042, 1863920777825390593, 11, '2024-12-16 22:25:56', 1); +INSERT INTO `tb_user_behavior` VALUES (1868670681277804545, 1863920777825390593, 11, '2024-12-16 22:53:03', 2); +INSERT INTO `tb_user_behavior` VALUES (1888959452418187265, 1888931423629377538, 1291546, '2025-02-10 14:34:03', 1); +INSERT INTO `tb_user_behavior` VALUES (1888959480515829762, 1888931423629377538, 1291548, '2025-02-10 14:34:09', 1); +INSERT INTO `tb_user_behavior` VALUES (1888959519942287361, 1888931423629377538, 1291552, '2025-02-10 14:34:19', 1); +INSERT INTO `tb_user_behavior` VALUES (1888959539441606657, 1888931423629377538, 1292370, '2025-02-10 14:34:24', 1); + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/front/pom.xml b/front/pom.xml new file mode 100644 index 0000000..03ea900 --- /dev/null +++ b/front/pom.xml @@ -0,0 +1,38 @@ + + + io.renren + block-identity-auth + 5.4.0 + + 4.0.0 + front + jar + front + + + + io.renren + common + 5.4.0 + + + + + + + ${project.artifactId} + + + org.springframework.boot + spring-boot-maven-plugin + + + org.apache.maven.plugins + maven-surefire-plugin + + true + + + + + diff --git a/front/src/main/java/io/FrontApplication.java b/front/src/main/java/io/FrontApplication.java new file mode 100644 index 0000000..56be7e1 --- /dev/null +++ b/front/src/main/java/io/FrontApplication.java @@ -0,0 +1,20 @@ +package io; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; + +/** + * front + */ +@SpringBootApplication +public class FrontApplication extends SpringBootServletInitializer { + public static void main(String[] args) { + SpringApplication.run(FrontApplication.class, args); + } + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { + return application.sources(FrontApplication.class); + } +} diff --git a/front/src/main/java/io/annotation/Login.java b/front/src/main/java/io/annotation/Login.java new file mode 100644 index 0000000..153c166 --- /dev/null +++ b/front/src/main/java/io/annotation/Login.java @@ -0,0 +1,15 @@ + + +package io.annotation; + +import java.lang.annotation.*; + +/** + * 登录效验 + + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface Login { +} diff --git a/front/src/main/java/io/annotation/LoginUser.java b/front/src/main/java/io/annotation/LoginUser.java new file mode 100644 index 0000000..03602d6 --- /dev/null +++ b/front/src/main/java/io/annotation/LoginUser.java @@ -0,0 +1,19 @@ + + +package io.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 登录用户信息 + * + + */ +@Target(ElementType.PARAMETER) +@Retention(RetentionPolicy.RUNTIME) +public @interface LoginUser { + +} diff --git a/front/src/main/java/io/config/FilterConfig.java b/front/src/main/java/io/config/FilterConfig.java new file mode 100644 index 0000000..cae8b06 --- /dev/null +++ b/front/src/main/java/io/config/FilterConfig.java @@ -0,0 +1,27 @@ +//package io.config; +// +//import io.common.xss.XssFilter; +//import jakarta.servlet.DispatcherType; +//import org.springframework.boot.web.servlet.FilterRegistrationBean; +//import org.springframework.context.annotation.Bean; +//import org.springframework.context.annotation.Configuration; +// +// +///** +// * Filter配置 +// * +// +// */ +//@Configuration +//public class FilterConfig { +// +// @Bean +// public FilterRegistrationBean xssFilterRegistration() { +// FilterRegistrationBean registration = new FilterRegistrationBean(); +// registration.setDispatcherTypes(DispatcherType.REQUEST); +// registration.setFilter(new XssFilter()); +// registration.addUrlPatterns("/*"); +// registration.setName("xssFilter"); +// return registration; +// } +//} diff --git a/front/src/main/java/io/config/MybatisPlusConfig.java b/front/src/main/java/io/config/MybatisPlusConfig.java new file mode 100644 index 0000000..7a129f9 --- /dev/null +++ b/front/src/main/java/io/config/MybatisPlusConfig.java @@ -0,0 +1,36 @@ + + +package io.config; + +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.BlockAttackInnerInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * mybatis-plus配置 + * + + */ +@Configuration +public class MybatisPlusConfig { + + /** + * 配置分页等 + */ + @Bean + public MybatisPlusInterceptor mybatisPlusInterceptor() { + MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor(); + // 分页插件 + mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor()); + // 乐观锁 + mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); + // 防止全表更新与删除 + mybatisPlusInterceptor.addInnerInterceptor(new BlockAttackInnerInterceptor()); + + return mybatisPlusInterceptor; + } + +} diff --git a/front/src/main/java/io/config/ResourceConfig.java b/front/src/main/java/io/config/ResourceConfig.java new file mode 100644 index 0000000..c6a9b86 --- /dev/null +++ b/front/src/main/java/io/config/ResourceConfig.java @@ -0,0 +1,19 @@ +package io.config; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + + +@Configuration +public class ResourceConfig implements WebMvcConfigurer { + @Value("${spring.web.resources.static-locations}") + private String path; + + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) { + registry.addResourceHandler("/upload/**") + .addResourceLocations(path); + } +} \ No newline at end of file diff --git a/front/src/main/java/io/config/SwaggerConfig.java b/front/src/main/java/io/config/SwaggerConfig.java new file mode 100644 index 0000000..430fd00 --- /dev/null +++ b/front/src/main/java/io/config/SwaggerConfig.java @@ -0,0 +1,41 @@ + + +package io.config; + +import io.common.constant.Constant; +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.info.Info; +import io.swagger.v3.oas.models.security.SecurityRequirement; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.ArrayList; +import java.util.List; + + +@Configuration +public class SwaggerConfig { + @Bean + public OpenAPI createRestApi() { + return new OpenAPI() + .info(apiInfo()) + .security(security()); + } + + private Info apiInfo() { + return new Info() + .title("系统") + .description("api文档") + .version("5.x"); + } + + private List security() { + SecurityRequirement key = new SecurityRequirement(); + key.addList(Constant.TOKEN_HEADER, Constant.TOKEN_HEADER); + + List list = new ArrayList<>(); + list.add(key); + return list; + } + +} diff --git a/front/src/main/java/io/config/WebMvcConfig.java b/front/src/main/java/io/config/WebMvcConfig.java new file mode 100644 index 0000000..6dbffbf --- /dev/null +++ b/front/src/main/java/io/config/WebMvcConfig.java @@ -0,0 +1,80 @@ + + +package io.config; + +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.module.SimpleModule; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import io.common.utils.DateUtils; +import io.interceptor.AuthorizationInterceptor; +import io.resolver.LoginUserHandlerMethodArgumentResolver; +import jakarta.annotation.Resource; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.converter.ByteArrayHttpMessageConverter; +import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.http.converter.ResourceHttpMessageConverter; +import org.springframework.http.converter.StringHttpMessageConverter; +import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; +import org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter; +import org.springframework.web.method.support.HandlerMethodArgumentResolver; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +import java.text.SimpleDateFormat; +import java.util.List; +import java.util.TimeZone; + +/** + * MVC配置 + * + + */ +@Configuration +public class WebMvcConfig implements WebMvcConfigurer { + @Resource + private AuthorizationInterceptor authorizationInterceptor; + @Resource + private LoginUserHandlerMethodArgumentResolver loginUserHandlerMethodArgumentResolver; + + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(authorizationInterceptor).addPathPatterns("/api/**"); + } + + @Override + public void addArgumentResolvers(List argumentResolvers) { + argumentResolvers.add(loginUserHandlerMethodArgumentResolver); + } + + @Override + public void configureMessageConverters(List> converters) { + converters.add(new ByteArrayHttpMessageConverter()); + converters.add(new StringHttpMessageConverter()); + converters.add(new ResourceHttpMessageConverter()); + converters.add(new AllEncompassingFormHttpMessageConverter()); + converters.add(new StringHttpMessageConverter()); + converters.add(jackson2HttpMessageConverter()); + } + + @Bean + public MappingJackson2HttpMessageConverter jackson2HttpMessageConverter() { + MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); + ObjectMapper mapper = new ObjectMapper(); + + //日期格式转换 + mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + mapper.setDateFormat(new SimpleDateFormat(DateUtils.DATE_TIME_PATTERN)); + mapper.setTimeZone(TimeZone.getTimeZone("GMT+8")); + + //Long类型转String类型 + SimpleModule simpleModule = new SimpleModule(); + simpleModule.addSerializer(Long.class, ToStringSerializer.instance); + simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance); + mapper.registerModule(simpleModule); + + converter.setObjectMapper(mapper); + return converter; + } +} diff --git a/front/src/main/java/io/controller/ApplicationsController.java b/front/src/main/java/io/controller/ApplicationsController.java new file mode 100644 index 0000000..af47a91 --- /dev/null +++ b/front/src/main/java/io/controller/ApplicationsController.java @@ -0,0 +1,127 @@ +package io.controller; + + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import io.annotation.Login; +import io.common.constant.Constant; +import io.common.page.PageData; +import io.common.utils.Result; +import io.common.validator.AssertUtils; +import io.common.validator.ValidatorUtils; +import io.common.validator.group.AddGroup; +import io.common.validator.group.DefaultGroup; +import io.common.validator.group.UpdateGroup; +import io.modules.item.dao.ApplicationsDao; +import io.modules.item.dao.CertificatesDao; +import io.modules.item.dto.ApplicationsDTO; +import io.modules.item.dto.CertificatesDTO; +import io.modules.item.dto.UserDTO; +import io.modules.item.entity.Applications; +import io.modules.item.entity.CertificatesEntity; +import io.modules.item.service.ApplicationsService; +import io.modules.item.service.CertificatesService; +import io.modules.item.service.FrontUserService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.enums.ParameterIn; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.*; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 申请表 + */ +@RestController +@RequestMapping("/api/applications") +@Tag(name="证书表") +@CrossOrigin +public class ApplicationsController { + @Autowired + private ApplicationsService applicationsService; + @Autowired + private CertificatesService certificatesService; + @Autowired + private FrontUserService userService; + + @Autowired + private ApplicationsDao applicationsDao; + + @Value("${upload.url}") + private String uploadUrl; + @Login + @GetMapping("page") + @Operation(summary = "分页") + @Parameters({ + @Parameter(name = Constant.PAGE, description = "当前页码,从1开始", in = ParameterIn.QUERY, required = true, ref="int") , + @Parameter(name = Constant.LIMIT, description = "每页显示记录数", in = ParameterIn.QUERY,required = true, ref="int") , + @Parameter(name = Constant.ORDER_FIELD, description = "排序字段", in = ParameterIn.QUERY, ref="String") , + @Parameter(name = Constant.ORDER, description = "排序方式,可选值(asc、desc)", in = ParameterIn.QUERY, ref="String") + }) + public Result> page(@Parameter(hidden = true) @RequestParam Map params,@Parameter(hidden = true) @RequestAttribute("userId") Long userId){ + params.put("userId",userId); + PageData page = applicationsService.page(params); + List collect = page.getList().stream().map(e -> { + + UserDTO userDTO = userService.get(e.getUserId()); + e.setUser(userDTO); + CertificatesDTO certificatesDTO = certificatesService.get(e.getCertId()); + if (certificatesDTO != null){ + certificatesDTO.setImg(uploadUrl + certificatesDTO.getImg()); + e.setCertificates(certificatesDTO); + } + return e; // 返回修改后的对象 + }).collect(Collectors.toList()); + page.setList(collect); + return new Result>().ok(page); + } + + + @Login + @PostMapping + @Operation(summary = "保存") + public Result save(@RequestBody ApplicationsDTO dto,@Parameter(hidden = true) @RequestAttribute("userId") Long userId){ + CertificatesDTO certificatesDTO = certificatesService.get(dto.getCertId()); + if (certificatesDTO.getUserId() == userId){ + return new Result().error("不可以申请自己的证书"); + } + + + LambdaQueryWrapper lwq = new LambdaQueryWrapper<>(); + lwq.eq(Applications::getUserId,userId); + lwq.eq(Applications::getCertId,dto.getCertId()); + List list = applicationsDao.selectList(lwq); + if (!list.isEmpty()){ + return new Result().error("不可以重复申请"); + } + //效验数据 + ValidatorUtils.validateEntity(dto, AddGroup.class, DefaultGroup.class); + dto.setUserId(userId); + applicationsService.save(dto); + return new Result(); + } + + @PutMapping + @Operation(summary = "修改") + public Result update(@RequestBody ApplicationsDTO dto){ + //效验数据 + ValidatorUtils.validateEntity(dto, UpdateGroup.class, DefaultGroup.class); + applicationsService.update(dto); + return new Result(); + } + + @DeleteMapping + @Operation(summary = "删除") + public Result delete(@RequestBody Long[] ids){ + //效验数据 + AssertUtils.isArrayEmpty(ids, "id"); + applicationsService.delete(ids); + return new Result(); + } + +} diff --git a/front/src/main/java/io/controller/CertificatesController.java b/front/src/main/java/io/controller/CertificatesController.java new file mode 100644 index 0000000..1d6aed1 --- /dev/null +++ b/front/src/main/java/io/controller/CertificatesController.java @@ -0,0 +1,125 @@ +package io.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import io.annotation.Login; +import io.common.constant.Constant; +import io.common.page.PageData; +import io.common.utils.Result; +import io.common.validator.AssertUtils; +import io.common.validator.ValidatorUtils; +import io.common.validator.group.AddGroup; +import io.common.validator.group.DefaultGroup; +import io.common.validator.group.UpdateGroup; +import io.modules.item.dao.CertificatesDao; +import io.modules.item.dto.CertificatesDTO; +import io.modules.item.dto.UserDTO; +import io.modules.item.entity.CertificatesEntity; +import io.modules.item.service.CertificatesService; +import io.modules.item.service.FrontUserService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.enums.ParameterIn; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 证书表 + */ +@RestController +@RequestMapping("/api/certificate") +@Tag(name="证书表") +@CrossOrigin +public class CertificatesController { + @Autowired + private CertificatesService certificatesService; + @Autowired + private CertificatesDao certificatesDao; + + + @Autowired + private FrontUserService userService; + @Value("${upload.url}") + private String uploadUrl; + + @Login + @GetMapping("page") + @Operation(summary = "分页") + @Parameters({ + @Parameter(name = Constant.PAGE, description = "当前页码,从1开始", in = ParameterIn.QUERY, required = true, ref="int") , + @Parameter(name = Constant.LIMIT, description = "每页显示记录数", in = ParameterIn.QUERY,required = true, ref="int") , + @Parameter(name = Constant.ORDER_FIELD, description = "排序字段", in = ParameterIn.QUERY, ref="String") , + @Parameter(name = Constant.ORDER, description = "排序方式,可选值(asc、desc)", in = ParameterIn.QUERY, ref="String") + }) + public Result> page(@Parameter(hidden = true) @RequestParam Map params,@Parameter(hidden = true) @RequestAttribute("userId") Long userId){ + params.put("userId",userId); + PageData page = certificatesService.page(params); + List collect = page.getList().stream().map(e -> { + // 拼接域名 + e.setImg(uploadUrl + e.getImg()); + + UserDTO userDTO = userService.get( e.getUserId()); + e.setUser(userDTO); + return e; // 返回修改后的对象 + }).collect(Collectors.toList()); + page.setList(collect); + return new Result>().ok(page); + } + + @GetMapping("{id}") + @Operation(summary = "信息") + public Result get(@PathVariable("id") String id){ + LambdaQueryWrapper lwq = new LambdaQueryWrapper<>(); + lwq.eq(CertificatesEntity::getBlockchainTxId,id); + CertificatesEntity list = certificatesDao.selectOne(lwq); + if (list == null){ + return new Result().error("没有查询到"); + } + list.setImg(uploadUrl + list.getImg()); + return new Result().ok(list); + } + + @Login + @PostMapping + @Operation(summary = "保存") + public Result save(@RequestBody CertificatesDTO dto,@Parameter(hidden = true) @RequestAttribute("userId") Long userId){ + LambdaQueryWrapper lwq = new LambdaQueryWrapper<>(); + lwq.eq(CertificatesEntity::getCertificateNumber,dto.getCertificateNumber()); + List list = certificatesDao.selectList(lwq); + if (!list.isEmpty()){ + return new Result().error("证书编号有重复"); + } + //效验数据 + ValidatorUtils.validateEntity(dto, AddGroup.class, DefaultGroup.class); + dto.setImg(dto.getImg().replace(uploadUrl,"")); + dto.setUserId(userId); + certificatesService.save(dto); + return new Result(); + } + + @PutMapping + @Operation(summary = "修改") + public Result update(@RequestBody CertificatesDTO dto){ + //效验数据 + ValidatorUtils.validateEntity(dto, UpdateGroup.class, DefaultGroup.class); + dto.setImg(dto.getImg().replace(uploadUrl,"")); + certificatesService.update(dto); + return new Result(); + } + + @DeleteMapping + @Operation(summary = "删除") + public Result delete(@RequestBody Long[] ids){ + //效验数据 + AssertUtils.isArrayEmpty(ids, "id"); + certificatesService.delete(ids); + return new Result(); + } + +} diff --git a/front/src/main/java/io/controller/UploadController.java b/front/src/main/java/io/controller/UploadController.java new file mode 100644 index 0000000..f502c8c --- /dev/null +++ b/front/src/main/java/io/controller/UploadController.java @@ -0,0 +1,39 @@ +package io.controller; + +import io.common.utils.Result; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletRequest; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.util.HashMap; + + +@CrossOrigin +@RestController +@RequestMapping("/api/upload") +@Tag(name = "上传文件") +public class UploadController { + @Value("${upload.path}") + private String path; + @PostMapping() + public Result upload(MultipartFile file) throws IOException { + if (file.isEmpty()) { + return new Result().error("文件不能为空!"); + } + //把文件的内容存储到本地磁盘上 + String originFileName = file.getOriginalFilename(); + file.transferTo(new File(path +"/"+ originFileName)); + String url = "http://localhost:18081/upload/" + originFileName; + HashMap map = new HashMap<>(); + map.put("path",url); + map.put("absolute","upload/" + originFileName); + return new Result<>().ok(map); + } +} \ No newline at end of file diff --git a/front/src/main/java/io/controller/UserController.java b/front/src/main/java/io/controller/UserController.java new file mode 100644 index 0000000..d2ae364 --- /dev/null +++ b/front/src/main/java/io/controller/UserController.java @@ -0,0 +1,114 @@ +package io.controller; + +import cn.hutool.crypto.digest.DigestUtil; +import io.annotation.Login; +import io.annotation.LoginUser; +import io.common.utils.Result; +import io.common.validator.ValidatorUtils; +import io.modules.item.dto.LoginDTO; +import io.dto.RegisterDTO; +import io.modules.item.entity.UserEntity; +import io.service.TokenService; +import io.modules.item.service.FrontUserService; +import io.service.UserService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.AllArgsConstructor; +import org.apache.commons.lang3.StringUtils; +import org.springframework.web.bind.annotation.*; +import java.util.Date; +import java.util.Map; + +/** + * 用户管理 + */ +@RestController +@RequestMapping("/api/user") +@Tag(name = "用户管理") +@AllArgsConstructor +@CrossOrigin +public class UserController { + private final UserService userService; + private final TokenService tokenService; + + @PostMapping("register") + @Operation(summary = "注册") + public Result register(@RequestBody RegisterDTO dto) { + + if (dto.getUsername().equals("admin")){ + return new Result().error("admin用户禁止创建~"); + } + + //表单校验 + ValidatorUtils.validateEntity(dto); + if (!dto.getPassword().equals(dto.getConfirmPassword())) { + return new Result().error("两次密码输入不一致~"); + } + + if (userService.getByUsername(dto.getUsername()) != null) { + return new Result().error("用户名已经存在~"); + } + //表单校验 + ValidatorUtils.validateEntity(dto); + UserEntity user = new UserEntity(); + user.setUsername(dto.getUsername()); + user.setNickName(dto.getUsername()); + user.setPassword(DigestUtil.sha256Hex(dto.getPassword())); + user.setCreateDate(new Date()); + userService.insert(user); + return new Result(); + } + + + @PostMapping("login") + @Operation(summary = "登录") + public Result> login(@RequestBody LoginDTO dto) { + //表单校验 + ValidatorUtils.validateEntity(dto); + //用户登录 + Map map = userService.login(dto); + return new Result().ok(map); + } + + @Login + @PutMapping("update") + @Operation(summary = "修改信息") + public Result update(@RequestBody UserEntity dto,@Parameter(hidden = true) @RequestAttribute("userId") Long userId) { + //表单校验 + ValidatorUtils.validateEntity(dto); + UserEntity user = new UserEntity(); + user.setId(userId); + user.setUsername(dto.getUsername()); + user.setNickName(dto.getNickName()); + user.setIntroduce(dto.getIntroduce()); + if (StringUtils.isNotEmpty(dto.getPassword())){ + user.setPassword(DigestUtil.sha256Hex(dto.getPassword())); + } + userService.updateById(user); + return new Result(); + } + + + @Login + @PostMapping("logout") + @Operation(summary = "退出") + public Result logout(@Parameter(hidden = true) @RequestAttribute("userId") Long userId) { + tokenService.expireToken(userId); + return new Result(); + } + + @Login + @GetMapping("userInfo") + @Operation(summary = "获取用户信息") + public Result userInfo(@Parameter(hidden = true) @LoginUser UserEntity user) { + return new Result().ok(user); + } + + @Login + @GetMapping("userId") + @Operation(summary = "获取用户ID") + public Result userInfo(@Parameter(hidden = true) @RequestAttribute("userId") Long userId) { + return new Result().ok(userId); + } +} diff --git a/front/src/main/java/io/dao/TokenDao.java b/front/src/main/java/io/dao/TokenDao.java new file mode 100644 index 0000000..a678199 --- /dev/null +++ b/front/src/main/java/io/dao/TokenDao.java @@ -0,0 +1,19 @@ + + +package io.dao; + +import io.common.dao.BaseDao; +import io.entity.TokenEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 用户Token + * + + */ +@Mapper +public interface TokenDao extends BaseDao { + TokenEntity getByToken(String token); + + TokenEntity getByUserId(Long userId); +} diff --git a/front/src/main/java/io/dto/RegisterDTO.java b/front/src/main/java/io/dto/RegisterDTO.java new file mode 100644 index 0000000..c587bc7 --- /dev/null +++ b/front/src/main/java/io/dto/RegisterDTO.java @@ -0,0 +1,35 @@ + + +package io.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import lombok.Data; + + +/** + * 注册表单 + * + */ +@Data +@Schema(title = "注册表单") +public class RegisterDTO { + private Long id; + @Schema(title = "用户名") + @NotBlank(message="用户名不能为空") + private String username; + + @Schema(title = "密码") + @NotBlank(message="密码不能为空") + private String password; + + @Schema(title = "密码") + @NotBlank(message="确认密码不能为空") + private String confirmPassword; + + @Schema(title = "昵称") + private String nickName; + + @Schema(title = "介绍") + private String introduce; +} diff --git a/front/src/main/java/io/entity/Picture.java b/front/src/main/java/io/entity/Picture.java new file mode 100644 index 0000000..b1aacee --- /dev/null +++ b/front/src/main/java/io/entity/Picture.java @@ -0,0 +1,10 @@ +package io.entity; + +import lombok.Data; + +@Data +public class Picture { + + private String path; + +} diff --git a/front/src/main/java/io/entity/TokenEntity.java b/front/src/main/java/io/entity/TokenEntity.java new file mode 100644 index 0000000..3fcd74b --- /dev/null +++ b/front/src/main/java/io/entity/TokenEntity.java @@ -0,0 +1,37 @@ +package io.entity; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import java.io.Serializable; +import java.util.Date; + +/** + * 用户Token + * + */ +@Data +@TableName("tb_token") +public class TokenEntity implements Serializable { + private static final long serialVersionUID = 1L; + + @TableId + private Long id; + /** + * 用户ID + */ + private Long userId; + /** + * 用户token + */ + private String token; + /** + * 过期时间 + */ + private Date expireDate; + /** + * 更新时间 + */ + private Date updateDate; + +} diff --git a/front/src/main/java/io/exception/RenExceptionHandler.java b/front/src/main/java/io/exception/RenExceptionHandler.java new file mode 100644 index 0000000..ce41574 --- /dev/null +++ b/front/src/main/java/io/exception/RenExceptionHandler.java @@ -0,0 +1,42 @@ +package io.exception; + +import io.common.exception.RenException; +import io.common.utils.Result; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +/** + * 异常处理器 + */ +@RestControllerAdvice +public class RenExceptionHandler { + private static final Logger logger = LoggerFactory.getLogger(RenExceptionHandler.class); + + /** + * 处理自定义异常 + */ + @ExceptionHandler(RenException.class) + public Result handleRenException(RenException ex){ + Result result = new Result(); + result.error(ex.getCode(), ex.getMsg()); + + return result; + } + + @ExceptionHandler(DuplicateKeyException.class) + public Result handleDuplicateKeyException(DuplicateKeyException ex){ + Result result = new Result(); + result.error("数据库中已存在该记录!"); + return result; + } + + @ExceptionHandler(Exception.class) + public Result handleException(Exception ex){ + logger.error(ex.getMessage(), ex); + + return new Result().error(ex.getMessage()); + } +} diff --git a/front/src/main/java/io/interceptor/AuthorizationInterceptor.java b/front/src/main/java/io/interceptor/AuthorizationInterceptor.java new file mode 100644 index 0000000..125d449 --- /dev/null +++ b/front/src/main/java/io/interceptor/AuthorizationInterceptor.java @@ -0,0 +1,57 @@ +package io.interceptor; + +import cn.hutool.core.util.StrUtil; +import io.annotation.Login; +import io.common.exception.RenException; +import io.entity.TokenEntity; +import io.service.TokenService; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.stereotype.Component; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.HandlerInterceptor; + +/** + * 权限(Token)验证 + * + */ +@Component +public class AuthorizationInterceptor implements HandlerInterceptor { + @Resource + private TokenService tokenService; + + public static final String USER_KEY = "userId"; + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler){ + Login annotation; + + if (handler instanceof HandlerMethod) { + annotation = ((HandlerMethod) handler).getMethodAnnotation(Login.class); + } else { + return true; + } + if (annotation == null) { + return true; + } + //从header中获取token + String token = request.getHeader("Authorization"); + //如果header中不存在token,则从参数中获取token + if (StrUtil.isBlank(token)) { + token = request.getParameter("Authorization"); + } + //token为空 + if (StrUtil.isBlank(token)) { + throw new RenException(401,"登录失效~"); + } + //查询token信息 + TokenEntity tokenEntity = tokenService.getByToken(token); + if (tokenEntity == null || tokenEntity.getExpireDate().getTime() < System.currentTimeMillis()) { + throw new RenException(401,"登录失效~"); + } + //设置userId到request里,后续根据userId,获取用户信息 + request.setAttribute(USER_KEY, tokenEntity.getUserId()); + return true; + } +} diff --git a/front/src/main/java/io/resolver/LoginUserHandlerMethodArgumentResolver.java b/front/src/main/java/io/resolver/LoginUserHandlerMethodArgumentResolver.java new file mode 100644 index 0000000..4df5102 --- /dev/null +++ b/front/src/main/java/io/resolver/LoginUserHandlerMethodArgumentResolver.java @@ -0,0 +1,45 @@ +package io.resolver; + +import io.annotation.LoginUser; +import io.modules.item.entity.UserEntity; +import io.interceptor.AuthorizationInterceptor; +import io.modules.item.service.FrontUserService; +import io.service.UserService; +import lombok.AllArgsConstructor; +import org.springframework.core.MethodParameter; +import org.springframework.stereotype.Component; +import org.springframework.web.bind.support.WebDataBinderFactory; +import org.springframework.web.context.request.NativeWebRequest; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.method.support.HandlerMethodArgumentResolver; +import org.springframework.web.method.support.ModelAndViewContainer; + +/** + * 有@LoginUser注解的方法参数,注入当前登录用户 + * + */ +@Component +@AllArgsConstructor +public class LoginUserHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver { + private final UserService userService; + + @Override + public boolean supportsParameter(MethodParameter parameter) { + return parameter.getParameterType().isAssignableFrom(UserEntity.class) && parameter.hasParameterAnnotation(LoginUser.class); + } + + @Override + public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer container, + NativeWebRequest request, WebDataBinderFactory factory){ + //获取用户ID + Object object = request.getAttribute(AuthorizationInterceptor.USER_KEY, RequestAttributes.SCOPE_REQUEST); + + if (object == null) { + return null; + } + + //获取用户信息 + UserEntity user = userService.getUserByUserId((Long) object); + return user; + } +} diff --git a/front/src/main/java/io/service/TokenService.java b/front/src/main/java/io/service/TokenService.java new file mode 100644 index 0000000..15b3c71 --- /dev/null +++ b/front/src/main/java/io/service/TokenService.java @@ -0,0 +1,30 @@ + + +package io.service; + +import io.common.service.BaseService; +import io.entity.TokenEntity; + +/** + * 用户Token + * + + */ +public interface TokenService extends BaseService { + + TokenEntity getByToken(String token); + + /** + * 生成token + * @param userId 用户ID + * @return 返回token信息 + */ + TokenEntity createToken(Long userId); + + /** + * 设置token过期 + * @param userId 用户ID + */ + void expireToken(Long userId); + +} diff --git a/front/src/main/java/io/service/UserService.java b/front/src/main/java/io/service/UserService.java new file mode 100644 index 0000000..5d59902 --- /dev/null +++ b/front/src/main/java/io/service/UserService.java @@ -0,0 +1,28 @@ + + +package io.service; + +import io.common.service.BaseService; +import io.modules.item.dto.LoginDTO; +import io.modules.item.entity.UserEntity; + +import java.util.Map; + +/** + * 用户 + * + + */ +public interface UserService extends BaseService { + + UserEntity getByUsername(String username); + + UserEntity getUserByUserId(Long userId); + + /** + * 用户登录 + * @param dto 登录表单 + * @return 返回登录信息 + */ + Map login(LoginDTO dto); +} diff --git a/front/src/main/java/io/service/impl/TokenServiceImpl.java b/front/src/main/java/io/service/impl/TokenServiceImpl.java new file mode 100644 index 0000000..8d3b8ab --- /dev/null +++ b/front/src/main/java/io/service/impl/TokenServiceImpl.java @@ -0,0 +1,92 @@ + + +package io.service.impl; + +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import io.common.service.impl.BaseServiceImpl; +import io.dao.TokenDao; +import io.entity.TokenEntity; +import io.service.TokenService; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; + +import java.util.Date; +import java.util.UUID; + + +@Service +public class TokenServiceImpl extends BaseServiceImpl implements TokenService { + + @Resource + private TokenDao tokenDao; + + /** + * 12小时后过期 + */ + private final static int EXPIRE = 3600 * 12; + + @Override + public TokenEntity getByToken(String token) { + return baseDao.getByToken(token); + } + + @Override + public TokenEntity createToken(Long userId) { + //当前时间 + Date now = new Date(); + //过期时间 + Date expireTime = new Date(now.getTime() + EXPIRE * 1000); + + //用户token + String token; + + //判断是否生成过token + TokenEntity tokenEntity = baseDao.getByUserId(userId); + if(tokenEntity == null){ + //生成一个token + token = generateToken(); + + tokenEntity = new TokenEntity(); + tokenEntity.setUserId(userId); + tokenEntity.setToken(token); + tokenEntity.setUpdateDate(now); + tokenEntity.setExpireDate(expireTime); + + //保存token + this.insert(tokenEntity); + }else{ + //判断token是否过期 + if(tokenEntity.getExpireDate().getTime() < System.currentTimeMillis()){ + //token过期,重新生成token + token = generateToken(); + }else { + token = tokenEntity.getToken(); + } + + tokenEntity.setToken(token); + tokenEntity.setUpdateDate(now); + tokenEntity.setExpireDate(expireTime); + + //更新token + this.updateById(tokenEntity); + } + + return tokenEntity; + } + + @Override + public void expireToken(Long userId){ + Date now = new Date(); + + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.eq(TokenEntity::getUserId, userId); + updateWrapper.set(TokenEntity::getExpireDate, now); + updateWrapper.set(TokenEntity::getUpdateDate, now); + + tokenDao.update(updateWrapper); + } + + private String generateToken(){ + return UUID.randomUUID().toString().replace("-", ""); + } +} diff --git a/front/src/main/java/io/service/impl/UserServiceImpl.java b/front/src/main/java/io/service/impl/UserServiceImpl.java new file mode 100644 index 0000000..e0dea4e --- /dev/null +++ b/front/src/main/java/io/service/impl/UserServiceImpl.java @@ -0,0 +1,50 @@ +package io.service.impl; + +import cn.hutool.crypto.digest.DigestUtil; +import io.common.exception.RenException; +import io.common.service.impl.BaseServiceImpl; +import io.common.validator.AssertUtils; +import io.entity.TokenEntity; +import io.modules.item.dao.UserDao; +import io.modules.item.dto.LoginDTO; +import io.modules.item.entity.UserEntity; +import io.service.TokenService; +import io.service.UserService; +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Service; +import java.util.HashMap; +import java.util.Map; + +@Service +@AllArgsConstructor +public class UserServiceImpl extends BaseServiceImpl implements UserService { + private final TokenService tokenService; + + @Override + public UserEntity getByUsername(String username){ + return baseDao.getUserByUsername(username); + } + + @Override + public UserEntity getUserByUserId(Long userId) { + return baseDao.getUserByUserId(userId); + } + + @Override + public Map login(LoginDTO dto) { + UserEntity user = getByUsername(dto.getUsername()); + AssertUtils.isNull(user, "用户名不存在~"); + + //密码错误 + if (!user.getPassword().equals(DigestUtil.sha256Hex(dto.getPassword()))) { + throw new RenException("密码输入错误~"); + } + //获取登录token + TokenEntity tokenEntity = tokenService.createToken(user.getId()); + Map map = new HashMap<>(2); + map.put("token", tokenEntity.getToken()); + map.put("expire", tokenEntity.getExpireDate().getTime() - System.currentTimeMillis()); + return map; + } + +} diff --git a/front/src/main/resources/application-dev.yml b/front/src/main/resources/application-dev.yml new file mode 100644 index 0000000..cd66b9d --- /dev/null +++ b/front/src/main/resources/application-dev.yml @@ -0,0 +1,39 @@ +spring: + servlet: + multipart: + max-file-size: 500MB + max-request-size: 500MB + datasource: + druid: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://localhost:33060/block_auth?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true + username: root + password: 123456 + initial-size: 10 + max-active: 100 + min-idle: 10 + max-wait: 60000 + pool-prepared-statements: true + max-pool-prepared-statement-per-connection-size: 20 + time-between-eviction-runs-millis: 60000 + min-evictable-idle-time-millis: 300000 + test-while-idle: true + test-on-borrow: false + test-on-return: false + stat-view-servlet: + enabled: true + url-pattern: /druid/* + filter: + stat: + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: false + wall: + config: + multi-statement-allow: true + web: + resources: + static-locations: "file:D:/2025/blockchain-certify/upload/" +upload: + path: D:\2025\blockchain-certify\upload + url: http://localhost:18081/ \ No newline at end of file diff --git a/front/src/main/resources/application.yml b/front/src/main/resources/application.yml new file mode 100644 index 0000000..b17726d --- /dev/null +++ b/front/src/main/resources/application.yml @@ -0,0 +1,62 @@ +# Tomcat +server: + tomcat: + uri-encoding: UTF-8 + threads: + max: 1000 + min-spare: 30 + port: 18081 + servlet: + context-path: / + session: + cookie: + http-only: true +knife4j: + enable: true + basic: + enable: false + username: admin + password: admin + setting: + enableFooter: false + +spring: + # 环境 dev|test|prod + profiles: + active: dev + messages: + encoding: UTF-8 + basename: i18n/messages + # jackson时间格式化 + jackson: + time-zone: GMT+8 + date-format: yyyy-MM-dd HH:mm:ss + mvc: + pathmatch: + matching-strategy: ANT_PATH_MATCHER + servlet: + multipart: + max-file-size: 100MB + max-request-size: 100MB + enabled: true +#mybatis +mybatis-plus: + mapper-locations: classpath*:/mapper/**/*.xml + #实体扫描,多个package用逗号或者分号分隔 + typeAliasesPackage: io.renren.entity + global-config: + #数据库相关配置 + db-config: + #主键类型 + id-type: AUTO + banner: false + #原生配置 + configuration: + map-underscore-to-camel-case: true + cache-enabled: false + call-setters-on-nulls: true + jdbc-type-for-null: 'null' + configuration-properties: + prefix: + blobType: BLOB + boolValue: TRUE diff --git a/front/src/main/resources/logback-spring.xml b/front/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..5deef21 --- /dev/null +++ b/front/src/main/resources/logback-spring.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/front/src/main/resources/mapper/TokenDao.xml b/front/src/main/resources/mapper/TokenDao.xml new file mode 100644 index 0000000..34f924b --- /dev/null +++ b/front/src/main/resources/mapper/TokenDao.xml @@ -0,0 +1,14 @@ + + + + + + + + + + diff --git a/front/src/main/resources/mapper/UserDao.xml b/front/src/main/resources/mapper/UserDao.xml new file mode 100644 index 0000000..64d6c77 --- /dev/null +++ b/front/src/main/resources/mapper/UserDao.xml @@ -0,0 +1,13 @@ + + + + + + + + + diff --git a/front/src/main/resources/static/17e86dfd-1a78-4d9c-bb31-9e920a561efa.jpg b/front/src/main/resources/static/17e86dfd-1a78-4d9c-bb31-9e920a561efa.jpg new file mode 100644 index 0000000..edee534 Binary files /dev/null and b/front/src/main/resources/static/17e86dfd-1a78-4d9c-bb31-9e920a561efa.jpg differ diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..c51aafc --- /dev/null +++ b/pom.xml @@ -0,0 +1,142 @@ + + 4.0.0 + io.renren + block-identity-auth + 5.4.0 + pom + + admin + 后台模板 + + org.springframework.boot + spring-boot-starter-parent + 3.2.6 + + + + common + admin + front + + + + UTF-8 + UTF-8 + 17 + 1.2.21 + 3.5.5 + 3.0.3 + 4.0 + 11.2.0.3 + 8.1.2.141 + 5.8.29 + 1.15.3 + 4.5.0 + 1.18.24 + 4.0.1 + + + + + org.springframework.boot + spring-boot-starter-test + test + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-aop + + + org.springframework.boot + spring-boot-starter-validation + + + org.springframework + spring-context-support + + + org.springframework.boot + spring-boot-starter-data-redis + + + org.springframework.boot + spring-boot-configuration-processor + true + + + + com.mysql + mysql-connector-j + + + + com.alibaba + druid-spring-boot-3-starter + ${druid.version} + + + com.baomidou + mybatis-plus-boot-starter + ${mybatisplus.version} + + + org.mybatis + mybatis-spring + ${mybatis.spring} + + + cn.hutool + hutool-all + ${hutool.version} + + + org.jsoup + jsoup + ${jsoup.version} + + + com.github.xiaoymin + knife4j-openapi3-jakarta-spring-boot-starter + ${knife4j.version} + + + org.projectlombok + lombok + ${lombok.version} + + + + + + + + + + + public + aliyun nexus + https://maven.aliyun.com/repository/public/ + + true + + + + + + public + aliyun nexus + https://maven.aliyun.com/repository/public/ + + true + + + false + + + + diff --git a/ui/.devcontainer/devcontainer.json b/ui/.devcontainer/devcontainer.json new file mode 100644 index 0000000..c6ccee3 --- /dev/null +++ b/ui/.devcontainer/devcontainer.json @@ -0,0 +1,44 @@ +// For format details, see https://aka.ms/devcontainer.json. For config options, see the +// README at: https://github.com/devcontainers/templates/tree/main/src/typescript-node +{ + "name": "Node.js & TypeScript", + // Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile + "image": "mcr.microsoft.com/devcontainers/typescript-node:1-18-buster", + "features": { + "ghcr.io/devcontainers-contrib/features/pnpm:2": {} + }, + "customizations": { + "vscode": { + "extensions": [ + "antfu.goto-alias", + "mikestead.dotenv", + "redhat.vscode-yaml", + "Vue.volar", + "steoates.autoimport", + "dbaeumer.vscode-eslint", + "esbenp.prettier-vscode", + "EditorConfig.EditorConfig", + "usernamehw.errorlens", + "shd101wyy.markdown-preview-enhanced", + "voorjaar.windicss-intellisense", + "yoavbls.pretty-ts-errors", + "bodil.prettier-toml", + "bungcip.better-toml" + ] + } + } + // Features to add to the dev container. More info: https://containers.dev/features. + // "features": {}, + + // Use 'forwardPorts' to make a list of ports inside the container available locally. + // "forwardPorts": [], + + // Use 'postCreateCommand' to run commands after the container is created. + // "postCreateCommand": "yarn install", + + // Configure tool-specific properties. + // "customizations": {}, + + // Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root. + // "remoteUser": "root" +} diff --git a/ui/.editorconfig b/ui/.editorconfig new file mode 100644 index 0000000..c2de21e --- /dev/null +++ b/ui/.editorconfig @@ -0,0 +1,23 @@ +root = true + +# 匹配全部文件 +[*] +# 设置字符集 +charset = utf-8 +# 缩进风格,可选 space、tab +indent_style = tab +# 缩进的空格数,当 indent_style = tab 将使用 tab_width +# 否则使用 indent_size +indent_size = 2 +tab_width = 2 +# 结尾换行符,可选 lf、cr、crlf +end_of_line = crlf +# 在文件结尾插入新行 +insert_final_newline = true +# 删除一行中的前后空格 +trim_trailing_whitespace = true + +# 匹配 md 结尾的文件 +[*.md] +insert_final_newline = false +trim_trailing_whitespace = false diff --git a/ui/.env b/ui/.env new file mode 100644 index 0000000..32f0d72 --- /dev/null +++ b/ui/.env @@ -0,0 +1,30 @@ +# 通用环境变量 +# 前端接口 +VITE_API_FRONT_BASE_URL = http://localhost:18081 +#后端接口 +VITE_ADMIN_API_BASE_URL = http://localhost:18080 + +VITE_LOGIN_BG = "/login/e36341619bf8f04dcbdc6b01105a85a.png" + +# 标题 +VITE_APP_TITLE = 证书 + +# markdown 渲染支持 +VITE_APP_MARKDOWN = true + +# 开发时的开发面板 +VITE_APP_DEV_TOOLS = false + +# 生产时 mock 支持 +VITE_APP_MOCK_IN_PRODUCTION = false + +# 生产时压缩算法,可选 gzip, brotliCompress, deflate, deflateRaw +VITE_APP_COMPRESSINON_ALGORITHM = gzip + +# api 自动按需引入 +# 注意设置关闭时,其他的 api 自动按需引入也将自动关闭 +VITE_APP_API_AUTO_IMPORT = true + + +# 项目级 api 自动按需导入 +VITE_APP_DIR_API_AUTO_IMPORT = true diff --git a/ui/.eslintignore b/ui/.eslintignore new file mode 100644 index 0000000..01a294a --- /dev/null +++ b/ui/.eslintignore @@ -0,0 +1,4 @@ +# 忽略 eslint 检查 +dist +node_modules +presets/types diff --git a/ui/.gitignore b/ui/.gitignore new file mode 100644 index 0000000..70806e6 --- /dev/null +++ b/ui/.gitignore @@ -0,0 +1,12 @@ +dist +.nitro +.output +env.d.ts +node_modules +.eslintcache +components.d.ts +type-router.d.ts +auto-imports.d.ts +.eslintrc-auto-import.json +vite.config.ts.timestamp* +.idea diff --git a/ui/.npmrc b/ui/.npmrc new file mode 100644 index 0000000..918fa4a --- /dev/null +++ b/ui/.npmrc @@ -0,0 +1 @@ +registry=https://registry.npmmirror.com/ \ No newline at end of file diff --git a/ui/.nvmrc b/ui/.nvmrc new file mode 100644 index 0000000..5802c69 --- /dev/null +++ b/ui/.nvmrc @@ -0,0 +1 @@ +20.12.2 \ No newline at end of file diff --git a/ui/.prettierignore b/ui/.prettierignore new file mode 100644 index 0000000..3673c24 --- /dev/null +++ b/ui/.prettierignore @@ -0,0 +1,3 @@ +dist +node_modules +presets/types diff --git a/ui/.prettierrc.json b/ui/.prettierrc.json new file mode 100644 index 0000000..6ef9e41 --- /dev/null +++ b/ui/.prettierrc.json @@ -0,0 +1,5 @@ +{ + "semi": false, + "singleQuote": true, + "endOfLine": "auto" +} diff --git a/ui/.vite/deps/_metadata.json b/ui/.vite/deps/_metadata.json new file mode 100644 index 0000000..215d1fe --- /dev/null +++ b/ui/.vite/deps/_metadata.json @@ -0,0 +1,8 @@ +{ + "hash": "9eae4843", + "configHash": "273d741a", + "lockfileHash": "e3b0c442", + "browserHash": "f1ecf6ce", + "optimized": {}, + "chunks": {} +} \ No newline at end of file diff --git a/ui/.vite/deps/package.json b/ui/.vite/deps/package.json new file mode 100644 index 0000000..3dbc1ca --- /dev/null +++ b/ui/.vite/deps/package.json @@ -0,0 +1,3 @@ +{ + "type": "module" +} diff --git a/ui/index.html b/ui/index.html new file mode 100644 index 0000000..65b9479 --- /dev/null +++ b/ui/index.html @@ -0,0 +1,13 @@ + + + + + + + + + +
+ + + diff --git a/ui/locales/English/common.yml b/ui/locales/English/common.yml new file mode 100644 index 0000000..85625b7 --- /dev/null +++ b/ui/locales/English/common.yml @@ -0,0 +1,10 @@ +# English + +home: home +about: about +echarts: echarts +edit: Edit +to test HMR: to test HMR +check out: Check out +The total number of views is: The total number of views is +the official Tov + Vue + Vite template: the official Tov + Vue + Vite template diff --git a/ui/locales/English/test.yml b/ui/locales/English/test.yml new file mode 100644 index 0000000..66a41ce --- /dev/null +++ b/ui/locales/English/test.yml @@ -0,0 +1,3 @@ +# English + +test.module: lanugae module test diff --git a/ui/locales/简体中文/common.yml b/ui/locales/简体中文/common.yml new file mode 100644 index 0000000..85e5868 --- /dev/null +++ b/ui/locales/简体中文/common.yml @@ -0,0 +1,10 @@ +# 中文 + +home: 主页 +about: 关于 +echarts: 图表 +edit: 编辑 +to test HMR: 测试热更新 +check out: 查看 +The total number of views is: 总浏览数 +the official Tov + Vue + Vite template: 公共的 Tov + Vue + Vite 模板 \ No newline at end of file diff --git a/ui/locales/简体中文/test.yml b/ui/locales/简体中文/test.yml new file mode 100644 index 0000000..efb8f3d --- /dev/null +++ b/ui/locales/简体中文/test.yml @@ -0,0 +1,3 @@ +# 简体中文 + +test.module: 多语言多模块测试 diff --git a/ui/netlify.toml b/ui/netlify.toml new file mode 100644 index 0000000..3a01cb0 --- /dev/null +++ b/ui/netlify.toml @@ -0,0 +1,4 @@ +[[redirects]] +to = "/index.html" +from = "/*" +status = 200 diff --git a/ui/package.json b/ui/package.json new file mode 100644 index 0000000..4720d48 --- /dev/null +++ b/ui/package.json @@ -0,0 +1,112 @@ +{ + "name": "后台", + "version": "1.19.0", + "description": "后台", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build" + }, + "engines": { + "node": ">=20.12.2" + }, + "packageManager": "pnpm@8.15.8", + "devDependencies": { + "@types/ityped": "^1.0.3", + "@types/node": "^20.12.7", + "@typescript-eslint/parser": "7.8.0", + "@unocss/eslint-config": "0.59.4", + "@unocss/reset": "^0.59.4", + "@vitejs/plugin-vue": "^5.0.4", + "@vitejs/plugin-vue-jsx": "^3.1.0", + "@vueuse/components": "^10.9.0", + "@vueuse/core": "^10.9.0", + "@vueuse/integrations": "^10.9.0", + "axios": "^1.6.8", + "browserslist": "^4.23.0", + "c8": "^9.1.0", + "changelogen": "^0.5.5", + "consola": "^3.2.3", + "cross-env": "^7.0.3", + "defu": "^6.1.4", + "echarts": "^5.5.0", + "eslint": "8.57.0", + "eslint-config-prettier": "9.1.0", + "eslint-plugin-prettier": "5.1.3", + "eslint-plugin-vue": "^9.25.0", + "fs-extra": "^11.2.0", + "husky": "^9.0.11", + "ityped": "^1.0.3", + "kolorist": "^1.8.0", + "lightningcss": "^1.24.1", + "lint-staged": "^15.2.2", + "local-pkg": "^0.5.0", + "mockjs": "^1.1.0", + "nprogress": "^0.2.0", + "perfect-debounce": "^1.0.0", + "pinia": "^2.1.7", + "pinia-plugin-persistedstate": "^3.2.1", + "plop": "^4.0.1", + "prettier": "^3.2.5", + "prism-theme-vars": "^0.2.5", + "simple-git": "^3.24.0", + "taze": "^0.13.7", + "terser": "^5.31.0", + "typescript": "^5.4.5", + "unocss": "^0.59.4", + "unplugin-auto-import": "^0.17.5", + "unplugin-vue-components": "^0.26.0", + "unplugin-vue-markdown": "^0.26.2", + "unplugin-vue-router": "^0.8.6", + "vite": "^5.2.10", + "vite-auto-import-resolvers": "^3.2.1", + "vite-layers": "^0.5.2", + "vite-plugin-compression": "^0.5.1", + "vite-plugin-env-types": "^0.1.4", + "vite-plugin-legacy-swc": "^1.1.0", + "vite-plugin-use-modules": "^1.4.8", + "vite-plugin-vue-devtools": "^7.1.3", + "vite-plugin-vue-meta-layouts": "^0.4.3", + "vitest": "^1.5.3", + "vue": "^3.4.26", + "vue-echarts": "^6.7.1", + "vue-request": "2.0.4", + "vue-router": "^4.3.2", + "vue-toastification": "2.0.0-rc.5" + }, + "lint-staged": { + "*.{js,jsx,ts,tsx,vue}": "eslint --cache --fix" + }, + "overrides": { + "sourcemap-codec": "npm:@jridgewell/sourcemap-codec@latest", + "array-includes": "npm:@nolyfill/array-includes@latest", + "array.prototype.findlastindex": "npm:@nolyfill/array.prototype.findlastindex@latest", + "array.prototype.flat": "npm:@nolyfill/array.prototype.flat@latest", + "array.prototype.flatmap": "npm:@nolyfill/array.prototype.flatmap@latest", + "arraybuffer.prorotype.slice": "npm:@nolyfill/arraybuffer.prorotype.slice@latest", + "function.prototype.name": "npm:@nolyfill/function.prototype.name@latest", + "has": "npm:@nolyfill/has@latest", + "is-regex": "npm:@nolyfill/is-regex@latest", + "object-keys": "npm:@nolyfill/object-keys@latest", + "object.assign": "npm:@nolyfill/object.assign@latest", + "object.entries": "npm:@nolyfill/object.entries@latest", + "object.fromentries": "npm:@nolyfill/object.fromentries@latest", + "object.values": "npm:@nolyfill/object.values@latest", + "vue-demi": "npm:vue-demi@latest" + }, + "repository": { + "url": "https://github.com/dishait/tov-template" + }, + "browserslist": [ + ">= 0.25%", + "last 2 versions", + "not dead", + "not ie <= 11", + "Android >= 4.0", + "iOS >= 8" + ], + "dependencies": { + "@element-plus/icons-vue": "^2.3.1", + "element-plus": "^2.9.2" + } +} diff --git a/ui/pnpm-lock.yaml b/ui/pnpm-lock.yaml new file mode 100644 index 0000000..8f99515 --- /dev/null +++ b/ui/pnpm-lock.yaml @@ -0,0 +1,7323 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@element-plus/icons-vue': + specifier: ^2.3.1 + version: 2.3.1(vue@3.4.26(typescript@5.4.5)) + element-plus: + specifier: ^2.9.2 + version: 2.9.2(vue@3.4.26(typescript@5.4.5)) + devDependencies: + '@types/ityped': + specifier: ^1.0.3 + version: 1.0.3 + '@types/node': + specifier: ^20.12.7 + version: 20.12.7 + '@typescript-eslint/parser': + specifier: 7.8.0 + version: 7.8.0(eslint@8.57.0)(typescript@5.4.5) + '@unocss/eslint-config': + specifier: 0.59.4 + version: 0.59.4(eslint@8.57.0)(typescript@5.4.5) + '@unocss/reset': + specifier: ^0.59.4 + version: 0.59.4 + '@vitejs/plugin-vue': + specifier: ^5.0.4 + version: 5.0.4(vite@5.2.10(@types/node@20.12.7)(lightningcss@1.24.1)(terser@5.31.0))(vue@3.4.26(typescript@5.4.5)) + '@vitejs/plugin-vue-jsx': + specifier: ^3.1.0 + version: 3.1.0(vite@5.2.10(@types/node@20.12.7)(lightningcss@1.24.1)(terser@5.31.0))(vue@3.4.26(typescript@5.4.5)) + '@vueuse/components': + specifier: ^10.9.0 + version: 10.9.0(vue@3.4.26(typescript@5.4.5)) + '@vueuse/core': + specifier: ^10.9.0 + version: 10.9.0(vue@3.4.26(typescript@5.4.5)) + '@vueuse/integrations': + specifier: ^10.9.0 + version: 10.9.0(async-validator@4.2.5)(axios@1.6.8)(change-case@4.1.2)(nprogress@0.2.0)(vue@3.4.26(typescript@5.4.5)) + axios: + specifier: ^1.6.8 + version: 1.6.8 + browserslist: + specifier: ^4.23.0 + version: 4.23.0 + c8: + specifier: ^9.1.0 + version: 9.1.0 + changelogen: + specifier: ^0.5.5 + version: 0.5.5 + consola: + specifier: ^3.2.3 + version: 3.2.3 + cross-env: + specifier: ^7.0.3 + version: 7.0.3 + defu: + specifier: ^6.1.4 + version: 6.1.4 + echarts: + specifier: ^5.5.0 + version: 5.5.0 + eslint: + specifier: 8.57.0 + version: 8.57.0 + eslint-config-prettier: + specifier: 9.1.0 + version: 9.1.0(eslint@8.57.0) + eslint-plugin-prettier: + specifier: 5.1.3 + version: 5.1.3(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.2.5) + eslint-plugin-vue: + specifier: ^9.25.0 + version: 9.25.0(eslint@8.57.0) + fs-extra: + specifier: ^11.2.0 + version: 11.2.0 + husky: + specifier: ^9.0.11 + version: 9.0.11 + ityped: + specifier: ^1.0.3 + version: 1.0.3 + kolorist: + specifier: ^1.8.0 + version: 1.8.0 + lightningcss: + specifier: ^1.24.1 + version: 1.24.1 + lint-staged: + specifier: ^15.2.2 + version: 15.2.2 + local-pkg: + specifier: ^0.5.0 + version: 0.5.0 + mockjs: + specifier: ^1.1.0 + version: 1.1.0 + nprogress: + specifier: ^0.2.0 + version: 0.2.0 + perfect-debounce: + specifier: ^1.0.0 + version: 1.0.0 + pinia: + specifier: ^2.1.7 + version: 2.1.7(typescript@5.4.5)(vue@3.4.26(typescript@5.4.5)) + pinia-plugin-persistedstate: + specifier: ^3.2.1 + version: 3.2.1(pinia@2.1.7(typescript@5.4.5)(vue@3.4.26(typescript@5.4.5))) + plop: + specifier: ^4.0.1 + version: 4.0.1 + prettier: + specifier: ^3.2.5 + version: 3.2.5 + prism-theme-vars: + specifier: ^0.2.5 + version: 0.2.5 + simple-git: + specifier: ^3.24.0 + version: 3.24.0 + taze: + specifier: ^0.13.7 + version: 0.13.7 + terser: + specifier: ^5.31.0 + version: 5.31.0 + typescript: + specifier: ^5.4.5 + version: 5.4.5 + unocss: + specifier: ^0.59.4 + version: 0.59.4(postcss@8.4.38)(rollup@4.13.0)(vite@5.2.10(@types/node@20.12.7)(lightningcss@1.24.1)(terser@5.31.0)) + unplugin-auto-import: + specifier: ^0.17.5 + version: 0.17.5(@vueuse/core@10.9.0(vue@3.4.26(typescript@5.4.5)))(rollup@4.13.0) + unplugin-vue-components: + specifier: ^0.26.0 + version: 0.26.0(@babel/parser@7.24.4)(rollup@4.13.0)(vue@3.4.26(typescript@5.4.5)) + unplugin-vue-markdown: + specifier: ^0.26.2 + version: 0.26.2(rollup@4.13.0)(vite@5.2.10(@types/node@20.12.7)(lightningcss@1.24.1)(terser@5.31.0)) + unplugin-vue-router: + specifier: ^0.8.6 + version: 0.8.6(rollup@4.13.0)(vue-router@4.3.2(vue@3.4.26(typescript@5.4.5)))(vue@3.4.26(typescript@5.4.5)) + vite: + specifier: ^5.2.10 + version: 5.2.10(@types/node@20.12.7)(lightningcss@1.24.1)(terser@5.31.0) + vite-auto-import-resolvers: + specifier: ^3.2.1 + version: 3.2.1(unplugin-auto-import@0.17.5(@vueuse/core@10.9.0(vue@3.4.26(typescript@5.4.5)))(rollup@4.13.0))(vite@5.2.10(@types/node@20.12.7)(lightningcss@1.24.1)(terser@5.31.0)) + vite-layers: + specifier: ^0.5.2 + version: 0.5.2(vite@5.2.10(@types/node@20.12.7)(lightningcss@1.24.1)(terser@5.31.0)) + vite-plugin-compression: + specifier: ^0.5.1 + version: 0.5.1(vite@5.2.10(@types/node@20.12.7)(lightningcss@1.24.1)(terser@5.31.0)) + vite-plugin-env-types: + specifier: ^0.1.4 + version: 0.1.4(vite@5.2.10(@types/node@20.12.7)(lightningcss@1.24.1)(terser@5.31.0)) + vite-plugin-legacy-swc: + specifier: ^1.1.0 + version: 1.1.0(vite@5.2.10(@types/node@20.12.7)(lightningcss@1.24.1)(terser@5.31.0)) + vite-plugin-use-modules: + specifier: ^1.4.8 + version: 1.4.8(vite@5.2.10(@types/node@20.12.7)(lightningcss@1.24.1)(terser@5.31.0))(vue@3.4.26(typescript@5.4.5)) + vite-plugin-vue-devtools: + specifier: ^7.1.3 + version: 7.1.3(rollup@4.13.0)(vite@5.2.10(@types/node@20.12.7)(lightningcss@1.24.1)(terser@5.31.0))(vue@3.4.26(typescript@5.4.5)) + vite-plugin-vue-meta-layouts: + specifier: ^0.4.3 + version: 0.4.3(vite@5.2.10(@types/node@20.12.7)(lightningcss@1.24.1)(terser@5.31.0))(vue-router@4.3.2(vue@3.4.26(typescript@5.4.5))) + vitest: + specifier: ^1.5.3 + version: 1.5.3(@types/node@20.12.7)(lightningcss@1.24.1)(terser@5.31.0) + vue: + specifier: ^3.4.26 + version: 3.4.26(typescript@5.4.5) + vue-echarts: + specifier: ^6.7.1 + version: 6.7.1(@vue/runtime-core@3.4.26)(echarts@5.5.0)(vue@3.4.26(typescript@5.4.5)) + vue-request: + specifier: 2.0.4 + version: 2.0.4(vue@3.4.26(typescript@5.4.5)) + vue-router: + specifier: ^4.3.2 + version: 4.3.2(vue@3.4.26(typescript@5.4.5)) + vue-toastification: + specifier: 2.0.0-rc.5 + version: 2.0.0-rc.5(vue@3.4.26(typescript@5.4.5)) + +packages: + + '@aashutoshrathi/word-wrap@1.2.6': + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@antfu/install-pkg@0.1.1': + resolution: {integrity: sha512-LyB/8+bSfa0DFGC06zpCEfs89/XoWZwws5ygEa5D+Xsm3OfI+aXQ86VgVG7Acyef+rSZ5HE7J8rrxzrQeM3PjQ==} + + '@antfu/ni@0.21.12': + resolution: {integrity: sha512-2aDL3WUv8hMJb2L3r/PIQWsTLyq7RQr3v9xD16fiz6O8ys1xEyLhhTOv8gxtZvJiTzjTF5pHoArvRdesGL1DMQ==} + hasBin: true + + '@antfu/utils@0.7.7': + resolution: {integrity: sha512-gFPqTG7otEJ8uP6wrhDv6mqwGWYZKNvAcCq6u9hOj0c+IKCEsY4L1oC9trPq2SaWIzAfHvqfBDxF591JkMf+kg==} + + '@babel/code-frame@7.24.2': + resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.24.1': + resolution: {integrity: sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.24.3': + resolution: {integrity: sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.24.4': + resolution: {integrity: sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.24.1': + resolution: {integrity: sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.24.4': + resolution: {integrity: sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-annotate-as-pure@7.22.5': + resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.23.6': + resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-create-class-features-plugin@7.24.1': + resolution: {integrity: sha512-1yJa9dX9g//V6fDebXoEfEsxkZHk3Hcbm+zLhyu6qVgYFLvmTALTeV+jNU9e5RnYtioBrGEOdoI2joMSNQ/+aA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-environment-visitor@7.22.20': + resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-function-name@7.23.0': + resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-hoist-variables@7.22.5': + resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-member-expression-to-functions@7.23.0': + resolution: {integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.22.15': + resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.24.3': + resolution: {integrity: sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.23.3': + resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-optimise-call-expression@7.22.5': + resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-plugin-utils@7.24.0': + resolution: {integrity: sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-replace-supers@7.24.1': + resolution: {integrity: sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-simple-access@7.22.5': + resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-skip-transparent-expression-wrappers@7.22.5': + resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} + engines: {node: '>=6.9.0'} + + '@babel/helper-split-export-declaration@7.22.6': + resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.24.1': + resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.22.20': + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.23.5': + resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.24.1': + resolution: {integrity: sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.24.4': + resolution: {integrity: sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==} + engines: {node: '>=6.9.0'} + + '@babel/highlight@7.24.2': + resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.24.1': + resolution: {integrity: sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/parser@7.24.4': + resolution: {integrity: sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-proposal-decorators@7.24.1': + resolution: {integrity: sha512-zPEvzFijn+hRvJuX2Vu3KbEBN39LN3f7tW3MQO2LsIs57B26KU+kUc82BdAktS1VCM6libzh45eKGI65lg0cpA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-decorators@7.24.1': + resolution: {integrity: sha512-05RJdO/cCrtVWuAaSn1tS3bH8jbsJa/Y1uD186u6J4C/1mnHFxseeuWpsqr9anvo7TUulev7tm7GDwRV+VuhDw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-attributes@7.24.1': + resolution: {integrity: sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-meta@7.10.4': + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-jsx@7.24.1': + resolution: {integrity: sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.24.1': + resolution: {integrity: sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-commonjs@7.24.1': + resolution: {integrity: sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typescript@7.24.1': + resolution: {integrity: sha512-liYSESjX2fZ7JyBFkYG78nfvHlMKE6IpNdTVnxmlYUR+j5ZLsitFbaAE+eJSK2zPPkNWNw4mXL51rQ8WrvdK0w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-typescript@7.24.1': + resolution: {integrity: sha512-1DBaMmRDpuYQBPWD8Pf/WEwCrtgRHxsZnP4mIy9G/X+hFfbI47Q2G4t1Paakld84+qsk2fSsUPMKg71jkoOOaQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/template@7.24.0': + resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.24.1': + resolution: {integrity: sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.24.0': + resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} + engines: {node: '>=6.9.0'} + + '@bcoe/v8-coverage@0.2.3': + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + + '@ctrl/tinycolor@3.6.1': + resolution: {integrity: sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==} + engines: {node: '>=10'} + + '@element-plus/icons-vue@2.3.1': + resolution: {integrity: sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==} + peerDependencies: + vue: ^3.2.0 + + '@esbuild/aix-ppc64@0.20.2': + resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.20.2': + resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.20.2': + resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.20.2': + resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.20.2': + resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.20.2': + resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.20.2': + resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.20.2': + resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.20.2': + resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.20.2': + resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.20.2': + resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.20.2': + resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.20.2': + resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.20.2': + resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.20.2': + resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.20.2': + resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.20.2': + resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.20.2': + resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-x64@0.20.2': + resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.20.2': + resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.20.2': + resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.20.2': + resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.20.2': + resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.4.0': + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.10.0': + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/eslintrc@2.1.4': + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eslint/js@8.57.0': + resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@floating-ui/core@1.6.8': + resolution: {integrity: sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==} + + '@floating-ui/dom@1.6.12': + resolution: {integrity: sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w==} + + '@floating-ui/utils@0.2.8': + resolution: {integrity: sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==} + + '@humanwhocodes/config-array@0.11.14': + resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} + engines: {node: '>=10.10.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/object-schema@2.0.2': + resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} + + '@iconify/types@2.0.0': + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + + '@iconify/utils@2.1.23': + resolution: {integrity: sha512-YGNbHKM5tyDvdWZ92y2mIkrfvm5Fvhe6WJSkWu7vvOFhMtYDP0casZpoRz0XEHZCrYsR4stdGT3cZ52yp5qZdQ==} + + '@istanbuljs/schema@0.1.3': + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + + '@jest/schemas@29.6.3': + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jridgewell/gen-mapping@0.3.5': + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/source-map@0.3.6': + resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} + + '@jridgewell/sourcemap-codec@1.4.15': + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@jsdevtools/ez-spawn@3.0.4': + resolution: {integrity: sha512-f5DRIOZf7wxogefH03RjMPMdBF7ADTWUMoOs9kaJo06EfwF+aFhMZMDZxHg/Xe12hptN9xoZjGso2fdjapBRIA==} + engines: {node: '>=10'} + + '@kwsites/file-exists@1.1.1': + resolution: {integrity: sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==} + + '@kwsites/promise-deferred@1.1.1': + resolution: {integrity: sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==} + + '@ljharb/through@2.3.13': + resolution: {integrity: sha512-/gKJun8NNiWGZJkGzI/Ragc53cOdcLNdzjLaIa+GEjguQs0ulsurx8WN0jijdK9yPqDvziX995sMRLyLt1uZMQ==} + engines: {node: '>= 0.4'} + + '@mdit-vue/plugin-component@2.1.2': + resolution: {integrity: sha512-n1HcAC82l912HhtiMSxl5pQLKBYbPok/IcdGRD49rTt53NXBqct68qo58+7jvsj+f8Lmo7kjD+em3tP4BSgl0A==} + + '@mdit-vue/plugin-frontmatter@2.1.2': + resolution: {integrity: sha512-2YOVOsMRtf11bZ6mEB4xoWD6RG5X0Ex+g/1c1iXoYUMUahlZnz9flXUM6WAE++HsLR3Wkvd5FNhGUArrcxn0dA==} + + '@mdit-vue/types@2.1.0': + resolution: {integrity: sha512-TMBB/BQWVvwtpBdWD75rkZx4ZphQ6MN0O4QB2Bc0oI5PC2uE57QerhNxdRZ7cvBHE2iY2C+BUNUziCfJbjIRRA==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@pkgr/core@0.1.1': + resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + + '@polka/url@1.0.0-next.25': + resolution: {integrity: sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==} + + '@rollup/pluginutils@5.1.0': + resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/rollup-android-arm-eabi@4.13.0': + resolution: {integrity: sha512-5ZYPOuaAqEH/W3gYsRkxQATBW3Ii1MfaT4EQstTnLKViLi2gLSQmlmtTpGucNP3sXEpOiI5tdGhjdE111ekyEg==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.13.0': + resolution: {integrity: sha512-BSbaCmn8ZadK3UAQdlauSvtaJjhlDEjS5hEVVIN3A4bbl3X+otyf/kOJV08bYiRxfejP3DXFzO2jz3G20107+Q==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.13.0': + resolution: {integrity: sha512-Ovf2evVaP6sW5Ut0GHyUSOqA6tVKfrTHddtmxGQc1CTQa1Cw3/KMCDEEICZBbyppcwnhMwcDce9ZRxdWRpVd6g==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.13.0': + resolution: {integrity: sha512-U+Jcxm89UTK592vZ2J9st9ajRv/hrwHdnvyuJpa5A2ngGSVHypigidkQJP+YiGL6JODiUeMzkqQzbCG3At81Gg==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-linux-arm-gnueabihf@4.13.0': + resolution: {integrity: sha512-8wZidaUJUTIR5T4vRS22VkSMOVooG0F4N+JSwQXWSRiC6yfEsFMLTYRFHvby5mFFuExHa/yAp9juSphQQJAijQ==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.13.0': + resolution: {integrity: sha512-Iu0Kno1vrD7zHQDxOmvweqLkAzjxEVqNhUIXBsZ8hu8Oak7/5VTPrxOEZXYC1nmrBVJp0ZcL2E7lSuuOVaE3+w==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm64-musl@4.13.0': + resolution: {integrity: sha512-C31QrW47llgVyrRjIwiOwsHFcaIwmkKi3PCroQY5aVq4H0A5v/vVVAtFsI1nfBngtoRpeREvZOkIhmRwUKkAdw==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-riscv64-gnu@4.13.0': + resolution: {integrity: sha512-Oq90dtMHvthFOPMl7pt7KmxzX7E71AfyIhh+cPhLY9oko97Zf2C9tt/XJD4RgxhaGeAraAXDtqxvKE1y/j35lA==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-gnu@4.13.0': + resolution: {integrity: sha512-yUD/8wMffnTKuiIsl6xU+4IA8UNhQ/f1sAnQebmE/lyQ8abjsVyDkyRkWop0kdMhKMprpNIhPmYlCxgHrPoXoA==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-musl@4.13.0': + resolution: {integrity: sha512-9RyNqoFNdF0vu/qqX63fKotBh43fJQeYC98hCaf89DYQpv+xu0D8QFSOS0biA7cGuqJFOc1bJ+m2rhhsKcw1hw==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rollup/rollup-win32-arm64-msvc@4.13.0': + resolution: {integrity: sha512-46ue8ymtm/5PUU6pCvjlic0z82qWkxv54GTJZgHrQUuZnVH+tvvSP0LsozIDsCBFO4VjJ13N68wqrKSeScUKdA==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.13.0': + resolution: {integrity: sha512-P5/MqLdLSlqxbeuJ3YDeX37srC8mCflSyTrUsgbU1c/U9j6l2g2GiIdYaGD9QjdMQPMSgYm7hgg0551wHyIluw==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.13.0': + resolution: {integrity: sha512-UKXUQNbO3DOhzLRwHSpa0HnhhCgNODvfoPWv2FCXme8N/ANFfhIPMGuOT+QuKd16+B5yxZ0HdpNlqPvTMS1qfw==} + cpu: [x64] + os: [win32] + + '@sinclair/typebox@0.27.8': + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + + '@swc/core-darwin-arm64@1.4.8': + resolution: {integrity: sha512-hhQCffRTgzpTIbngSnC30vV6IJVTI9FFBF954WEsshsecVoCGFiMwazBbrkLG+RwXENTrMhgeREEFh6R3KRgKQ==} + engines: {node: '>=10'} + cpu: [arm64] + os: [darwin] + + '@swc/core-darwin-x64@1.4.8': + resolution: {integrity: sha512-P3ZBw8Jr8rKhY/J8d+6WqWriqngGTgHwtFeJ8MIakQJTbdYbFgXSZxcvDiERg3psbGeFXaUaPI0GO6BXv9k/OQ==} + engines: {node: '>=10'} + cpu: [x64] + os: [darwin] + + '@swc/core-linux-arm-gnueabihf@1.4.8': + resolution: {integrity: sha512-PP9JIJt19bUWhAGcQW6qMwTjZOcMyzkvZa0/LWSlDm0ORYVLmDXUoeQbGD3e0Zju9UiZxyulnpjEN0ZihJgPTA==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux] + + '@swc/core-linux-arm64-gnu@1.4.8': + resolution: {integrity: sha512-HvEWnwKHkoVUr5iftWirTApFJ13hGzhAY2CMw4lz9lur2m+zhPviRRED0FCI6T95Knpv7+8eUOr98Z7ctrG6DQ==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@swc/core-linux-arm64-musl@1.4.8': + resolution: {integrity: sha512-kY8+qa7k/dEeBq9p0Hrta18QnJPpsiJvDQSLNaTIFpdM3aEM9zbkshWz8gaX5VVGUEALowCBUWqmzO4VaqM+2w==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@swc/core-linux-x64-gnu@1.4.8': + resolution: {integrity: sha512-0WWyIw432wpO/zeGblwq4f2YWam4pn8Z/Ig4KzHMgthR/KmiLU3f0Z7eo45eVmq5vcU7Os1zi/Zb65OOt09q/w==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@swc/core-linux-x64-musl@1.4.8': + resolution: {integrity: sha512-p4yxvVS05rBNCrBaSTa20KK88vOwtg8ifTW7ec/yoab0bD5EwzzB8KbDmLLxE6uziFa0sdjF0dfRDwSZPex37Q==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@swc/core-win32-arm64-msvc@1.4.8': + resolution: {integrity: sha512-jKuXihxAaqUnbFfvPxtmxjdJfs87F1GdBf33il+VUmSyWCP4BE6vW+/ReDAe8sRNsKyrZ3UH1vI5q1n64csBUA==} + engines: {node: '>=10'} + cpu: [arm64] + os: [win32] + + '@swc/core-win32-ia32-msvc@1.4.8': + resolution: {integrity: sha512-O0wT4AGHrX8aBeH6c2ADMHgagAJc5Kf6W48U5moyYDAkkVnKvtSc4kGhjWhe1Yl0sI0cpYh2In2FxvYsb44eWw==} + engines: {node: '>=10'} + cpu: [ia32] + os: [win32] + + '@swc/core-win32-x64-msvc@1.4.8': + resolution: {integrity: sha512-C2AYc3A2o+ECciqsJWRgIpp83Vk5EaRzHe7ed/xOWzVd0MsWR+fweEsyOjlmzHfpUxJSi46Ak3/BIZJlhZbXbg==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + + '@swc/core@1.4.8': + resolution: {integrity: sha512-uY2RSJcFPgNOEg12RQZL197LZX+MunGiKxsbxmh22VfVxrOYGRvh4mPANFlrD1yb38CgmW1wI6YgIi8LkIwmWg==} + engines: {node: '>=10'} + peerDependencies: + '@swc/helpers': ^0.5.0 + peerDependenciesMeta: + '@swc/helpers': + optional: true + + '@swc/counter@0.1.3': + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + + '@swc/types@0.1.6': + resolution: {integrity: sha512-/JLo/l2JsT/LRd80C3HfbmVpxOAJ11FO2RCEslFrgzLltoP9j8XIbsyDcfCt2WWyX+CM96rBoNM+IToAkFOugg==} + + '@sxzz/popperjs-es@2.11.7': + resolution: {integrity: sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==} + + '@types/estree@1.0.5': + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + + '@types/fined@1.1.5': + resolution: {integrity: sha512-2N93vadEGDFhASTIRbizbl4bNqpMOId5zZfj6hHqYZfEzEfO9onnU4Im8xvzo8uudySDveDHBOOSlTWf38ErfQ==} + + '@types/inquirer@9.0.7': + resolution: {integrity: sha512-Q0zyBupO6NxGRZut/JdmqYKOnN95Eg5V8Csg3PGKkP+FnvsUZx1jAyK7fztIszxxMuoBA6E3KXWvdZVXIpx60g==} + + '@types/istanbul-lib-coverage@2.0.6': + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + + '@types/ityped@1.0.3': + resolution: {integrity: sha512-89dSbYe+TuNYRgw5stHSAlQ1ABp5Ca9UPw/yCvaFBUn6W7M2wG1XjivvohYCkOC2rIKCnSAjezIXe8oDmrJPew==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/liftoff@4.0.3': + resolution: {integrity: sha512-UgbL2kR5pLrWICvr8+fuSg0u43LY250q7ZMkC+XKC3E+rs/YBDEnQIzsnhU5dYsLlwMi3R75UvCL87pObP1sxw==} + + '@types/linkify-it@3.0.5': + resolution: {integrity: sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw==} + + '@types/lodash-es@4.17.12': + resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==} + + '@types/lodash@4.17.14': + resolution: {integrity: sha512-jsxagdikDiDBeIRaPYtArcT8my4tN1og7MtMRquFT3XNA6axxyHDRUemqDz/taRDdOUn0GnGHRCuff4q48sW9A==} + + '@types/markdown-it@14.0.1': + resolution: {integrity: sha512-6WfOG3jXR78DW8L5cTYCVVGAsIFZskRHCDo5tbqa+qtKVt4oDRVH7hyIWu1SpDQJlmIoEivNQZ5h+AGAOrgOtQ==} + + '@types/mdurl@1.0.5': + resolution: {integrity: sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA==} + + '@types/node@20.12.7': + resolution: {integrity: sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==} + + '@types/semver@7.5.8': + resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} + + '@types/through@0.0.33': + resolution: {integrity: sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==} + + '@types/web-bluetooth@0.0.16': + resolution: {integrity: sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==} + + '@types/web-bluetooth@0.0.20': + resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} + + '@typescript-eslint/parser@7.8.0': + resolution: {integrity: sha512-KgKQly1pv0l4ltcftP59uQZCi4HUYswCLbTqVZEJu7uLX8CTLyswqMLqLN+2QFz4jCptqWVV4SB7vdxcH2+0kQ==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@7.8.0': + resolution: {integrity: sha512-viEmZ1LmwsGcnr85gIq+FCYI7nO90DVbE37/ll51hjv9aG+YZMb4WDE2fyWpUR4O/UrhGRpYXK/XajcGTk2B8g==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/types@7.8.0': + resolution: {integrity: sha512-wf0peJ+ZGlcH+2ZS23aJbOv+ztjeeP8uQ9GgwMJGVLx/Nj9CJt17GWgWWoSmoRVKAX2X+7fzEnAjxdvK2gqCLw==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/typescript-estree@7.8.0': + resolution: {integrity: sha512-5pfUCOwK5yjPaJQNy44prjCwtr981dO8Qo9J9PwYXZ0MosgAbfEMB008dJ5sNo3+/BN6ytBPuSvXUg9SAqB0dg==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@7.8.0': + resolution: {integrity: sha512-L0yFqOCflVqXxiZyXrDr80lnahQfSOfc9ELAAZ75sqicqp2i36kEZZGuUymHNFoYOqxRT05up760b4iGsl02nQ==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + + '@typescript-eslint/visitor-keys@7.8.0': + resolution: {integrity: sha512-q4/gibTNBQNA0lGyYQCmWRS5D15n8rXh4QjK3KV+MBPlTYHpfBUT3D3PaPR/HeNiI9W6R7FvlkcGhNyAoP+caA==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@ungap/structured-clone@1.2.0': + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + + '@unocss/astro@0.59.4': + resolution: {integrity: sha512-DU3OR5MMR1Uvvec4/wB9EetDASHRg19Moy6z/MiIhn8JWJ0QzWYgSeJcfUX8exomMYv6WUEQJL+CyLI34Wmn8w==} + peerDependencies: + vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 + peerDependenciesMeta: + vite: + optional: true + + '@unocss/cli@0.59.4': + resolution: {integrity: sha512-TT+WKedSifhsRqnpoYD2LfyYipVzEbzIU4DDGIaDNeDxGXYOGpb876zzkPDcvZSpI37IJ/efkkV7PGYpPBcQBQ==} + engines: {node: '>=14'} + hasBin: true + + '@unocss/config@0.59.4': + resolution: {integrity: sha512-h3yhj+D5Ygn5R7gbK4wMrtXZX6FF5DF6YD517sSSb0XB3lxHD9PhhT4HaV1hpHknvu0cMFU3460M45+TN1TI0Q==} + engines: {node: '>=14'} + + '@unocss/core@0.59.4': + resolution: {integrity: sha512-bBZ1sgcAtezQVZ1BST9IS3jqcsTLyqKNjiIf7FTnX3DHpfpYuMDFzSOtmkZDzBleOLO/CtcRWjT0HwTSQAmV0A==} + + '@unocss/eslint-config@0.59.4': + resolution: {integrity: sha512-a0FWOXQtdheYplZI+Oba2QMNWzCsfTUV/EuYEUDuKFARcsqpzO0PgRSH0MDHz0nROYmxeKkEKW/56dbAXmjBFQ==} + engines: {node: '>=14'} + + '@unocss/eslint-plugin@0.59.4': + resolution: {integrity: sha512-bWxr0ax0X8F97/JcQ8V34Zl4ZSPklMkYAExj+svfanng7i6ymBCmMDfSVcNjb7VJFP1ealNuEnJ9PJcV0N0aQQ==} + engines: {node: '>=14'} + + '@unocss/extractor-arbitrary-variants@0.59.4': + resolution: {integrity: sha512-RDe4FgMGJQ+tp9GLvhPHni7Cc2O0lHBRMElVlN8LoXJAdODMICdbrEPGJlEfrc+7x/QgVFoR895KpYJh3hIgGA==} + + '@unocss/inspector@0.59.4': + resolution: {integrity: sha512-QczJFNDiggmekkJyNcbcZIUVwlhvxz7ZwjnSf0w7K4znxfjKkZ1hNUbqLviM1HumkTKOdT27VISW7saN/ysO4w==} + + '@unocss/postcss@0.59.4': + resolution: {integrity: sha512-KVz+AD7McHKp7VEWHbFahhyyVEo0oP/e1vnuNSuPlHthe+1V2zfH6lps+iJcvfL2072r5J+0PvD/1kOp5ryUSg==} + engines: {node: '>=14'} + peerDependencies: + postcss: ^8.4.21 + + '@unocss/preset-attributify@0.59.4': + resolution: {integrity: sha512-BeogWuYaIakC1gmOZFFCjFVWmu/m3AqEX8UYQS6tY6lAaK2L4Qf4AstYBlT2zAMxy9LNxPDxFQrvfSfFk5Klsg==} + + '@unocss/preset-icons@0.59.4': + resolution: {integrity: sha512-Afjwh5oC4KRE8TNZDUkRK6hvvV1wKLrS1e5trniE0B0AM9HK3PBolQaIU7QmzPv6WQrog+MZgIwafg1eqsPUCA==} + + '@unocss/preset-mini@0.59.4': + resolution: {integrity: sha512-ZLywGrXi1OCr4My5vX2rLUb5Xgx6ufR9WTQOvpQJGBdIV/jnZn/pyE5avCs476SnOq2K172lnd8mFmTK7/zArA==} + + '@unocss/preset-tagify@0.59.4': + resolution: {integrity: sha512-vWMdTUoghOSmTbdmZtERssffmdUdOuhh4vUdl0R8Kv6KxB0PkvEFCu2FItn97nRJdSPlZSFxxDkaOIg9w+STNQ==} + + '@unocss/preset-typography@0.59.4': + resolution: {integrity: sha512-ZX9bxZUqlXK1qEDzO5lkK96ICt9itR/oNyn/7mMc1JPqwj263LumQMn5silocgzoLSUXEeq//L6GylqYjkL8GA==} + + '@unocss/preset-uno@0.59.4': + resolution: {integrity: sha512-G1f8ZluplvXZ3bERj+sM/8zzY//XD++nNOlAQNKOANSVht3qEoJebrfEiMClNpA5qW5VWOZhEhPkh0M7GsXtnA==} + + '@unocss/preset-web-fonts@0.59.4': + resolution: {integrity: sha512-ehutTjKHnf2KPmdatN42N9a8+y+glKSU3UlcBRNsVIIXVIlaBQuPVGZSPhnMtrKD17IgWylXq2K6RJK+ab0hZA==} + + '@unocss/preset-wind@0.59.4': + resolution: {integrity: sha512-CNX6w0ZpSQg/i1oF0/WKWzto8PtLqoknC5h8JmmcGb7VsyBQeV0oNnhbURxpbuMEhbv1MWVIGvk8a+P6y0rFkQ==} + + '@unocss/reset@0.59.4': + resolution: {integrity: sha512-Upy4xzdWl4RChbLAXBq1BoR4WqxXMoIfjvtcwSZcZK2sylXCFAseSWnyzJFdSiXPqNfmMuNgPXgiSxiQB+cmNA==} + + '@unocss/rule-utils@0.59.4': + resolution: {integrity: sha512-1qoLJlBWAkS4D4sg73990S1MT7E8E5md/YhopKjTQuEC9SyeVmEg+5pR/Xd8xhPKMqbcuBPl/DS8b6l/GQO56A==} + engines: {node: '>=14'} + + '@unocss/scope@0.59.4': + resolution: {integrity: sha512-wBQJ39kw4Tfj4km7AoGvSIobPKVnRZVsgc0bema5Y0PL3g1NeVQ/LopBI2zEJWdpxGXUWxSDsXm7BZo6qVlD/A==} + + '@unocss/transformer-attributify-jsx-babel@0.59.4': + resolution: {integrity: sha512-xtCRSgeTaDBiNJLVX7oOSFe63JiFB5nrdK23PHn3IlZM9O7Bxx4ZxI3MQJtFZFQNE+INFko+DVyY1WiFEm1p/Q==} + + '@unocss/transformer-attributify-jsx@0.59.4': + resolution: {integrity: sha512-m4b83utzKMfUQH/45V2QkjJoXd8Tu2pRP1nic91Xf7QRceyKDD+BxoTneo2JNC2K274cQu7HqqotnCm2aFfEGw==} + + '@unocss/transformer-compile-class@0.59.4': + resolution: {integrity: sha512-Vgk2OCLPW0pU+Uzr1IgDtHVspSBb+gPrQFkV+5gxHk9ZdKi3oYKxLuufVWYDSwv7o9yfQGbYrMH9YLsjRsnA7Q==} + + '@unocss/transformer-directives@0.59.4': + resolution: {integrity: sha512-nXUTEclUbs0vQ4KfLhKt4J/5SLSEq1az2FNlJmiXMmqmn75X89OrtCu2OJu9sGXhn+YyBApxgcSSdxmtpqMi1Q==} + + '@unocss/transformer-variant-group@0.59.4': + resolution: {integrity: sha512-9XLixxn1NRgP62Kj4R/NC/rpqhql5F2s6ulJ8CAMTEbd/NylVhEANluPGDVUGcLJ4cj6E02hFa8C1PLGSm7/xw==} + + '@unocss/vite@0.59.4': + resolution: {integrity: sha512-q7GN7vkQYn79n7vYIUlaa7gXGwc7pk0Qo3z3ZFwWGE43/DtZnn2Hwl5UjgBAgi9McA+xqHJEHRsJnI7HJPHUYA==} + peerDependencies: + vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 + + '@vitejs/plugin-vue-jsx@3.1.0': + resolution: {integrity: sha512-w9M6F3LSEU5kszVb9An2/MmXNxocAnUb3WhRr8bHlimhDrXNt6n6D2nJQR3UXpGlZHh/EsgouOHCsM8V3Ln+WA==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.0.0 || ^5.0.0 + vue: ^3.0.0 + + '@vitejs/plugin-vue@5.0.4': + resolution: {integrity: sha512-WS3hevEszI6CEVEx28F8RjTX97k3KsrcY6kvTg7+Whm5y3oYvcqzVeGCU3hxSAn4uY2CLCkeokkGKpoctccilQ==} + engines: {node: ^18.0.0 || >=20.0.0} + peerDependencies: + vite: ^5.0.0 + vue: ^3.2.25 + + '@vitest/expect@1.5.3': + resolution: {integrity: sha512-y+waPz31pOFr3rD7vWTbwiLe5+MgsMm40jTZbQE8p8/qXyBX3CQsIXRx9XK12IbY7q/t5a5aM/ckt33b4PxK2g==} + + '@vitest/runner@1.5.3': + resolution: {integrity: sha512-7PlfuReN8692IKQIdCxwir1AOaP5THfNkp0Uc4BKr2na+9lALNit7ub9l3/R7MP8aV61+mHKRGiqEKRIwu6iiQ==} + + '@vitest/snapshot@1.5.3': + resolution: {integrity: sha512-K3mvIsjyKYBhNIDujMD2gfQEzddLe51nNOAf45yKRt/QFJcUIeTQd2trRvv6M6oCBHNVnZwFWbQ4yj96ibiDsA==} + + '@vitest/spy@1.5.3': + resolution: {integrity: sha512-Llj7Jgs6lbnL55WoshJUUacdJfjU2honvGcAJBxhra5TPEzTJH8ZuhI3p/JwqqfnTr4PmP7nDmOXP53MS7GJlg==} + + '@vitest/utils@1.5.3': + resolution: {integrity: sha512-rE9DTN1BRhzkzqNQO+kw8ZgfeEBCLXiHJwetk668shmNBpSagQxneT5eSqEBLP+cqSiAeecvQmbpFfdMyLcIQA==} + + '@vue-macros/common@1.10.2': + resolution: {integrity: sha512-WC66NPVh2mJWqm4L0l/u/cOqm4pNOIwVdMGnDYAH2rHcOWy5x68GkhpkYTBu1+xwCSeHWOQn1TCGGbD+98fFpA==} + engines: {node: '>=16.14.0'} + peerDependencies: + vue: ^2.7.0 || ^3.2.25 + peerDependenciesMeta: + vue: + optional: true + + '@vue/babel-helper-vue-transform-on@1.2.2': + resolution: {integrity: sha512-nOttamHUR3YzdEqdM/XXDyCSdxMA9VizUKoroLX6yTyRtggzQMHXcmwh8a7ZErcJttIBIc9s68a1B8GZ+Dmvsw==} + + '@vue/babel-plugin-jsx@1.2.2': + resolution: {integrity: sha512-nYTkZUVTu4nhP199UoORePsql0l+wj7v/oyQjtThUVhJl1U+6qHuoVhIvR3bf7eVKjbCK+Cs2AWd7mi9Mpz9rA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + peerDependenciesMeta: + '@babel/core': + optional: true + + '@vue/babel-plugin-resolve-type@1.2.2': + resolution: {integrity: sha512-EntyroPwNg5IPVdUJupqs0CFzuf6lUrVvCspmv2J1FITLeGnUCuoGNNk78dgCusxEiYj6RMkTJflGSxk5aIC4A==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@vue/compiler-core@3.4.21': + resolution: {integrity: sha512-MjXawxZf2SbZszLPYxaFCjxfibYrzr3eYbKxwpLR9EQN+oaziSu3qKVbwBERj1IFIB8OLUewxB5m/BFzi613og==} + + '@vue/compiler-core@3.4.24': + resolution: {integrity: sha512-vbW/tgbwJYj62N/Ww99x0zhFTkZDTcGh3uwJEuadZ/nF9/xuFMC4693P9r+3sxGXISABpDKvffY5ApH9pmdd1A==} + + '@vue/compiler-core@3.4.26': + resolution: {integrity: sha512-N9Vil6Hvw7NaiyFUFBPXrAyETIGlQ8KcFMkyk6hW1Cl6NvoqvP+Y8p1Eqvx+UdqsnrnI9+HMUEJegzia3mhXmQ==} + + '@vue/compiler-dom@3.4.21': + resolution: {integrity: sha512-IZC6FKowtT1sl0CR5DpXSiEB5ayw75oT2bma1BEhV7RRR1+cfwLrxc2Z8Zq/RGFzJ8w5r9QtCOvTjQgdn0IKmA==} + + '@vue/compiler-dom@3.4.24': + resolution: {integrity: sha512-4XgABML/4cNndVsQndG6BbGN7+EoisDwi3oXNovqL/4jdNhwvP8/rfRMTb6FxkxIxUUtg6AI1/qZvwfSjxJiWA==} + + '@vue/compiler-dom@3.4.26': + resolution: {integrity: sha512-4CWbR5vR9fMg23YqFOhr6t6WB1Fjt62d6xdFPyj8pxrYub7d+OgZaObMsoxaF9yBUHPMiPFK303v61PwAuGvZA==} + + '@vue/compiler-sfc@3.4.21': + resolution: {integrity: sha512-me7epoTxYlY+2CUM7hy9PCDdpMPfIwrOvAXud2Upk10g4YLv9UBW7kL798TvMeDhPthkZ0CONNrK2GoeI1ODiQ==} + + '@vue/compiler-sfc@3.4.26': + resolution: {integrity: sha512-It1dp+FAOCgluYSVYlDn5DtZBxk1NCiJJfu2mlQqa/b+k8GL6NG/3/zRbJnHdhV2VhxFghaDq5L4K+1dakW6cw==} + + '@vue/compiler-ssr@3.4.21': + resolution: {integrity: sha512-M5+9nI2lPpAsgXOGQobnIueVqc9sisBFexh5yMIMRAPYLa7+5wEJs8iqOZc1WAa9WQbx9GR2twgznU8LTIiZ4Q==} + + '@vue/compiler-ssr@3.4.26': + resolution: {integrity: sha512-FNwLfk7LlEPRY/g+nw2VqiDKcnDTVdCfBREekF8X74cPLiWHUX6oldktf/Vx28yh4STNy7t+/yuLoMBBF7YDiQ==} + + '@vue/devtools-api@6.6.1': + resolution: {integrity: sha512-LgPscpE3Vs0x96PzSSB4IGVSZXZBZHpfxs+ZA1d+VEPwHdOXowy/Y2CsvCAIFrf+ssVU1pD1jidj505EpUnfbA==} + + '@vue/devtools-core@7.1.3': + resolution: {integrity: sha512-pVbWi8pf2Z/fZPioYOIgu+cv9pQG55k4D8bL31ec+Wfe+pQR0ImFDu0OhHfch1Ra8uvLLrAZTF4IKeGAkmzD4A==} + + '@vue/devtools-kit@7.1.3': + resolution: {integrity: sha512-NFskFSJMVCBXTkByuk2llzI3KD3Blcm7WqiRorWjD6nClHPgkH5BobDH08rfulqq5ocRt5xV+3qOT1Q9FXJrwQ==} + peerDependencies: + vue: ^3.0.0 + + '@vue/devtools-shared@7.1.3': + resolution: {integrity: sha512-KJ3AfgjTn3tJz/XKF+BlVShNPecim3G21oHRue+YQOsooW+0s+qXvm09U09aO7yBza5SivL1QgxSrzAbiKWjhQ==} + + '@vue/reactivity@3.4.26': + resolution: {integrity: sha512-E/ynEAu/pw0yotJeLdvZEsp5Olmxt+9/WqzvKff0gE67tw73gmbx6tRkiagE/eH0UCubzSlGRebCbidB1CpqZQ==} + + '@vue/runtime-core@3.4.26': + resolution: {integrity: sha512-AFJDLpZvhT4ujUgZSIL9pdNcO23qVFh7zWCsNdGQBw8ecLNxOOnPcK9wTTIYCmBJnuPHpukOwo62a2PPivihqw==} + + '@vue/runtime-dom@3.4.26': + resolution: {integrity: sha512-UftYA2hUXR2UOZD/Fc3IndZuCOOJgFxJsWOxDkhfVcwLbsfh2CdXE2tG4jWxBZuDAs9J9PzRTUFt1PgydEtItw==} + + '@vue/server-renderer@3.4.26': + resolution: {integrity: sha512-xoGAqSjYDPGAeRWxeoYwqJFD/gw7mpgzOvSxEmjWaFO2rE6qpbD1PC172YRpvKhrihkyHJkNDADFXTfCyVGhKw==} + peerDependencies: + vue: 3.4.26 + + '@vue/shared@3.4.21': + resolution: {integrity: sha512-PuJe7vDIi6VYSinuEbUIQgMIRZGgM8e4R+G+/dQTk0X1NEdvgvvgv7m+rfmDH1gZzyA1OjjoWskvHlfRNfQf3g==} + + '@vue/shared@3.4.24': + resolution: {integrity: sha512-BW4tajrJBM9AGAknnyEw5tO2xTmnqgup0VTnDAMcxYmqOX0RG0b9aSUGAbEKolD91tdwpA6oCwbltoJoNzpItw==} + + '@vue/shared@3.4.26': + resolution: {integrity: sha512-Fg4zwR0GNnjzodMt3KRy2AWGMKQXByl56+4HjN87soxLNU9P5xcJkstAlIeEF3cU6UYOzmJl1tV0dVPGIljCnQ==} + + '@vueuse/components@10.9.0': + resolution: {integrity: sha512-BHQpA0yIi3y7zKa1gYD0FUzLLkcRTqVhP8smnvsCK6GFpd94Nziq1XVPD7YpFeho0k5BzbBiNZF7V/DpkJ967A==} + + '@vueuse/core@10.9.0': + resolution: {integrity: sha512-/1vjTol8SXnx6xewDEKfS0Ra//ncg4Hb0DaZiwKf7drgfMsKFExQ+FnnENcN6efPen+1kIzhLQoGSy0eDUVOMg==} + + '@vueuse/core@9.13.0': + resolution: {integrity: sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==} + + '@vueuse/integrations@10.9.0': + resolution: {integrity: sha512-acK+A01AYdWSvL4BZmCoJAcyHJ6EqhmkQEXbQLwev1MY7NBnS+hcEMx/BzVoR9zKI+UqEPMD9u6PsyAuiTRT4Q==} + peerDependencies: + async-validator: '*' + axios: '*' + change-case: '*' + drauu: '*' + focus-trap: '*' + fuse.js: '*' + idb-keyval: '*' + jwt-decode: '*' + nprogress: '*' + qrcode: '*' + sortablejs: '*' + universal-cookie: '*' + peerDependenciesMeta: + async-validator: + optional: true + axios: + optional: true + change-case: + optional: true + drauu: + optional: true + focus-trap: + optional: true + fuse.js: + optional: true + idb-keyval: + optional: true + jwt-decode: + optional: true + nprogress: + optional: true + qrcode: + optional: true + sortablejs: + optional: true + universal-cookie: + optional: true + + '@vueuse/metadata@10.9.0': + resolution: {integrity: sha512-iddNbg3yZM0X7qFY2sAotomgdHK7YJ6sKUvQqbvwnf7TmaVPxS4EJydcNsVejNdS8iWCtDk+fYXr7E32nyTnGA==} + + '@vueuse/metadata@9.13.0': + resolution: {integrity: sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==} + + '@vueuse/shared@10.9.0': + resolution: {integrity: sha512-Uud2IWncmAfJvRaFYzv5OHDli+FbOzxiVEQdLCKQKLyhz94PIyFC3CHcH7EDMwIn8NPtD06+PNbC/PiO0LGLtw==} + + '@vueuse/shared@9.13.0': + resolution: {integrity: sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn-walk@8.3.2: + resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} + engines: {node: '>=0.4.0'} + + acorn@8.11.3: + resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + engines: {node: '>=0.4.0'} + hasBin: true + + aggregate-error@4.0.1: + resolution: {integrity: sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==} + engines: {node: '>=12'} + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + + ansi-escapes@6.2.0: + resolution: {integrity: sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==} + engines: {node: '>=14.16'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + array-each@1.0.1: + resolution: {integrity: sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==} + engines: {node: '>=0.10.0'} + + array-slice@1.1.0: + resolution: {integrity: sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==} + engines: {node: '>=0.10.0'} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + + ast-kit@0.12.1: + resolution: {integrity: sha512-O+33g7x6irsESUcd47KdfWUrS2F6aGp9KeVJFGj0YjIznfXpBxVGjA0w+y/1OKqX4mFOfmZ9Xpf1ixPT4n9xxw==} + engines: {node: '>=16.14.0'} + + ast-walker-scope@0.6.1: + resolution: {integrity: sha512-0ZdQEsSfH3mX4BFbRCc3xOBjx5bDbm73+aAdQOHerPQNf8K0XFMAv79ucd2BpnSc4UMyvBDixiroT8yjm2Y6bw==} + engines: {node: '>=16.14.0'} + + async-validator@4.2.5: + resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + axios@1.6.8: + resolution: {integrity: sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + big-integer@1.6.52: + resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} + engines: {node: '>=0.6'} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + bplist-parser@0.2.0: + resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==} + engines: {node: '>= 5.10.0'} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + + browserslist-to-esbuild@2.1.1: + resolution: {integrity: sha512-KN+mty6C3e9AN8Z5dI1xeN15ExcRNeISoC3g7V0Kax/MMF9MSoYA2G7lkTTcVUFntiEjkpI0HNgqJC1NjdyNUw==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + browserslist: '*' + + browserslist@4.23.0: + resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + bundle-name@3.0.0: + resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==} + engines: {node: '>=12'} + + bundle-name@4.1.0: + resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} + engines: {node: '>=18'} + + c12@1.10.0: + resolution: {integrity: sha512-0SsG7UDhoRWcuSvKWHaXmu5uNjDCDN3nkQLRL4Q42IlFy+ze58FcCoI3uPwINXinkz7ZinbhEgyzYFw9u9ZV8g==} + + c8@9.1.0: + resolution: {integrity: sha512-mBWcT5iqNir1zIkzSPyI3NCR9EZCVI3WUD+AVO17MVWTSFNyUueXE82qTeampNtTr+ilN/5Ua3j24LgbCKjDVg==} + engines: {node: '>=14.14.0'} + hasBin: true + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} + + call-me-maybe@1.0.2: + resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camel-case@4.1.2: + resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + caniuse-lite@1.0.30001600: + resolution: {integrity: sha512-+2S9/2JFhYmYaDpZvo0lKkfvuKIglrx68MwOBqMGHhQsNkLjB5xtc/TGoEPs+MxjSyN/72qer2g97nzR641mOQ==} + + capital-case@1.0.4: + resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} + + chai@4.4.1: + resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} + engines: {node: '>=4'} + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + change-case@4.1.2: + resolution: {integrity: sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==} + + changelogen@0.5.5: + resolution: {integrity: sha512-IzgToIJ/R9NhVKmL+PW33ozYkv53bXvufDNUSH3GTKXq1iCHGgkbgbtqEWbo8tnWNnt7nPDpjL8PwSG2iS8RVw==} + hasBin: true + + chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + + check-error@1.0.3: + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + + citty@0.1.6: + resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} + + clean-stack@4.2.0: + resolution: {integrity: sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==} + engines: {node: '>=12'} + + cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + + cli-cursor@4.0.0: + resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + cli-progress@3.12.0: + resolution: {integrity: sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A==} + engines: {node: '>=4'} + + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + + cli-truncate@4.0.0: + resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} + engines: {node: '>=18'} + + cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} + + commander@12.0.0: + resolution: {integrity: sha512-MwVNWlYjDTtOjX5PiD7o5pK0UrFU/OYgcJfjjK4RaHZETNtjJqrZa9Y9ds88+A+f+d5lv+561eZ+yCKoS3gbAA==} + engines: {node: '>=18'} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + confbox@0.1.3: + resolution: {integrity: sha512-eH3ZxAihl1PhKfpr4VfEN6/vUd87fmgb6JkldHgg/YR6aEBhW63qUDgzP2Y6WM0UumdsYp5H3kibalXAdHfbgg==} + + consola@3.2.3: + resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} + engines: {node: ^14.18.0 || >=16.10.0} + + constant-case@3.0.4: + resolution: {integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==} + + convert-gitmoji@0.1.5: + resolution: {integrity: sha512-4wqOafJdk2tqZC++cjcbGcaJ13BZ3kwldf06PTiAQRAB76Z1KJwZNL1SaRZMi2w1FM9RYTgZ6QErS8NUl/GBmQ==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + core-js@3.36.1: + resolution: {integrity: sha512-BTvUrwxVBezj5SZ3f10ImnX2oRByMxql3EimVqMysepbC9EeMUOpLwdy6Eoili2x6E4kf+ZUB5k/+Jv55alPfA==} + + cross-env@7.0.3: + resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} + engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} + hasBin: true + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + css-tree@2.3.1: + resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + dayjs@1.11.13: + resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} + + debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + deep-eql@4.1.3: + resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + engines: {node: '>=6'} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + default-browser-id@3.0.0: + resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==} + engines: {node: '>=12'} + + default-browser-id@5.0.0: + resolution: {integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==} + engines: {node: '>=18'} + + default-browser@4.0.0: + resolution: {integrity: sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==} + engines: {node: '>=14.16'} + + default-browser@5.2.1: + resolution: {integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==} + engines: {node: '>=18'} + + defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + + defu@6.1.4: + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + + del@7.1.0: + resolution: {integrity: sha512-v2KyNk7efxhlyHpjEvfyxaAihKKK0nWCuf6ZtqZcFFpQRG0bJ12Qsr0RpvsICMjAAZ8DOVCxrlqpxISlMHC4Kg==} + engines: {node: '>=14.16'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + destr@2.0.3: + resolution: {integrity: sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==} + + detect-file@1.0.0: + resolution: {integrity: sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==} + engines: {node: '>=0.10.0'} + + detect-indent@7.0.1: + resolution: {integrity: sha512-Mc7QhQ8s+cLrnUfU/Ji94vG/r8M26m8f++vyres4ZoojaRDpZ1eSIh/EpzLNwlWuvzSZ3UbDFspjFvTDXe6e/g==} + engines: {node: '>=12.20'} + + detect-libc@1.0.3: + resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} + engines: {node: '>=0.10'} + hasBin: true + + diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + dot-case@3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + + dotenv@16.4.5: + resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} + engines: {node: '>=12'} + + duplexer@0.1.2: + resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + + echarts@5.5.0: + resolution: {integrity: sha512-rNYnNCzqDAPCr4m/fqyUFv7fD9qIsd50S6GDFgO1DxZhncCsNsG7IfUlAlvZe5oSEQxtsjnHiUuppzccry93Xw==} + + electron-to-chromium@1.4.715: + resolution: {integrity: sha512-XzWNH4ZSa9BwVUQSDorPWAUQ5WGuYz7zJUNpNif40zFCiCl20t8zgylmreNmn26h5kiyw2lg7RfTmeMBsDklqg==} + + element-plus@2.9.2: + resolution: {integrity: sha512-HS+Cc5mmy70DixJuoN3cMxPPoNWXkjHzUw2PcGmysk6NHQzzUtwi2Vc+dlmbmRxj3eNqgC1xpPQV5Nf9uDtQRg==} + peerDependencies: + vue: ^3.2.0 + + emoji-regex@10.3.0: + resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + error-stack-parser-es@0.1.1: + resolution: {integrity: sha512-g/9rfnvnagiNf+DRMHEVGuGuIBlCIMDFoTA616HaP2l9PlCjGjVhD98PNbVSJvmK4TttqT5mV5tInMhoFgi+aA==} + + es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + esbuild@0.20.2: + resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} + engines: {node: '>=12'} + hasBin: true + + escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + eslint-config-prettier@9.1.0: + resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-plugin-prettier@5.1.3: + resolution: {integrity: sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' + eslint-config-prettier: '*' + prettier: '>=3.0.0' + peerDependenciesMeta: + '@types/eslint': + optional: true + eslint-config-prettier: + optional: true + + eslint-plugin-vue@9.25.0: + resolution: {integrity: sha512-tDWlx14bVe6Bs+Nnh3IGrD+hb11kf2nukfm6jLsmJIhmiRQ1SUaksvwY9U5MvPB0pcrg0QK0xapQkfITs3RKOA==} + engines: {node: ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint@8.57.0: + resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + execa@7.2.0: + resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} + engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} + + execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + + expand-tilde@2.0.2: + resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} + engines: {node: '>=0.10.0'} + + extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + + figures@3.2.0: + resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} + engines: {node: '>=8'} + + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + + fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + findup-sync@5.0.0: + resolution: {integrity: sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==} + engines: {node: '>= 10.13.0'} + + fined@2.0.0: + resolution: {integrity: sha512-OFRzsL6ZMHz5s0JrsEr+TpdGNCtrVtnuG3x1yzGNiQHT0yaDnXAj8V/lWcpJVrnoDpcwXcASxAZYbuXda2Y82A==} + engines: {node: '>= 10.13.0'} + + flagged-respawn@2.0.0: + resolution: {integrity: sha512-Gq/a6YCi8zexmGHMuJwahTGzXlAZAOsbCVKduWXC6TlLCjjFRlExMJc4GC2NYPYZ0r/brw9P7CpRgQmlPVeOoA==} + engines: {node: '>= 10.13.0'} + + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + + flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + hasBin: true + + flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + + follow-redirects@1.15.6: + resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + for-in@1.0.2: + resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} + engines: {node: '>=0.10.0'} + + for-own@1.0.0: + resolution: {integrity: sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==} + engines: {node: '>=0.10.0'} + + foreground-child@3.1.1: + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + engines: {node: '>=14'} + + form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + + fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + + fs-extra@11.2.0: + resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} + engines: {node: '>=14.14'} + + fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-east-asian-width@1.2.0: + resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} + engines: {node: '>=18'} + + get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + + get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + + giget@1.2.3: + resolution: {integrity: sha512-8EHPljDvs7qKykr6uw8b+lqLiUc/vUg+KVTI0uND4s63TdsZM2Xus3mflvF0DDG9SiM4RlCkFGL+7aAjRmV7KA==} + hasBin: true + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + + global-modules@1.0.0: + resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==} + engines: {node: '>=0.10.0'} + + global-prefix@1.0.2: + resolution: {integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==} + engines: {node: '>=0.10.0'} + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + globby@13.2.2: + resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + gray-matter@4.0.3: + resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} + engines: {node: '>=6.0'} + + gzip-size@6.0.0: + resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} + engines: {node: '>=10'} + + handlebars@4.7.8: + resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} + engines: {node: '>=0.4.7'} + hasBin: true + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + engines: {node: '>= 0.4'} + + has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + header-case@2.0.4: + resolution: {integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==} + + homedir-polyfill@1.0.3: + resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} + engines: {node: '>=0.10.0'} + + hookable@5.5.3: + resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} + + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + + html-tags@3.3.1: + resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} + engines: {node: '>=8'} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + human-signals@4.3.1: + resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} + engines: {node: '>=14.18.0'} + + human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + + husky@9.0.11: + resolution: {integrity: sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw==} + engines: {node: '>=18'} + hasBin: true + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore@5.3.1: + resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + engines: {node: '>= 4'} + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + indent-string@5.0.0: + resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} + engines: {node: '>=12'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + inquirer@9.2.16: + resolution: {integrity: sha512-qzgbB+yNjgSzk2omeqMDtO9IgJet/UL67luT1MaaggRpGK73DBQct5Q4pipwFQcIKK1GbMODYd4UfsRCkSP1DA==} + engines: {node: '>=18'} + + interpret@3.1.1: + resolution: {integrity: sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==} + engines: {node: '>=10.13.0'} + + is-absolute@1.0.0: + resolution: {integrity: sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==} + engines: {node: '>=0.10.0'} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + + is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-fullwidth-code-point@4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} + + is-fullwidth-code-point@5.0.0: + resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==} + engines: {node: '>=18'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + + is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + + is-interactive@2.0.0: + resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} + engines: {node: '>=12'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-path-cwd@3.0.0: + resolution: {integrity: sha512-kyiNFFLU0Ampr6SDZitD/DwUo4Zs1nSdnygUBqsu3LooL00Qvb5j+UnvApUn/TTj1J3OuE6BTdQ5rudKmU2ZaA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + is-path-inside@4.0.0: + resolution: {integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==} + engines: {node: '>=12'} + + is-plain-object@5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} + + is-relative@1.0.0: + resolution: {integrity: sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==} + engines: {node: '>=0.10.0'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-unc-path@1.0.0: + resolution: {integrity: sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==} + engines: {node: '>=0.10.0'} + + is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + + is-unicode-supported@1.3.0: + resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} + engines: {node: '>=12'} + + is-unicode-supported@2.0.0: + resolution: {integrity: sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==} + engines: {node: '>=18'} + + is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + + is-wsl@3.1.0: + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + engines: {node: '>=16'} + + isbinaryfile@5.0.2: + resolution: {integrity: sha512-GvcjojwonMjWbTkfMpnVHVqXW/wKMYDfEpY94/8zy8HFMOqb/VL6oeONq9v87q4ttVlaTLnGXnJD4B5B1OTGIg==} + engines: {node: '>= 18.0.0'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-reports@3.1.7: + resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + engines: {node: '>=8'} + + ityped@1.0.3: + resolution: {integrity: sha512-46Qnh3qs+6EJlWDHmvWRW6qiz5jFy2mkh9UvtTvQmLJMZIjKrdz4du68le7hLX4tAWCp6QTKiq/OuLv6huHxZg==} + + jiti@1.21.0: + resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} + hasBin: true + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-tokens@8.0.3: + resolution: {integrity: sha512-UfJMcSJc+SEXEl9lH/VLHSZbThQyLpw1vLO1Lb+j4RWDvG3N2f7yj3PVQA3cmkTBNldJ9eFnM+xEXxHIXrYiJw==} + + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonc-parser@3.2.1: + resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==} + + jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + liftoff@4.0.0: + resolution: {integrity: sha512-rMGwYF8q7g2XhG2ulBmmJgWv25qBsqRbDn5gH0+wnuyeFt7QBJlHJmtg5qEdn4pN6WVAUMgXnIxytMFRX9c1aA==} + engines: {node: '>=10.13.0'} + + lightningcss-darwin-arm64@1.24.1: + resolution: {integrity: sha512-1jQ12jBy+AE/73uGQWGSafK5GoWgmSiIQOGhSEXiFJSZxzV+OXIx+a9h2EYHxdJfX864M+2TAxWPWb0Vv+8y4w==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.24.1: + resolution: {integrity: sha512-R4R1d7VVdq2mG4igMU+Di8GPf0b64ZLnYVkubYnGG0Qxq1KaXQtAzcLI43EkpnoWvB/kUg8JKCWH4S13NfiLcQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.24.1: + resolution: {integrity: sha512-z6NberUUw5ALES6Ixn2shmjRRrM1cmEn1ZQPiM5IrZ6xHHL5a1lPin9pRv+w6eWfcrEo+qGG6R9XfJrpuY3e4g==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.24.1: + resolution: {integrity: sha512-NLQLnBQW/0sSg74qLNI8F8QKQXkNg4/ukSTa+XhtkO7v3BnK19TS1MfCbDHt+TTdSgNEBv0tubRuapcKho2EWw==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.24.1: + resolution: {integrity: sha512-AQxWU8c9E9JAjAi4Qw9CvX2tDIPjgzCTrZCSXKELfs4mCwzxRkHh2RCxX8sFK19RyJoJAjA/Kw8+LMNRHS5qEg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + lightningcss-linux-arm64-musl@1.24.1: + resolution: {integrity: sha512-JCgH/SrNrhqsguUA0uJUM1PvN5+dVuzPIlXcoWDHSv2OU/BWlj2dUYr3XNzEw748SmNZPfl2NjQrAdzaPOn1lA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + + lightningcss-linux-x64-gnu@1.24.1: + resolution: {integrity: sha512-TYdEsC63bHV0h47aNRGN3RiK7aIeco3/keN4NkoSQ5T8xk09KHuBdySltWAvKLgT8JvR+ayzq8ZHnL1wKWY0rw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + lightningcss-linux-x64-musl@1.24.1: + resolution: {integrity: sha512-HLfzVik3RToot6pQ2Rgc3JhfZkGi01hFetHt40HrUMoeKitLoqUUT5owM6yTZPTytTUW9ukLBJ1pc3XNMSvlLw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + + lightningcss-win32-x64-msvc@1.24.1: + resolution: {integrity: sha512-joEupPjYJ7PjZtDsS5lzALtlAudAbgIBMGJPNeFe5HfdmJXFd13ECmEM+5rXNxYVMRHua2w8132R6ab5Z6K9Ow==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.24.1: + resolution: {integrity: sha512-kUpHOLiH5GB0ERSv4pxqlL0RYKnOXtgGtVe7shDGfhS0AZ4D1ouKFYAcLcZhql8aMspDNzaUCumGHZ78tb2fTg==} + engines: {node: '>= 12.0.0'} + + lilconfig@3.0.0: + resolution: {integrity: sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==} + engines: {node: '>=14'} + + linkify-it@5.0.0: + resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} + + lint-staged@15.2.2: + resolution: {integrity: sha512-TiTt93OPh1OZOsb5B7k96A/ATl2AjIZo+vnzFZ6oHK5FuTk63ByDtxGQpHm+kFETjEWqgkF95M8FRXKR/LEBcw==} + engines: {node: '>=18.12.0'} + hasBin: true + + listr2@8.0.1: + resolution: {integrity: sha512-ovJXBXkKGfq+CwmKTjluEqFi3p4h8xvkxGQQAQan22YCgef4KZ1mKGjzfGh6PL6AW5Csw0QiQPNuQyH+6Xk3hA==} + engines: {node: '>=18.0.0'} + + local-pkg@0.4.3: + resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} + engines: {node: '>=14'} + + local-pkg@0.5.0: + resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} + engines: {node: '>=14'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + + lodash-unified@1.0.3: + resolution: {integrity: sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==} + peerDependencies: + '@types/lodash-es': '*' + lodash: '*' + lodash-es: '*' + + lodash.get@4.4.2: + resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + + log-symbols@6.0.0: + resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} + engines: {node: '>=18'} + + log-update@6.0.0: + resolution: {integrity: sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==} + engines: {node: '>=18'} + + loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + + lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + + m-type-tools@0.5.3: + resolution: {integrity: sha512-UycDrrmHNEqKn5KZblX+fGP2tMNyaZPIBPCE+H4aE+adD3LoKDrVir1hwZfa049yIZ/q3UoLpcWs7Mgqi5G9ig==} + + magic-string-ast@0.3.0: + resolution: {integrity: sha512-0shqecEPgdFpnI3AP90epXyxZy9g6CRZ+SZ7BcqFwYmtFEnZ1jpevcV5HoyVnlDS9gCnc1UIg3Rsvp3Ci7r8OA==} + engines: {node: '>=16.14.0'} + + magic-string@0.30.10: + resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} + + magic-string@0.30.8: + resolution: {integrity: sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==} + engines: {node: '>=12'} + + magic-string@0.30.9: + resolution: {integrity: sha512-S1+hd+dIrC8EZqKyT9DstTH/0Z+f76kmmvZnkfQVmOpDEF9iVgdYif3Q/pIWHmCoo59bQVGW0kVL3e2nl+9+Sw==} + engines: {node: '>=12'} + + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + + make-iterator@1.0.1: + resolution: {integrity: sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==} + engines: {node: '>=0.10.0'} + + map-cache@0.2.2: + resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} + engines: {node: '>=0.10.0'} + + markdown-it@14.1.0: + resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} + hasBin: true + + mdn-data@2.0.30: + resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + + mdurl@2.0.0: + resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} + + memoize-one@6.0.0: + resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==} + + meow@13.2.0: + resolution: {integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==} + engines: {node: '>=18'} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + + minimatch@9.0.4: + resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + + minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + + minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + + mitt@3.0.1: + resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + mkdirp@3.0.1: + resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} + engines: {node: '>=10'} + hasBin: true + + mlly@1.6.1: + resolution: {integrity: sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==} + + mockjs@1.1.0: + resolution: {integrity: sha512-eQsKcWzIaZzEZ07NuEyO4Nw65g0hdWAyurVol1IPl1gahRwY+svqzfgfey8U8dahLwG44d6/RwEzuK52rSa/JQ==} + hasBin: true + + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + + mrmime@2.0.0: + resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==} + engines: {node: '>=10'} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + mute-stream@1.0.0: + resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + + node-fetch-native@1.6.4: + resolution: {integrity: sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==} + + node-plop@0.32.0: + resolution: {integrity: sha512-lKFSRSRuDHhwDKMUobdsvaWCbbDRbV3jMUSMiajQSQux1aNUevAZVxUHc2JERI//W8ABPRbi3ebYuSuIzkNIpQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + normalize-wheel-es@1.2.0: + resolution: {integrity: sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + nprogress@0.2.0: + resolution: {integrity: sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + nypm@0.3.8: + resolution: {integrity: sha512-IGWlC6So2xv6V4cIDmoV0SwwWx7zLG086gyqkyumteH2fIgCAM4nDVFB2iDRszDvmdSVW9xb1N+2KjQ6C7d4og==} + engines: {node: ^14.16.0 || >=16.10.0} + hasBin: true + + object.defaults@1.1.0: + resolution: {integrity: sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==} + engines: {node: '>=0.10.0'} + + object.map@1.0.1: + resolution: {integrity: sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w==} + engines: {node: '>=0.10.0'} + + object.pick@1.3.0: + resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==} + engines: {node: '>=0.10.0'} + + ofetch@1.3.4: + resolution: {integrity: sha512-KLIET85ik3vhEfS+3fDlc/BAZiAp+43QEC/yCo5zkNoY2YaKvNkOaFr/6wCFgFH1kuYQM5pMNi0Tg8koiIemtw==} + + ohash@1.1.3: + resolution: {integrity: sha512-zuHHiGTYTA1sYJ/wZN+t5HKZaH23i4yI1HMwbuXm24Nid7Dv0KcuRlKoNKS9UNfAVSBlnGLcuQrnOKWOZoEGaw==} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + + open@10.1.0: + resolution: {integrity: sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==} + engines: {node: '>=18'} + + open@9.1.0: + resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==} + engines: {node: '>=14.16'} + + optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} + + ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + + ora@8.0.1: + resolution: {integrity: sha512-ANIvzobt1rls2BDny5fWZ3ZVKyD6nscLvfFRpQgfWsythlcsVUC9kL0zq6j2Z5z9wwp1kd7wpsD/T9qNPVLCaQ==} + engines: {node: '>=18'} + + os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-limit@5.0.0: + resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} + engines: {node: '>=18'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-map@5.5.0: + resolution: {integrity: sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==} + engines: {node: '>=12'} + + param-case@3.0.4: + resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-filepath@1.0.2: + resolution: {integrity: sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==} + engines: {node: '>=0.8'} + + parse-passwd@1.0.0: + resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==} + engines: {node: '>=0.10.0'} + + pascal-case@3.1.2: + resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} + + path-case@3.0.4: + resolution: {integrity: sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-root-regex@0.1.2: + resolution: {integrity: sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==} + engines: {node: '>=0.10.0'} + + path-root@0.1.1: + resolution: {integrity: sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==} + engines: {node: '>=0.10.0'} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + + pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + + perfect-debounce@1.0.0: + resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} + + picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pidtree@0.6.0: + resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} + engines: {node: '>=0.10'} + hasBin: true + + pinia-plugin-persistedstate@3.2.1: + resolution: {integrity: sha512-MK++8LRUsGF7r45PjBFES82ISnPzyO6IZx3CH5vyPseFLZCk1g2kgx6l/nW8pEBKxxd4do0P6bJw+mUSZIEZUQ==} + peerDependencies: + pinia: ^2.0.0 + + pinia@2.1.7: + resolution: {integrity: sha512-+C2AHFtcFqjPih0zpYuvof37SFxMQ7OEG2zV9jRI12i9BOy3YQVAHwdKtyyc8pDcDyIc33WCIsZaCFWU7WWxGQ==} + peerDependencies: + '@vue/composition-api': ^1.4.0 + typescript: '>=4.4.4' + vue: ^2.6.14 || ^3.3.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + typescript: + optional: true + + pkg-types@1.0.3: + resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} + + plop@4.0.1: + resolution: {integrity: sha512-5n8QU93kvL/ObOzBcPAB1siVFtAH1TZM6TntJ3JK5kXT0jIgnQV+j+uaOWWFJlg1cNkzLYm8klgASF65K36q9w==} + engines: {node: '>=18'} + hasBin: true + + postcss-selector-parser@6.0.16: + resolution: {integrity: sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==} + engines: {node: '>=4'} + + postcss@8.4.38: + resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + + prettier@3.2.5: + resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} + engines: {node: '>=14'} + hasBin: true + + pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + prism-theme-vars@0.2.5: + resolution: {integrity: sha512-/D8gBTScYzi9afwE6v3TC1U/1YFZ6k+ly17mtVRdLpGy7E79YjJJWkXFgUDHJ2gDksV/ZnXF7ydJ4TvoDm2z/Q==} + + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + punycode.js@2.3.1: + resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} + engines: {node: '>=6'} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + rc9@2.1.1: + resolution: {integrity: sha512-lNeOl38Ws0eNxpO3+wD1I9rkHGQyj1NU1jlzv4go2CtEnEQEUfqnIvZG7W+bC/aXdJ27n5x/yUjb6RoT9tko+Q==} + + react-is@18.2.0: + resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + rechoir@0.8.0: + resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==} + engines: {node: '>= 10.13.0'} + + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + resize-detector@0.3.0: + resolution: {integrity: sha512-R/tCuvuOHQ8o2boRP6vgx8hXCCy87H1eY9V5imBYeVNyNVpuL9ciReSccLj2gDcax9+2weXy3bc8Vv+NRXeEvQ==} + + resolve-dir@1.0.1: + resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==} + engines: {node: '>=0.10.0'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + + restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + + restore-cursor@4.0.0: + resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rfdc@1.3.1: + resolution: {integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + + rollup@4.13.0: + resolution: {integrity: sha512-3YegKemjoQnYKmsBlOHfMLVPPA5xLkQ8MHLLSw/fBrFaVkEayL51DilPpNNLq1exr98F2B1TzrV0FUlN3gWRPg==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-applescript@5.0.0: + resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==} + engines: {node: '>=12'} + + run-applescript@7.0.0: + resolution: {integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==} + engines: {node: '>=18'} + + run-async@3.0.0: + resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==} + engines: {node: '>=0.12.0'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + scule@1.3.0: + resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==} + + section-matter@1.0.0: + resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} + engines: {node: '>=4'} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.6.0: + resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} + engines: {node: '>=10'} + hasBin: true + + sentence-case@3.0.4: + resolution: {integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + simple-git@3.24.0: + resolution: {integrity: sha512-QqAKee9Twv+3k8IFOFfPB2hnk6as6Y6ACUpwCtQvRYBAes23Wv3SZlHVobAzqcE8gfsisCvPw3HGW3HYM+VYYw==} + + sirv@2.0.4: + resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} + engines: {node: '>= 10'} + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + slash@4.0.0: + resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} + engines: {node: '>=12'} + + slice-ansi@5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} + + slice-ansi@7.1.0: + resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} + engines: {node: '>=18'} + + snake-case@3.0.4: + resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} + + source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + speakingurl@14.0.1: + resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==} + engines: {node: '>=0.10.0'} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + std-env@3.7.0: + resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} + + stdin-discarder@0.2.2: + resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} + engines: {node: '>=18'} + + string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@7.1.0: + resolution: {integrity: sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==} + engines: {node: '>=18'} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-bom-string@1.0.0: + resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} + engines: {node: '>=0.10.0'} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + strip-literal@1.3.0: + resolution: {integrity: sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==} + + strip-literal@2.0.0: + resolution: {integrity: sha512-f9vHgsCWBq2ugHAkGMiiYY+AYG0D/cbloKKg0nhaaaSNsujdGIpVXCNsrJpCKr5M0f4aI31mr13UjY6GAuXCKA==} + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + svg-tags@1.0.0: + resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==} + + synckit@0.8.8: + resolution: {integrity: sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==} + engines: {node: ^14.18.0 || >=16.0.0} + + synckit@0.9.0: + resolution: {integrity: sha512-7RnqIMq572L8PeEzKeBINYEJDDxpcH8JEgLwUqBd3TkofhFRbkq4QLR0u+36avGAhCRbk2nnmjcW9SE531hPDg==} + engines: {node: ^14.18.0 || >=16.0.0} + + systemjs@6.14.3: + resolution: {integrity: sha512-hQv45irdhXudAOr8r6SVSpJSGtogdGZUbJBRKCE5nsIS7tsxxvnIHqT4IOPWj+P+HcSzeWzHlGCGpmhPDIKe+w==} + + tar@6.2.1: + resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} + engines: {node: '>=10'} + + taze@0.13.7: + resolution: {integrity: sha512-7of7fg1+2O5fm4eykJdCOkr9D0TEjZeXDdgm8hST4C+iFxa24Vzjm3Dk5TQ7JjId2ut+yRE2KE++YaSY7Vh5ng==} + hasBin: true + + terser@5.31.0: + resolution: {integrity: sha512-Q1JFAoUKE5IMfI4Z/lkE/E6+SwgzO+x4tq4v1AyBLRj8VSYvRO6A/rQrPg1yud4g0En9EKI1TvFRF2tQFcoUkg==} + engines: {node: '>=10'} + hasBin: true + + test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + tinybench@2.6.0: + resolution: {integrity: sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA==} + + tinypool@0.8.3: + resolution: {integrity: sha512-Ud7uepAklqRH1bvwy22ynrliC7Dljz7Tm8M/0RBUW+YRa4YHhZ6e4PpgE+fu1zr/WqB1kbeuVrdfeuyIBpy4tw==} + engines: {node: '>=14.0.0'} + + tinyspy@2.2.1: + resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} + engines: {node: '>=14.0.0'} + + title-case@3.0.3: + resolution: {integrity: sha512-e1zGYRvbffpcHIrnuqT0Dh+gEJtDaxDSoG4JAIpq4oDFyooziLBIiYQv0GBT4FUAnUop5uZ1hiIAj7oAF6sOCA==} + + titleize@3.0.0: + resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==} + engines: {node: '>=12'} + + tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + + to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + totalist@3.0.1: + resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} + engines: {node: '>=6'} + + ts-api-utils@1.3.0: + resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + + tslib@2.3.0: + resolution: {integrity: sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==} + + tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + type-fest@3.13.1: + resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} + engines: {node: '>=14.16'} + + typescript@5.4.5: + resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} + engines: {node: '>=14.17'} + hasBin: true + + uc.micro@2.1.0: + resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} + + ufo@1.5.3: + resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} + + uglify-js@3.17.4: + resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} + engines: {node: '>=0.8.0'} + hasBin: true + + unc-path-regex@0.1.2: + resolution: {integrity: sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==} + engines: {node: '>=0.10.0'} + + unconfig@0.3.13: + resolution: {integrity: sha512-N9Ph5NC4+sqtcOjPfHrRcHekBCadCXWTBzp2VYYbySOHW0PfD9XLCeXshTXjkPYwLrBr9AtSeU0CZmkYECJhng==} + + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + unimport@3.7.1: + resolution: {integrity: sha512-V9HpXYfsZye5bPPYUgs0Otn3ODS1mDUciaBlXljI4C2fTwfFpvFZRywmlOu943puN9sncxROMZhsZCjNXEpzEQ==} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + unocss@0.59.4: + resolution: {integrity: sha512-QmCVjRObvVu/gsGrJGVt0NnrdhFFn314BUZn2WQyXV9rIvHLRmG5bIu0j5vibJkj7ZhFchTrnTM1pTFXP1xt5g==} + engines: {node: '>=14'} + peerDependencies: + '@unocss/webpack': 0.59.4 + vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 + peerDependenciesMeta: + '@unocss/webpack': + optional: true + vite: + optional: true + + unplugin-auto-import@0.17.5: + resolution: {integrity: sha512-fHNDkDSxv3PGagX1wmKBYBkgaM4AKAgZmdJw/bxjhNljx9KSXSgHpGfX0MwUrq9qw6q1bhHIZVWyOwoY2koo4w==} + engines: {node: '>=14'} + peerDependencies: + '@nuxt/kit': ^3.2.2 + '@vueuse/core': '*' + peerDependenciesMeta: + '@nuxt/kit': + optional: true + '@vueuse/core': + optional: true + + unplugin-vue-components@0.26.0: + resolution: {integrity: sha512-s7IdPDlnOvPamjunVxw8kNgKNK8A5KM1YpK5j/p97jEKTjlPNrA0nZBiSfAKKlK1gWZuyWXlKL5dk3EDw874LQ==} + engines: {node: '>=14'} + peerDependencies: + '@babel/parser': ^7.15.8 + '@nuxt/kit': ^3.2.2 + vue: 2 || 3 + peerDependenciesMeta: + '@babel/parser': + optional: true + '@nuxt/kit': + optional: true + + unplugin-vue-markdown@0.26.2: + resolution: {integrity: sha512-FjmhLZ+RRx7PFmfBCTwNUZLAj0Y9z0y/j79rTgYuXH9u+K6tZBFB+GpFFBm+4yMQ0la3MNCl7KHbaSvfna2bEA==} + peerDependencies: + vite: ^2.0.0 || ^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 + + unplugin-vue-router@0.8.6: + resolution: {integrity: sha512-yd7A4qIT2ZvCELchL32qVueFXx8BE9zD0UEzWJjHAlVy2Xb2luPkNJG6uCAeqdObCS1lSKTOFAFmQXAxdchqTw==} + peerDependencies: + vue-router: ^4.3.0 + peerDependenciesMeta: + vue-router: + optional: true + + unplugin@1.10.0: + resolution: {integrity: sha512-CuZtvvO8ua2Wl+9q2jEaqH6m3DoQ38N7pvBYQbbaeNlWGvK2l6GHiKi29aIHDPoSxdUzQ7Unevf1/ugil5X6Pg==} + engines: {node: '>=14.0.0'} + + unplugin@1.10.1: + resolution: {integrity: sha512-d6Mhq8RJeGA8UfKCu54Um4lFA0eSaRa3XxdAJg8tIdxbu1ubW0hBCZUL7yI2uGyYCRndvbK8FLHzqy2XKfeMsg==} + engines: {node: '>=14.0.0'} + + untildify@4.0.0: + resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} + engines: {node: '>=8'} + + update-browserslist-db@1.0.13: + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + upper-case-first@2.0.2: + resolution: {integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==} + + upper-case@2.0.2: + resolution: {integrity: sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==} + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + v8-to-istanbul@9.2.0: + resolution: {integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==} + engines: {node: '>=10.12.0'} + + v8flags@4.0.1: + resolution: {integrity: sha512-fcRLaS4H/hrZk9hYwbdRM35D0U8IYMfEClhXxCivOojl+yTRAZH3Zy2sSy6qVCiGbV9YAtPssP6jaChqC9vPCg==} + engines: {node: '>= 10.13.0'} + + vite-auto-import-resolvers@3.2.1: + resolution: {integrity: sha512-xXUl1VAJCqHIqU7xzkMNWvQ4cb6MjKHSs4OyjgfxNeJNFqu2hVKJnVxWr8co6I4Ikdvw0CdAy5M3wj4UWGPwVA==} + engines: {node: '>=16'} + peerDependencies: + unplugin-auto-import: '>=0.6.9' + vite: '>=2.9.1' + + vite-hot-client@0.2.3: + resolution: {integrity: sha512-rOGAV7rUlUHX89fP2p2v0A2WWvV3QMX2UYq0fRqsWSvFvev4atHWqjwGoKaZT1VTKyLGk533ecu3eyd0o59CAg==} + peerDependencies: + vite: ^2.6.0 || ^3.0.0 || ^4.0.0 || ^5.0.0-0 + + vite-layers@0.5.2: + resolution: {integrity: sha512-/FFYE7kCsYPNBIEfGmHFf1a2UElFjDM/IIGgZDwS6bmEg7xlxuv1dqNgLoSUPy6W1fRs8RmouHry0W9GBt6ubg==} + peerDependencies: + vite: '>=3.0.0' + + vite-node@1.5.3: + resolution: {integrity: sha512-axFo00qiCpU/JLd8N1gu9iEYL3xTbMbMrbe5nDp9GL0nb6gurIdZLkkFogZXWnE8Oyy5kfSLwNVIcVsnhE7lgQ==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + + vite-plugin-compression@0.5.1: + resolution: {integrity: sha512-5QJKBDc+gNYVqL/skgFAP81Yuzo9R+EAf19d+EtsMF/i8kFUpNi3J/H01QD3Oo8zBQn+NzoCIFkpPLynoOzaJg==} + peerDependencies: + vite: '>=2.0.0' + + vite-plugin-env-types@0.1.4: + resolution: {integrity: sha512-u+sZv4Q8HB51cT0EsZtjqdmgSDytZoo1AyQsPmIj8QPM9QjtdG3YE1eHkuAvCapf/llagvZbC6M+Ekhbt3bw9w==} + peerDependencies: + vite: '>=2.0.0' + + vite-plugin-inspect@0.8.4: + resolution: {integrity: sha512-G0N3rjfw+AiiwnGw50KlObIHYWfulVwaCBUBLh2xTW9G1eM9ocE5olXkEYUbwyTmX+azM8duubi+9w5awdCz+g==} + engines: {node: '>=14'} + peerDependencies: + '@nuxt/kit': '*' + vite: ^3.1.0 || ^4.0.0 || ^5.0.0-0 + peerDependenciesMeta: + '@nuxt/kit': + optional: true + + vite-plugin-legacy-swc@1.1.0: + resolution: {integrity: sha512-ELJGMso5mukCSj7//P13HYlo2tmo0WsXR7rs0r4oRO5s8xmQQi0J26UAjBsnbXAumTIUT71MP4uYWvI4zjs8Eg==} + peerDependencies: + vite: '>=4.0.0' + + vite-plugin-use-modules@1.4.8: + resolution: {integrity: sha512-SydvdNUuwuwk9YjeA2sE6acK2xmTOgpVarEiTcccczcNL7JIMZ2C3Cbw2bvmkH2Od8JDtdIxIpMvswJ8rlEufA==} + peerDependencies: + vite: '>=2.0.0' + vue: '>=3.0.0' + + vite-plugin-vue-devtools@7.1.3: + resolution: {integrity: sha512-qv8Z4yok9RYo6TEs89WnIAlmTHby/+XTim8tlSnMs3lAPcQqqcl/wGRY8gAeYrGCANngOqO+VuabW3Jb1HZtyw==} + engines: {node: '>=v14.21.3'} + peerDependencies: + vite: ^3.1.0 || ^4.0.0-0 || ^5.0.0-0 + + vite-plugin-vue-inspector@5.0.1: + resolution: {integrity: sha512-R93P8iFa6BPODhc/aOtO04A8FFMMyFIfm8ZVSmN+8vU1TgwsHya734APGpX4fVHSPX2aVwYyiezXBUYQ0Opsqw==} + peerDependencies: + vite: ^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 + + vite-plugin-vue-meta-layouts@0.4.3: + resolution: {integrity: sha512-KlC1gtgw+a8h+o99QsnqnGCkQp4FxVdm0P7vuMZIqYNLKywSnbRLrKQ+WATB25efDldpfBrNB1J8OgurHi3LBg==} + peerDependencies: + vite: '>=2.0.0' + vue-router: '>=4.0.14' + + vite@5.2.10: + resolution: {integrity: sha512-PAzgUZbP7msvQvqdSD+ErD5qGnSFiGOoWmV5yAKUEI0kdhjbH6nMWVyZQC/hSc4aXwc0oJ9aEdIiF9Oje0JFCw==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vitest@1.5.3: + resolution: {integrity: sha512-2oM7nLXylw3mQlW6GXnRriw+7YvZFk/YNV8AxIC3Z3MfFbuziLGWP9GPxxu/7nRlXhqyxBikpamr+lEEj1sUEw==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 1.5.3 + '@vitest/ui': 1.5.3 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + + vue-demi@0.13.11: + resolution: {integrity: sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==} + engines: {node: '>=12'} + hasBin: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + + vue-demi@0.14.10: + resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} + engines: {node: '>=12'} + hasBin: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + + vue-demi@0.14.7: + resolution: {integrity: sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==} + engines: {node: '>=12'} + hasBin: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + + vue-echarts@6.7.1: + resolution: {integrity: sha512-HYn54QBk1ILaQ+qA1PQGHwm3MsEFTD5NN9bmgk6wco8LcwKLnRC4HRM0ualYDGOJcCccTpnqD5DvIG0UH1+wDQ==} + peerDependencies: + '@vue/composition-api': ^1.0.5 + '@vue/runtime-core': ^3.0.0 + echarts: ^5.4.1 + vue: ^2.6.12 || ^3.1.1 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + '@vue/runtime-core': + optional: true + + vue-eslint-parser@9.4.2: + resolution: {integrity: sha512-Ry9oiGmCAK91HrKMtCrKFWmSFWvYkpGglCeFAIqDdr9zdXmMMpJOmUJS7WWsW7fX81h6mwHmUZCQQ1E0PkSwYQ==} + engines: {node: ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '>=6.0.0' + + vue-request@2.0.4: + resolution: {integrity: sha512-+Tu5rDy6ItF9UdD21Mmbjiq5Pq6NZSN9juH72hNQTMn1whHh4KZPTKWVLK2YS4nzbuEnPs+82G91AA2Fgd93mg==} + engines: {node: '>=14'} + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^2.0.0 || >=3.0.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + + vue-router@4.3.2: + resolution: {integrity: sha512-hKQJ1vDAZ5LVkKEnHhmm1f9pMiWIBNGF5AwU67PdH7TyXCj/a4hTccuUuYCAMgJK6rO/NVYtQIEN3yL8CECa7Q==} + peerDependencies: + vue: ^3.2.0 + + vue-toastification@2.0.0-rc.5: + resolution: {integrity: sha512-q73e5jy6gucEO/U+P48hqX+/qyXDozAGmaGgLFm5tXX4wJBcVsnGp4e/iJqlm9xzHETYOilUuwOUje2Qg1JdwA==} + peerDependencies: + vue: ^3.0.2 + + vue@3.4.26: + resolution: {integrity: sha512-bUIq/p+VB+0xrJubaemrfhk1/FiW9iX+pDV+62I/XJ6EkspAO9/DXEjbDFoe8pIfOZBqfk45i9BMc41ptP/uRg==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + + webpack-sources@3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + + webpack-virtual-modules@0.6.1: + resolution: {integrity: sha512-poXpCylU7ExuvZK8z+On3kX+S8o/2dQ/SVYueKA0D4WEMXROXgY8Ez50/bQEUmvoSMMrWcrJqCHuhAbsiwg7Dg==} + + which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + why-is-node-running@2.2.2: + resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} + engines: {node: '>=8'} + hasBin: true + + wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@9.0.0: + resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} + engines: {node: '>=18'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + xml-name-validator@4.0.0: + resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} + engines: {node: '>=12'} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yaml@2.3.4: + resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} + engines: {node: '>= 14'} + + yaml@2.4.1: + resolution: {integrity: sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==} + engines: {node: '>= 14'} + hasBin: true + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + + zrender@5.5.0: + resolution: {integrity: sha512-O3MilSi/9mwoovx77m6ROZM7sXShR/O/JIanvzTwjN3FORfLSr81PsUGd7jlaYOeds9d8tw82oP44+3YucVo+w==} + +snapshots: + + '@aashutoshrathi/word-wrap@1.2.6': {} + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + '@antfu/install-pkg@0.1.1': + dependencies: + execa: 5.1.1 + find-up: 5.0.0 + + '@antfu/ni@0.21.12': {} + + '@antfu/utils@0.7.7': {} + + '@babel/code-frame@7.24.2': + dependencies: + '@babel/highlight': 7.24.2 + picocolors: 1.0.0 + + '@babel/compat-data@7.24.1': {} + + '@babel/core@7.24.3': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.24.2 + '@babel/generator': 7.24.1 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.3) + '@babel/helpers': 7.24.1 + '@babel/parser': 7.24.1 + '@babel/template': 7.24.0 + '@babel/traverse': 7.24.1 + '@babel/types': 7.24.0 + convert-source-map: 2.0.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/core@7.24.4': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.24.2 + '@babel/generator': 7.24.4 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.4) + '@babel/helpers': 7.24.4 + '@babel/parser': 7.24.4 + '@babel/template': 7.24.0 + '@babel/traverse': 7.24.1 + '@babel/types': 7.24.0 + convert-source-map: 2.0.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.24.1': + dependencies: + '@babel/types': 7.24.0 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 2.5.2 + + '@babel/generator@7.24.4': + dependencies: + '@babel/types': 7.24.0 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 2.5.2 + + '@babel/helper-annotate-as-pure@7.22.5': + dependencies: + '@babel/types': 7.24.0 + + '@babel/helper-compilation-targets@7.23.6': + dependencies: + '@babel/compat-data': 7.24.1 + '@babel/helper-validator-option': 7.23.5 + browserslist: 4.23.0 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-create-class-features-plugin@7.24.1(@babel/core@7.24.3)': + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-member-expression-to-functions': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.3) + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + semver: 6.3.1 + + '@babel/helper-create-class-features-plugin@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-member-expression-to-functions': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.4) + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + semver: 6.3.1 + + '@babel/helper-environment-visitor@7.22.20': {} + + '@babel/helper-function-name@7.23.0': + dependencies: + '@babel/template': 7.24.0 + '@babel/types': 7.24.0 + + '@babel/helper-hoist-variables@7.22.5': + dependencies: + '@babel/types': 7.24.0 + + '@babel/helper-member-expression-to-functions@7.23.0': + dependencies: + '@babel/types': 7.24.0 + + '@babel/helper-module-imports@7.22.15': + dependencies: + '@babel/types': 7.24.0 + + '@babel/helper-module-imports@7.24.3': + dependencies: + '@babel/types': 7.24.0 + + '@babel/helper-module-transforms@7.23.3(@babel/core@7.24.3)': + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.24.3 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 + + '@babel/helper-module-transforms@7.23.3(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.24.3 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 + + '@babel/helper-optimise-call-expression@7.22.5': + dependencies: + '@babel/types': 7.24.0 + + '@babel/helper-plugin-utils@7.24.0': {} + + '@babel/helper-replace-supers@7.24.1(@babel/core@7.24.3)': + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-member-expression-to-functions': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + + '@babel/helper-replace-supers@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-member-expression-to-functions': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + + '@babel/helper-simple-access@7.22.5': + dependencies: + '@babel/types': 7.24.0 + + '@babel/helper-skip-transparent-expression-wrappers@7.22.5': + dependencies: + '@babel/types': 7.24.0 + + '@babel/helper-split-export-declaration@7.22.6': + dependencies: + '@babel/types': 7.24.0 + + '@babel/helper-string-parser@7.24.1': {} + + '@babel/helper-validator-identifier@7.22.20': {} + + '@babel/helper-validator-option@7.23.5': {} + + '@babel/helpers@7.24.1': + dependencies: + '@babel/template': 7.24.0 + '@babel/traverse': 7.24.1 + '@babel/types': 7.24.0 + transitivePeerDependencies: + - supports-color + + '@babel/helpers@7.24.4': + dependencies: + '@babel/template': 7.24.0 + '@babel/traverse': 7.24.1 + '@babel/types': 7.24.0 + transitivePeerDependencies: + - supports-color + + '@babel/highlight@7.24.2': + dependencies: + '@babel/helper-validator-identifier': 7.22.20 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.0.0 + + '@babel/parser@7.24.1': + dependencies: + '@babel/types': 7.24.0 + + '@babel/parser@7.24.4': + dependencies: + '@babel/types': 7.24.0 + + '@babel/plugin-proposal-decorators@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.24.4) + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-decorators': 7.24.1(@babel/core@7.24.4) + + '@babel/plugin-syntax-decorators@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-syntax-import-attributes@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-syntax-jsx@7.24.1(@babel/core@7.24.3)': + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-syntax-jsx@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-syntax-typescript@7.24.1(@babel/core@7.24.3)': + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-syntax-typescript@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-transform-modules-commonjs@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.4) + '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-simple-access': 7.22.5 + + '@babel/plugin-transform-typescript@7.24.1(@babel/core@7.24.3)': + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.24.3) + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-typescript': 7.24.1(@babel/core@7.24.3) + + '@babel/plugin-transform-typescript@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.24.4) + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-typescript': 7.24.1(@babel/core@7.24.4) + + '@babel/preset-typescript@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-validator-option': 7.23.5 + '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-typescript': 7.24.1(@babel/core@7.24.4) + + '@babel/template@7.24.0': + dependencies: + '@babel/code-frame': 7.24.2 + '@babel/parser': 7.24.4 + '@babel/types': 7.24.0 + + '@babel/traverse@7.24.1': + dependencies: + '@babel/code-frame': 7.24.2 + '@babel/generator': 7.24.4 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.24.4 + '@babel/types': 7.24.0 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.24.0': + dependencies: + '@babel/helper-string-parser': 7.24.1 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + + '@bcoe/v8-coverage@0.2.3': {} + + '@ctrl/tinycolor@3.6.1': {} + + '@element-plus/icons-vue@2.3.1(vue@3.4.26(typescript@5.4.5))': + dependencies: + vue: 3.4.26(typescript@5.4.5) + + '@esbuild/aix-ppc64@0.20.2': + optional: true + + '@esbuild/android-arm64@0.20.2': + optional: true + + '@esbuild/android-arm@0.20.2': + optional: true + + '@esbuild/android-x64@0.20.2': + optional: true + + '@esbuild/darwin-arm64@0.20.2': + optional: true + + '@esbuild/darwin-x64@0.20.2': + optional: true + + '@esbuild/freebsd-arm64@0.20.2': + optional: true + + '@esbuild/freebsd-x64@0.20.2': + optional: true + + '@esbuild/linux-arm64@0.20.2': + optional: true + + '@esbuild/linux-arm@0.20.2': + optional: true + + '@esbuild/linux-ia32@0.20.2': + optional: true + + '@esbuild/linux-loong64@0.20.2': + optional: true + + '@esbuild/linux-mips64el@0.20.2': + optional: true + + '@esbuild/linux-ppc64@0.20.2': + optional: true + + '@esbuild/linux-riscv64@0.20.2': + optional: true + + '@esbuild/linux-s390x@0.20.2': + optional: true + + '@esbuild/linux-x64@0.20.2': + optional: true + + '@esbuild/netbsd-x64@0.20.2': + optional: true + + '@esbuild/openbsd-x64@0.20.2': + optional: true + + '@esbuild/sunos-x64@0.20.2': + optional: true + + '@esbuild/win32-arm64@0.20.2': + optional: true + + '@esbuild/win32-ia32@0.20.2': + optional: true + + '@esbuild/win32-x64@0.20.2': + optional: true + + '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': + dependencies: + eslint: 8.57.0 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.10.0': {} + + '@eslint/eslintrc@2.1.4': + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@8.57.0': {} + + '@floating-ui/core@1.6.8': + dependencies: + '@floating-ui/utils': 0.2.8 + + '@floating-ui/dom@1.6.12': + dependencies: + '@floating-ui/core': 1.6.8 + '@floating-ui/utils': 0.2.8 + + '@floating-ui/utils@0.2.8': {} + + '@humanwhocodes/config-array@0.11.14': + dependencies: + '@humanwhocodes/object-schema': 2.0.2 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/object-schema@2.0.2': {} + + '@iconify/types@2.0.0': {} + + '@iconify/utils@2.1.23': + dependencies: + '@antfu/install-pkg': 0.1.1 + '@antfu/utils': 0.7.7 + '@iconify/types': 2.0.0 + debug: 4.3.4 + kolorist: 1.8.0 + local-pkg: 0.5.0 + mlly: 1.6.1 + transitivePeerDependencies: + - supports-color + + '@istanbuljs/schema@0.1.3': {} + + '@jest/schemas@29.6.3': + dependencies: + '@sinclair/typebox': 0.27.8 + + '@jridgewell/gen-mapping@0.3.5': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/source-map@0.3.6': + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/sourcemap-codec@1.4.15': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + + '@jsdevtools/ez-spawn@3.0.4': + dependencies: + call-me-maybe: 1.0.2 + cross-spawn: 7.0.3 + string-argv: 0.3.2 + type-detect: 4.0.8 + + '@kwsites/file-exists@1.1.1': + dependencies: + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + + '@kwsites/promise-deferred@1.1.1': {} + + '@ljharb/through@2.3.13': + dependencies: + call-bind: 1.0.7 + + '@mdit-vue/plugin-component@2.1.2': + dependencies: + '@types/markdown-it': 14.0.1 + markdown-it: 14.1.0 + + '@mdit-vue/plugin-frontmatter@2.1.2': + dependencies: + '@mdit-vue/types': 2.1.0 + '@types/markdown-it': 14.0.1 + gray-matter: 4.0.3 + markdown-it: 14.1.0 + + '@mdit-vue/types@2.1.0': {} + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + + '@pkgr/core@0.1.1': {} + + '@polka/url@1.0.0-next.25': {} + + '@rollup/pluginutils@5.1.0(rollup@4.13.0)': + dependencies: + '@types/estree': 1.0.5 + estree-walker: 2.0.2 + picomatch: 2.3.1 + optionalDependencies: + rollup: 4.13.0 + + '@rollup/rollup-android-arm-eabi@4.13.0': + optional: true + + '@rollup/rollup-android-arm64@4.13.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.13.0': + optional: true + + '@rollup/rollup-darwin-x64@4.13.0': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.13.0': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.13.0': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.13.0': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.13.0': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.13.0': + optional: true + + '@rollup/rollup-linux-x64-musl@4.13.0': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.13.0': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.13.0': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.13.0': + optional: true + + '@sinclair/typebox@0.27.8': {} + + '@swc/core-darwin-arm64@1.4.8': + optional: true + + '@swc/core-darwin-x64@1.4.8': + optional: true + + '@swc/core-linux-arm-gnueabihf@1.4.8': + optional: true + + '@swc/core-linux-arm64-gnu@1.4.8': + optional: true + + '@swc/core-linux-arm64-musl@1.4.8': + optional: true + + '@swc/core-linux-x64-gnu@1.4.8': + optional: true + + '@swc/core-linux-x64-musl@1.4.8': + optional: true + + '@swc/core-win32-arm64-msvc@1.4.8': + optional: true + + '@swc/core-win32-ia32-msvc@1.4.8': + optional: true + + '@swc/core-win32-x64-msvc@1.4.8': + optional: true + + '@swc/core@1.4.8': + dependencies: + '@swc/counter': 0.1.3 + '@swc/types': 0.1.6 + optionalDependencies: + '@swc/core-darwin-arm64': 1.4.8 + '@swc/core-darwin-x64': 1.4.8 + '@swc/core-linux-arm-gnueabihf': 1.4.8 + '@swc/core-linux-arm64-gnu': 1.4.8 + '@swc/core-linux-arm64-musl': 1.4.8 + '@swc/core-linux-x64-gnu': 1.4.8 + '@swc/core-linux-x64-musl': 1.4.8 + '@swc/core-win32-arm64-msvc': 1.4.8 + '@swc/core-win32-ia32-msvc': 1.4.8 + '@swc/core-win32-x64-msvc': 1.4.8 + + '@swc/counter@0.1.3': {} + + '@swc/types@0.1.6': + dependencies: + '@swc/counter': 0.1.3 + + '@sxzz/popperjs-es@2.11.7': {} + + '@types/estree@1.0.5': {} + + '@types/fined@1.1.5': {} + + '@types/inquirer@9.0.7': + dependencies: + '@types/through': 0.0.33 + rxjs: 7.8.1 + + '@types/istanbul-lib-coverage@2.0.6': {} + + '@types/ityped@1.0.3': {} + + '@types/json-schema@7.0.15': {} + + '@types/liftoff@4.0.3': + dependencies: + '@types/fined': 1.1.5 + '@types/node': 20.12.7 + + '@types/linkify-it@3.0.5': {} + + '@types/lodash-es@4.17.12': + dependencies: + '@types/lodash': 4.17.14 + + '@types/lodash@4.17.14': {} + + '@types/markdown-it@14.0.1': + dependencies: + '@types/linkify-it': 3.0.5 + '@types/mdurl': 1.0.5 + + '@types/mdurl@1.0.5': {} + + '@types/node@20.12.7': + dependencies: + undici-types: 5.26.5 + + '@types/semver@7.5.8': {} + + '@types/through@0.0.33': + dependencies: + '@types/node': 20.12.7 + + '@types/web-bluetooth@0.0.16': {} + + '@types/web-bluetooth@0.0.20': {} + + '@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5)': + dependencies: + '@typescript-eslint/scope-manager': 7.8.0 + '@typescript-eslint/types': 7.8.0 + '@typescript-eslint/typescript-estree': 7.8.0(typescript@5.4.5) + '@typescript-eslint/visitor-keys': 7.8.0 + debug: 4.3.4 + eslint: 8.57.0 + optionalDependencies: + typescript: 5.4.5 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@7.8.0': + dependencies: + '@typescript-eslint/types': 7.8.0 + '@typescript-eslint/visitor-keys': 7.8.0 + + '@typescript-eslint/types@7.8.0': {} + + '@typescript-eslint/typescript-estree@7.8.0(typescript@5.4.5)': + dependencies: + '@typescript-eslint/types': 7.8.0 + '@typescript-eslint/visitor-keys': 7.8.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.4 + semver: 7.6.0 + ts-api-utils: 1.3.0(typescript@5.4.5) + optionalDependencies: + typescript: 5.4.5 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@7.8.0(eslint@8.57.0)(typescript@5.4.5)': + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.8 + '@typescript-eslint/scope-manager': 7.8.0 + '@typescript-eslint/types': 7.8.0 + '@typescript-eslint/typescript-estree': 7.8.0(typescript@5.4.5) + eslint: 8.57.0 + semver: 7.6.0 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/visitor-keys@7.8.0': + dependencies: + '@typescript-eslint/types': 7.8.0 + eslint-visitor-keys: 3.4.3 + + '@ungap/structured-clone@1.2.0': {} + + '@unocss/astro@0.59.4(rollup@4.13.0)(vite@5.2.10(@types/node@20.12.7)(lightningcss@1.24.1)(terser@5.31.0))': + dependencies: + '@unocss/core': 0.59.4 + '@unocss/reset': 0.59.4 + '@unocss/vite': 0.59.4(rollup@4.13.0)(vite@5.2.10(@types/node@20.12.7)(lightningcss@1.24.1)(terser@5.31.0)) + optionalDependencies: + vite: 5.2.10(@types/node@20.12.7)(lightningcss@1.24.1)(terser@5.31.0) + transitivePeerDependencies: + - rollup + + '@unocss/cli@0.59.4(rollup@4.13.0)': + dependencies: + '@ampproject/remapping': 2.3.0 + '@rollup/pluginutils': 5.1.0(rollup@4.13.0) + '@unocss/config': 0.59.4 + '@unocss/core': 0.59.4 + '@unocss/preset-uno': 0.59.4 + cac: 6.7.14 + chokidar: 3.6.0 + colorette: 2.0.20 + consola: 3.2.3 + fast-glob: 3.3.2 + magic-string: 0.30.10 + pathe: 1.1.2 + perfect-debounce: 1.0.0 + transitivePeerDependencies: + - rollup + + '@unocss/config@0.59.4': + dependencies: + '@unocss/core': 0.59.4 + unconfig: 0.3.13 + + '@unocss/core@0.59.4': {} + + '@unocss/eslint-config@0.59.4(eslint@8.57.0)(typescript@5.4.5)': + dependencies: + '@unocss/eslint-plugin': 0.59.4(eslint@8.57.0)(typescript@5.4.5) + transitivePeerDependencies: + - eslint + - supports-color + - typescript + + '@unocss/eslint-plugin@0.59.4(eslint@8.57.0)(typescript@5.4.5)': + dependencies: + '@typescript-eslint/utils': 7.8.0(eslint@8.57.0)(typescript@5.4.5) + '@unocss/config': 0.59.4 + '@unocss/core': 0.59.4 + magic-string: 0.30.10 + synckit: 0.9.0 + transitivePeerDependencies: + - eslint + - supports-color + - typescript + + '@unocss/extractor-arbitrary-variants@0.59.4': + dependencies: + '@unocss/core': 0.59.4 + + '@unocss/inspector@0.59.4': + dependencies: + '@unocss/core': 0.59.4 + '@unocss/rule-utils': 0.59.4 + gzip-size: 6.0.0 + sirv: 2.0.4 + + '@unocss/postcss@0.59.4(postcss@8.4.38)': + dependencies: + '@unocss/config': 0.59.4 + '@unocss/core': 0.59.4 + '@unocss/rule-utils': 0.59.4 + css-tree: 2.3.1 + fast-glob: 3.3.2 + magic-string: 0.30.10 + postcss: 8.4.38 + + '@unocss/preset-attributify@0.59.4': + dependencies: + '@unocss/core': 0.59.4 + + '@unocss/preset-icons@0.59.4': + dependencies: + '@iconify/utils': 2.1.23 + '@unocss/core': 0.59.4 + ofetch: 1.3.4 + transitivePeerDependencies: + - supports-color + + '@unocss/preset-mini@0.59.4': + dependencies: + '@unocss/core': 0.59.4 + '@unocss/extractor-arbitrary-variants': 0.59.4 + '@unocss/rule-utils': 0.59.4 + + '@unocss/preset-tagify@0.59.4': + dependencies: + '@unocss/core': 0.59.4 + + '@unocss/preset-typography@0.59.4': + dependencies: + '@unocss/core': 0.59.4 + '@unocss/preset-mini': 0.59.4 + + '@unocss/preset-uno@0.59.4': + dependencies: + '@unocss/core': 0.59.4 + '@unocss/preset-mini': 0.59.4 + '@unocss/preset-wind': 0.59.4 + '@unocss/rule-utils': 0.59.4 + + '@unocss/preset-web-fonts@0.59.4': + dependencies: + '@unocss/core': 0.59.4 + ofetch: 1.3.4 + + '@unocss/preset-wind@0.59.4': + dependencies: + '@unocss/core': 0.59.4 + '@unocss/preset-mini': 0.59.4 + '@unocss/rule-utils': 0.59.4 + + '@unocss/reset@0.59.4': {} + + '@unocss/rule-utils@0.59.4': + dependencies: + '@unocss/core': 0.59.4 + magic-string: 0.30.10 + + '@unocss/scope@0.59.4': {} + + '@unocss/transformer-attributify-jsx-babel@0.59.4': + dependencies: + '@babel/core': 7.24.4 + '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.4) + '@babel/preset-typescript': 7.24.1(@babel/core@7.24.4) + '@unocss/core': 0.59.4 + transitivePeerDependencies: + - supports-color + + '@unocss/transformer-attributify-jsx@0.59.4': + dependencies: + '@unocss/core': 0.59.4 + + '@unocss/transformer-compile-class@0.59.4': + dependencies: + '@unocss/core': 0.59.4 + + '@unocss/transformer-directives@0.59.4': + dependencies: + '@unocss/core': 0.59.4 + '@unocss/rule-utils': 0.59.4 + css-tree: 2.3.1 + + '@unocss/transformer-variant-group@0.59.4': + dependencies: + '@unocss/core': 0.59.4 + + '@unocss/vite@0.59.4(rollup@4.13.0)(vite@5.2.10(@types/node@20.12.7)(lightningcss@1.24.1)(terser@5.31.0))': + dependencies: + '@ampproject/remapping': 2.3.0 + '@rollup/pluginutils': 5.1.0(rollup@4.13.0) + '@unocss/config': 0.59.4 + '@unocss/core': 0.59.4 + '@unocss/inspector': 0.59.4 + '@unocss/scope': 0.59.4 + '@unocss/transformer-directives': 0.59.4 + chokidar: 3.6.0 + fast-glob: 3.3.2 + magic-string: 0.30.10 + vite: 5.2.10(@types/node@20.12.7)(lightningcss@1.24.1)(terser@5.31.0) + transitivePeerDependencies: + - rollup + + '@vitejs/plugin-vue-jsx@3.1.0(vite@5.2.10(@types/node@20.12.7)(lightningcss@1.24.1)(terser@5.31.0))(vue@3.4.26(typescript@5.4.5))': + dependencies: + '@babel/core': 7.24.3 + '@babel/plugin-transform-typescript': 7.24.1(@babel/core@7.24.3) + '@vue/babel-plugin-jsx': 1.2.2(@babel/core@7.24.3) + vite: 5.2.10(@types/node@20.12.7)(lightningcss@1.24.1)(terser@5.31.0) + vue: 3.4.26(typescript@5.4.5) + transitivePeerDependencies: + - supports-color + + '@vitejs/plugin-vue@5.0.4(vite@5.2.10(@types/node@20.12.7)(lightningcss@1.24.1)(terser@5.31.0))(vue@3.4.26(typescript@5.4.5))': + dependencies: + vite: 5.2.10(@types/node@20.12.7)(lightningcss@1.24.1)(terser@5.31.0) + vue: 3.4.26(typescript@5.4.5) + + '@vitest/expect@1.5.3': + dependencies: + '@vitest/spy': 1.5.3 + '@vitest/utils': 1.5.3 + chai: 4.4.1 + + '@vitest/runner@1.5.3': + dependencies: + '@vitest/utils': 1.5.3 + p-limit: 5.0.0 + pathe: 1.1.2 + + '@vitest/snapshot@1.5.3': + dependencies: + magic-string: 0.30.10 + pathe: 1.1.2 + pretty-format: 29.7.0 + + '@vitest/spy@1.5.3': + dependencies: + tinyspy: 2.2.1 + + '@vitest/utils@1.5.3': + dependencies: + diff-sequences: 29.6.3 + estree-walker: 3.0.3 + loupe: 2.3.7 + pretty-format: 29.7.0 + + '@vue-macros/common@1.10.2(rollup@4.13.0)(vue@3.4.26(typescript@5.4.5))': + dependencies: + '@babel/types': 7.24.0 + '@rollup/pluginutils': 5.1.0(rollup@4.13.0) + '@vue/compiler-sfc': 3.4.21 + ast-kit: 0.12.1 + local-pkg: 0.5.0 + magic-string-ast: 0.3.0 + optionalDependencies: + vue: 3.4.26(typescript@5.4.5) + transitivePeerDependencies: + - rollup + + '@vue/babel-helper-vue-transform-on@1.2.2': {} + + '@vue/babel-plugin-jsx@1.2.2(@babel/core@7.24.3)': + dependencies: + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.3) + '@babel/template': 7.24.0 + '@babel/traverse': 7.24.1 + '@babel/types': 7.24.0 + '@vue/babel-helper-vue-transform-on': 1.2.2 + '@vue/babel-plugin-resolve-type': 1.2.2(@babel/core@7.24.3) + camelcase: 6.3.0 + html-tags: 3.3.1 + svg-tags: 1.0.0 + optionalDependencies: + '@babel/core': 7.24.3 + transitivePeerDependencies: + - supports-color + + '@vue/babel-plugin-jsx@1.2.2(@babel/core@7.24.4)': + dependencies: + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.4) + '@babel/template': 7.24.0 + '@babel/traverse': 7.24.1 + '@babel/types': 7.24.0 + '@vue/babel-helper-vue-transform-on': 1.2.2 + '@vue/babel-plugin-resolve-type': 1.2.2(@babel/core@7.24.4) + camelcase: 6.3.0 + html-tags: 3.3.1 + svg-tags: 1.0.0 + optionalDependencies: + '@babel/core': 7.24.4 + transitivePeerDependencies: + - supports-color + + '@vue/babel-plugin-resolve-type@1.2.2(@babel/core@7.24.3)': + dependencies: + '@babel/code-frame': 7.24.2 + '@babel/core': 7.24.3 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/parser': 7.24.1 + '@vue/compiler-sfc': 3.4.21 + + '@vue/babel-plugin-resolve-type@1.2.2(@babel/core@7.24.4)': + dependencies: + '@babel/code-frame': 7.24.2 + '@babel/core': 7.24.4 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/parser': 7.24.1 + '@vue/compiler-sfc': 3.4.21 + + '@vue/compiler-core@3.4.21': + dependencies: + '@babel/parser': 7.24.1 + '@vue/shared': 3.4.21 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.0 + + '@vue/compiler-core@3.4.24': + dependencies: + '@babel/parser': 7.24.4 + '@vue/shared': 3.4.24 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.0 + + '@vue/compiler-core@3.4.26': + dependencies: + '@babel/parser': 7.24.4 + '@vue/shared': 3.4.26 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.0 + + '@vue/compiler-dom@3.4.21': + dependencies: + '@vue/compiler-core': 3.4.21 + '@vue/shared': 3.4.21 + + '@vue/compiler-dom@3.4.24': + dependencies: + '@vue/compiler-core': 3.4.24 + '@vue/shared': 3.4.24 + + '@vue/compiler-dom@3.4.26': + dependencies: + '@vue/compiler-core': 3.4.26 + '@vue/shared': 3.4.26 + + '@vue/compiler-sfc@3.4.21': + dependencies: + '@babel/parser': 7.24.1 + '@vue/compiler-core': 3.4.21 + '@vue/compiler-dom': 3.4.21 + '@vue/compiler-ssr': 3.4.21 + '@vue/shared': 3.4.21 + estree-walker: 2.0.2 + magic-string: 0.30.8 + postcss: 8.4.38 + source-map-js: 1.2.0 + + '@vue/compiler-sfc@3.4.26': + dependencies: + '@babel/parser': 7.24.4 + '@vue/compiler-core': 3.4.26 + '@vue/compiler-dom': 3.4.26 + '@vue/compiler-ssr': 3.4.26 + '@vue/shared': 3.4.26 + estree-walker: 2.0.2 + magic-string: 0.30.10 + postcss: 8.4.38 + source-map-js: 1.2.0 + + '@vue/compiler-ssr@3.4.21': + dependencies: + '@vue/compiler-dom': 3.4.21 + '@vue/shared': 3.4.21 + + '@vue/compiler-ssr@3.4.26': + dependencies: + '@vue/compiler-dom': 3.4.26 + '@vue/shared': 3.4.26 + + '@vue/devtools-api@6.6.1': {} + + '@vue/devtools-core@7.1.3(vite@5.2.10(@types/node@20.12.7)(lightningcss@1.24.1)(terser@5.31.0))(vue@3.4.26(typescript@5.4.5))': + dependencies: + '@vue/devtools-kit': 7.1.3(vue@3.4.26(typescript@5.4.5)) + '@vue/devtools-shared': 7.1.3 + mitt: 3.0.1 + nanoid: 3.3.7 + pathe: 1.1.2 + vite-hot-client: 0.2.3(vite@5.2.10(@types/node@20.12.7)(lightningcss@1.24.1)(terser@5.31.0)) + transitivePeerDependencies: + - vite + - vue + + '@vue/devtools-kit@7.1.3(vue@3.4.26(typescript@5.4.5))': + dependencies: + '@vue/devtools-shared': 7.1.3 + hookable: 5.5.3 + mitt: 3.0.1 + perfect-debounce: 1.0.0 + speakingurl: 14.0.1 + vue: 3.4.26(typescript@5.4.5) + + '@vue/devtools-shared@7.1.3': + dependencies: + rfdc: 1.3.1 + + '@vue/reactivity@3.4.26': + dependencies: + '@vue/shared': 3.4.26 + + '@vue/runtime-core@3.4.26': + dependencies: + '@vue/reactivity': 3.4.26 + '@vue/shared': 3.4.26 + + '@vue/runtime-dom@3.4.26': + dependencies: + '@vue/runtime-core': 3.4.26 + '@vue/shared': 3.4.26 + csstype: 3.1.3 + + '@vue/server-renderer@3.4.26(vue@3.4.26(typescript@5.4.5))': + dependencies: + '@vue/compiler-ssr': 3.4.26 + '@vue/shared': 3.4.26 + vue: 3.4.26(typescript@5.4.5) + + '@vue/shared@3.4.21': {} + + '@vue/shared@3.4.24': {} + + '@vue/shared@3.4.26': {} + + '@vueuse/components@10.9.0(vue@3.4.26(typescript@5.4.5))': + dependencies: + '@vueuse/core': 10.9.0(vue@3.4.26(typescript@5.4.5)) + '@vueuse/shared': 10.9.0(vue@3.4.26(typescript@5.4.5)) + vue-demi: 0.14.7(vue@3.4.26(typescript@5.4.5)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + '@vueuse/core@10.9.0(vue@3.4.26(typescript@5.4.5))': + dependencies: + '@types/web-bluetooth': 0.0.20 + '@vueuse/metadata': 10.9.0 + '@vueuse/shared': 10.9.0(vue@3.4.26(typescript@5.4.5)) + vue-demi: 0.14.7(vue@3.4.26(typescript@5.4.5)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + '@vueuse/core@9.13.0(vue@3.4.26(typescript@5.4.5))': + dependencies: + '@types/web-bluetooth': 0.0.16 + '@vueuse/metadata': 9.13.0 + '@vueuse/shared': 9.13.0(vue@3.4.26(typescript@5.4.5)) + vue-demi: 0.14.10(vue@3.4.26(typescript@5.4.5)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + '@vueuse/integrations@10.9.0(async-validator@4.2.5)(axios@1.6.8)(change-case@4.1.2)(nprogress@0.2.0)(vue@3.4.26(typescript@5.4.5))': + dependencies: + '@vueuse/core': 10.9.0(vue@3.4.26(typescript@5.4.5)) + '@vueuse/shared': 10.9.0(vue@3.4.26(typescript@5.4.5)) + vue-demi: 0.14.7(vue@3.4.26(typescript@5.4.5)) + optionalDependencies: + async-validator: 4.2.5 + axios: 1.6.8 + change-case: 4.1.2 + nprogress: 0.2.0 + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + '@vueuse/metadata@10.9.0': {} + + '@vueuse/metadata@9.13.0': {} + + '@vueuse/shared@10.9.0(vue@3.4.26(typescript@5.4.5))': + dependencies: + vue-demi: 0.14.7(vue@3.4.26(typescript@5.4.5)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + '@vueuse/shared@9.13.0(vue@3.4.26(typescript@5.4.5))': + dependencies: + vue-demi: 0.14.10(vue@3.4.26(typescript@5.4.5)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + acorn-jsx@5.3.2(acorn@8.11.3): + dependencies: + acorn: 8.11.3 + + acorn-walk@8.3.2: {} + + acorn@8.11.3: {} + + aggregate-error@4.0.1: + dependencies: + clean-stack: 4.2.0 + indent-string: 5.0.0 + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ansi-escapes@4.3.2: + dependencies: + type-fest: 0.21.3 + + ansi-escapes@6.2.0: + dependencies: + type-fest: 3.13.1 + + ansi-regex@5.0.1: {} + + ansi-regex@6.0.1: {} + + ansi-styles@3.2.1: + dependencies: + color-convert: 1.9.3 + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@5.2.0: {} + + ansi-styles@6.2.1: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + argparse@2.0.1: {} + + array-each@1.0.1: {} + + array-slice@1.1.0: {} + + array-union@2.1.0: {} + + assertion-error@1.1.0: {} + + ast-kit@0.12.1: + dependencies: + '@babel/parser': 7.24.4 + pathe: 1.1.2 + + ast-walker-scope@0.6.1: + dependencies: + '@babel/parser': 7.24.4 + ast-kit: 0.12.1 + + async-validator@4.2.5: {} + + asynckit@0.4.0: {} + + axios@1.6.8: + dependencies: + follow-redirects: 1.15.6 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + balanced-match@1.0.2: {} + + base64-js@1.5.1: {} + + big-integer@1.6.52: {} + + binary-extensions@2.3.0: {} + + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + + boolbase@1.0.0: {} + + bplist-parser@0.2.0: + dependencies: + big-integer: 1.6.52 + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.2: + dependencies: + fill-range: 7.0.1 + + browserslist-to-esbuild@2.1.1(browserslist@4.23.0): + dependencies: + browserslist: 4.23.0 + meow: 13.2.0 + + browserslist@4.23.0: + dependencies: + caniuse-lite: 1.0.30001600 + electron-to-chromium: 1.4.715 + node-releases: 2.0.14 + update-browserslist-db: 1.0.13(browserslist@4.23.0) + + buffer-from@1.1.2: {} + + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + bundle-name@3.0.0: + dependencies: + run-applescript: 5.0.0 + + bundle-name@4.1.0: + dependencies: + run-applescript: 7.0.0 + + c12@1.10.0: + dependencies: + chokidar: 3.6.0 + confbox: 0.1.3 + defu: 6.1.4 + dotenv: 16.4.5 + giget: 1.2.3 + jiti: 1.21.0 + mlly: 1.6.1 + ohash: 1.1.3 + pathe: 1.1.2 + perfect-debounce: 1.0.0 + pkg-types: 1.0.3 + rc9: 2.1.1 + + c8@9.1.0: + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@istanbuljs/schema': 0.1.3 + find-up: 5.0.0 + foreground-child: 3.1.1 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-report: 3.0.1 + istanbul-reports: 3.1.7 + test-exclude: 6.0.0 + v8-to-istanbul: 9.2.0 + yargs: 17.7.2 + yargs-parser: 21.1.1 + + cac@6.7.14: {} + + call-bind@1.0.7: + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + set-function-length: 1.2.2 + + call-me-maybe@1.0.2: {} + + callsites@3.1.0: {} + + camel-case@4.1.2: + dependencies: + pascal-case: 3.1.2 + tslib: 2.6.2 + + camelcase@6.3.0: {} + + caniuse-lite@1.0.30001600: {} + + capital-case@1.0.4: + dependencies: + no-case: 3.0.4 + tslib: 2.6.2 + upper-case-first: 2.0.2 + + chai@4.4.1: + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.3 + deep-eql: 4.1.3 + get-func-name: 2.0.2 + loupe: 2.3.7 + pathval: 1.1.1 + type-detect: 4.0.8 + + chalk@2.4.2: + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chalk@5.3.0: {} + + change-case@4.1.2: + dependencies: + camel-case: 4.1.2 + capital-case: 1.0.4 + constant-case: 3.0.4 + dot-case: 3.0.4 + header-case: 2.0.4 + no-case: 3.0.4 + param-case: 3.0.4 + pascal-case: 3.1.2 + path-case: 3.0.4 + sentence-case: 3.0.4 + snake-case: 3.0.4 + tslib: 2.6.2 + + changelogen@0.5.5: + dependencies: + c12: 1.10.0 + colorette: 2.0.20 + consola: 3.2.3 + convert-gitmoji: 0.1.5 + execa: 8.0.1 + mri: 1.2.0 + node-fetch-native: 1.6.4 + ofetch: 1.3.4 + open: 9.1.0 + pathe: 1.1.2 + pkg-types: 1.0.3 + scule: 1.3.0 + semver: 7.6.0 + std-env: 3.7.0 + yaml: 2.4.1 + + chardet@0.7.0: {} + + check-error@1.0.3: + dependencies: + get-func-name: 2.0.2 + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + chownr@2.0.0: {} + + citty@0.1.6: + dependencies: + consola: 3.2.3 + + clean-stack@4.2.0: + dependencies: + escape-string-regexp: 5.0.0 + + cli-cursor@3.1.0: + dependencies: + restore-cursor: 3.1.0 + + cli-cursor@4.0.0: + dependencies: + restore-cursor: 4.0.0 + + cli-progress@3.12.0: + dependencies: + string-width: 4.2.3 + + cli-spinners@2.9.2: {} + + cli-truncate@4.0.0: + dependencies: + slice-ansi: 5.0.0 + string-width: 7.1.0 + + cli-width@4.1.0: {} + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clone@1.0.4: {} + + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.3: {} + + color-name@1.1.4: {} + + colorette@2.0.20: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + commander@11.1.0: {} + + commander@12.0.0: {} + + commander@2.20.3: {} + + concat-map@0.0.1: {} + + confbox@0.1.3: {} + + consola@3.2.3: {} + + constant-case@3.0.4: + dependencies: + no-case: 3.0.4 + tslib: 2.6.2 + upper-case: 2.0.2 + + convert-gitmoji@0.1.5: {} + + convert-source-map@2.0.0: {} + + core-js@3.36.1: {} + + cross-env@7.0.3: + dependencies: + cross-spawn: 7.0.3 + + cross-spawn@7.0.3: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + css-tree@2.3.1: + dependencies: + mdn-data: 2.0.30 + source-map-js: 1.2.0 + + cssesc@3.0.0: {} + + csstype@3.1.3: {} + + dayjs@1.11.13: {} + + debug@4.3.4: + dependencies: + ms: 2.1.2 + + deep-eql@4.1.3: + dependencies: + type-detect: 4.0.8 + + deep-is@0.1.4: {} + + deepmerge@4.3.1: {} + + default-browser-id@3.0.0: + dependencies: + bplist-parser: 0.2.0 + untildify: 4.0.0 + + default-browser-id@5.0.0: {} + + default-browser@4.0.0: + dependencies: + bundle-name: 3.0.0 + default-browser-id: 3.0.0 + execa: 7.2.0 + titleize: 3.0.0 + + default-browser@5.2.1: + dependencies: + bundle-name: 4.1.0 + default-browser-id: 5.0.0 + + defaults@1.0.4: + dependencies: + clone: 1.0.4 + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + gopd: 1.0.1 + + define-lazy-prop@3.0.0: {} + + defu@6.1.4: {} + + del@7.1.0: + dependencies: + globby: 13.2.2 + graceful-fs: 4.2.11 + is-glob: 4.0.3 + is-path-cwd: 3.0.0 + is-path-inside: 4.0.0 + p-map: 5.5.0 + rimraf: 3.0.2 + slash: 4.0.0 + + delayed-stream@1.0.0: {} + + destr@2.0.3: {} + + detect-file@1.0.0: {} + + detect-indent@7.0.1: {} + + detect-libc@1.0.3: {} + + diff-sequences@29.6.3: {} + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + doctrine@3.0.0: + dependencies: + esutils: 2.0.3 + + dot-case@3.0.4: + dependencies: + no-case: 3.0.4 + tslib: 2.6.2 + + dotenv@16.4.5: {} + + duplexer@0.1.2: {} + + echarts@5.5.0: + dependencies: + tslib: 2.3.0 + zrender: 5.5.0 + + electron-to-chromium@1.4.715: {} + + element-plus@2.9.2(vue@3.4.26(typescript@5.4.5)): + dependencies: + '@ctrl/tinycolor': 3.6.1 + '@element-plus/icons-vue': 2.3.1(vue@3.4.26(typescript@5.4.5)) + '@floating-ui/dom': 1.6.12 + '@popperjs/core': '@sxzz/popperjs-es@2.11.7' + '@types/lodash': 4.17.14 + '@types/lodash-es': 4.17.12 + '@vueuse/core': 9.13.0(vue@3.4.26(typescript@5.4.5)) + async-validator: 4.2.5 + dayjs: 1.11.13 + escape-html: 1.0.3 + lodash: 4.17.21 + lodash-es: 4.17.21 + lodash-unified: 1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.17.21)(lodash@4.17.21) + memoize-one: 6.0.0 + normalize-wheel-es: 1.2.0 + vue: 3.4.26(typescript@5.4.5) + transitivePeerDependencies: + - '@vue/composition-api' + + emoji-regex@10.3.0: {} + + emoji-regex@8.0.0: {} + + entities@4.5.0: {} + + error-stack-parser-es@0.1.1: {} + + es-define-property@1.0.0: + dependencies: + get-intrinsic: 1.2.4 + + es-errors@1.3.0: {} + + esbuild@0.20.2: + optionalDependencies: + '@esbuild/aix-ppc64': 0.20.2 + '@esbuild/android-arm': 0.20.2 + '@esbuild/android-arm64': 0.20.2 + '@esbuild/android-x64': 0.20.2 + '@esbuild/darwin-arm64': 0.20.2 + '@esbuild/darwin-x64': 0.20.2 + '@esbuild/freebsd-arm64': 0.20.2 + '@esbuild/freebsd-x64': 0.20.2 + '@esbuild/linux-arm': 0.20.2 + '@esbuild/linux-arm64': 0.20.2 + '@esbuild/linux-ia32': 0.20.2 + '@esbuild/linux-loong64': 0.20.2 + '@esbuild/linux-mips64el': 0.20.2 + '@esbuild/linux-ppc64': 0.20.2 + '@esbuild/linux-riscv64': 0.20.2 + '@esbuild/linux-s390x': 0.20.2 + '@esbuild/linux-x64': 0.20.2 + '@esbuild/netbsd-x64': 0.20.2 + '@esbuild/openbsd-x64': 0.20.2 + '@esbuild/sunos-x64': 0.20.2 + '@esbuild/win32-arm64': 0.20.2 + '@esbuild/win32-ia32': 0.20.2 + '@esbuild/win32-x64': 0.20.2 + + escalade@3.1.2: {} + + escape-html@1.0.3: {} + + escape-string-regexp@1.0.5: {} + + escape-string-regexp@4.0.0: {} + + escape-string-regexp@5.0.0: {} + + eslint-config-prettier@9.1.0(eslint@8.57.0): + dependencies: + eslint: 8.57.0 + + eslint-plugin-prettier@5.1.3(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.2.5): + dependencies: + eslint: 8.57.0 + prettier: 3.2.5 + prettier-linter-helpers: 1.0.0 + synckit: 0.8.8 + optionalDependencies: + eslint-config-prettier: 9.1.0(eslint@8.57.0) + + eslint-plugin-vue@9.25.0(eslint@8.57.0): + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + eslint: 8.57.0 + globals: 13.24.0 + natural-compare: 1.4.0 + nth-check: 2.1.1 + postcss-selector-parser: 6.0.16 + semver: 7.6.0 + vue-eslint-parser: 9.4.2(eslint@8.57.0) + xml-name-validator: 4.0.0 + transitivePeerDependencies: + - supports-color + + eslint-scope@7.2.2: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint@8.57.0: + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@eslint-community/regexpp': 4.10.0 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.57.0 + '@humanwhocodes/config-array': 0.11.14 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 + ignore: 5.3.1 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.3 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + espree@9.6.1: + dependencies: + acorn: 8.11.3 + acorn-jsx: 5.3.2(acorn@8.11.3) + eslint-visitor-keys: 3.4.3 + + esprima@4.0.1: {} + + esquery@1.5.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + estree-walker@2.0.2: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.5 + + esutils@2.0.3: {} + + eventemitter3@5.0.1: {} + + execa@5.1.1: + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + + execa@7.2.0: + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 4.3.1 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 3.0.7 + strip-final-newline: 3.0.0 + + execa@8.0.1: + dependencies: + cross-spawn: 7.0.3 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + + expand-tilde@2.0.2: + dependencies: + homedir-polyfill: 1.0.3 + + extend-shallow@2.0.1: + dependencies: + is-extendable: 0.1.1 + + extend@3.0.2: {} + + external-editor@3.1.0: + dependencies: + chardet: 0.7.0 + iconv-lite: 0.4.24 + tmp: 0.0.33 + + fast-deep-equal@3.1.3: {} + + fast-diff@1.3.0: {} + + fast-glob@3.3.2: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fastq@1.17.1: + dependencies: + reusify: 1.0.4 + + figures@3.2.0: + dependencies: + escape-string-regexp: 1.0.5 + + file-entry-cache@6.0.1: + dependencies: + flat-cache: 3.2.0 + + fill-range@7.0.1: + dependencies: + to-regex-range: 5.0.1 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + findup-sync@5.0.0: + dependencies: + detect-file: 1.0.0 + is-glob: 4.0.3 + micromatch: 4.0.5 + resolve-dir: 1.0.1 + + fined@2.0.0: + dependencies: + expand-tilde: 2.0.2 + is-plain-object: 5.0.0 + object.defaults: 1.1.0 + object.pick: 1.3.0 + parse-filepath: 1.0.2 + + flagged-respawn@2.0.0: {} + + flat-cache@3.2.0: + dependencies: + flatted: 3.3.1 + keyv: 4.5.4 + rimraf: 3.0.2 + + flat@5.0.2: {} + + flatted@3.3.1: {} + + follow-redirects@1.15.6: {} + + for-in@1.0.2: {} + + for-own@1.0.0: + dependencies: + for-in: 1.0.2 + + foreground-child@3.1.1: + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + + form-data@4.0.0: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + fs-extra@10.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + fs-extra@11.2.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + fs-minipass@2.1.0: + dependencies: + minipass: 3.3.6 + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + gensync@1.0.0-beta.2: {} + + get-caller-file@2.0.5: {} + + get-east-asian-width@1.2.0: {} + + get-func-name@2.0.2: {} + + get-intrinsic@1.2.4: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + + get-stream@6.0.1: {} + + get-stream@8.0.1: {} + + giget@1.2.3: + dependencies: + citty: 0.1.6 + consola: 3.2.3 + defu: 6.1.4 + node-fetch-native: 1.6.4 + nypm: 0.3.8 + ohash: 1.1.3 + pathe: 1.1.2 + tar: 6.2.1 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + global-modules@1.0.0: + dependencies: + global-prefix: 1.0.2 + is-windows: 1.0.2 + resolve-dir: 1.0.1 + + global-prefix@1.0.2: + dependencies: + expand-tilde: 2.0.2 + homedir-polyfill: 1.0.3 + ini: 1.3.8 + is-windows: 1.0.2 + which: 1.3.1 + + globals@11.12.0: {} + + globals@13.24.0: + dependencies: + type-fest: 0.20.2 + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.3.1 + merge2: 1.4.1 + slash: 3.0.0 + + globby@13.2.2: + dependencies: + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.3.1 + merge2: 1.4.1 + slash: 4.0.0 + + gopd@1.0.1: + dependencies: + get-intrinsic: 1.2.4 + + graceful-fs@4.2.11: {} + + graphemer@1.4.0: {} + + gray-matter@4.0.3: + dependencies: + js-yaml: 3.14.1 + kind-of: 6.0.3 + section-matter: 1.0.0 + strip-bom-string: 1.0.0 + + gzip-size@6.0.0: + dependencies: + duplexer: 0.1.2 + + handlebars@4.7.8: + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.17.4 + + has-flag@3.0.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.0 + + has-proto@1.0.3: {} + + has-symbols@1.0.3: {} + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + header-case@2.0.4: + dependencies: + capital-case: 1.0.4 + tslib: 2.6.2 + + homedir-polyfill@1.0.3: + dependencies: + parse-passwd: 1.0.0 + + hookable@5.5.3: {} + + html-escaper@2.0.2: {} + + html-tags@3.3.1: {} + + human-signals@2.1.0: {} + + human-signals@4.3.1: {} + + human-signals@5.0.0: {} + + husky@9.0.11: {} + + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + + ieee754@1.2.1: {} + + ignore@5.3.1: {} + + import-fresh@3.3.0: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + imurmurhash@0.1.4: {} + + indent-string@5.0.0: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + ini@1.3.8: {} + + inquirer@9.2.16: + dependencies: + '@ljharb/through': 2.3.13 + ansi-escapes: 4.3.2 + chalk: 5.3.0 + cli-cursor: 3.1.0 + cli-width: 4.1.0 + external-editor: 3.1.0 + figures: 3.2.0 + lodash: 4.17.21 + mute-stream: 1.0.0 + ora: 5.4.1 + run-async: 3.0.0 + rxjs: 7.8.1 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + + interpret@3.1.1: {} + + is-absolute@1.0.0: + dependencies: + is-relative: 1.0.0 + is-windows: 1.0.2 + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-core-module@2.13.1: + dependencies: + hasown: 2.0.2 + + is-docker@2.2.1: {} + + is-docker@3.0.0: {} + + is-extendable@0.1.1: {} + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-fullwidth-code-point@4.0.0: {} + + is-fullwidth-code-point@5.0.0: + dependencies: + get-east-asian-width: 1.2.0 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + + is-interactive@1.0.0: {} + + is-interactive@2.0.0: {} + + is-number@7.0.0: {} + + is-path-cwd@3.0.0: {} + + is-path-inside@3.0.3: {} + + is-path-inside@4.0.0: {} + + is-plain-object@5.0.0: {} + + is-relative@1.0.0: + dependencies: + is-unc-path: 1.0.0 + + is-stream@2.0.1: {} + + is-stream@3.0.0: {} + + is-unc-path@1.0.0: + dependencies: + unc-path-regex: 0.1.2 + + is-unicode-supported@0.1.0: {} + + is-unicode-supported@1.3.0: {} + + is-unicode-supported@2.0.0: {} + + is-windows@1.0.2: {} + + is-wsl@2.2.0: + dependencies: + is-docker: 2.2.1 + + is-wsl@3.1.0: + dependencies: + is-inside-container: 1.0.0 + + isbinaryfile@5.0.2: {} + + isexe@2.0.0: {} + + isobject@3.0.1: {} + + istanbul-lib-coverage@3.2.2: {} + + istanbul-lib-report@3.0.1: + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + + istanbul-reports@3.1.7: + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + + ityped@1.0.3: {} + + jiti@1.21.0: {} + + js-tokens@4.0.0: {} + + js-tokens@8.0.3: {} + + js-yaml@3.14.1: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsesc@2.5.2: {} + + json-buffer@3.0.1: {} + + json-schema-traverse@0.4.1: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json5@2.2.3: {} + + jsonc-parser@3.2.1: {} + + jsonfile@6.1.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + kind-of@6.0.3: {} + + kleur@3.0.3: {} + + kolorist@1.8.0: {} + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + liftoff@4.0.0: + dependencies: + extend: 3.0.2 + findup-sync: 5.0.0 + fined: 2.0.0 + flagged-respawn: 2.0.0 + is-plain-object: 5.0.0 + object.map: 1.0.1 + rechoir: 0.8.0 + resolve: 1.22.8 + + lightningcss-darwin-arm64@1.24.1: + optional: true + + lightningcss-darwin-x64@1.24.1: + optional: true + + lightningcss-freebsd-x64@1.24.1: + optional: true + + lightningcss-linux-arm-gnueabihf@1.24.1: + optional: true + + lightningcss-linux-arm64-gnu@1.24.1: + optional: true + + lightningcss-linux-arm64-musl@1.24.1: + optional: true + + lightningcss-linux-x64-gnu@1.24.1: + optional: true + + lightningcss-linux-x64-musl@1.24.1: + optional: true + + lightningcss-win32-x64-msvc@1.24.1: + optional: true + + lightningcss@1.24.1: + dependencies: + detect-libc: 1.0.3 + optionalDependencies: + lightningcss-darwin-arm64: 1.24.1 + lightningcss-darwin-x64: 1.24.1 + lightningcss-freebsd-x64: 1.24.1 + lightningcss-linux-arm-gnueabihf: 1.24.1 + lightningcss-linux-arm64-gnu: 1.24.1 + lightningcss-linux-arm64-musl: 1.24.1 + lightningcss-linux-x64-gnu: 1.24.1 + lightningcss-linux-x64-musl: 1.24.1 + lightningcss-win32-x64-msvc: 1.24.1 + + lilconfig@3.0.0: {} + + linkify-it@5.0.0: + dependencies: + uc.micro: 2.1.0 + + lint-staged@15.2.2: + dependencies: + chalk: 5.3.0 + commander: 11.1.0 + debug: 4.3.4 + execa: 8.0.1 + lilconfig: 3.0.0 + listr2: 8.0.1 + micromatch: 4.0.5 + pidtree: 0.6.0 + string-argv: 0.3.2 + yaml: 2.3.4 + transitivePeerDependencies: + - supports-color + + listr2@8.0.1: + dependencies: + cli-truncate: 4.0.0 + colorette: 2.0.20 + eventemitter3: 5.0.1 + log-update: 6.0.0 + rfdc: 1.3.1 + wrap-ansi: 9.0.0 + + local-pkg@0.4.3: {} + + local-pkg@0.5.0: + dependencies: + mlly: 1.6.1 + pkg-types: 1.0.3 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash-es@4.17.21: {} + + lodash-unified@1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.17.21)(lodash@4.17.21): + dependencies: + '@types/lodash-es': 4.17.12 + lodash: 4.17.21 + lodash-es: 4.17.21 + + lodash.get@4.4.2: {} + + lodash.merge@4.6.2: {} + + lodash@4.17.21: {} + + log-symbols@4.1.0: + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + + log-symbols@6.0.0: + dependencies: + chalk: 5.3.0 + is-unicode-supported: 1.3.0 + + log-update@6.0.0: + dependencies: + ansi-escapes: 6.2.0 + cli-cursor: 4.0.0 + slice-ansi: 7.1.0 + strip-ansi: 7.1.0 + wrap-ansi: 9.0.0 + + loupe@2.3.7: + dependencies: + get-func-name: 2.0.2 + + lower-case@2.0.2: + dependencies: + tslib: 2.6.2 + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + lru-cache@6.0.0: + dependencies: + yallist: 4.0.0 + + m-type-tools@0.5.3: {} + + magic-string-ast@0.3.0: + dependencies: + magic-string: 0.30.9 + + magic-string@0.30.10: + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + + magic-string@0.30.8: + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + + magic-string@0.30.9: + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + + make-dir@4.0.0: + dependencies: + semver: 7.6.0 + + make-iterator@1.0.1: + dependencies: + kind-of: 6.0.3 + + map-cache@0.2.2: {} + + markdown-it@14.1.0: + dependencies: + argparse: 2.0.1 + entities: 4.5.0 + linkify-it: 5.0.0 + mdurl: 2.0.0 + punycode.js: 2.3.1 + uc.micro: 2.1.0 + + mdn-data@2.0.30: {} + + mdurl@2.0.0: {} + + memoize-one@6.0.0: {} + + meow@13.2.0: {} + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + micromatch@4.0.5: + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mimic-fn@2.1.0: {} + + mimic-fn@4.0.0: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minimatch@9.0.3: + dependencies: + brace-expansion: 2.0.1 + + minimatch@9.0.4: + dependencies: + brace-expansion: 2.0.1 + + minimist@1.2.8: {} + + minipass@3.3.6: + dependencies: + yallist: 4.0.0 + + minipass@5.0.0: {} + + minizlib@2.1.2: + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + + mitt@3.0.1: {} + + mkdirp@1.0.4: {} + + mkdirp@3.0.1: {} + + mlly@1.6.1: + dependencies: + acorn: 8.11.3 + pathe: 1.1.2 + pkg-types: 1.0.3 + ufo: 1.5.3 + + mockjs@1.1.0: + dependencies: + commander: 12.0.0 + + mri@1.2.0: {} + + mrmime@2.0.0: {} + + ms@2.1.2: {} + + mute-stream@1.0.0: {} + + nanoid@3.3.7: {} + + natural-compare@1.4.0: {} + + neo-async@2.6.2: {} + + no-case@3.0.4: + dependencies: + lower-case: 2.0.2 + tslib: 2.6.2 + + node-fetch-native@1.6.4: {} + + node-plop@0.32.0: + dependencies: + '@types/inquirer': 9.0.7 + change-case: 4.1.2 + del: 7.1.0 + globby: 13.2.2 + handlebars: 4.7.8 + inquirer: 9.2.16 + isbinaryfile: 5.0.2 + lodash.get: 4.4.2 + lower-case: 2.0.2 + mkdirp: 3.0.1 + resolve: 1.22.8 + title-case: 3.0.3 + upper-case: 2.0.2 + + node-releases@2.0.14: {} + + normalize-path@3.0.0: {} + + normalize-wheel-es@1.2.0: {} + + npm-run-path@4.0.1: + dependencies: + path-key: 3.1.1 + + npm-run-path@5.3.0: + dependencies: + path-key: 4.0.0 + + nprogress@0.2.0: {} + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + + nypm@0.3.8: + dependencies: + citty: 0.1.6 + consola: 3.2.3 + execa: 8.0.1 + pathe: 1.1.2 + ufo: 1.5.3 + + object.defaults@1.1.0: + dependencies: + array-each: 1.0.1 + array-slice: 1.1.0 + for-own: 1.0.0 + isobject: 3.0.1 + + object.map@1.0.1: + dependencies: + for-own: 1.0.0 + make-iterator: 1.0.1 + + object.pick@1.3.0: + dependencies: + isobject: 3.0.1 + + ofetch@1.3.4: + dependencies: + destr: 2.0.3 + node-fetch-native: 1.6.4 + ufo: 1.5.3 + + ohash@1.1.3: {} + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + onetime@6.0.0: + dependencies: + mimic-fn: 4.0.0 + + open@10.1.0: + dependencies: + default-browser: 5.2.1 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + is-wsl: 3.1.0 + + open@9.1.0: + dependencies: + default-browser: 4.0.0 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + is-wsl: 2.2.0 + + optionator@0.9.3: + dependencies: + '@aashutoshrathi/word-wrap': 1.2.6 + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + + ora@5.4.1: + dependencies: + bl: 4.1.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.9.2 + is-interactive: 1.0.0 + is-unicode-supported: 0.1.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + + ora@8.0.1: + dependencies: + chalk: 5.3.0 + cli-cursor: 4.0.0 + cli-spinners: 2.9.2 + is-interactive: 2.0.0 + is-unicode-supported: 2.0.0 + log-symbols: 6.0.0 + stdin-discarder: 0.2.2 + string-width: 7.1.0 + strip-ansi: 7.1.0 + + os-tmpdir@1.0.2: {} + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-limit@5.0.0: + dependencies: + yocto-queue: 1.0.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + p-map@5.5.0: + dependencies: + aggregate-error: 4.0.1 + + param-case@3.0.4: + dependencies: + dot-case: 3.0.4 + tslib: 2.6.2 + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-filepath@1.0.2: + dependencies: + is-absolute: 1.0.0 + map-cache: 0.2.2 + path-root: 0.1.1 + + parse-passwd@1.0.0: {} + + pascal-case@3.1.2: + dependencies: + no-case: 3.0.4 + tslib: 2.6.2 + + path-case@3.0.4: + dependencies: + dot-case: 3.0.4 + tslib: 2.6.2 + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-key@4.0.0: {} + + path-parse@1.0.7: {} + + path-root-regex@0.1.2: {} + + path-root@0.1.1: + dependencies: + path-root-regex: 0.1.2 + + path-type@4.0.0: {} + + pathe@1.1.2: {} + + pathval@1.1.1: {} + + perfect-debounce@1.0.0: {} + + picocolors@1.0.0: {} + + picomatch@2.3.1: {} + + pidtree@0.6.0: {} + + pinia-plugin-persistedstate@3.2.1(pinia@2.1.7(typescript@5.4.5)(vue@3.4.26(typescript@5.4.5))): + dependencies: + pinia: 2.1.7(typescript@5.4.5)(vue@3.4.26(typescript@5.4.5)) + + pinia@2.1.7(typescript@5.4.5)(vue@3.4.26(typescript@5.4.5)): + dependencies: + '@vue/devtools-api': 6.6.1 + vue: 3.4.26(typescript@5.4.5) + vue-demi: 0.14.7(vue@3.4.26(typescript@5.4.5)) + optionalDependencies: + typescript: 5.4.5 + + pkg-types@1.0.3: + dependencies: + jsonc-parser: 3.2.1 + mlly: 1.6.1 + pathe: 1.1.2 + + plop@4.0.1: + dependencies: + '@types/liftoff': 4.0.3 + chalk: 5.3.0 + interpret: 3.1.1 + liftoff: 4.0.0 + minimist: 1.2.8 + node-plop: 0.32.0 + ora: 8.0.1 + v8flags: 4.0.1 + + postcss-selector-parser@6.0.16: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss@8.4.38: + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.2.0 + + prelude-ls@1.2.1: {} + + prettier-linter-helpers@1.0.0: + dependencies: + fast-diff: 1.3.0 + + prettier@3.2.5: {} + + pretty-format@29.7.0: + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.2.0 + + prism-theme-vars@0.2.5: {} + + prompts@2.4.2: + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + + proxy-from-env@1.1.0: {} + + punycode.js@2.3.1: {} + + punycode@2.3.1: {} + + queue-microtask@1.2.3: {} + + rc9@2.1.1: + dependencies: + defu: 6.1.4 + destr: 2.0.3 + flat: 5.0.2 + + react-is@18.2.0: {} + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + rechoir@0.8.0: + dependencies: + resolve: 1.22.8 + + regenerator-runtime@0.14.1: {} + + require-directory@2.1.1: {} + + resize-detector@0.3.0: {} + + resolve-dir@1.0.1: + dependencies: + expand-tilde: 2.0.2 + global-modules: 1.0.0 + + resolve-from@4.0.0: {} + + resolve@1.22.8: + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + restore-cursor@3.1.0: + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + + restore-cursor@4.0.0: + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + + reusify@1.0.4: {} + + rfdc@1.3.1: {} + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + rollup@4.13.0: + dependencies: + '@types/estree': 1.0.5 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.13.0 + '@rollup/rollup-android-arm64': 4.13.0 + '@rollup/rollup-darwin-arm64': 4.13.0 + '@rollup/rollup-darwin-x64': 4.13.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.13.0 + '@rollup/rollup-linux-arm64-gnu': 4.13.0 + '@rollup/rollup-linux-arm64-musl': 4.13.0 + '@rollup/rollup-linux-riscv64-gnu': 4.13.0 + '@rollup/rollup-linux-x64-gnu': 4.13.0 + '@rollup/rollup-linux-x64-musl': 4.13.0 + '@rollup/rollup-win32-arm64-msvc': 4.13.0 + '@rollup/rollup-win32-ia32-msvc': 4.13.0 + '@rollup/rollup-win32-x64-msvc': 4.13.0 + fsevents: 2.3.3 + + run-applescript@5.0.0: + dependencies: + execa: 5.1.1 + + run-applescript@7.0.0: {} + + run-async@3.0.0: {} + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + rxjs@7.8.1: + dependencies: + tslib: 2.6.2 + + safe-buffer@5.2.1: {} + + safer-buffer@2.1.2: {} + + scule@1.3.0: {} + + section-matter@1.0.0: + dependencies: + extend-shallow: 2.0.1 + kind-of: 6.0.3 + + semver@6.3.1: {} + + semver@7.6.0: + dependencies: + lru-cache: 6.0.0 + + sentence-case@3.0.4: + dependencies: + no-case: 3.0.4 + tslib: 2.6.2 + upper-case-first: 2.0.2 + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + siginfo@2.0.0: {} + + signal-exit@3.0.7: {} + + signal-exit@4.1.0: {} + + simple-git@3.24.0: + dependencies: + '@kwsites/file-exists': 1.1.1 + '@kwsites/promise-deferred': 1.1.1 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + + sirv@2.0.4: + dependencies: + '@polka/url': 1.0.0-next.25 + mrmime: 2.0.0 + totalist: 3.0.1 + + sisteransi@1.0.5: {} + + slash@3.0.0: {} + + slash@4.0.0: {} + + slice-ansi@5.0.0: + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 4.0.0 + + slice-ansi@7.1.0: + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 5.0.0 + + snake-case@3.0.4: + dependencies: + dot-case: 3.0.4 + tslib: 2.6.2 + + source-map-js@1.2.0: {} + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + speakingurl@14.0.1: {} + + sprintf-js@1.0.3: {} + + stackback@0.0.2: {} + + std-env@3.7.0: {} + + stdin-discarder@0.2.2: {} + + string-argv@0.3.2: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@7.1.0: + dependencies: + emoji-regex: 10.3.0 + get-east-asian-width: 1.2.0 + strip-ansi: 7.1.0 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.0.1 + + strip-bom-string@1.0.0: {} + + strip-final-newline@2.0.0: {} + + strip-final-newline@3.0.0: {} + + strip-json-comments@3.1.1: {} + + strip-literal@1.3.0: + dependencies: + acorn: 8.11.3 + + strip-literal@2.0.0: + dependencies: + js-tokens: 8.0.3 + + supports-color@5.5.0: + dependencies: + has-flag: 3.0.0 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + svg-tags@1.0.0: {} + + synckit@0.8.8: + dependencies: + '@pkgr/core': 0.1.1 + tslib: 2.6.2 + + synckit@0.9.0: + dependencies: + '@pkgr/core': 0.1.1 + tslib: 2.6.2 + + systemjs@6.14.3: {} + + tar@6.2.1: + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + + taze@0.13.7: + dependencies: + '@antfu/ni': 0.21.12 + '@jsdevtools/ez-spawn': 3.0.4 + cli-progress: 3.12.0 + deepmerge: 4.3.1 + detect-indent: 7.0.1 + picocolors: 1.0.0 + prompts: 2.4.2 + ufo: 1.5.3 + unconfig: 0.3.13 + yargs: 17.7.2 + + terser@5.31.0: + dependencies: + '@jridgewell/source-map': 0.3.6 + acorn: 8.11.3 + commander: 2.20.3 + source-map-support: 0.5.21 + + test-exclude@6.0.0: + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.1.2 + + text-table@0.2.0: {} + + tinybench@2.6.0: {} + + tinypool@0.8.3: {} + + tinyspy@2.2.1: {} + + title-case@3.0.3: + dependencies: + tslib: 2.6.2 + + titleize@3.0.0: {} + + tmp@0.0.33: + dependencies: + os-tmpdir: 1.0.2 + + to-fast-properties@2.0.0: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + totalist@3.0.1: {} + + ts-api-utils@1.3.0(typescript@5.4.5): + dependencies: + typescript: 5.4.5 + + tslib@2.3.0: {} + + tslib@2.6.2: {} + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-detect@4.0.8: {} + + type-fest@0.20.2: {} + + type-fest@0.21.3: {} + + type-fest@3.13.1: {} + + typescript@5.4.5: {} + + uc.micro@2.1.0: {} + + ufo@1.5.3: {} + + uglify-js@3.17.4: + optional: true + + unc-path-regex@0.1.2: {} + + unconfig@0.3.13: + dependencies: + '@antfu/utils': 0.7.7 + defu: 6.1.4 + jiti: 1.21.0 + + undici-types@5.26.5: {} + + unimport@3.7.1(rollup@4.13.0): + dependencies: + '@rollup/pluginutils': 5.1.0(rollup@4.13.0) + acorn: 8.11.3 + escape-string-regexp: 5.0.0 + estree-walker: 3.0.3 + fast-glob: 3.3.2 + local-pkg: 0.5.0 + magic-string: 0.30.10 + mlly: 1.6.1 + pathe: 1.1.2 + pkg-types: 1.0.3 + scule: 1.3.0 + strip-literal: 1.3.0 + unplugin: 1.10.0 + transitivePeerDependencies: + - rollup + + universalify@2.0.1: {} + + unocss@0.59.4(postcss@8.4.38)(rollup@4.13.0)(vite@5.2.10(@types/node@20.12.7)(lightningcss@1.24.1)(terser@5.31.0)): + dependencies: + '@unocss/astro': 0.59.4(rollup@4.13.0)(vite@5.2.10(@types/node@20.12.7)(lightningcss@1.24.1)(terser@5.31.0)) + '@unocss/cli': 0.59.4(rollup@4.13.0) + '@unocss/core': 0.59.4 + '@unocss/extractor-arbitrary-variants': 0.59.4 + '@unocss/postcss': 0.59.4(postcss@8.4.38) + '@unocss/preset-attributify': 0.59.4 + '@unocss/preset-icons': 0.59.4 + '@unocss/preset-mini': 0.59.4 + '@unocss/preset-tagify': 0.59.4 + '@unocss/preset-typography': 0.59.4 + '@unocss/preset-uno': 0.59.4 + '@unocss/preset-web-fonts': 0.59.4 + '@unocss/preset-wind': 0.59.4 + '@unocss/reset': 0.59.4 + '@unocss/transformer-attributify-jsx': 0.59.4 + '@unocss/transformer-attributify-jsx-babel': 0.59.4 + '@unocss/transformer-compile-class': 0.59.4 + '@unocss/transformer-directives': 0.59.4 + '@unocss/transformer-variant-group': 0.59.4 + '@unocss/vite': 0.59.4(rollup@4.13.0)(vite@5.2.10(@types/node@20.12.7)(lightningcss@1.24.1)(terser@5.31.0)) + optionalDependencies: + vite: 5.2.10(@types/node@20.12.7)(lightningcss@1.24.1)(terser@5.31.0) + transitivePeerDependencies: + - postcss + - rollup + - supports-color + + unplugin-auto-import@0.17.5(@vueuse/core@10.9.0(vue@3.4.26(typescript@5.4.5)))(rollup@4.13.0): + dependencies: + '@antfu/utils': 0.7.7 + '@rollup/pluginutils': 5.1.0(rollup@4.13.0) + fast-glob: 3.3.2 + local-pkg: 0.5.0 + magic-string: 0.30.8 + minimatch: 9.0.3 + unimport: 3.7.1(rollup@4.13.0) + unplugin: 1.10.0 + optionalDependencies: + '@vueuse/core': 10.9.0(vue@3.4.26(typescript@5.4.5)) + transitivePeerDependencies: + - rollup + + unplugin-vue-components@0.26.0(@babel/parser@7.24.4)(rollup@4.13.0)(vue@3.4.26(typescript@5.4.5)): + dependencies: + '@antfu/utils': 0.7.7 + '@rollup/pluginutils': 5.1.0(rollup@4.13.0) + chokidar: 3.6.0 + debug: 4.3.4 + fast-glob: 3.3.2 + local-pkg: 0.4.3 + magic-string: 0.30.8 + minimatch: 9.0.3 + resolve: 1.22.8 + unplugin: 1.10.0 + vue: 3.4.26(typescript@5.4.5) + optionalDependencies: + '@babel/parser': 7.24.4 + transitivePeerDependencies: + - rollup + - supports-color + + unplugin-vue-markdown@0.26.2(rollup@4.13.0)(vite@5.2.10(@types/node@20.12.7)(lightningcss@1.24.1)(terser@5.31.0)): + dependencies: + '@mdit-vue/plugin-component': 2.1.2 + '@mdit-vue/plugin-frontmatter': 2.1.2 + '@mdit-vue/types': 2.1.0 + '@rollup/pluginutils': 5.1.0(rollup@4.13.0) + '@types/markdown-it': 14.0.1 + markdown-it: 14.1.0 + unplugin: 1.10.1 + vite: 5.2.10(@types/node@20.12.7)(lightningcss@1.24.1)(terser@5.31.0) + transitivePeerDependencies: + - rollup + + unplugin-vue-router@0.8.6(rollup@4.13.0)(vue-router@4.3.2(vue@3.4.26(typescript@5.4.5)))(vue@3.4.26(typescript@5.4.5)): + dependencies: + '@babel/types': 7.24.0 + '@rollup/pluginutils': 5.1.0(rollup@4.13.0) + '@vue-macros/common': 1.10.2(rollup@4.13.0)(vue@3.4.26(typescript@5.4.5)) + ast-walker-scope: 0.6.1 + chokidar: 3.6.0 + fast-glob: 3.3.2 + json5: 2.2.3 + local-pkg: 0.5.0 + mlly: 1.6.1 + pathe: 1.1.2 + scule: 1.3.0 + unplugin: 1.10.1 + yaml: 2.4.1 + optionalDependencies: + vue-router: 4.3.2(vue@3.4.26(typescript@5.4.5)) + transitivePeerDependencies: + - rollup + - vue + + unplugin@1.10.0: + dependencies: + acorn: 8.11.3 + chokidar: 3.6.0 + webpack-sources: 3.2.3 + webpack-virtual-modules: 0.6.1 + + unplugin@1.10.1: + dependencies: + acorn: 8.11.3 + chokidar: 3.6.0 + webpack-sources: 3.2.3 + webpack-virtual-modules: 0.6.1 + + untildify@4.0.0: {} + + update-browserslist-db@1.0.13(browserslist@4.23.0): + dependencies: + browserslist: 4.23.0 + escalade: 3.1.2 + picocolors: 1.0.0 + + upper-case-first@2.0.2: + dependencies: + tslib: 2.6.2 + + upper-case@2.0.2: + dependencies: + tslib: 2.6.2 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + util-deprecate@1.0.2: {} + + v8-to-istanbul@9.2.0: + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + '@types/istanbul-lib-coverage': 2.0.6 + convert-source-map: 2.0.0 + + v8flags@4.0.1: {} + + vite-auto-import-resolvers@3.2.1(unplugin-auto-import@0.17.5(@vueuse/core@10.9.0(vue@3.4.26(typescript@5.4.5)))(rollup@4.13.0))(vite@5.2.10(@types/node@20.12.7)(lightningcss@1.24.1)(terser@5.31.0)): + dependencies: + fast-glob: 3.3.2 + local-pkg: 0.4.3 + scule: 1.3.0 + unplugin-auto-import: 0.17.5(@vueuse/core@10.9.0(vue@3.4.26(typescript@5.4.5)))(rollup@4.13.0) + vite: 5.2.10(@types/node@20.12.7)(lightningcss@1.24.1)(terser@5.31.0) + + vite-hot-client@0.2.3(vite@5.2.10(@types/node@20.12.7)(lightningcss@1.24.1)(terser@5.31.0)): + dependencies: + vite: 5.2.10(@types/node@20.12.7)(lightningcss@1.24.1)(terser@5.31.0) + + vite-layers@0.5.2(vite@5.2.10(@types/node@20.12.7)(lightningcss@1.24.1)(terser@5.31.0)): + dependencies: + consola: 3.2.3 + defu: 6.1.4 + jiti: 1.21.0 + kolorist: 1.8.0 + m-type-tools: 0.5.3 + vite: 5.2.10(@types/node@20.12.7)(lightningcss@1.24.1)(terser@5.31.0) + + vite-node@1.5.3(@types/node@20.12.7)(lightningcss@1.24.1)(terser@5.31.0): + dependencies: + cac: 6.7.14 + debug: 4.3.4 + pathe: 1.1.2 + picocolors: 1.0.0 + vite: 5.2.10(@types/node@20.12.7)(lightningcss@1.24.1)(terser@5.31.0) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + + vite-plugin-compression@0.5.1(vite@5.2.10(@types/node@20.12.7)(lightningcss@1.24.1)(terser@5.31.0)): + dependencies: + chalk: 4.1.2 + debug: 4.3.4 + fs-extra: 10.1.0 + vite: 5.2.10(@types/node@20.12.7)(lightningcss@1.24.1)(terser@5.31.0) + transitivePeerDependencies: + - supports-color + + vite-plugin-env-types@0.1.4(vite@5.2.10(@types/node@20.12.7)(lightningcss@1.24.1)(terser@5.31.0)): + dependencies: + fast-glob: 3.3.2 + vite: 5.2.10(@types/node@20.12.7)(lightningcss@1.24.1)(terser@5.31.0) + + vite-plugin-inspect@0.8.4(rollup@4.13.0)(vite@5.2.10(@types/node@20.12.7)(lightningcss@1.24.1)(terser@5.31.0)): + dependencies: + '@antfu/utils': 0.7.7 + '@rollup/pluginutils': 5.1.0(rollup@4.13.0) + debug: 4.3.4 + error-stack-parser-es: 0.1.1 + fs-extra: 11.2.0 + open: 10.1.0 + perfect-debounce: 1.0.0 + picocolors: 1.0.0 + sirv: 2.0.4 + vite: 5.2.10(@types/node@20.12.7)(lightningcss@1.24.1)(terser@5.31.0) + transitivePeerDependencies: + - rollup + - supports-color + + vite-plugin-legacy-swc@1.1.0(vite@5.2.10(@types/node@20.12.7)(lightningcss@1.24.1)(terser@5.31.0)): + dependencies: + '@swc/core': 1.4.8 + browserslist: 4.23.0 + browserslist-to-esbuild: 2.1.1(browserslist@4.23.0) + core-js: 3.36.1 + magic-string: 0.30.8 + regenerator-runtime: 0.14.1 + systemjs: 6.14.3 + vite: 5.2.10(@types/node@20.12.7)(lightningcss@1.24.1)(terser@5.31.0) + transitivePeerDependencies: + - '@swc/helpers' + + vite-plugin-use-modules@1.4.8(vite@5.2.10(@types/node@20.12.7)(lightningcss@1.24.1)(terser@5.31.0))(vue@3.4.26(typescript@5.4.5)): + dependencies: + local-pkg: 0.5.0 + vite: 5.2.10(@types/node@20.12.7)(lightningcss@1.24.1)(terser@5.31.0) + vue: 3.4.26(typescript@5.4.5) + + vite-plugin-vue-devtools@7.1.3(rollup@4.13.0)(vite@5.2.10(@types/node@20.12.7)(lightningcss@1.24.1)(terser@5.31.0))(vue@3.4.26(typescript@5.4.5)): + dependencies: + '@vue/devtools-core': 7.1.3(vite@5.2.10(@types/node@20.12.7)(lightningcss@1.24.1)(terser@5.31.0))(vue@3.4.26(typescript@5.4.5)) + '@vue/devtools-kit': 7.1.3(vue@3.4.26(typescript@5.4.5)) + '@vue/devtools-shared': 7.1.3 + execa: 8.0.1 + sirv: 2.0.4 + vite: 5.2.10(@types/node@20.12.7)(lightningcss@1.24.1)(terser@5.31.0) + vite-plugin-inspect: 0.8.4(rollup@4.13.0)(vite@5.2.10(@types/node@20.12.7)(lightningcss@1.24.1)(terser@5.31.0)) + vite-plugin-vue-inspector: 5.0.1(vite@5.2.10(@types/node@20.12.7)(lightningcss@1.24.1)(terser@5.31.0)) + transitivePeerDependencies: + - '@nuxt/kit' + - rollup + - supports-color + - vue + + vite-plugin-vue-inspector@5.0.1(vite@5.2.10(@types/node@20.12.7)(lightningcss@1.24.1)(terser@5.31.0)): + dependencies: + '@babel/core': 7.24.4 + '@babel/plugin-proposal-decorators': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-syntax-import-attributes': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.4) + '@babel/plugin-transform-typescript': 7.24.1(@babel/core@7.24.4) + '@vue/babel-plugin-jsx': 1.2.2(@babel/core@7.24.4) + '@vue/compiler-dom': 3.4.24 + kolorist: 1.8.0 + magic-string: 0.30.10 + vite: 5.2.10(@types/node@20.12.7)(lightningcss@1.24.1)(terser@5.31.0) + transitivePeerDependencies: + - supports-color + + vite-plugin-vue-meta-layouts@0.4.3(vite@5.2.10(@types/node@20.12.7)(lightningcss@1.24.1)(terser@5.31.0))(vue-router@4.3.2(vue@3.4.26(typescript@5.4.5))): + dependencies: + local-pkg: 0.5.0 + vite: 5.2.10(@types/node@20.12.7)(lightningcss@1.24.1)(terser@5.31.0) + vue-router: 4.3.2(vue@3.4.26(typescript@5.4.5)) + + vite@5.2.10(@types/node@20.12.7)(lightningcss@1.24.1)(terser@5.31.0): + dependencies: + esbuild: 0.20.2 + postcss: 8.4.38 + rollup: 4.13.0 + optionalDependencies: + '@types/node': 20.12.7 + fsevents: 2.3.3 + lightningcss: 1.24.1 + terser: 5.31.0 + + vitest@1.5.3(@types/node@20.12.7)(lightningcss@1.24.1)(terser@5.31.0): + dependencies: + '@vitest/expect': 1.5.3 + '@vitest/runner': 1.5.3 + '@vitest/snapshot': 1.5.3 + '@vitest/spy': 1.5.3 + '@vitest/utils': 1.5.3 + acorn-walk: 8.3.2 + chai: 4.4.1 + debug: 4.3.4 + execa: 8.0.1 + local-pkg: 0.5.0 + magic-string: 0.30.10 + pathe: 1.1.2 + picocolors: 1.0.0 + std-env: 3.7.0 + strip-literal: 2.0.0 + tinybench: 2.6.0 + tinypool: 0.8.3 + vite: 5.2.10(@types/node@20.12.7)(lightningcss@1.24.1)(terser@5.31.0) + vite-node: 1.5.3(@types/node@20.12.7)(lightningcss@1.24.1)(terser@5.31.0) + why-is-node-running: 2.2.2 + optionalDependencies: + '@types/node': 20.12.7 + transitivePeerDependencies: + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + + vue-demi@0.13.11(vue@3.4.26(typescript@5.4.5)): + dependencies: + vue: 3.4.26(typescript@5.4.5) + + vue-demi@0.14.10(vue@3.4.26(typescript@5.4.5)): + dependencies: + vue: 3.4.26(typescript@5.4.5) + + vue-demi@0.14.7(vue@3.4.26(typescript@5.4.5)): + dependencies: + vue: 3.4.26(typescript@5.4.5) + + vue-echarts@6.7.1(@vue/runtime-core@3.4.26)(echarts@5.5.0)(vue@3.4.26(typescript@5.4.5)): + dependencies: + echarts: 5.5.0 + resize-detector: 0.3.0 + vue: 3.4.26(typescript@5.4.5) + vue-demi: 0.13.11(vue@3.4.26(typescript@5.4.5)) + optionalDependencies: + '@vue/runtime-core': 3.4.26 + + vue-eslint-parser@9.4.2(eslint@8.57.0): + dependencies: + debug: 4.3.4 + eslint: 8.57.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 + lodash: 4.17.21 + semver: 7.6.0 + transitivePeerDependencies: + - supports-color + + vue-request@2.0.4(vue@3.4.26(typescript@5.4.5)): + dependencies: + vue: 3.4.26(typescript@5.4.5) + vue-demi: 0.14.10(vue@3.4.26(typescript@5.4.5)) + + vue-router@4.3.2(vue@3.4.26(typescript@5.4.5)): + dependencies: + '@vue/devtools-api': 6.6.1 + vue: 3.4.26(typescript@5.4.5) + + vue-toastification@2.0.0-rc.5(vue@3.4.26(typescript@5.4.5)): + dependencies: + vue: 3.4.26(typescript@5.4.5) + + vue@3.4.26(typescript@5.4.5): + dependencies: + '@vue/compiler-dom': 3.4.26 + '@vue/compiler-sfc': 3.4.26 + '@vue/runtime-dom': 3.4.26 + '@vue/server-renderer': 3.4.26(vue@3.4.26(typescript@5.4.5)) + '@vue/shared': 3.4.26 + optionalDependencies: + typescript: 5.4.5 + + wcwidth@1.0.1: + dependencies: + defaults: 1.0.4 + + webpack-sources@3.2.3: {} + + webpack-virtual-modules@0.6.1: {} + + which@1.3.1: + dependencies: + isexe: 2.0.0 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + why-is-node-running@2.2.2: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + + wordwrap@1.0.0: {} + + wrap-ansi@6.2.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@9.0.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 7.1.0 + strip-ansi: 7.1.0 + + wrappy@1.0.2: {} + + xml-name-validator@4.0.0: {} + + y18n@5.0.8: {} + + yallist@3.1.1: {} + + yallist@4.0.0: {} + + yaml@2.3.4: {} + + yaml@2.4.1: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.1.2 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yocto-queue@0.1.0: {} + + yocto-queue@1.0.0: {} + + zrender@5.5.0: + dependencies: + tslib: 2.3.0 diff --git a/ui/presets/autoprefixer.ts b/ui/presets/autoprefixer.ts new file mode 100644 index 0000000..01837f8 --- /dev/null +++ b/ui/presets/autoprefixer.ts @@ -0,0 +1,33 @@ +import type { Preset } from 'unocss' +import browserslist from 'browserslist' +import { defaultBuildTargets } from './shared/detect' +import { browserslistToTargets, transformStyleAttribute } from 'lightningcss' + +export default function autoprefixerPreset( + targets: string[] = defaultBuildTargets, +): Preset { + return { + name: 'unocss-preset-autoprefixer', + postprocess: (util) => { + const entries = util.entries + const { code } = transformStyleAttribute({ + code: Buffer.from( + entries + .filter((item) => !item[0].startsWith('--un')) + .map((x) => x.join(':')) + .join(';'), + ), + targets: browserslistToTargets(browserslist(targets)), + minify: true, + }) + + util.entries = [ + ...entries.filter((item) => item[0].startsWith('--un')), + ...(code + .toString() + .split(';') + .map((i) => i.split(':')) as [string, string | number][]), + ] + }, + } +} diff --git a/ui/presets/index.ts b/ui/presets/index.ts new file mode 100644 index 0000000..bac27a1 --- /dev/null +++ b/ui/presets/index.ts @@ -0,0 +1,234 @@ +import UnoCss from 'unocss/vite' +import AutoImport from 'unplugin-auto-import/vite' +import { + AntDesignVueResolver, + ArcoResolver, + DevUiResolver, + ElementPlusResolver, + HeadlessUiResolver, + IduxResolver, + InklineResolver, + LayuiVueResolver, + NaiveUiResolver, + PrimeVueResolver, + QuasarResolver, + TDesignResolver, + VantResolver, + VarletUIResolver, + ViewUiResolver, + VueUseComponentsResolver, + Vuetify3Resolver, +} from 'unplugin-vue-components/resolvers' +import Components from 'unplugin-vue-components/vite' +import Markdown from 'unplugin-vue-markdown/vite' +import { VueRouterAutoImports } from 'unplugin-vue-router' +import Router from 'unplugin-vue-router/vite' + +import { AutoGenerateImports, vue3Presets } from 'vite-auto-import-resolvers' +import Compression from 'vite-plugin-compression' +import EnvTypes from 'vite-plugin-env-types' +import Modules from 'vite-plugin-use-modules' +import VueDevTools from 'vite-plugin-vue-devtools' +import Layouts from 'vite-plugin-vue-meta-layouts' +import Legacy from 'vite-plugin-legacy-swc' +import Vue from '@vitejs/plugin-vue' +import Jsx from '@vitejs/plugin-vue-jsx' + +// 内置插件 +import { + Alias, + Lightningcss, + Restart, + Warmup, + Layers, + Optimize, +} from './plugins' +import { defaultBuildTargets, detectResolvers, useEnv } from './shared/detect' +import { r } from './shared/path' +import type { PluginOption } from 'vite' + +export default function () { + const env = useEnv() + const safelist = + 'prose px-2 sm:px-0 md:prose-lg lg:prose-lg dark:prose-invert text-left w-screen prose-slate prose-img:rounded-xl prose-headings:underline prose-a:text-blue-600' + + const plugins: PluginOption[] = [ + /** + * vite 配置层 + * 通过 mode 区分 vite 配置文件 (experimental) + */ + Layers(), + /** + * 兼容不支持 esmModule 的浏览器 + * https://www.npmjs.com/package/@vitejs/plugin-legacy + */ + Legacy({ + targets: defaultBuildTargets, + }), + /** + * 智能启动 lightningcss + */ + Lightningcss(), + /** + * 启动优化 + */ + Optimize(), + /** + * 环境变量类型提示 + * https://github.com/dishait/vite-plugin-env-types + */ + EnvTypes({ + dts: r('presets/types/env.d.ts'), + }), + /** + * 内置的预热,可以加快冷启动 + */ + Warmup(), + /** + * 文件路由 + * https://github.com/posva/unplugin-vue-router + */ + Router({ + routesFolder: r('src/pages'), + dts: r('presets/types/type-router.d.ts'), + extensions: ['.md', '.vue', '.tsx', '.jsx'], + }), + /** + * 自动安装 vue 插件 + * https://github.com/dishait/vite-plugin-use-modules + */ + Modules({ + auto: true, + // 内部使用虚拟模块,运行在前端,所以不需要 r 重写路径 + target: 'src/plugins', + }), + /** + * vue 官方插件,用来解析 sfc 单文件组件 + * https://www.npmjs.com/package/@vitejs/plugin-vue + */ + Vue({ + include: [/\.vue$/, /\.md$/], + }), + /** + * 布局系统 + * https://github.com/dishait/vite-plugin-vue-meta-layouts + */ + Layouts({ + skipTopLevelRouteLayout: true, + }), + + /** + * 组件自动按需引入 + * https://github.com/antfu/unplugin-vue-components + */ + Components({ + directoryAsNamespace: true, + include: [/\.vue$/, /\.vue\?vue/, /\.[tj]sx$/, /\.md$/], + extensions: ['md', 'vue', 'tsx', 'jsx'], + dts: r('presets/types/components.d.ts'), + types: [ + { + from: 'vue-router', + names: ['RouterLink', 'RouterView'], + }, + ], + resolvers: detectResolvers({ + onlyExist: [ + [VantResolver(), 'vant'], + [QuasarResolver(), 'quasar'], + [DevUiResolver(), 'vue-devui'], + [NaiveUiResolver(), 'naive-ui'], + [Vuetify3Resolver(), 'vuetify'], + [PrimeVueResolver(), 'primevue'], + [ViewUiResolver(), 'view-design'], + [LayuiVueResolver(), 'layui-vue'], + [VarletUIResolver(), '@varlet/ui'], + [IduxResolver(), '@idux/components'], + [InklineResolver(), '@inkline/inkline'], + [ElementPlusResolver(), 'element-plus'], + [HeadlessUiResolver(), '@headlessui/vue'], + [ArcoResolver(), '@arco-design/web-vue'], + [AntDesignVueResolver({ importStyle: false }), 'ant-design-vue'], + [VueUseComponentsResolver(), '@vueuse/components'], + [TDesignResolver({ library: 'vue-next' }), 'tdesign-vue-next'], + ], + }), + }), + + /** + * jsx 和 tsx 支持 + * https://www.npmjs.com/package/@vitejs/plugin-vue-jsx + */ + Jsx(), + /** + * 生产环境资源压缩 + * https://github.com/vbenjs/vite-plugin-compression + */ + Compression({ + // @ts-ignore + algorithm: env.VITE_APP_COMPRESSINON_ALGORITHM, + }), + /** + * 别名插件 (内置) + * 支持 `~` 和 `@` 别名到 `src` + */ + Alias(), + /** + * 强制重启 (内置) + * 如果 package.json 或 pnpm-lock.yaml 更新的话,强制重启 + */ + Restart(), + /** + * css 原子引擎 + * https://github.com/unocss/unocss + */ + UnoCss({ + safelist: env.VITE_APP_MARKDOWN ? safelist.split(' ') : undefined, + }), + ] + /** + * 开发面板 + * https://github.com/webfansplz/vite-plugin-vue-devtools + */ + if (env.VITE_APP_DEV_TOOLS) { + plugins.push(VueDevTools()) + } + + + /** + * api 自动按需引入 + * https://github.com/antfu/unplugin-auto-import + */ + if (env.VITE_APP_API_AUTO_IMPORT) { + const dirs = env.VITE_APP_DIR_API_AUTO_IMPORT + ? ['src/stores/**', 'src/composables/**', 'src/api/**'] + : [] + plugins.push( + AutoImport({ + dirs, + vueTemplate: true, + dts: r('presets/types/auto-imports.d.ts'), + imports: [ + ...AutoGenerateImports({ + include: [...vue3Presets], + exclude: ['vue-router'], + }), + VueRouterAutoImports, + ], + resolvers: detectResolvers({ + onlyExist: [ + [ElementPlusResolver(), 'element-plus'], + [TDesignResolver({ library: 'vue-next' }), 'tdesign-vue-next'], + ], + }), + eslintrc: { + enabled: true, + globalsPropValue: true, + filepath: r('presets/eslint/.eslintrc-auto-import.json'), + }, + }), + ) + } + + return plugins +} diff --git a/ui/presets/plugins/alias.ts b/ui/presets/plugins/alias.ts new file mode 100644 index 0000000..e4acd64 --- /dev/null +++ b/ui/presets/plugins/alias.ts @@ -0,0 +1,27 @@ +import type { Plugin } from 'vite' +import { r } from '../shared/path' + +/** + * 别名插件 + * @description 支持 `~` 和 `@` 别名到 `src` + */ +export function Alias(): Plugin { + const src = r('./src') + return { + name: 'vite-alias', + enforce: 'pre', + config(config) { + config.resolve ??= {} + config.resolve.alias = [ + { + find: /^~/, + replacement: src, + }, + { + find: /^@\//, + replacement: src + '/', + }, + ] + }, + } +} diff --git a/ui/presets/plugins/index.ts b/ui/presets/plugins/index.ts new file mode 100644 index 0000000..e775cce --- /dev/null +++ b/ui/presets/plugins/index.ts @@ -0,0 +1,6 @@ +export { Alias } from './alias' +export { Layers } from './layers' +export { Warmup } from './warmup' +export { Restart } from './restart' +export { Optimize } from './optimize' +export { Lightningcss } from './lightningcss' diff --git a/ui/presets/plugins/layers.ts b/ui/presets/plugins/layers.ts new file mode 100644 index 0000000..6cf143b --- /dev/null +++ b/ui/presets/plugins/layers.ts @@ -0,0 +1,41 @@ +import { existsSync } from 'fs' +import { gray } from 'kolorist' +import { basename } from 'path' +import { r } from '../shared/path' +import { Restart } from './restart' +import { createConsola } from 'consola' +import type { Plugin, UserConfig } from 'vite' +import { Layers as loadLayer, detectMode } from 'vite-layers' + +const logger = createConsola().withTag('layers') + +/** + * vite 配置层 + * @description 通过 mode 区分 vite 配置文件 (experimental) + */ +export function Layers(): Plugin { + const mode = detectMode() + const modeFiles = [mode.slice(0, 3), mode].map((mode) => + r(`vite.config.${mode}.ts`), + ) + return { + ...Restart(modeFiles.map((modeFile) => basename(modeFile))), + name: 'vite-plugin-layers', + enforce: 'post', + async config(config) { + const modeFile = modeFiles.find((modeFile) => existsSync(modeFile)) + if (modeFile) { + logger + .withTag(mode) + .success( + `vite.config.ts → ${basename(modeFile)} ${gray(`(experimental)`)}`, + ) + return loadLayer({ + logger: false, + extends: [config, modeFile], + }) as UserConfig + } + return config + }, + } +} diff --git a/ui/presets/plugins/lightningcss.ts b/ui/presets/plugins/lightningcss.ts new file mode 100644 index 0000000..d495e28 --- /dev/null +++ b/ui/presets/plugins/lightningcss.ts @@ -0,0 +1,62 @@ +import { existsSync } from 'fs' +import { gray } from 'kolorist' +import type { Plugin } from 'vite' +import { createConsola } from 'consola' +import { isPackageExists } from 'local-pkg' +import { browserslistToTargets } from 'lightningcss' +import { defaultBuildTargets } from '../shared/detect' + +const name = 'vite-plugin-fire-lightningcss' + +const logger = createConsola().withTag('css') + +/** + * 智能开启 lightningcss (如果不使用预处理器,或者 postcss) + */ +export function Lightningcss(): Plugin { + const packages = ['less', 'sass', 'stylus'] + return { + name, + config(config) { + config.css ??= {} + config.build ??= {} + const hasPreprocessor = packages.some((p) => isPackageExists(p)) + + const { postcss, modules, transformer } = config.css + const conflictConfiguration = [postcss, modules, transformer].some( + (c) => !isUndefined(c), + ) + + const hasPostcssConfigFile = [ + 'postcss.config.js', + 'postcss.config.cts', + 'postcss.config.ts', + ].some((c) => existsSync(c)) + + // 如果有预处理器,冲突配置或者 postcss 配置文件则禁用 + const disabled = + hasPreprocessor || conflictConfiguration || hasPostcssConfigFile + if (!disabled) { + const transformer = 'lightningcss' + config.css.transformer = transformer + let tip = `${transformer} ${gray(transformer)}` + + if (isUndefined(config.build.cssMinify)) { + config.build.cssMinify = 'lightningcss' + tip = `${transformer} ${gray('(transformer + cssMinify)')}` + } + + if (isUndefined(config.css.lightningcss?.targets)) { + config.css.lightningcss ??= {} + config.css.lightningcss.targets = + browserslistToTargets(defaultBuildTargets) + } + logger.success(tip) + } + }, + } + + function isUndefined(v: unknown): v is undefined { + return typeof v === 'undefined' + } +} diff --git a/ui/presets/plugins/optimize.ts b/ui/presets/plugins/optimize.ts new file mode 100644 index 0000000..63bca9c --- /dev/null +++ b/ui/presets/plugins/optimize.ts @@ -0,0 +1,19 @@ +import { createConsola } from 'consola' +import { gray } from 'kolorist' +import type { Plugin } from 'vite' + +const logger = createConsola().withTag('optimize') +export function Optimize(): Plugin { + return { + name: 'vite-optimize', + config(config) { + config.css ??= {} + config.optimizeDeps ??= {} + config.css.preprocessorMaxWorkers = true + config.optimizeDeps.holdUntilCrawlEnd = false + logger.success( + `optimize ${gray('(preprocessorMaxWorkers + closeHoldUntilCrawlEnd)')}`, + ) + }, + } +} diff --git a/ui/presets/plugins/restart.ts b/ui/presets/plugins/restart.ts new file mode 100644 index 0000000..bf117d0 --- /dev/null +++ b/ui/presets/plugins/restart.ts @@ -0,0 +1,30 @@ +import type { Plugin } from 'vite' +import { utimes } from 'fs/promises' +import { r } from '../shared/path' +import { debounce } from 'perfect-debounce' +import { resolve } from 'path' +import { slash } from 'vite-layers' + +const defaultPaths = ['package.json', 'pnpm-lock.yaml'] + +/** + * 强制重启 + * @description 如果监听更新的话,强制重启项目 + * @param paths 监听重启路径,默认为 ['package.json', 'pnpm-lock.yaml'] + */ +export function Restart(paths = defaultPaths): Plugin { + paths = paths.map((path) => slash(resolve(path))) + const restart = debounce(async function touch() { + const time = new Date() + await utimes(r('vite.config.ts'), time, time) + }, 1000) + return { + name: 'vite-plugin-force-restart', + apply: 'serve', + async watchChange(id) { + if (paths.includes(id)) { + await restart() + } + }, + } +} diff --git a/ui/presets/plugins/warmup.ts b/ui/presets/plugins/warmup.ts new file mode 100644 index 0000000..22c0e5d --- /dev/null +++ b/ui/presets/plugins/warmup.ts @@ -0,0 +1,21 @@ +import type { Plugin } from 'vite' + +/** + * 预热 + * @description 内置的预热,可以加快冷启动 + */ +export function Warmup(): Plugin { + return { + name: 'vite-plugin-warmup', + apply: 'serve', + config(config) { + const src = './src/**/*' + config.server ??= {} + config.server.warmup ??= {} + config.server.warmup.clientFiles ??= [] + if (!config.server.warmup.clientFiles.includes(src)) { + config.server.warmup.clientFiles.push(src) + } + }, + } +} diff --git a/ui/presets/shared/detect.ts b/ui/presets/shared/detect.ts new file mode 100644 index 0000000..9af4cde --- /dev/null +++ b/ui/presets/shared/detect.ts @@ -0,0 +1,76 @@ +/** + * 侦察模块 + * @description 自动检测环境并智能生成 + */ + +import { r } from './path' +import { loadEnv } from 'vite' +import browserslist from 'browserslist' +import { detectMode } from 'vite-layers' +import { isPackageExists } from 'local-pkg' +import type { ComponentResolver } from 'unplugin-vue-components' + +const { loadConfig: browserslistLoadConfig } = browserslist + +/** + * 默认打包目标 (浏览器兼容程度) + */ +export const defaultBuildTargets = browserslistLoadConfig({ + path: r('./'), +}) || ['last 2 versions and not dead, > 0.3%, Firefox ESR'] + +type Arrayable = T | Array + +interface Options { + onlyExist?: [Arrayable, string][] + include?: ComponentResolver[] +} + +/** + * 发现 resolvers + */ +export function detectResolvers(options: Options = {}) { + const { onlyExist = [], include = [] } = options + + const existedResolvers = [] + for (let i = 0; i < onlyExist.length; i++) { + const [resolver, packageName] = onlyExist[i] + if ( + isPackageExists(packageName, { + paths: [r('./')], + }) + ) { + existedResolvers.push(resolver) + } + } + existedResolvers.push(...include) + + return existedResolvers +} + +// 获取环境变量 +export function useEnv() { + function stringToBoolean(v: string) { + return Boolean(v === 'true' || false) + } + + const { + VITE_APP_TITLE, + VITE_APP_DEV_TOOLS, + VITE_APP_MARKDOWN, + VITE_APP_API_AUTO_IMPORT, + VITE_APP_MOCK_IN_PRODUCTION, + VITE_APP_DIR_API_AUTO_IMPORT, + VITE_APP_COMPRESSINON_ALGORITHM, + } = loadEnv(detectMode(), '.') + + return { + VITE_APP_TITLE, + VITE_APP_COMPRESSINON_ALGORITHM, + VITE_APP_DEV_TOOLS: stringToBoolean(VITE_APP_DEV_TOOLS), + VITE_APP_MARKDOWN: stringToBoolean(VITE_APP_MARKDOWN), + VITE_APP_API_AUTO_IMPORT: stringToBoolean(VITE_APP_API_AUTO_IMPORT), + VITE_APP_MOCK_IN_PRODUCTION: stringToBoolean(VITE_APP_MOCK_IN_PRODUCTION), + VITE_APP_DIR_API_AUTO_IMPORT: stringToBoolean(VITE_APP_DIR_API_AUTO_IMPORT), + } +} diff --git a/ui/presets/shared/mock.ts b/ui/presets/shared/mock.ts new file mode 100644 index 0000000..b2bcfb0 --- /dev/null +++ b/ui/presets/shared/mock.ts @@ -0,0 +1,89 @@ +// @ts-nocheck +/** + * issue: https://github.com/vbenjs/vite-plugin-mock/issues/47 + * fix: https://github.com/vbenjs/vite-plugin-mock/issues/47#issuecomment-982724613 + */ +import Mock from 'mockjs' + +export function createFetchSever(mockList: any[]) { + if (!window['originFetch']) { + window['originFetch'] = window.fetch + window.fetch = function (fetchUrl: string, init: any) { + const currentMock = mockList.find((mi) => fetchUrl.includes(mi.url)) + if (currentMock) { + const result = createFetchReturn(currentMock, init) + return result + } else { + return window['originFetch'](fetchUrl, init) + } + } + } +} + +function __param2Obj__(url: string) { + const search = url.split('?')[1] + if (!search) { + return {} + } + return JSON.parse( + '{"' + + decodeURIComponent(search) + .replace(/"/g, '\\"') + .replace(/&/g, '","') + .replace(/=/g, '":"') + .replace(/\+/g, ' ') + + '"}', + ) +} + +function __Fetch2ExpressReqWrapper__(handle: () => any) { + return function (options: any) { + let result = null + if (typeof handle === 'function') { + const { body, method, url, headers } = options + + let b = body + b = JSON.parse(body) + result = handle({ + method, + body: b, + query: __param2Obj__(url), + headers, + }) + } else { + result = handle + } + + return Mock.mock(result) + } +} + +const sleep = (delay = 0) => { + if (delay) { + return new Promise((resolve) => { + setTimeout(resolve, delay) + }) + } + return null +} + +async function createFetchReturn(mock: any, init) { + const { timeout, response } = mock + const mockFn = __Fetch2ExpressReqWrapper__(response) + const data = mockFn(init) + await sleep(timeout) + const result = { + ok: true, + status: 200, + clone() { + return result + }, + text() { + return Promise.resolve(data) + }, + json() { + return Promise.resolve(data) + }, + } + return result +} diff --git a/ui/presets/shared/path.ts b/ui/presets/shared/path.ts new file mode 100644 index 0000000..2e687ce --- /dev/null +++ b/ui/presets/shared/path.ts @@ -0,0 +1,15 @@ +import { dirname, resolve } from 'path' +import { fileURLToPath } from 'url' + +const _dirname = dirname(fileURLToPath(import.meta.url)) + +const root = resolve(_dirname, '../../') + +/** + * 路径重写 + * @param path 相对路径 + * @returns 基于根目录的相对路径 + */ +export function r(path: string) { + return resolve(root, path).replaceAll('\\', '/') +} diff --git a/ui/presets/types/vite.d.ts b/ui/presets/types/vite.d.ts new file mode 100644 index 0000000..eb5c2bb --- /dev/null +++ b/ui/presets/types/vite.d.ts @@ -0,0 +1,17 @@ +/// +/// +/// +/// +/// + +declare module "*.vue" { + import type { DefineComponent } from "vue"; + const component: DefineComponent<{}, {}, any>; + export default component; +} + +declare module "*.md" { + import { ComponentOptions } from "vue"; + const Component: ComponentOptions; + export default Component; +} diff --git a/ui/public/a1.png b/ui/public/a1.png new file mode 100644 index 0000000..3cd353c Binary files /dev/null and b/ui/public/a1.png differ diff --git a/ui/public/ec13203e-20ee-4bb3-ba23-f0b6f93d3760.jpg b/ui/public/ec13203e-20ee-4bb3-ba23-f0b6f93d3760.jpg new file mode 100644 index 0000000..e96b89a Binary files /dev/null and b/ui/public/ec13203e-20ee-4bb3-ba23-f0b6f93d3760.jpg differ diff --git a/ui/public/icoimg.png b/ui/public/icoimg.png new file mode 100644 index 0000000..9653c36 Binary files /dev/null and b/ui/public/icoimg.png differ diff --git a/ui/public/login/e36341619bf8f04dcbdc6b01105a85a.png b/ui/public/login/e36341619bf8f04dcbdc6b01105a85a.png new file mode 100644 index 0000000..4d66105 Binary files /dev/null and b/ui/public/login/e36341619bf8f04dcbdc6b01105a85a.png differ diff --git a/ui/public/loginimg.jpg b/ui/public/loginimg.jpg new file mode 100644 index 0000000..3da63a7 Binary files /dev/null and b/ui/public/loginimg.jpg differ diff --git a/ui/public/logo.png b/ui/public/logo.png new file mode 100644 index 0000000..9653c36 Binary files /dev/null and b/ui/public/logo.png differ diff --git a/ui/public/notFound/33.svg b/ui/public/notFound/33.svg new file mode 100644 index 0000000..a9ed703 --- /dev/null +++ b/ui/public/notFound/33.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ui/renovate.json b/ui/renovate.json new file mode 100644 index 0000000..57fe916 --- /dev/null +++ b/ui/renovate.json @@ -0,0 +1,3 @@ +{ + "extends": ["github>unjs/renovate-config"] +} diff --git a/ui/scripts/create.cjs b/ui/scripts/create.cjs new file mode 100644 index 0000000..fa45555 --- /dev/null +++ b/ui/scripts/create.cjs @@ -0,0 +1,76 @@ +const { existsSync } = require('fs') + +const { showDir, showExt, moduleTypes } = require('./shared/base.cjs') + +/** + * 自动创建 + * @param {import('plop').NodePlopAPI} plop + */ +function create(plop) { + let exist = null + let modulePath = null + + plop.setGenerator('controller', { + description: '自动创建', + prompts: [ + { + name: 'type', + type: 'list', + default: 'component', + message: '您希望生成哪种类型的模块?', + choices: moduleTypes, + }, + { + name: 'isMarkdown', + type: 'confirm', + message: '是否 markdown 类型?', + default: false, + // 如果是 page 类型需要询问是否为 markdown 类型 + when({ type }) { + return type === 'page' + }, + }, + { + name: 'name', + type: 'input', + message({ type }) { + return `请输入 ${type} 的命名` + }, + }, + { + name: 'shouldReset', + type: 'confirm', + default: false, + message({ type }) { + return `目标 ${type} 已存在,是否重置?` + }, + // 确认模块是否已存在,是则询问是否重置 + when({ type, name, isMarkdown }) { + const dir = showDir(type) + const ext = showExt(type, isMarkdown) + modulePath = `src/${dir}/${name}.${ext}` + exist = existsSync(modulePath) + if (exist) { + return true + } + }, + }, + ], + actions(answer) { + const { type, shouldReset } = answer + if (exist && !shouldReset) { + throw new Error(`${type} 创建失败`) + } + return [ + { + type: 'add', + force: true, + path: `../${modulePath}`, + templateFile: `./template/${type}.hbs`, + }, + ] + }, + }) +} + +module.exports = create diff --git a/ui/scripts/deps-fresh.cjs b/ui/scripts/deps-fresh.cjs new file mode 100644 index 0000000..f9bae6a --- /dev/null +++ b/ui/scripts/deps-fresh.cjs @@ -0,0 +1,36 @@ +const { execSync } = require('child_process') + +/** + * 自动更新依赖 + * @param {import('plop').NodePlopAPI} plop + */ +function depsFresh(plop) { + plop.setGenerator('controller', { + description: '自动更新依赖', + prompts: [ + { + name: 'type', + type: 'list', + default: 'patch', + message: '你希望发布一个什么版本?', + choices: ['patch', 'minor', 'major'], + }, + { + name: 'shouldWrite', + type: 'confirm', + default: false, + message: '是否直接更新?', + }, + ], + actions(answer) { + const { type, shouldWrite } = answer + + execSync(`npx taze ${type} ${shouldWrite ? '-w' : ''}`, { + stdio: 'inherit', + }) + return [] + }, + }) +} + +module.exports = depsFresh diff --git a/ui/scripts/release.cjs b/ui/scripts/release.cjs new file mode 100644 index 0000000..d6009d1 --- /dev/null +++ b/ui/scripts/release.cjs @@ -0,0 +1,65 @@ +const { createConsola } = require('consola') +const { execSync } = require('child_process') +const { repository } = require('../package.json') +const { gray } = require('kolorist') +const { simpleGit } = require('simple-git') +const logger = createConsola().withTag('release') + +/** + * 自动发版 + * @param {import('plop').NodePlopAPI} plop + */ +async function release(plop) { + const git = simpleGit() + + const remotes = await git.getRemotes(true) + + const urls = remotes.map((r) => { + return r.refs.push + .replace('git@github.com:', 'https://github.com/') + .replace('.git', '') + }) + let allowRelease = false + if (!urls.includes(repository.url)) { + allowRelease = await logger.prompt(`是否发布到 ${gray(repository.url)}`, { + type: 'confirm', + }) + } else { + allowRelease = true + } + + if (allowRelease) { + plop.setGenerator('controller', { + description: '自动发版', + prompts: [ + { + name: 'type', + type: 'list', + default: 'patch', + message: '你希望发布一个什么版本?', + choices: [ + 'patch', + 'minor', + 'major', + 'prepatch', + 'premajor', + 'preminor', + 'prerelease', + ], + }, + ], + actions(answer) { + const { type } = answer + execSync( + `npx changelogen --${type} --release && git push --follow-tags`, + { + stdio: 'inherit', + }, + ) + return [] + }, + }) + } +} + +module.exports = release diff --git a/ui/scripts/remove.cjs b/ui/scripts/remove.cjs new file mode 100644 index 0000000..d42ffb5 --- /dev/null +++ b/ui/scripts/remove.cjs @@ -0,0 +1,75 @@ +const { unlinkSync } = require('fs') +const { readdir } = require('fs/promises') +const { basename } = require('path') +const { showDir, moduleTypes } = require('./shared/base.cjs') + +/** + * 自动删除 + * @param {import('plop').NodePlopAPI} plop + */ +function remove(plop) { + plop.setActionType('remove', (answers) => { + const { name, type, shouldRemove } = answers + const dir = showDir(type) + const target = `./src/${dir}/${name}` + if (shouldRemove) { + return unlinkSync(target) + } + throw new Error(`删除 ${target} 失败`) + }) + + plop.setGenerator('controller', { + description: '自动删除', + prompts: [ + { + name: 'type', + type: 'list', + message: '请选择您要删除的类型', + async choices() { + const entrys = await readdir('./src', { + recursive: false, + withFileTypes: true, + }) + const dirs = entrys.filter((e) => e.isDirectory()) + const types = moduleTypes.filter((type) => { + const dir = showDir(type) + return dirs.includes(`./src/${dir}`) + }) + return types + }, + }, + { + name: 'name', + type: 'list', + message({ type }) { + return `请选择您要删除的 ${type} 模块` + }, + async choices({ type }) { + const dir = showDir(type) + const entrys = await readdir(`src/${dir}`, { + recursive: false, + withFileTypes: true, + }) + let modules = entrys.filter((e) => e.isFile()) + modules = modules.map((module) => { + return basename(module) + }) + return modules + }, + }, + { + name: 'shouldRemove', + type: 'confirm', + default: false, + message: '再次确认是否删除', + }, + ], + actions: [ + { + type: 'remove', + }, + ], + }) +} + +module.exports = remove diff --git a/ui/scripts/safe-init.cjs b/ui/scripts/safe-init.cjs new file mode 100644 index 0000000..e43486a --- /dev/null +++ b/ui/scripts/safe-init.cjs @@ -0,0 +1,113 @@ +const { resolve } = require('path') +const { gray, green } = require('kolorist') +const { createConsola } = require('consola') +const { existsSync, lstatSync } = require('fs') +const { removeSync, emptyDirSync } = require('fs-extra') + +function slash(path) { + return path.replace(/\\/g, '/') +} + +function r(dir) { + return slash(resolve(__dirname, '../', dir)) +} + +const entrys = [ + 'src/components', + 'src/api', + 'mock', + 'layouts/default.vue', + 'src/pages/index.vue', + 'src/pages/about.md', + 'src/pages/echarts.vue', + 'src/stores', + 'locales/简体中文', + 'locales/English', +] + +const resolvedEntrys = entrys.map((entry) => r(entry)) + +/** + * 安全初始化 + * @param {import('plop').NodePlopAPI} plop + */ +function safeInit(plop) { + const logger = createConsola().withTag('safe:init') + + logger.warn('实验性功能') + + plop.setGenerator('controller', { + description: '安全初始化', + prompts: [ + { + name: 'yes', + type: 'confirm', + message: '是否安全的初始化?', + default: false, + }, + { + name: 'cleanStyles', + type: 'confirm', + message: '是否清理 styles?', + default: false, + }, + ], + actions(answer) { + if (!answer.yes) { + return [] + } + + if (answer.cleanStyles) { + resolvedEntrys.push(r('src/styles')) + } + + console.log() + + // 这里不用异步是因为 plop action 只支持同步 + resolvedEntrys.forEach((e) => { + if (!existsSync(e)) { + return + } + const entry = lstatSync(e) + if (entry.isFile()) { + removeSync(e) + logClean(e) + return + } + + if (entry.isDirectory()) { + emptyDirSync(e) + logClean(e) + } + }) + + return [ + { + type: 'add', + force: true, + path: '../src/pages/index.vue', + templateFile: './template/page.hbs', + data: { + name: 'index', + isMarkdown: false, + }, + }, + { + type: 'add', + force: true, + path: '../src/layouts/default.vue', + templateFile: './template/layout.hbs', + data: { + name: 'default', + }, + }, + ] + }, + }) +} + +function logClean(path) { + console.log(`${green('√ clean')} ${gray(path)}`) +} + +module.exports = safeInit diff --git a/ui/scripts/shared/base.cjs b/ui/scripts/shared/base.cjs new file mode 100644 index 0000000..644cc43 --- /dev/null +++ b/ui/scripts/shared/base.cjs @@ -0,0 +1,41 @@ +/** + * 获取扩展名 + * @param {string} type 模块类型 + * @param {boolean} isMarkdown 是否是 markdown,默认为 false + * @returns {string} 扩展名 + */ +const showExt = (type, isMarkdown = false) => { + const isTs = type === 'api' || type === 'store' || type === 'module' + const ext = isMarkdown ? 'md' : isTs ? 'ts' : 'vue' + return ext +} + +/** + * 模块类型 + */ +const moduleTypes = [ + 'api', + 'page', + 'store', + 'layout', + 'module', + 'component', + 'composable', +] + +/** + * 获取目录 + * @param {string} type 类型 + */ +const showDir = (type) => { + if (type === 'api') { + return 'api' + } + return `${type}s` +} + +module.exports = { + showExt, + showDir, + moduleTypes, +} diff --git a/ui/scripts/template/api.hbs b/ui/scripts/template/api.hbs new file mode 100644 index 0000000..725fdcb --- /dev/null +++ b/ui/scripts/template/api.hbs @@ -0,0 +1,2 @@ +import axios from "axios" + diff --git a/ui/scripts/template/component.hbs b/ui/scripts/template/component.hbs new file mode 100644 index 0000000..3ca24eb --- /dev/null +++ b/ui/scripts/template/component.hbs @@ -0,0 +1,11 @@ + + + + + diff --git a/ui/scripts/template/composable.hbs b/ui/scripts/template/composable.hbs new file mode 100644 index 0000000..d55de55 --- /dev/null +++ b/ui/scripts/template/composable.hbs @@ -0,0 +1,5 @@ +import { ref } from "vue" + +export default {{name}} = () => { + +} diff --git a/ui/scripts/template/layout.hbs b/ui/scripts/template/layout.hbs new file mode 100644 index 0000000..fbc03c4 --- /dev/null +++ b/ui/scripts/template/layout.hbs @@ -0,0 +1,4 @@ + diff --git a/ui/scripts/template/module.hbs b/ui/scripts/template/module.hbs new file mode 100644 index 0000000..fd294b5 --- /dev/null +++ b/ui/scripts/template/module.hbs @@ -0,0 +1,6 @@ +import type { App } from "vue" + + +export default (app: App) => { + +} diff --git a/ui/scripts/template/page.hbs b/ui/scripts/template/page.hbs new file mode 100644 index 0000000..6b160cb --- /dev/null +++ b/ui/scripts/template/page.hbs @@ -0,0 +1,17 @@ +{{#if isMarkdown}} +## {{pascalCase name}} Page + +> The page is markdown file +{{else}} + + + + + +{{/if}} diff --git a/ui/scripts/template/store.hbs b/ui/scripts/template/store.hbs new file mode 100644 index 0000000..099829f --- /dev/null +++ b/ui/scripts/template/store.hbs @@ -0,0 +1,9 @@ +import { defineStore } from 'pinia' + +export default defineStore('{{name}}', { + state() { + return {} + }, + getters: {}, + actions: {} +}) diff --git a/ui/src/App.vue b/ui/src/App.vue new file mode 100644 index 0000000..d8656bc --- /dev/null +++ b/ui/src/App.vue @@ -0,0 +1,9 @@ + + + diff --git a/ui/src/api/itemApi.ts b/ui/src/api/itemApi.ts new file mode 100644 index 0000000..a3ac937 --- /dev/null +++ b/ui/src/api/itemApi.ts @@ -0,0 +1,35 @@ +import { frontRequest } from '~/composables/frontRequest' + + +export function itemPageApi(data: any) { + return frontRequest.get("/api/item/page",{params:data}) +} + +/** + * 查看详情 + * @param id + */ +export function itemInfoApi(id: number) { + return frontRequest.get(`/api/item/${id}`) +} +/** + * 购买 + */ +export function buyItemApi(data: any) { + return frontRequest.post(`/api/order`,data) +} + +/** + * 用户修改订单 + */ +export function updateOrderItemApi(data: any) { + return frontRequest.put(`/api/order`,data) +} + + +/** + * 购买列表 + */ +export function buyPageApi(data: any) { + return frontRequest.get(`/api/order/page`,{params:data}) +} diff --git a/ui/src/api/slidesApi.ts b/ui/src/api/slidesApi.ts new file mode 100644 index 0000000..f3090e6 --- /dev/null +++ b/ui/src/api/slidesApi.ts @@ -0,0 +1,7 @@ + +/** + * 轮播图 + */ +export function slidesPageApi(data: any) { + return frontRequest.get(`/api/slides/page`,{params:data}) +} diff --git a/ui/src/api/user/adminUserApi.ts b/ui/src/api/user/adminUserApi.ts new file mode 100644 index 0000000..3c0060d --- /dev/null +++ b/ui/src/api/user/adminUserApi.ts @@ -0,0 +1,50 @@ +import { adminRequest } from '~/composables/adminRequest' + +/** + * 验证码 + * @param data + */ +export function captchaAdmin(uid: Number) { + return adminRequest.get("/captcha",{ + params:{uuid:uid} + }) +} + + +/** + * 登录 + * @param data + */ +export function loginAdmin(data: any) { + return adminRequest.post("/login", data) +} +/** + * 注册 + * @param data + */ +export function registerAdmin(data: any) { + return adminRequest.post("/register", data) +} + +/** + * 退出 + */ +export function logoutAdmin() { + return adminRequest.post("/logout") +} + + +/** + * 获取用户信息 + * @param userId + */ +export function userInfoAdmin() { + return adminRequest.get("/sys/user/info") +} +/** + * 修改密码 + * @param userId + */ +export function updatePasswordAdmin(data:any) { + return adminRequest.put("/sys/user/password",data) +} diff --git a/ui/src/api/user/adminUserUtils.ts b/ui/src/api/user/adminUserUtils.ts new file mode 100644 index 0000000..148dc3c --- /dev/null +++ b/ui/src/api/user/adminUserUtils.ts @@ -0,0 +1,14 @@ +import { getUuid } from '~/utils/utils' + + +/** + * 获取验证码图 + */ +export function getCaptchaUrl(){ + const uuid = getUuid() + captchaAdmin(uuid) + return { + uid: uuid, + captchaUrl:import.meta.env.VITE_ADMIN_API_BASE_URL + `/captcha?uuid=${uuid}` + } +} diff --git a/ui/src/api/user/frontUserApi.ts b/ui/src/api/user/frontUserApi.ts new file mode 100644 index 0000000..f2fe488 --- /dev/null +++ b/ui/src/api/user/frontUserApi.ts @@ -0,0 +1,32 @@ + +/** + * 注册 + * @param data + */ +export function registerFront(data: any) { + return frontRequest.post("/api/user/register", data) +} + +/** + * 获取用户信息 + * @param userId + */ +export function userInfoFront() { + return frontRequest.get("/api/user/userInfo") +} + +/** + * 修改用户信息 + * @param data + */ +export function userUpdateFront(data:any) { + return frontRequest.put("/api/user/update", data) +} + + +/** + * 退出 + */ +export function logoutFront() { + return frontRequest.post("/api/user/logout") +} diff --git a/ui/src/components/Heads.vue b/ui/src/components/Heads.vue new file mode 100644 index 0000000..3742f7d --- /dev/null +++ b/ui/src/components/Heads.vue @@ -0,0 +1,149 @@ + + + diff --git a/ui/src/components/ImageUpload.vue b/ui/src/components/ImageUpload.vue new file mode 100644 index 0000000..5dff863 --- /dev/null +++ b/ui/src/components/ImageUpload.vue @@ -0,0 +1,88 @@ + + + + diff --git a/ui/src/components/nav/Navigation.vue b/ui/src/components/nav/Navigation.vue new file mode 100644 index 0000000..aa17d5a --- /dev/null +++ b/ui/src/components/nav/Navigation.vue @@ -0,0 +1,96 @@ + + + + + diff --git a/ui/src/composables/adminRequest.ts b/ui/src/composables/adminRequest.ts new file mode 100644 index 0000000..9dbd182 --- /dev/null +++ b/ui/src/composables/adminRequest.ts @@ -0,0 +1,53 @@ +import axios from 'axios' + +export const adminRequest = axios.create({ + baseURL: import.meta.env.VITE_ADMIN_API_BASE_URL, +}) +// 添加请求拦截器 +adminRequest.interceptors.request.use( + function (config) { + // 在发送请求之前做些什么 + const token = userStore().adminToken + if (token !== null || token !== undefined) { + //添加header + config.headers.token = token + } + // 在发送请求之前做些什么 + return config + }, + function (error) { + toast.warning(error.message ?? '未知请求错误') + // 对请求错误做些什么 + return Promise.reject(error) + }, +) +// 添加响应拦截器 +adminRequest.interceptors.response.use( + function (response) { + if (response.data.code){ + const code = response.data.code + switch (code) { + case 500: + toast.error(response.data.msg) + return Promise.reject(response.data.msg) + case 401: + toast.error(response.data.msg) + window.open(`/login`, '_self') + return Promise.reject(response.data.msg) + default: + return response.data + } + } + return response.data + }, + function (error) { + let { msg, message } = error.response?.data ?? {} + if (!msg && message) { + msg = message + } + toast.warning(msg) + // 超出 2xx 范围的状态码都会触发该函数。 + // 对响应错误做点什么 + return Promise.reject(error) + }, +) diff --git a/ui/src/composables/env.ts b/ui/src/composables/env.ts new file mode 100644 index 0000000..68a98a1 --- /dev/null +++ b/ui/src/composables/env.ts @@ -0,0 +1,26 @@ +/** + * 是否在开发环境 + * @description 在 `if (IN_DEV)` 块中的代码在 `vite build` 时会自动编译掉,不会带到生产环境 + * @example + * ```ts + * if (IN_DEV) { + * console.log("开发环境") + * } + * ``` + */ +export const IN_DEV = import.meta.env.DEV +/** + * 是否在生产环境 + * @example + * if (IN_PROD) { + * console.log("生产环境") + * } + */ +export const IN_PROD = import.meta.env.PROD + +/** + * 不带尾部 / 的 BASE_URL + */ +export const BASE_URL_WITHOUT_TAIL = import.meta.env.BASE_URL.endsWith('/') + ? import.meta.env.BASE_URL.slice(0, -1) + : import.meta.env.BASE_URL diff --git a/ui/src/composables/frontRequest.ts b/ui/src/composables/frontRequest.ts new file mode 100644 index 0000000..062d0fe --- /dev/null +++ b/ui/src/composables/frontRequest.ts @@ -0,0 +1,78 @@ +import axios from 'axios' + +export const frontRequest = axios.create({ + baseURL: import.meta.env.VITE_API_FRONT_BASE_URL, +}) +// 添加请求拦截器 +frontRequest.interceptors.request.use( + function (config) { + const token = userStore().frontToken + + console.log("111"+token) + + if (token !== null || token !== undefined) { + //添加header + config.headers.Authorization = token + } + // 在发送请求之前做些什么 + return config + }, + function (error) { + toast.warning(error.message ?? '未知请求错误') + // 对请求错误做些什么 + return Promise.reject(error) + }, +) +// 添加响应拦截器 +frontRequest.interceptors.response.use( + function (response) { + if (response.data.code){ + const code = response.data.code + switch (code) { + case 500: + ElMessage.error(response.data.msg) + return Promise.reject(response.data.msg) + case 401: + window.open(`/login`, '_self') + ElMessage.error("请重新登录~") + break + default: + return response + } + } + if (response.data) { + return response.data + } + return response + }, + function (error) { + const status = error.response?.status + let { msg, message } = error.response?.data ?? {} + + if (!msg && message) { + msg = message + } + + if (!msg) { + switch (status) { + case 400: + msg = '参数错误' + break + case 500: + msg = '服务端错误' + break + case 401: + window.location.href = "/dsds" + break + default: + msg = error.message ?? '未知响应错误' + break + } + } + + toast.warning(msg) + // 超出 2xx 范围的状态码都会触发该函数。 + // 对响应错误做点什么 + return Promise.reject(error) + }, +) diff --git a/ui/src/composables/path.ts b/ui/src/composables/path.ts new file mode 100644 index 0000000..f37ee08 --- /dev/null +++ b/ui/src/composables/path.ts @@ -0,0 +1,7 @@ +/** + * base 安全的路径解析 + * @param path 路径 + */ +export function safeResolve(path: string) { + return BASE_URL_WITHOUT_TAIL + path +} diff --git a/ui/src/composables/toast.ts b/ui/src/composables/toast.ts new file mode 100644 index 0000000..2b0bb48 --- /dev/null +++ b/ui/src/composables/toast.ts @@ -0,0 +1,3 @@ +import 'vue-toastification/dist/index.css' +import { createToastInterface } from 'vue-toastification' +export default createToastInterface() diff --git a/ui/src/composables/useLanguage.ts b/ui/src/composables/useLanguage.ts new file mode 100644 index 0000000..24ef719 --- /dev/null +++ b/ui/src/composables/useLanguage.ts @@ -0,0 +1,12 @@ +export default () => { + const { t, locale } = useI18n() + const toggleLocale = () => { + locale.value = locale.value === 'zh-CN' ? 'en' : 'zh-CN' + } + + const language = computed(() => + locale.value === 'zh-CN' ? '中文' : 'English', + ) + + return { t, language, toggleLocale } +} diff --git a/ui/src/composables/useTyped.ts b/ui/src/composables/useTyped.ts new file mode 100644 index 0000000..4f89fb8 --- /dev/null +++ b/ui/src/composables/useTyped.ts @@ -0,0 +1,14 @@ +import { init } from 'ityped' + +export default (strings: string[]) => { + const typedRef = ref() + + onMounted(() => { + init(typedRef.value!, { + strings, + showCursor: false, + disableBackTyping: true, + }) + }) + return typedRef +} diff --git a/ui/src/composables/useVisits.ts b/ui/src/composables/useVisits.ts new file mode 100644 index 0000000..829cbbe --- /dev/null +++ b/ui/src/composables/useVisits.ts @@ -0,0 +1,25 @@ +import { useRequest } from 'vue-request' + +export function useVisits() { + // 开发环境下 + if (import.meta.env.DEV) { + const visits = useStorage('visits-kv', 0) + if (typeof visits.value === 'number') { + visits.value++ + } + return visits + } + + const { data: visits } = useRequest(async function () { + try { + const n = await http.get('https://visits-kv.deno.dev/tov-template', { + baseURL: '', + }) + return Number(n) ?? 0 + } catch (error) { + console.error(error) + return 0 + } + }) + return visits ?? 0 +} diff --git a/ui/src/layouts/admin.vue b/ui/src/layouts/admin.vue new file mode 100644 index 0000000..2b9ba0e --- /dev/null +++ b/ui/src/layouts/admin.vue @@ -0,0 +1,164 @@ + + + + diff --git a/ui/src/layouts/default.vue b/ui/src/layouts/default.vue new file mode 100644 index 0000000..63dcaaf --- /dev/null +++ b/ui/src/layouts/default.vue @@ -0,0 +1,50 @@ + + + + diff --git a/ui/src/layouts/front.vue b/ui/src/layouts/front.vue new file mode 100644 index 0000000..7822ae4 --- /dev/null +++ b/ui/src/layouts/front.vue @@ -0,0 +1,34 @@ + + + + + + + diff --git a/ui/src/layouts/frontUserInfo.vue b/ui/src/layouts/frontUserInfo.vue new file mode 100644 index 0000000..70eb466 --- /dev/null +++ b/ui/src/layouts/frontUserInfo.vue @@ -0,0 +1,60 @@ + + + + + + + +{ +"meta": { +"layout": "front" +} +} + diff --git a/ui/src/layouts/notFound.vue b/ui/src/layouts/notFound.vue new file mode 100644 index 0000000..4437b0a --- /dev/null +++ b/ui/src/layouts/notFound.vue @@ -0,0 +1,3 @@ + diff --git a/ui/src/main.ts b/ui/src/main.ts new file mode 100644 index 0000000..43371d5 --- /dev/null +++ b/ui/src/main.ts @@ -0,0 +1,19 @@ +// https://unocss.dev/ 原子 css 库 +import '@unocss/reset/tailwind-compat.css' // unocss reset +import 'virtual:uno.css' +import 'virtual:unocss-devtools' +// 你自定义的 css +import './styles/main.css' +import ElementPlus from 'element-plus' +import 'element-plus/dist/index.css' +import * as ElementPlusIconsVue from '@element-plus/icons-vue' +import zhCn from 'element-plus/dist/locale/zh-cn' + +import App from './App.vue' +const app = createApp(App) +for (const [key, component] of Object.entries(ElementPlusIconsVue)) { + app.component(key, component) +} +app.use(ElementPlus, { locale: zhCn }) + +app.mount('#app') diff --git a/ui/src/pages/[...notFound].vue b/ui/src/pages/[...notFound].vue new file mode 100644 index 0000000..c029377 --- /dev/null +++ b/ui/src/pages/[...notFound].vue @@ -0,0 +1,58 @@ + + + + + + + +{ + "meta": { + "title": "404", + "layout": "notFound" + } +} + diff --git a/ui/src/pages/admin/adminuser.vue b/ui/src/pages/admin/adminuser.vue new file mode 100644 index 0000000..26586cf --- /dev/null +++ b/ui/src/pages/admin/adminuser.vue @@ -0,0 +1,292 @@ + + + diff --git a/ui/src/pages/admin/block.vue b/ui/src/pages/admin/block.vue new file mode 100644 index 0000000..beb9f29 --- /dev/null +++ b/ui/src/pages/admin/block.vue @@ -0,0 +1,192 @@ + + + + + diff --git a/ui/src/pages/admin/certificates.vue b/ui/src/pages/admin/certificates.vue new file mode 100644 index 0000000..63314aa --- /dev/null +++ b/ui/src/pages/admin/certificates.vue @@ -0,0 +1,405 @@ + + + + + diff --git a/ui/src/pages/admin/index.vue b/ui/src/pages/admin/index.vue new file mode 100644 index 0000000..1943906 --- /dev/null +++ b/ui/src/pages/admin/index.vue @@ -0,0 +1,75 @@ + + + + + diff --git a/ui/src/pages/admin/log.vue b/ui/src/pages/admin/log.vue new file mode 100644 index 0000000..5c0b864 --- /dev/null +++ b/ui/src/pages/admin/log.vue @@ -0,0 +1,158 @@ + + + + + diff --git a/ui/src/pages/audit/index.vue b/ui/src/pages/audit/index.vue new file mode 100644 index 0000000..27cd494 --- /dev/null +++ b/ui/src/pages/audit/index.vue @@ -0,0 +1,421 @@ + + + + + + + +{ +"meta": { +"layout": "front" +} +} + diff --git a/ui/src/pages/front/index.vue b/ui/src/pages/front/index.vue new file mode 100644 index 0000000..6c881c9 --- /dev/null +++ b/ui/src/pages/front/index.vue @@ -0,0 +1,33 @@ + + + + + +{ +"meta": { +"layout": "front" +} +} + diff --git a/ui/src/pages/front/info/[id].vue b/ui/src/pages/front/info/[id].vue new file mode 100644 index 0000000..d880dcb --- /dev/null +++ b/ui/src/pages/front/info/[id].vue @@ -0,0 +1,41 @@ + + + + + +{ +"meta": { +"layout": "front" +} +} + diff --git a/ui/src/pages/front/list/index.vue b/ui/src/pages/front/list/index.vue new file mode 100644 index 0000000..c6509d0 --- /dev/null +++ b/ui/src/pages/front/list/index.vue @@ -0,0 +1,33 @@ + + + + + + +{ +"meta": { +"layout": "front" +} +} + diff --git a/ui/src/pages/index.vue b/ui/src/pages/index.vue new file mode 100644 index 0000000..46ec91c --- /dev/null +++ b/ui/src/pages/index.vue @@ -0,0 +1,341 @@ + + + + + + + +{ +"meta": { +"layout": "front" +} +} + diff --git a/ui/src/pages/load/index.vue b/ui/src/pages/load/index.vue new file mode 100644 index 0000000..6a6feaa --- /dev/null +++ b/ui/src/pages/load/index.vue @@ -0,0 +1,432 @@ + + + + + + + + + +{ +"meta": { +"layout": "front" +} +} + diff --git a/ui/src/pages/log/index.vue b/ui/src/pages/log/index.vue new file mode 100644 index 0000000..14ee3c4 --- /dev/null +++ b/ui/src/pages/log/index.vue @@ -0,0 +1,451 @@ + + + + + + + +{ +"meta": { +"layout": "front" +} +} + diff --git a/ui/src/pages/login.vue b/ui/src/pages/login.vue new file mode 100644 index 0000000..1e7734b --- /dev/null +++ b/ui/src/pages/login.vue @@ -0,0 +1,189 @@ + + + + +{ +"meta": { +"layout": "notFound" +} +} + diff --git a/ui/src/pages/look/index.vue b/ui/src/pages/look/index.vue new file mode 100644 index 0000000..ff33ca3 --- /dev/null +++ b/ui/src/pages/look/index.vue @@ -0,0 +1,446 @@ + + + + + + + +{ +"meta": { +"layout": "front" +} +} + diff --git a/ui/src/pages/register.vue b/ui/src/pages/register.vue new file mode 100644 index 0000000..132d524 --- /dev/null +++ b/ui/src/pages/register.vue @@ -0,0 +1,166 @@ + + + + +{ +"meta": { +"layout": "notFound" +} +} + diff --git a/ui/src/pages/user/index.vue b/ui/src/pages/user/index.vue new file mode 100644 index 0000000..a7e633b --- /dev/null +++ b/ui/src/pages/user/index.vue @@ -0,0 +1,93 @@ + + + + + + +{ +"meta": { +"layout": "frontUserInfo" +} +} + diff --git a/ui/src/plugins/mock.ts b/ui/src/plugins/mock.ts new file mode 100644 index 0000000..bfef337 --- /dev/null +++ b/ui/src/plugins/mock.ts @@ -0,0 +1,21 @@ +/** + * 该模块主要给生产时的 mock 用,一般情况下你并不需要关注 + */ +import { createFetchSever } from '../../presets/shared/mock' + +const shouldCreateServer = + !import.meta.env.DEV && import.meta.env.VITE_APP_MOCK_IN_PRODUCTION === 'true' + +// 生产环境时才创建服务 +if (shouldCreateServer) { + const mockModules: any[] = [] + const modules = import.meta.glob('../../mock/*.ts', { + eager: true, + }) + Object.values(modules).forEach((v: any) => { + if (Array.isArray(v.default)) { + mockModules.push(...v.default) + } + }) + createFetchSever(mockModules) +} diff --git a/ui/src/plugins/nprogress.ts b/ui/src/plugins/nprogress.ts new file mode 100644 index 0000000..c512b07 --- /dev/null +++ b/ui/src/plugins/nprogress.ts @@ -0,0 +1,9 @@ +import { router } from './router' +import { useNProgress } from '@vueuse/integrations/useNProgress' + +// https://vueuse.org/integrations/useNProgress/ +const { start, done } = useNProgress() + +router.beforeEach(() => start()) + +router.afterEach(() => done(true)) diff --git a/ui/src/plugins/pinia.ts b/ui/src/plugins/pinia.ts new file mode 100644 index 0000000..96ff6f1 --- /dev/null +++ b/ui/src/plugins/pinia.ts @@ -0,0 +1,7 @@ +import persistedstate from 'pinia-plugin-persistedstate' + +const pinia = createPinia() + +pinia.use(persistedstate) + +export default pinia diff --git a/ui/src/plugins/router.ts b/ui/src/plugins/router.ts new file mode 100644 index 0000000..6fba3a9 --- /dev/null +++ b/ui/src/plugins/router.ts @@ -0,0 +1,39 @@ +import { setupLayouts } from 'virtual:meta-layouts' +import { createRouter, createWebHistory } from 'vue-router' +import { routes as fileRoutes } from 'vue-router/auto-routes' +declare module 'vue-router' {} +// 重定向 BASE_URL +fileRoutes.flat(Infinity).forEach((route) => { + route.path = safeResolve(route.path) +}) +export const router = createRouter({ + history: createWebHistory(), + routes: setupLayouts(fileRoutes), +}) +// 路由拦截 +router.beforeEach((to, from, next) => { + // 前台处理逻辑 + if (to.fullPath.includes("/front")){ + if (to.fullPath.includes("/front/info")){ + console.log("公告管理~") + //判断有没有登录 + if (!userStore().frontIsLogin){ + ElMessage.warning("请先登录~") + next('/login'); + } + } + } + /////////////////////////////////////////////////////////////////////////////// + // 管理员全部限制 + else if (to.fullPath.includes("/admin")){ + console.log("管理员认证~") + //判断有没有登录 + if (!userStore().adminIsLogin){ + ElMessage.warning("认证失败~") + next('/login'); + } + } + next(); +}); + +export default router diff --git a/ui/src/plugins/title.ts b/ui/src/plugins/title.ts new file mode 100644 index 0000000..f7bbeb0 --- /dev/null +++ b/ui/src/plugins/title.ts @@ -0,0 +1,17 @@ +import { router } from './router' + +useTitle( + () => { + const { path, meta } = router.currentRoute.value + if (meta.title) { + return `· ${meta.title}` + } + if (path === '/') { + return '· home' + } + return path.replaceAll('/', ' · ') + }, + { + titleTemplate: `${import.meta.env.VITE_APP_TITLE} %s`, + }, +) diff --git a/ui/src/stores/navStore.ts b/ui/src/stores/navStore.ts new file mode 100644 index 0000000..0d060d1 --- /dev/null +++ b/ui/src/stores/navStore.ts @@ -0,0 +1,16 @@ +import { defineStore } from 'pinia' + +export default defineStore('navStore', { + state() { + return { + adminPath: "/", + frontPath: "/front/", + } + }, + actions: { + inc() { + + }, + }, + persist: true, +}) diff --git a/ui/src/stores/userStore.ts b/ui/src/stores/userStore.ts new file mode 100644 index 0000000..50ca2b5 --- /dev/null +++ b/ui/src/stores/userStore.ts @@ -0,0 +1,20 @@ +import { defineStore } from 'pinia' + +export default defineStore('userStore', { + state() { + return { + adminIsLogin: false, + frontIsLogin: false, + adminToken: "", + frontToken: "", + adminUserInfo:{}, + frontUserInfo:{} + } + }, + actions: { + inc() { + + }, + }, + persist: true, +}) diff --git a/ui/src/styles/main.css b/ui/src/styles/main.css new file mode 100644 index 0000000..d8b3a9c --- /dev/null +++ b/ui/src/styles/main.css @@ -0,0 +1,51 @@ +html.dark { + background: #100c2a !important; +} + +.prose { + scroll-behavior: smooth; +} + +#nprogress { + pointer-events: none; +} + +/*进度条配色*/ +#nprogress .bar { + @apply bg-blue-700 bg-opacity-75; + background: repeating-linear-gradient(90deg, #00dc82 0, #34cdfe 50%, #0047e1); + position: fixed; + z-index: 1031; + top: 0; + left: 0; + width: 100%; + height: 2px; +} + +/* +* 全局滚动条 +*/ +::-webkit-scrollbar { + width: 8px; + height: 11px; + background-color: rgb(246, 247, 248); +} + +::-webkit-scrollbar-thumb { + background-color: rgb(233, 236, 239); + border-radius: 10px; +} + +::-webkit-scrollbar-track { + background-color: rgb(246, 247, 248); + border-radius: 10px; +} + +html.dark ::-webkit-scrollbar, +html.dark ::-webkit-scrollbar-track { + background-color: #212529; +} + +html.dark ::-webkit-scrollbar-thumb { + background-color: #343a40; +} diff --git a/ui/src/utils/utils.ts b/ui/src/utils/utils.ts new file mode 100644 index 0000000..f0e4820 --- /dev/null +++ b/ui/src/utils/utils.ts @@ -0,0 +1,61 @@ + +export const getAdminList = () => { + const routes = [ + { + path: "/admin", + name: "首页", + icon: "House", + }, + { + path: "/admin/certificates", + name: "证书管理", + icon: "Postcard", + }, + { + path: "/admin/block", + name: "上链信息", + icon: "Postcard", + }, + { + path: "/admin/log", + name: "申请记录", + icon: "Postcard", + }, + { + path: "/admin/adminuser", + name: "用户管理", + icon: "Notification", + } + ]; + return routes; +} +export const getFrontList = () => { + const routes = [ + { + path: "/", + name: "证书信息", + icon: "Dashboard", + }, + { + path: "/load", + name: "证书提交", + icon: "Dashboard", + }, + { + path: "/log", + name: "审核记录", + icon: "ShoppingCart", + }, + { + path: "/audit", + name: "证书验证", + icon: "Warehouse", + }, + { + path: "/look", + name: "查看证书", + icon: "Warehouse", + } + ] + return routes; +} diff --git a/ui/tsconfig.json b/ui/tsconfig.json new file mode 100644 index 0000000..b31d1f8 --- /dev/null +++ b/ui/tsconfig.json @@ -0,0 +1,32 @@ +{ + "compilerOptions": { + "strict": true, + "jsx": "preserve", + "target": "esnext", + "module": "esnext", + "sourceMap": true, + "skipLibCheck": true, + "isolatedModules": true, + "jsxImportSource": "vue", + "esModuleInterop": true, + "lib": ["esnext", "dom"], + "resolveJsonModule": true, + "moduleResolution": "node", + "useDefineForClassFields": true, + "baseUrl": ".", + "paths": { + "~/*": ["src/*"], + "@/*": ["src/*"] + } + }, + "include": [ + "srcipts", + "presets", + "src/**/*.ts", + "src/**/*.d.ts", + "src/**/*.tsx", + "src/**/*.vue", + "./vite.config.ts" + ], + "exclude": ["node_modules", "dist"] +} diff --git a/ui/uno.config.ts b/ui/uno.config.ts new file mode 100644 index 0000000..936f25d --- /dev/null +++ b/ui/uno.config.ts @@ -0,0 +1,24 @@ +import { + defineConfig, + presetAttributify, + presetIcons, + presetTypography, + presetUno, + transformerVariantGroup, + transformerDirectives, +} from 'unocss' + +import presetAutoprefixer from './presets/autoprefixer' + +export default defineConfig({ + transformers: [transformerDirectives(), transformerVariantGroup()], + presets: [ + presetAttributify(), + presetIcons({ + autoInstall: true, + }), + presetUno(), + presetTypography(), + presetAutoprefixer(), + ], +}) diff --git a/ui/vite.config.ts b/ui/vite.config.ts new file mode 100644 index 0000000..90972a4 --- /dev/null +++ b/ui/vite.config.ts @@ -0,0 +1,6 @@ +import Tov from './presets' +import { defineConfig } from 'vite' + +export default defineConfig({ + plugins: [Tov()], +})