diff --git a/.gitignore b/.gitignore index 9154f4c..91af0b6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,26 +1,162 @@ -# ---> Java -# Compiled class file -*.class +# ---> Python +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class +.idea +# C extensions +*.so -# Log file +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: *.log +local_settings.py +db.sqlite3 +db.sqlite3-journal -# BlueJ files -*.ctxt +# Flask stuff: +instance/ +.webassets-cache -# Mobile Tools for Java (J2ME) -.mtj.tmp/ +# Scrapy stuff: +.scrapy -# Package Files # -*.jar -*.war -*.nar -*.ear -*.zip -*.tar.gz -*.rar +# Sphinx documentation +docs/_build/ -# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml -hs_err_pid* -replay_pid* +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ diff --git a/admin/admin.iml b/admin/admin.iml new file mode 100644 index 0000000..511358b --- /dev/null +++ b/admin/admin.iml @@ -0,0 +1,200 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/admin/pom.xml b/admin/pom.xml new file mode 100644 index 0000000..35fa112 --- /dev/null +++ b/admin/pom.xml @@ -0,0 +1,119 @@ + + + io.renren + block-chaincopyright + 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..d8aa9a5 --- /dev/null +++ b/admin/src/main/java/io/common/aspect/LogOperationAspect.java @@ -0,0 +1,72 @@ +package io.common.aspect; + +import io.common.annotation.LogOperation; +import io.common.utils.HttpContextUtils; +import io.common.utils.JsonUtils; +import io.modules.security.user.SecurityUser; +import io.modules.security.user.UserDetail; +import jakarta.servlet.http.HttpServletRequest; +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.aspectj.lang.reflect.MethodSignature; +import org.springframework.http.HttpHeaders; +import org.springframework.stereotype.Component; + +import java.lang.reflect.Method; + +/** + * 操作日志,切面处理类 + * + */ +@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; + } + } + + private void saveLog(ProceedingJoinPoint joinPoint, long time, Integer status) throws Exception { + MethodSignature signature = (MethodSignature) joinPoint.getSignature(); + Method method = joinPoint.getTarget().getClass().getDeclaredMethod(signature.getName(), signature.getParameterTypes()); + LogOperation annotation = method.getAnnotation(LogOperation.class); + + + //登录用户信息 + UserDetail user = SecurityUser.getUser(); + + + //请求相关信息 + HttpServletRequest request = HttpContextUtils.getHttpServletRequest(); + + //请求参数 + Object[] args = joinPoint.getArgs(); + try { + String params = JsonUtils.toJsonString(args[0]); + + } catch (Exception 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..af53466 --- /dev/null +++ b/admin/src/main/java/io/common/exception/RenExceptionHandler.java @@ -0,0 +1,65 @@ +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); + saveLog(ex); + return new Result().error(ex.getMessage()); + } + + /** + * 保存异常日志 + */ + private void saveLog(Exception ex) { + + //请求相关信息 + HttpServletRequest request = HttpContextUtils.getHttpServletRequest(); + + Map params = HttpContextUtils.getParameterMap(request); + + } +} 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..c6ebd0b --- /dev/null +++ b/admin/src/main/java/io/modules/security/controller/LoginController.java @@ -0,0 +1,88 @@ +package io.modules.security.controller; + +import io.common.exception.RenException; +import io.common.utils.IpUtils; +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; +import java.util.Date; + +/** + * 登录 + */ +@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(@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..83e6c8f --- /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..5d2c0a1 --- /dev/null +++ b/admin/src/main/java/io/modules/security/oauth2/Oauth2Realm.java @@ -0,0 +1,74 @@ + + +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); + //账号锁定 + 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..1e5de23 --- /dev/null +++ b/admin/src/main/java/io/modules/security/service/ShiroService.java @@ -0,0 +1,32 @@ + + +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); + + +} 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..5a023d4 --- /dev/null +++ b/admin/src/main/java/io/modules/security/service/impl/ShiroServiceImpl.java @@ -0,0 +1,45 @@ + + +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.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 SysUserDao sysUserDao; + private final SysUserTokenDao sysUserTokenDao; + + @Override + public Set getUserPermissions(UserDetail user) { + //用户权限列表 + Set permsSet = new HashSet<>(); + return permsSet; + } + + @Override + public SysUserTokenEntity getByToken(String token) { + return sysUserTokenDao.getByToken(token); + } + + @Override + public SysUserEntity getUser(Long userId) { + return sysUserDao.selectById(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/AddressController.java b/admin/src/main/java/io/modules/sys/controller/AddressController.java new file mode 100644 index 0000000..106e013 --- /dev/null +++ b/admin/src/main/java/io/modules/sys/controller/AddressController.java @@ -0,0 +1,82 @@ +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.AddressDTO; +import io.modules.item.service.AddressService; +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.web.bind.annotation.*; + +import java.util.Map; + +/** + * 收货地址表 + */ +@RestController +@RequestMapping("sys/address") +@Tag(name="收货地址表") +public class AddressController { + @Autowired + private AddressService addressService; + + @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 = addressService.page(params); + return new Result>().ok(page); + } + + @GetMapping("{id}") + @Operation(summary = "信息") + public Result get(@PathVariable("id") Long id){ + AddressDTO data = addressService.get(id); + return new Result().ok(data); + } + + @PostMapping + @Operation(summary = "保存") + public Result save(@RequestBody AddressDTO dto){ + //效验数据 + ValidatorUtils.validateEntity(dto, AddGroup.class, DefaultGroup.class); + addressService.save(dto); + return new Result(); + } + + @PutMapping + @Operation(summary = "修改") + public Result update(@RequestBody AddressDTO dto){ + //效验数据 + ValidatorUtils.validateEntity(dto, UpdateGroup.class, DefaultGroup.class); + addressService.update(dto); + return new Result(); + } + + @DeleteMapping("{id}") + @Operation(summary = "删除") + public Result delete(@PathVariable Long id) { + Long[] ids = new Long[]{id}; + //效验数据 + AssertUtils.isArrayEmpty(ids, "id"); + addressService.delete(ids); + return new Result(); + } + + +} diff --git a/admin/src/main/java/io/modules/sys/controller/ArticleController.java b/admin/src/main/java/io/modules/sys/controller/ArticleController.java new file mode 100644 index 0000000..40e522c --- /dev/null +++ b/admin/src/main/java/io/modules/sys/controller/ArticleController.java @@ -0,0 +1,107 @@ +package io.modules.sys.controller; +import io.common.annotation.LogOperation; +import io.common.constant.Constant; +import io.modules.item.dto.ArticleDTO; + +import io.modules.item.service.ArticleService; +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.service.DictService; +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.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 java.util.List; +import java.util.Map; +/** + * 文章表 + + */ +@RestController +@RequestMapping("item/article") +@Tag(name="文章表") +public class ArticleController { + @Autowired + private ArticleService articleService; + + + @Autowired + private DictService dictService; + + @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 = "type", description = "类型", in = ParameterIn.QUERY, ref="String") + }) + @RequiresPermissions("item:article:page") + public Result> page(@Parameter(hidden = true) @RequestParam Map params){ + PageData page = articleService.page(params); + return new Result>().ok(page); + } + + @GetMapping("{id}") + @Operation(summary = "信息") + @RequiresPermissions("item:article:info") + public Result get(@PathVariable("id") Long id){ + ArticleDTO data = articleService.get(id); + + return new Result().ok(data); + } + + @PostMapping + @Operation(summary = "保存") + @LogOperation("保存") + @RequiresPermissions("item:article:save") + public Result save(@RequestBody ArticleDTO dto){ + //效验数据 + ValidatorUtils.validateEntity(dto, AddGroup.class, DefaultGroup.class); + List existsList = dictService.isExistsList(dto.getIntroduction()); + if (!existsList.isEmpty()){ + return new Result().error("简介出现敏感词:"+existsList); + } + List contentExistsList = dictService.isExistsList(dto.getContent()); + if (!contentExistsList.isEmpty()){ + return new Result().error("发布内容出现敏感词:"+ contentExistsList); + } + articleService.save(dto); + return new Result(); + } + @PutMapping + @Operation(summary = "修改") + @LogOperation("修改") + @RequiresPermissions("item:article:update") + public Result update(@RequestBody ArticleDTO dto){ + //效验数据 + ValidatorUtils.validateEntity(dto, UpdateGroup.class, DefaultGroup.class); + articleService.update(dto); + return new Result(); + } + + @DeleteMapping + @Operation(summary = "删除") + @LogOperation("删除") + @RequiresPermissions("item:article:delete") + public Result delete(@RequestBody Long[] ids){ + //效验数据 + AssertUtils.isArrayEmpty(ids, "id"); + articleService.delete(ids); + return new Result(); + } + + + +} diff --git a/admin/src/main/java/io/modules/sys/controller/CategoriesController.java b/admin/src/main/java/io/modules/sys/controller/CategoriesController.java new file mode 100644 index 0000000..137c7e3 --- /dev/null +++ b/admin/src/main/java/io/modules/sys/controller/CategoriesController.java @@ -0,0 +1,100 @@ +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.item.dto.CategoriesDTO; +import io.modules.item.service.CategoriesService; +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.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; + + +/** + * 商品分类表 + * + * @author Mark # + * @since 1.0.0 2025-02-13 + */ +@RestController +@RequestMapping("sys/categories") +@Tag(name="商品分类表") +public class CategoriesController { + @Autowired + private CategoriesService categoriesService; + + @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 = categoriesService.page(params); + return new Result>().ok(page); + } + + @GetMapping("{id}") + + public Result get(@PathVariable("id") Long id){ + CategoriesDTO data = categoriesService.get(id); + return new Result().ok(data); + } + + @PostMapping + @Operation(summary = "保存") + + public Result save(@RequestBody CategoriesDTO dto){ + //效验数据 + ValidatorUtils.validateEntity(dto, AddGroup.class, DefaultGroup.class); + + categoriesService.save(dto); + + return new Result(); + } + + @PutMapping + @Operation(summary = "修改") + + public Result update(@RequestBody CategoriesDTO dto){ + //效验数据 + ValidatorUtils.validateEntity(dto, UpdateGroup.class, DefaultGroup.class); + + categoriesService.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"); + categoriesService.delete(ids); + return new Result(); + } + + + +} diff --git a/admin/src/main/java/io/modules/sys/controller/CommentController.java b/admin/src/main/java/io/modules/sys/controller/CommentController.java new file mode 100644 index 0000000..5a47647 --- /dev/null +++ b/admin/src/main/java/io/modules/sys/controller/CommentController.java @@ -0,0 +1,93 @@ +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.modules.item.dto.CommentDTO; +import io.modules.item.dto.HouseDTO; +import io.modules.item.dto.UserDTO; +import io.modules.item.service.CommentService; +import io.modules.item.service.HouseService; +import io.modules.item.service.UserService; +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/comment") +@Tag(name="评论表") +@CrossOrigin +public class CommentController { + + @Autowired + private CommentService commentService; + @Autowired + private UserService userService; + @Autowired + private HouseService itemService; + + @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"), + @Parameter(name = "itemId", description = "关联编号", in = ParameterIn.QUERY, ref="String") + }) + public Result> page(@Parameter(hidden = true) @RequestParam Map params){ + PageData page = commentService.page(params); + List updatedPage = page.getList().stream() + .map(comment -> { + Long userId = comment.getUserId(); + // 如果缓存中已经存在该用户的信息,直接使用 + UserDTO user = userService.get(userId); + if (user != null) { + // 否则调用 userService 获取用户信息并缓存 + comment.setNickName(user.getNickName()); // 设置昵称 + } + Long itemId = comment.getItemId(); + HouseDTO itemDTO = itemService.get(itemId); + if (itemDTO != null){ + itemDTO.setImage(uploadUrl + itemDTO.getImage());; + } + comment.setItemDTO(itemDTO); + return comment; + }) + .collect(Collectors.toList()); + page.setList(updatedPage); + return new Result>().ok(page); + } + + + + @DeleteMapping("{id}") + @Operation(summary = "删除") + @LogOperation("删除") + public Result delete(@PathVariable Long id){ + Long[] ids = new Long[] { id }; + //效验数据 + AssertUtils.isArrayEmpty(ids, "id"); + commentService.delete(ids); + return new Result(); + } + +} diff --git a/admin/src/main/java/io/modules/sys/controller/DictController.java b/admin/src/main/java/io/modules/sys/controller/DictController.java new file mode 100644 index 0000000..3f2d87e --- /dev/null +++ b/admin/src/main/java/io/modules/sys/controller/DictController.java @@ -0,0 +1,105 @@ +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.item.dto.DictDTO; +import io.modules.item.service.DictService; +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.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 java.util.List; +import java.util.Map; + + +/** + * 敏感词 + + */ +@RestController +@RequestMapping("item/dict") +@Tag(name="敏感词") +public class DictController { + @Autowired + private DictService dictService; + + @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") + }) + @RequiresPermissions("item:dict:page") + public Result> page(@Parameter(hidden = true) @RequestParam Map params){ + PageData page = dictService.page(params); + + return new Result>().ok(page); + } + + @GetMapping("{id}") + @Operation(summary = "信息") + @RequiresPermissions("item:dict:info") + public Result get(@PathVariable("id") Long id){ + DictDTO data = dictService.get(id); + + return new Result().ok(data); + } + + @PostMapping + @Operation(summary = "保存") + @LogOperation("保存") + @RequiresPermissions("item:dict:save") + public Result save(@RequestBody DictDTO dto){ + //效验数据 + ValidatorUtils.validateEntity(dto, AddGroup.class, DefaultGroup.class); + + + dictService.save(dto); + + return new Result(); + } + + @PutMapping + @Operation(summary = "修改") + @LogOperation("修改") + @RequiresPermissions("item:dict:update") + public Result update(@RequestBody DictDTO dto){ + //效验数据 + ValidatorUtils.validateEntity(dto, UpdateGroup.class, DefaultGroup.class); + dictService.update(dto); + + return new Result(); + } + + @DeleteMapping + @Operation(summary = "删除") + @LogOperation("删除") + @RequiresPermissions("item:dict:delete") + public Result delete(@RequestBody Long[] ids){ + //效验数据 + AssertUtils.isArrayEmpty(ids, "id"); + + dictService.delete(ids); + + return new Result(); + } + + + +} diff --git a/admin/src/main/java/io/modules/sys/controller/HouseController.java b/admin/src/main/java/io/modules/sys/controller/HouseController.java new file mode 100644 index 0000000..8ffa067 --- /dev/null +++ b/admin/src/main/java/io/modules/sys/controller/HouseController.java @@ -0,0 +1,113 @@ +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.item.dto.CategoriesDTO; +import io.modules.item.dto.HouseDTO; +import io.modules.item.entity.ViewEntity; +import io.modules.item.service.CategoriesService; +import io.modules.item.service.HouseService; +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.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.*; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 主表 + */ +@CrossOrigin +@RestController +@RequestMapping("sys/house") +@Tag(name = "主表") +public class HouseController { + @Autowired + private HouseService itemService; + + + @GetMapping("query") + @Operation(summary = "首页顶部展示") + public Result> page() { + List res = itemService.query(); + return new Result>().ok(res); + } + + @GetMapping("view1") + @Operation(summary = "首页分析1") + public Result> view1() { + List res = itemService.view1(); + return new Result>().ok(res); + } + + @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 = "status", description = "排序方式,可选值(asc、desc)", in = ParameterIn.QUERY, ref = "String") + }) + public Result> page(@Parameter(hidden = true) @RequestParam Map params) { + + PageData page = itemService.page(params); + List list = page.getList().stream().map(e -> { + + return e; + }).collect(Collectors.toList()); + page.setList(list); + return new Result>().ok(page); + } + + @GetMapping("{id}") + @Operation(summary = "信息") + public Result get(@PathVariable("id") Long id) { + HouseDTO data = itemService.get(id); + return new Result().ok(data); + } + + @PostMapping + @Operation(summary = "保存") + public Result save(@RequestBody HouseDTO dto) { + //效验数据 + ValidatorUtils.validateEntity(dto, AddGroup.class, DefaultGroup.class); + itemService.save(dto); + return new Result(); + } + + @PutMapping + @Operation(summary = "修改") + public Result update(@RequestBody HouseDTO dto) { //效验数据 + ValidatorUtils.validateEntity(dto, UpdateGroup.class, DefaultGroup.class); + itemService.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"); + itemService.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..e7a25f1 --- /dev/null +++ b/admin/src/main/java/io/modules/sys/controller/IndexController.java @@ -0,0 +1,18 @@ +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/OrderController.java b/admin/src/main/java/io/modules/sys/controller/OrderController.java new file mode 100644 index 0000000..706751c --- /dev/null +++ b/admin/src/main/java/io/modules/sys/controller/OrderController.java @@ -0,0 +1,120 @@ +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.dao.FrontUserDao; +import io.modules.item.dto.AddressDTO; +import io.modules.item.dto.HouseDTO; +import io.modules.item.dto.OrderDTO; +import io.modules.item.entity.FrontUserEntity; +import io.modules.item.service.AddressService; +import io.modules.item.service.HouseService; +import io.modules.item.service.OrderService; +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; + + +/** + * 订单表 + * + * @author Mark # + * @since 1.0.0 2025-02-14 + */ +@RestController +@RequestMapping("sys/order") +@Tag(name="订单表") +@CrossOrigin +public class OrderController { + @Autowired + private OrderService orderService; + + @Autowired + private HouseService itemService; + + + + @Autowired + private FrontUserDao frontUserDao; + + @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 = orderService.page(params); + List collect = page.getList().stream().map(e -> { + HouseDTO item = itemService.get(e.getItemId()); + if(item != null){ + item.setImage(uploadUrl + item.getImage()); + } + e.setItem(item); + FrontUserEntity frontUserEntity = frontUserDao.selectById(e.getUserId()); + e.setUserEntity(frontUserEntity); + + return e; + }).collect(Collectors.toList()); + + page.setList(collect); + return new Result>().ok(page); + } + + @GetMapping("{id}") + @Operation(summary = "信息") + public Result get(@PathVariable("id") Long id){ + OrderDTO data = orderService.get(id); + + return new Result().ok(data); + } + + @PostMapping + @Operation(summary = "保存") + public Result save(@RequestBody OrderDTO dto){ + //效验数据 + ValidatorUtils.validateEntity(dto, AddGroup.class, DefaultGroup.class); + orderService.save(dto); + return new Result(); + } + + @PutMapping + @Operation(summary = "修改") + public Result update(@RequestBody OrderDTO dto){ + //效验数据 + ValidatorUtils.validateEntity(dto, UpdateGroup.class, DefaultGroup.class); + orderService.update(dto); + return new Result(); + } + + @DeleteMapping + @Operation(summary = "删除") + public Result delete(@RequestBody Long[] ids){ + //效验数据 + AssertUtils.isArrayEmpty(ids, "id"); + orderService.delete(ids); + return new Result(); + } + +} diff --git a/admin/src/main/java/io/modules/sys/controller/SlidesController.java b/admin/src/main/java/io/modules/sys/controller/SlidesController.java new file mode 100644 index 0000000..6cf719d --- /dev/null +++ b/admin/src/main/java/io/modules/sys/controller/SlidesController.java @@ -0,0 +1,107 @@ +package io.modules.sys.controller; +import io.common.annotation.LogOperation; +import io.common.constant.Constant; +import io.modules.item.dto.SlidesDTO; + +import io.modules.item.service.SlidesService; +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.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.enums.ParameterIn; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.*; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + + +/** + * 轮播图 + */ +@RestController +@RequestMapping("sys/slides") +@Tag(name= "轮播图") +public class SlidesController { + @Autowired + private SlidesService slidesService; + + + @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 = slidesService.page(params); + + List list = page.getList().stream().map(e -> { + e.setPath(uploadUrl + e.getPath()); + return e; + }).collect(Collectors.toList()); + + page.setList(list); + return new Result>().ok(page); + } + + @GetMapping("{id}") + @Operation(summary = "信息") + public Result get(@PathVariable("id") Long id){ + SlidesDTO data = slidesService.get(id); + + return new Result().ok(data); + } + + @PostMapping + @Operation(summary = "保存") + @LogOperation("保存") + public Result save(@RequestBody SlidesDTO dto){ + //效验数据 + ValidatorUtils.validateEntity(dto, AddGroup.class, DefaultGroup.class); + dto.setPath(dto.getPath().replace(uploadUrl ,"")); + slidesService.save(dto); + return new Result(); + } + + @PutMapping + @Operation(summary = "修改") + @LogOperation("修改") + public Result update(@RequestBody SlidesDTO dto){ + //效验数据 + ValidatorUtils.validateEntity(dto, UpdateGroup.class, DefaultGroup.class); + dto.setPath(dto.getPath().replace(uploadUrl ,"")); + slidesService.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"); + slidesService.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..51b40d3 --- /dev/null +++ b/admin/src/main/java/io/modules/sys/controller/SysUserController.java @@ -0,0 +1,126 @@ +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.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.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; + + @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); + 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(); + } +} 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..cdd8b94 --- /dev/null +++ b/admin/src/main/java/io/modules/sys/controller/UserController.java @@ -0,0 +1,96 @@ +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.UserService; +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 UserService 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/controller/WallController.java b/admin/src/main/java/io/modules/sys/controller/WallController.java new file mode 100644 index 0000000..7ef380f --- /dev/null +++ b/admin/src/main/java/io/modules/sys/controller/WallController.java @@ -0,0 +1,103 @@ +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.item.dto.BookDTO; +import io.modules.item.service.BookService; +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.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 java.util.Map; + + +/** + * 吐槽墙 + * + * @author Mark # + * @since 1.0.0 2024-12-12 + */ +@RestController +@RequestMapping("item/wall") +@Tag(name="吐槽墙") +public class WallController { + @Autowired + private BookService wallService; + + @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") + }) + @RequiresPermissions("item:wall:page") + public Result> page(@Parameter(hidden = true) @RequestParam Map params){ + PageData page = wallService.page(params); + + return new Result>().ok(page); + } + + @GetMapping("{id}") + @Operation(summary = "信息") + @RequiresPermissions("item:wall:info") + public Result get(@PathVariable("id") Long id){ + BookDTO data = wallService.get(id); + + return new Result().ok(data); + } + + @PostMapping + @Operation(summary = "保存") + @LogOperation("保存") + @RequiresPermissions("item:wall:save") + public Result save(@RequestBody BookDTO dto){ + //效验数据 + ValidatorUtils.validateEntity(dto, AddGroup.class, DefaultGroup.class); + + wallService.save(dto); + + return new Result(); + } + + @PutMapping + @Operation(summary = "修改") + @LogOperation("修改") + @RequiresPermissions("item:wall:update") + public Result update(@RequestBody BookDTO dto){ + //效验数据 + ValidatorUtils.validateEntity(dto, UpdateGroup.class, DefaultGroup.class); + + wallService.update(dto); + + return new Result(); + } + + @DeleteMapping + @Operation(summary = "删除") + @LogOperation("删除") + @RequiresPermissions("item:wall:delete") + public Result delete(@RequestBody Long[] ids){ + //效验数据 + AssertUtils.isArrayEmpty(ids, "id"); + + wallService.delete(ids); + + return new Result(); + } + +} 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/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/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/SysUserServiceImpl.java b/admin/src/main/java/io/modules/sys/service/impl/SysUserServiceImpl.java new file mode 100644 index 0000000..d437313 --- /dev/null +++ b/admin/src/main/java/io/modules/sys/service/impl/SysUserServiceImpl.java @@ -0,0 +1,129 @@ +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.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 { + + @Override + public PageData page(Map params) { + //转换成like + paramsToLike(params, "username"); + + //分页 + IPage page = getPage(params, Constant.CREATE_DATE, false); + + //普通管理员,只能查询所属部门及子部门的数据 + UserDetail user = SecurityUser.getUser(); + + //查询 + List list = baseDao.getList(params); + + return getPageData(list, page.getTotal(), SysUserDTO.class); + } + + @Override + public List list(Map params) { + //普通管理员,只能查询所属部门及子部门的数据 + UserDetail user = SecurityUser.getUser(); + + 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); + } + + @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); + } + + @Override + public void delete(Long[] ids) { + //删除用户 + baseDao.deleteBatchIds(Arrays.asList(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..edf4608 --- /dev/null +++ b/admin/src/main/resources/application-dev.yml @@ -0,0 +1,41 @@ +spring: + datasource: + druid: + #MySQL + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://localhost:33060/block_house?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-plus: + mapper-locations: classpath*:/mapper/**/*.xml + 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: + path: D:\\code\\security\\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..d8e5d87 --- /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: + + 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 + + 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/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/common.iml b/common/common.iml new file mode 100644 index 0000000..6df7cdd --- /dev/null +++ b/common/common.iml @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/common/pom.xml b/common/pom.xml new file mode 100644 index 0000000..1e49e51 --- /dev/null +++ b/common/pom.xml @@ -0,0 +1,16 @@ + + + io.renren + block-chaincopyright + 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..51d6913 --- /dev/null +++ b/common/src/main/java/io/common/exception/ErrorCode.java @@ -0,0 +1,18 @@ +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; + + int ACCOUNT_PASSWORD_ERROR = 10004; + + int IDENTIFIER_NOT_NULL = 10006; + +} 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..3eae250 --- /dev/null +++ b/common/src/main/java/io/common/utils/ConvertUtils.java @@ -0,0 +1,51 @@ +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; + } +} 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/AddressDao.java b/common/src/main/java/io/modules/item/dao/AddressDao.java new file mode 100644 index 0000000..e300122 --- /dev/null +++ b/common/src/main/java/io/modules/item/dao/AddressDao.java @@ -0,0 +1,17 @@ +package io.modules.item.dao; + + +import io.common.dao.BaseDao; +import io.modules.item.entity.AddressEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 收货地址表 + * + * @author Mark # + * @since 1.0.0 2025-02-14 + */ +@Mapper +public interface AddressDao extends BaseDao { + +} \ No newline at end of file diff --git a/common/src/main/java/io/modules/item/dao/AreaDao.java b/common/src/main/java/io/modules/item/dao/AreaDao.java new file mode 100644 index 0000000..47fd18f --- /dev/null +++ b/common/src/main/java/io/modules/item/dao/AreaDao.java @@ -0,0 +1,17 @@ +package io.modules.item.dao; + + +import io.common.dao.BaseDao; +import io.modules.item.entity.AreaEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 地区信息 + * + * @author Mark # + * @since 1.0.0 2025-02-14 + */ +@Mapper +public interface AreaDao extends BaseDao { + +} \ No newline at end of file diff --git a/common/src/main/java/io/modules/item/dao/ArticleDao.java b/common/src/main/java/io/modules/item/dao/ArticleDao.java new file mode 100644 index 0000000..d8eae19 --- /dev/null +++ b/common/src/main/java/io/modules/item/dao/ArticleDao.java @@ -0,0 +1,13 @@ +package io.modules.item.dao; + +import io.common.dao.BaseDao; +import io.modules.item.entity.ArticleEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 文章表 + */ +@Mapper +public interface ArticleDao extends BaseDao { + +} diff --git a/common/src/main/java/io/modules/item/dao/CartDao.java b/common/src/main/java/io/modules/item/dao/CartDao.java new file mode 100644 index 0000000..1b32216 --- /dev/null +++ b/common/src/main/java/io/modules/item/dao/CartDao.java @@ -0,0 +1,16 @@ +package io.modules.item.dao; + +import io.common.dao.BaseDao; +import io.modules.item.entity.CartEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 购物车 + * + * @author Mark # + * @since 1.0.0 2025-03-12 + */ +@Mapper +public interface CartDao extends BaseDao { + +} \ No newline at end of file diff --git a/common/src/main/java/io/modules/item/dao/CategoriesDao.java b/common/src/main/java/io/modules/item/dao/CategoriesDao.java new file mode 100644 index 0000000..0a44db7 --- /dev/null +++ b/common/src/main/java/io/modules/item/dao/CategoriesDao.java @@ -0,0 +1,17 @@ +package io.modules.item.dao; + + +import io.common.dao.BaseDao; +import io.modules.item.entity.CategoriesEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 商品分类表 + * + * @author Mark # + * @since 1.0.0 2025-02-13 + */ +@Mapper +public interface CategoriesDao extends BaseDao { + +} diff --git a/common/src/main/java/io/modules/item/dao/CityDao.java b/common/src/main/java/io/modules/item/dao/CityDao.java new file mode 100644 index 0000000..bd99ec8 --- /dev/null +++ b/common/src/main/java/io/modules/item/dao/CityDao.java @@ -0,0 +1,17 @@ +package io.modules.item.dao; + + +import io.common.dao.BaseDao; +import io.modules.item.entity.CityEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 城市信息 + * + * @author Mark # + * @since 1.0.0 2025-02-14 + */ +@Mapper +public interface CityDao extends BaseDao { + +} \ No newline at end of file diff --git a/common/src/main/java/io/modules/item/dao/CommentDao.java b/common/src/main/java/io/modules/item/dao/CommentDao.java new file mode 100644 index 0000000..8115fdd --- /dev/null +++ b/common/src/main/java/io/modules/item/dao/CommentDao.java @@ -0,0 +1,13 @@ +package io.modules.item.dao; + +import io.common.dao.BaseDao; +import io.modules.item.entity.CommentEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 评论表 + */ +@Mapper +public interface CommentDao extends BaseDao { + +} diff --git a/common/src/main/java/io/modules/item/dao/DictDao.java b/common/src/main/java/io/modules/item/dao/DictDao.java new file mode 100644 index 0000000..e741ae8 --- /dev/null +++ b/common/src/main/java/io/modules/item/dao/DictDao.java @@ -0,0 +1,17 @@ +package io.modules.item.dao; + + +import io.common.dao.BaseDao; +import io.modules.item.entity.DictEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 敏感词 + * + * @author Mark # + * @since 1.0.0 2024-12-12 + */ +@Mapper +public interface DictDao extends BaseDao { + +} diff --git a/common/src/main/java/io/modules/item/dao/FrontUserDao.java b/common/src/main/java/io/modules/item/dao/FrontUserDao.java new file mode 100644 index 0000000..59fac76 --- /dev/null +++ b/common/src/main/java/io/modules/item/dao/FrontUserDao.java @@ -0,0 +1,16 @@ +package io.modules.item.dao; + +import io.common.dao.BaseDao; +import io.modules.item.entity.FrontUserEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 用户 + * + * @author Mark # + * @since 1.0.0 2025-01-14 + */ +@Mapper +public interface FrontUserDao extends BaseDao { + +} diff --git a/common/src/main/java/io/modules/item/dao/ItemDao.java b/common/src/main/java/io/modules/item/dao/ItemDao.java new file mode 100644 index 0000000..db97f5f --- /dev/null +++ b/common/src/main/java/io/modules/item/dao/ItemDao.java @@ -0,0 +1,19 @@ +package io.modules.item.dao; + +import io.common.dao.BaseDao; +import io.modules.item.entity.HouseEntity; +import io.modules.item.entity.ViewEntity; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +/** + * 主表 + */ +@Mapper +public interface ItemDao extends BaseDao { + + @Select("select * from obs_category_summary") + List view1(); +} diff --git a/common/src/main/java/io/modules/item/dao/OrderDao.java b/common/src/main/java/io/modules/item/dao/OrderDao.java new file mode 100644 index 0000000..f69c84d --- /dev/null +++ b/common/src/main/java/io/modules/item/dao/OrderDao.java @@ -0,0 +1,14 @@ +package io.modules.item.dao; + + +import io.common.dao.BaseDao; +import io.modules.item.entity.OrderEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 订单表 + */ +@Mapper +public interface OrderDao extends BaseDao { + +} \ No newline at end of file diff --git a/common/src/main/java/io/modules/item/dao/ProvinceDao.java b/common/src/main/java/io/modules/item/dao/ProvinceDao.java new file mode 100644 index 0000000..3232a06 --- /dev/null +++ b/common/src/main/java/io/modules/item/dao/ProvinceDao.java @@ -0,0 +1,17 @@ +package io.modules.item.dao; + + +import io.common.dao.BaseDao; +import io.modules.item.entity.ProvinceEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 省份信息 + * + * @author Mark # + * @since 1.0.0 2025-02-14 + */ +@Mapper +public interface ProvinceDao extends BaseDao { + +} \ No newline at end of file diff --git a/common/src/main/java/io/modules/item/dao/SlidesDao.java b/common/src/main/java/io/modules/item/dao/SlidesDao.java new file mode 100644 index 0000000..1817cca --- /dev/null +++ b/common/src/main/java/io/modules/item/dao/SlidesDao.java @@ -0,0 +1,15 @@ +package io.modules.item.dao; + + +import io.common.dao.BaseDao; +import io.modules.item.entity.SlidesEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 轮播图 + + */ +@Mapper +public interface SlidesDao extends BaseDao { + +} diff --git a/common/src/main/java/io/modules/item/dao/UserBehaviorDao.java b/common/src/main/java/io/modules/item/dao/UserBehaviorDao.java new file mode 100644 index 0000000..a9d9c97 --- /dev/null +++ b/common/src/main/java/io/modules/item/dao/UserBehaviorDao.java @@ -0,0 +1,17 @@ +package io.modules.item.dao; + + +import io.common.dao.BaseDao; +import io.modules.item.entity.UserBehaviorEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 用户行为表 + * + * @author Mark # + * @since 1.0.0 2024-12-16 + */ +@Mapper +public interface UserBehaviorDao extends BaseDao { + +} diff --git a/common/src/main/java/io/modules/item/dao/WallDao.java b/common/src/main/java/io/modules/item/dao/WallDao.java new file mode 100644 index 0000000..148c84f --- /dev/null +++ b/common/src/main/java/io/modules/item/dao/WallDao.java @@ -0,0 +1,17 @@ +package io.modules.item.dao; + + +import io.common.dao.BaseDao; +import io.modules.item.entity.BookEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 吐槽墙 + * + * @author Mark # + * @since 1.0.0 2024-12-12 + */ +@Mapper +public interface WallDao extends BaseDao { + +} diff --git a/common/src/main/java/io/modules/item/dto/AddressDTO.java b/common/src/main/java/io/modules/item/dto/AddressDTO.java new file mode 100644 index 0000000..ce8e41f --- /dev/null +++ b/common/src/main/java/io/modules/item/dto/AddressDTO.java @@ -0,0 +1,53 @@ +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-02-14 + */ +@Data +@Schema(name = "收货地址表") +public class AddressDTO implements Serializable { + private static final long serialVersionUID = 1L; + + @SchemaProperty(name = "编号") + private Long id; + + @SchemaProperty(name = "用户编号") + private Long userId; + + @SchemaProperty(name = "收货人姓名") + private String recipientName; + + @SchemaProperty(name = "详细地址") + private String address; + + @SchemaProperty(name = "省份") + private String province; + + @SchemaProperty(name = "城市") + private String city; + + @SchemaProperty(name = "区域/街道") + private String area; + + @SchemaProperty(name = "收货人联系电话") + private String phone; + + @SchemaProperty(name = "是否是默认地址") + private Integer isDefault; + + @SchemaProperty(name = "创建时间") + private Date createTime; + + +} diff --git a/common/src/main/java/io/modules/item/dto/AreaDTO.java b/common/src/main/java/io/modules/item/dto/AreaDTO.java new file mode 100644 index 0000000..b37502e --- /dev/null +++ b/common/src/main/java/io/modules/item/dto/AreaDTO.java @@ -0,0 +1,35 @@ +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-02-14 + */ +@Data +@Schema(name = "地区信息") +public class AreaDTO implements Serializable { + private static final long serialVersionUID = 1L; + + @SchemaProperty(name = "") + private Integer id; + + @SchemaProperty(name = "") + private String areaId; + + @SchemaProperty(name = "") + private String area; + + @SchemaProperty(name = "") + private String father; + + +} diff --git a/common/src/main/java/io/modules/item/dto/AreaTree.java b/common/src/main/java/io/modules/item/dto/AreaTree.java new file mode 100644 index 0000000..d141db2 --- /dev/null +++ b/common/src/main/java/io/modules/item/dto/AreaTree.java @@ -0,0 +1,9 @@ +package io.modules.item.dto; + +import lombok.Data; + +@Data +public class AreaTree { + private Long value; + private String label; +} diff --git a/common/src/main/java/io/modules/item/dto/ArticleDTO.java b/common/src/main/java/io/modules/item/dto/ArticleDTO.java new file mode 100644 index 0000000..ea1fb35 --- /dev/null +++ b/common/src/main/java/io/modules/item/dto/ArticleDTO.java @@ -0,0 +1,56 @@ +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; + + +/** + * 文章表 + + */ +@Data +@Schema(name = "文章表") +public class ArticleDTO implements Serializable { + private static final long serialVersionUID = 1L; + + @SchemaProperty(name = "编号") + private Long id; + + @SchemaProperty(name = "文章标题") + private String title; + private String path; + @SchemaProperty(name = "简介") + private String introduction; + + @SchemaProperty(name = "发表用户") + private Long userId; + + @SchemaProperty(name = "内容") + private String content; + + @SchemaProperty(name = "排序") + private Integer sort; + + @SchemaProperty(name = "点赞数量") + private Integer star; + + @SchemaProperty(name = "封面图") + private String cover; + + @SchemaProperty(name = "创建时间") + private Date createTime; + + + private String tag; + + + private String type; + + private Integer audit; + private String feedback; + +} diff --git a/common/src/main/java/io/modules/item/dto/BookDTO.java b/common/src/main/java/io/modules/item/dto/BookDTO.java new file mode 100644 index 0000000..bdf4391 --- /dev/null +++ b/common/src/main/java/io/modules/item/dto/BookDTO.java @@ -0,0 +1,36 @@ +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; + + + +@Data +@Schema(name = "吐槽墙") +public class BookDTO implements Serializable { + private static final long serialVersionUID = 1L; + + private Long id; // 主键ID + private Long userId; // 主键ID + private String img; // 封面 + private String isbn; // ISBN编号 + private String title; // 图书标题 + private String author; // 作者 + private String publisher; // 出版社 + private Date publishDate; // 出版日期 + private String copyrightOwner; // 版权持有人 + private Integer copyrightStartYear; // 版权起始年份 + private Integer copyrightEndYear; // 版权到期年份 + private String edition; // 版次 + private String language; // 语言 + private BigDecimal price; // 图书定价 + private String hex; // 上链哈希值 + private Date createTime; // 创建时间 + private String file; // 电子数据文件地址 + +} 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..0185368 --- /dev/null +++ b/common/src/main/java/io/modules/item/dto/CartDTO.java @@ -0,0 +1,43 @@ +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; + +import java.math.BigDecimal; + +/** + * 购物车 + * + * @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 HouseDTO item; + + +} diff --git a/common/src/main/java/io/modules/item/dto/CategoriesDTO.java b/common/src/main/java/io/modules/item/dto/CategoriesDTO.java new file mode 100644 index 0000000..c69ccb2 --- /dev/null +++ b/common/src/main/java/io/modules/item/dto/CategoriesDTO.java @@ -0,0 +1,38 @@ +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-02-13 + */ +@Data +@Schema(name = "商品分类表") +public class CategoriesDTO implements Serializable { + private static final long serialVersionUID = 1L; + + @SchemaProperty(name = "编号") + private Long id; + + @SchemaProperty(name = "名称") + private String name; + + @SchemaProperty(name = "图片") + private String image; + + @SchemaProperty(name = "父编号") + private Integer parentId; + + @SchemaProperty(name = "创建时间") + private Date createTime; + + +} diff --git a/common/src/main/java/io/modules/item/dto/CityDTO.java b/common/src/main/java/io/modules/item/dto/CityDTO.java new file mode 100644 index 0000000..f6e81d6 --- /dev/null +++ b/common/src/main/java/io/modules/item/dto/CityDTO.java @@ -0,0 +1,35 @@ +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-02-14 + */ +@Data +@Schema(name = "城市信息") +public class CityDTO implements Serializable { + private static final long serialVersionUID = 1L; + + @SchemaProperty(name = "") + private Integer id; + + @SchemaProperty(name = "") + private String cityId; + + @SchemaProperty(name = "") + private String city; + + @SchemaProperty(name = "") + private String father; + + +} diff --git a/common/src/main/java/io/modules/item/dto/CityTree.java b/common/src/main/java/io/modules/item/dto/CityTree.java new file mode 100644 index 0000000..4e939c6 --- /dev/null +++ b/common/src/main/java/io/modules/item/dto/CityTree.java @@ -0,0 +1,13 @@ +package io.modules.item.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class CityTree { + + private Long value; + private String label; + private List children; +} diff --git a/common/src/main/java/io/modules/item/dto/CommentDTO.java b/common/src/main/java/io/modules/item/dto/CommentDTO.java new file mode 100644 index 0000000..8b4712e --- /dev/null +++ b/common/src/main/java/io/modules/item/dto/CommentDTO.java @@ -0,0 +1,39 @@ +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; + +/** + * 评论表 + */ +@Data +@Schema(name = "评论表") +public class CommentDTO implements Serializable { + private static final long serialVersionUID = 1L; + + @SchemaProperty(name = "编号") + private Long id; + + @SchemaProperty(name = "用户编号") + private Long userId; + + @SchemaProperty(name = "用户昵称") + private String nickName; + + @SchemaProperty(name = "内容") + private String content; + + private Long itemId; + + @SchemaProperty(name = "创建时间") + private Date createTime; + /** + * 评分 + */ + private String score; + + private HouseDTO itemDTO; +} diff --git a/common/src/main/java/io/modules/item/dto/DictDTO.java b/common/src/main/java/io/modules/item/dto/DictDTO.java new file mode 100644 index 0000000..f82be38 --- /dev/null +++ b/common/src/main/java/io/modules/item/dto/DictDTO.java @@ -0,0 +1,29 @@ +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; + + +/** + * 敏感词 + */ +@Data +@Schema(name = "敏感词") +public class DictDTO implements Serializable { + private static final long serialVersionUID = 1L; + + @SchemaProperty(name = "") + private Long id; + + @SchemaProperty(name = "内容") + private String content; + + @SchemaProperty(name = "创建时间") + private Date createTime; + + +} diff --git a/common/src/main/java/io/modules/item/dto/HexDto.java b/common/src/main/java/io/modules/item/dto/HexDto.java new file mode 100644 index 0000000..00fbc3b --- /dev/null +++ b/common/src/main/java/io/modules/item/dto/HexDto.java @@ -0,0 +1,17 @@ +package io.modules.item.dto; + + +import io.modules.item.entity.OrderEntity; +import lombok.Data; + +import java.io.Serializable; +@Data +public class HexDto implements Serializable { + private HouseDTO houseA; + private UserDTO userA; + private HouseDTO houseB; + private UserDTO userB; + + private OrderEntity dto; + +} diff --git a/common/src/main/java/io/modules/item/dto/HouseDTO.java b/common/src/main/java/io/modules/item/dto/HouseDTO.java new file mode 100644 index 0000000..b1ed10e --- /dev/null +++ b/common/src/main/java/io/modules/item/dto/HouseDTO.java @@ -0,0 +1,61 @@ +package io.modules.item.dto; + +import io.modules.item.entity.FrontUserEntity; +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; +import java.util.List; + + +/** + * 商品表 + */ +@Data +@Schema(name = "商品表") +public class HouseDTO implements Serializable { + private static final long serialVersionUID = 1L; + + @SchemaProperty(name = "编号") + private Long id; + private String title; // 标题 + private String name; // 小区名称 + private String city; // 城市 + private String type; // 户型 + private String area; // 面积 + private Integer floor; // 楼层 + private String face; // 朝向 + private String decoration; // 装修 + private String image; // 图片URL + private Double price; // 价格(元/平方) + private String description; // 描述 + private String tag; // 标签(逗号分隔) + + private String hex; // 区块链密钥/哈希 + + private Integer sort = 1; // 排序权重(默认1) + private Integer status = 0; // 状态:0未审核,1上架,2审核失败 + private Integer view = 0; // 点击次数(默认0) + + private Date createTime; // 创建时间(自动更新) + + private Long userId; // 用户编号 + + + /** + * 用户信息 + */ + private FrontUserEntity user; + /** + * 评论信息信息 + */ + private List orderEntityList; + + /** + * 是否收藏 + */ + private Boolean IsFavorite; + +} diff --git a/common/src/main/java/io/modules/item/dto/OrderCartDTO.java b/common/src/main/java/io/modules/item/dto/OrderCartDTO.java new file mode 100644 index 0000000..73b5ec5 --- /dev/null +++ b/common/src/main/java/io/modules/item/dto/OrderCartDTO.java @@ -0,0 +1,25 @@ +package io.modules.item.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * 订单表 + * + * @author Mark # + * @since 1.0.0 2025-01-26 + */ +@Data +@Schema(name = "订单表") +public class OrderCartDTO implements Serializable { + private static final long serialVersionUID = 1L; + + private List dtoList; + + + private Long addressId; + +} diff --git a/common/src/main/java/io/modules/item/dto/OrderDTO.java b/common/src/main/java/io/modules/item/dto/OrderDTO.java new file mode 100644 index 0000000..eb45ad4 --- /dev/null +++ b/common/src/main/java/io/modules/item/dto/OrderDTO.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 io.swagger.v3.oas.annotations.media.SchemaProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +import java.math.BigDecimal; + +/** + * 订单表 + * + * @author Mark # + * @since 1.0.0 2025-02-14 + */ +@Data +@Schema(name = "订单表") +public class OrderDTO implements Serializable { + private static final long serialVersionUID = 1L; + + @SchemaProperty(name = "订单编号") + private Long id; + + private Long userId; + private Long itemId; + private Long userHouseId; + private Long itemUserId; + + private String status; + private Integer score; + private String content; + private Date createTime; + private BigDecimal price; + private Integer quantity; + private String refuse; + private String hex; + private UserDTO user; + private FrontUserEntity userEntity; + private HouseDTO item; + private HouseDTO itemA; +} diff --git a/common/src/main/java/io/modules/item/dto/ProvinceDTO.java b/common/src/main/java/io/modules/item/dto/ProvinceDTO.java new file mode 100644 index 0000000..5ac3f1f --- /dev/null +++ b/common/src/main/java/io/modules/item/dto/ProvinceDTO.java @@ -0,0 +1,32 @@ +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-02-14 + */ +@Data +@Schema(name = "省份信息") +public class ProvinceDTO implements Serializable { + private static final long serialVersionUID = 1L; + + @SchemaProperty(name = "") + private Integer id; + + @SchemaProperty(name = "") + private String provinceId; + + @SchemaProperty(name = "") + private String province; + + +} diff --git a/common/src/main/java/io/modules/item/dto/ProvinceTree.java b/common/src/main/java/io/modules/item/dto/ProvinceTree.java new file mode 100644 index 0000000..01f3471 --- /dev/null +++ b/common/src/main/java/io/modules/item/dto/ProvinceTree.java @@ -0,0 +1,14 @@ +package io.modules.item.dto; + + +import lombok.Data; + +import java.util.List; + +@Data +public class ProvinceTree { + + private Long value; + private String label; + private List children; +} diff --git a/common/src/main/java/io/modules/item/dto/SlidesDTO.java b/common/src/main/java/io/modules/item/dto/SlidesDTO.java new file mode 100644 index 0000000..8f43643 --- /dev/null +++ b/common/src/main/java/io/modules/item/dto/SlidesDTO.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; + + +/** + * 轮播图 + + */ +@Data +@Schema(name = "轮播图") +public class SlidesDTO implements Serializable { + private static final long serialVersionUID = 1L; + + @SchemaProperty(name = "编号") + private Long id; + + @SchemaProperty(name = "轮播名称") + private String name; + + @SchemaProperty(name = "排序") + private Integer sort; + + @SchemaProperty(name = "图片地址") + private String path; + + @SchemaProperty(name = "类型") + private String type; + + + @SchemaProperty(name = "创建时间") + private Date createTime; + + +} diff --git a/common/src/main/java/io/modules/item/dto/UserBehaviorDTO.java b/common/src/main/java/io/modules/item/dto/UserBehaviorDTO.java new file mode 100644 index 0000000..07a77d9 --- /dev/null +++ b/common/src/main/java/io/modules/item/dto/UserBehaviorDTO.java @@ -0,0 +1,32 @@ +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 2024-12-16 + */ +@Data +@Schema(name = "用户行为表") +public class UserBehaviorDTO implements Serializable { + private static final long serialVersionUID = 1L; + + @SchemaProperty(name = "编号") + private Long id; + + @SchemaProperty(name = "用户编号") + private Long userId; + + @SchemaProperty(name = "商品编号") + private Long itemId; + + private Integer type; +} 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/AddressEntity.java b/common/src/main/java/io/modules/item/entity/AddressEntity.java new file mode 100644 index 0000000..6201550 --- /dev/null +++ b/common/src/main/java/io/modules/item/entity/AddressEntity.java @@ -0,0 +1,58 @@ +package io.modules.item.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +/** + * 收货地址表 + * + * @author Mark # + * @since 1.0.0 2025-02-14 + */ +@Data +@TableName("tb_address") +public class AddressEntity { + + /** + * 编号 + */ + private Long id; + /** + * 用户编号 + */ + private Long userId; + /** + * 收货人姓名 + */ + private String recipientName; + /** + * 详细地址 + */ + private String address; + /** + * 省份 + */ + private String province; + /** + * 城市 + */ + private String city; + /** + * 区域/街道 + */ + private String area; + /** + * 收货人联系电话 + */ + private String phone; + /** + * 是否是默认地址 + */ + private Integer isDefault; + /** + * 创建时间 + */ + private Date createTime; +} \ No newline at end of file diff --git a/common/src/main/java/io/modules/item/entity/AreaEntity.java b/common/src/main/java/io/modules/item/entity/AreaEntity.java new file mode 100644 index 0000000..089aa54 --- /dev/null +++ b/common/src/main/java/io/modules/item/entity/AreaEntity.java @@ -0,0 +1,34 @@ +package io.modules.item.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +/** + * 地区信息 + * + * @author Mark # + * @since 1.0.0 2025-02-14 + */ +@Data +@TableName("tb_area") +public class AreaEntity { + + /** + * + */ + private Long id; + /** + * + */ + private String areaId; + /** + * + */ + private String area; + /** + * + */ + private String father; +} \ No newline at end of file diff --git a/common/src/main/java/io/modules/item/entity/ArticleEntity.java b/common/src/main/java/io/modules/item/entity/ArticleEntity.java new file mode 100644 index 0000000..942393e --- /dev/null +++ b/common/src/main/java/io/modules/item/entity/ArticleEntity.java @@ -0,0 +1,68 @@ +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_article") +public class ArticleEntity { + + /** + * 编号 + */ + @TableId(value = "id",type = IdType.AUTO) + private Long id; + /** + * 文章标题 + */ + private String title; + private String path; + /** + * 简介 + */ + private String introduction; + /** + * 发表用户 + */ + private Long userId; + /** + * 内容 + */ + private String content; + /** + * 排序 + */ + private Integer sort; + /** + * 点赞数量 + */ + private Integer star; + private Integer audit; + /** + * 封面图 + */ + private String cover; + /** + * 创建时间 + */ + private Date createTime; + + /** + * 类型 + */ + private String type; + + + private String tag; + + private String feedback; + +} diff --git a/common/src/main/java/io/modules/item/entity/BookEntity.java b/common/src/main/java/io/modules/item/entity/BookEntity.java new file mode 100644 index 0000000..11627c6 --- /dev/null +++ b/common/src/main/java/io/modules/item/entity/BookEntity.java @@ -0,0 +1,30 @@ +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_book") +public class BookEntity { + + private Long id; // 主键ID + private Long userId; + private String img; // 封面 + private String isbn; // ISBN编号 + private String title; // 图书标题 + private String author; // 作者 + private String publisher; // 出版社 + private Date publishDate; // 出版日期 + private String copyrightOwner; // 版权持有人 + private Integer copyrightStartYear; // 版权起始年份 + private Integer copyrightEndYear; // 版权到期年份 + private String edition; // 版次 + private String language; // 语言 + private BigDecimal price; // 图书定价 + private String hex; // 上链哈希值 + private Date createTime; // 创建时间 + private String file; // 电子数据文件地址 +} diff --git a/common/src/main/java/io/modules/item/entity/CartEntity.java b/common/src/main/java/io/modules/item/entity/CartEntity.java new file mode 100644 index 0000000..86d322a --- /dev/null +++ b/common/src/main/java/io/modules/item/entity/CartEntity.java @@ -0,0 +1,43 @@ +package io.modules.item.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 购物车 + * + * @author Mark # + * @since 1.0.0 2025-03-12 + */ +@Data +@TableName("tb_cart") +public class CartEntity { + + /** + * 编号 + */ + private Long id; + /** + * 用户ID + */ + private Long userId; + /** + * 商品ID + */ + private Long productId; + /** + * 商品数量 + */ + private Integer quantity; + /** + * 创建时间 + */ + private Date createdTime; + /** + * 加入时价格 + */ + private BigDecimal price; +} \ No newline at end of file diff --git a/common/src/main/java/io/modules/item/entity/CategoriesEntity.java b/common/src/main/java/io/modules/item/entity/CategoriesEntity.java new file mode 100644 index 0000000..171dc1a --- /dev/null +++ b/common/src/main/java/io/modules/item/entity/CategoriesEntity.java @@ -0,0 +1,35 @@ +package io.modules.item.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +/** + * 商品分类表 + */ +@Data +@TableName("tb_categories") +public class CategoriesEntity { + + /** + * 编号 + */ + private Long id; + /** + * 名称 + */ + private String name; + /** + * 图片 + */ + private String image; + /** + * 父编号 + */ + private Integer parentId; + /** + * 创建时间 + */ + private Date createTime; +} diff --git a/common/src/main/java/io/modules/item/entity/CityEntity.java b/common/src/main/java/io/modules/item/entity/CityEntity.java new file mode 100644 index 0000000..e6712e2 --- /dev/null +++ b/common/src/main/java/io/modules/item/entity/CityEntity.java @@ -0,0 +1,34 @@ +package io.modules.item.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +/** + * 城市信息 + * + * @author Mark # + * @since 1.0.0 2025-02-14 + */ +@Data +@TableName("tb_city") +public class CityEntity { + + /** + * + */ + private Long id; + /** + * + */ + private String cityId; + /** + * + */ + private String city; + /** + * + */ + private String father; +} \ No newline at end of file diff --git a/common/src/main/java/io/modules/item/entity/CommentEntity.java b/common/src/main/java/io/modules/item/entity/CommentEntity.java new file mode 100644 index 0000000..c566f99 --- /dev/null +++ b/common/src/main/java/io/modules/item/entity/CommentEntity.java @@ -0,0 +1,44 @@ +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_comment") +public class CommentEntity { + + /** + * 编号 + */ + private Long id; + + private Long itemId; + /** + * 用户编号 + */ + private Long userId; + /** + * 用户昵称 + */ + private String nickName; + /** + * 内容 + */ + private String content; + /** + * 评分 + */ + private String score; + /** + * 创建时间 + */ + private Date createTime; +} 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/HouseEntity.java b/common/src/main/java/io/modules/item/entity/HouseEntity.java new file mode 100644 index 0000000..d5c018c --- /dev/null +++ b/common/src/main/java/io/modules/item/entity/HouseEntity.java @@ -0,0 +1,42 @@ +package io.modules.item.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +/** + * 房源表 + */ +@Data +@TableName("tb_house") +public class HouseEntity { + + /** + * 编号 + */ + private Long id; + private String title; // 标题 + private String name; // 小区名称 + private String city; // 城市 + private String type; // 户型 + private String area; // 面积 + private Integer floor; // 楼层 + private String face; // 朝向 + private String decoration; // 装修 + private String image; // 图片URL + private Double price; // 价格(元/平方) + private String description; // 描述 + private String tag; // 标签(逗号分隔) + + private String hex; // 区块链密钥/哈希 + + private Integer sort = 1; // 排序权重(默认1) + private Integer status = 0; // 状态:0未审核,1上架,2审核失败 + private Integer view = 0; // 点击次数(默认0) + + private Date createTime; // 创建时间(自动更新) + + private Long userId; // 用户编号 + +} diff --git a/common/src/main/java/io/modules/item/entity/OrderEntity.java b/common/src/main/java/io/modules/item/entity/OrderEntity.java new file mode 100644 index 0000000..45c025c --- /dev/null +++ b/common/src/main/java/io/modules/item/entity/OrderEntity.java @@ -0,0 +1,32 @@ +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_order") +public class OrderEntity { + + /** + * 订单编号 + */ + private Long id; + private Long userId; + private Long itemId; + private Long userHouseId; + private Long itemUserId; + private String status; + private Integer score; + private String content; + private Date createTime; + private BigDecimal price; + private String refuse; + private String hex; + +} \ No newline at end of file diff --git a/common/src/main/java/io/modules/item/entity/ProvinceEntity.java b/common/src/main/java/io/modules/item/entity/ProvinceEntity.java new file mode 100644 index 0000000..950dcc8 --- /dev/null +++ b/common/src/main/java/io/modules/item/entity/ProvinceEntity.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 2025-02-14 + */ +@Data +@TableName("tb_province") +public class ProvinceEntity { + + /** + * + */ + private Long id; + /** + * + */ + private String provinceId; + /** + * + */ + private String province; +} \ No newline at end of file diff --git a/common/src/main/java/io/modules/item/entity/SlidesEntity.java b/common/src/main/java/io/modules/item/entity/SlidesEntity.java new file mode 100644 index 0000000..7c795e9 --- /dev/null +++ b/common/src/main/java/io/modules/item/entity/SlidesEntity.java @@ -0,0 +1,40 @@ +package io.modules.item.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.v3.oas.annotations.media.SchemaProperty; +import lombok.Data; + +import java.util.Date; + +/** + * 轮播图 + + */ +@Data +@TableName("tb_slides") +public class SlidesEntity { + + /** + * 编号 + */ + private Long id; + /** + * 轮播名称 + */ + private String name; + /** + * 排序 + */ + private Integer sort; + /** + * 图片地址 + */ + private String path; + + + private String type; + /** + * 创建时间 + */ + private Date createTime; +} diff --git a/common/src/main/java/io/modules/item/entity/UserBehaviorEntity.java b/common/src/main/java/io/modules/item/entity/UserBehaviorEntity.java new file mode 100644 index 0000000..db28a16 --- /dev/null +++ b/common/src/main/java/io/modules/item/entity/UserBehaviorEntity.java @@ -0,0 +1,35 @@ +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-16 + */ +@Data +@TableName("tb_user_behavior") +public class UserBehaviorEntity { + + /** + * 编号 + */ + private Long id; + /** + * 用户编号 + */ + private Long userId; + /** + * 商品编号 + */ + private Long itemId; + /** + * + */ + private Date createTime; + private Integer type; +} diff --git a/common/src/main/java/io/modules/item/entity/ViewEntity.java b/common/src/main/java/io/modules/item/entity/ViewEntity.java new file mode 100644 index 0000000..fb8a307 --- /dev/null +++ b/common/src/main/java/io/modules/item/entity/ViewEntity.java @@ -0,0 +1,10 @@ +package io.modules.item.entity; + +import lombok.Data; + +@Data +public class ViewEntity { + + public String name; + private Integer value; +} diff --git a/common/src/main/java/io/modules/item/service/AddressService.java b/common/src/main/java/io/modules/item/service/AddressService.java new file mode 100644 index 0000000..9736cc1 --- /dev/null +++ b/common/src/main/java/io/modules/item/service/AddressService.java @@ -0,0 +1,16 @@ +package io.modules.item.service; + + +import io.common.service.CrudService; +import io.modules.item.dto.AddressDTO; +import io.modules.item.entity.AddressEntity; + +/** + * 收货地址表 + * + * @author Mark # + * @since 1.0.0 2025-02-14 + */ +public interface AddressService extends CrudService { + +} \ No newline at end of file diff --git a/common/src/main/java/io/modules/item/service/AreaService.java b/common/src/main/java/io/modules/item/service/AreaService.java new file mode 100644 index 0000000..99c41ef --- /dev/null +++ b/common/src/main/java/io/modules/item/service/AreaService.java @@ -0,0 +1,16 @@ +package io.modules.item.service; + + +import io.common.service.CrudService; +import io.modules.item.dto.AreaDTO; +import io.modules.item.entity.AreaEntity; + +/** + * 地区信息 + * + * @author Mark # + * @since 1.0.0 2025-02-14 + */ +public interface AreaService extends CrudService { + +} \ No newline at end of file diff --git a/common/src/main/java/io/modules/item/service/ArticleService.java b/common/src/main/java/io/modules/item/service/ArticleService.java new file mode 100644 index 0000000..9967801 --- /dev/null +++ b/common/src/main/java/io/modules/item/service/ArticleService.java @@ -0,0 +1,14 @@ +package io.modules.item.service; + + +import io.modules.item.dto.ArticleDTO; +import io.modules.item.entity.ArticleEntity; +import io.common.service.CrudService; + +/** + * 文章表 + + */ +public interface ArticleService extends CrudService { + +} diff --git a/common/src/main/java/io/modules/item/service/BookService.java b/common/src/main/java/io/modules/item/service/BookService.java new file mode 100644 index 0000000..845a490 --- /dev/null +++ b/common/src/main/java/io/modules/item/service/BookService.java @@ -0,0 +1,16 @@ +package io.modules.item.service; + + +import io.common.service.CrudService; +import io.modules.item.dto.BookDTO; +import io.modules.item.entity.BookEntity; + +/** + * 吐槽墙 + * + * @author Mark # + * @since 1.0.0 2024-12-12 + */ +public interface BookService extends CrudService { + +} diff --git a/common/src/main/java/io/modules/item/service/CartService.java b/common/src/main/java/io/modules/item/service/CartService.java new file mode 100644 index 0000000..8213254 --- /dev/null +++ b/common/src/main/java/io/modules/item/service/CartService.java @@ -0,0 +1,16 @@ +package io.modules.item.service; + + +import io.common.service.CrudService; +import io.modules.item.dto.CartDTO; +import io.modules.item.entity.CartEntity; + +/** + * 购物车 + * + * @author Mark # + * @since 1.0.0 2025-03-12 + */ +public interface CartService extends CrudService { + +} \ No newline at end of file diff --git a/common/src/main/java/io/modules/item/service/CategoriesService.java b/common/src/main/java/io/modules/item/service/CategoriesService.java new file mode 100644 index 0000000..68ea646 --- /dev/null +++ b/common/src/main/java/io/modules/item/service/CategoriesService.java @@ -0,0 +1,16 @@ +package io.modules.item.service; + + +import io.common.service.CrudService; +import io.modules.item.dto.CategoriesDTO; +import io.modules.item.entity.CategoriesEntity; + +/** + * 商品分类表 + * + * @author Mark # + * @since 1.0.0 2025-02-13 + */ +public interface CategoriesService extends CrudService { + +} diff --git a/common/src/main/java/io/modules/item/service/CityService.java b/common/src/main/java/io/modules/item/service/CityService.java new file mode 100644 index 0000000..591a0c5 --- /dev/null +++ b/common/src/main/java/io/modules/item/service/CityService.java @@ -0,0 +1,16 @@ +package io.modules.item.service; + + +import io.common.service.CrudService; +import io.modules.item.dto.CityDTO; +import io.modules.item.entity.CityEntity; + +/** + * 城市信息 + * + * @author Mark # + * @since 1.0.0 2025-02-14 + */ +public interface CityService extends CrudService { + +} \ No newline at end of file diff --git a/common/src/main/java/io/modules/item/service/CommentService.java b/common/src/main/java/io/modules/item/service/CommentService.java new file mode 100644 index 0000000..7101897 --- /dev/null +++ b/common/src/main/java/io/modules/item/service/CommentService.java @@ -0,0 +1,16 @@ +package io.modules.item.service; + + +import io.common.service.CrudService; +import io.modules.item.dto.CommentDTO; +import io.modules.item.entity.CommentEntity; + +/** + * 评论表 + * + * @author Mark # + * @since 1.0.0 2024-12-12 + */ +public interface CommentService extends CrudService { + +} diff --git a/common/src/main/java/io/modules/item/service/DictService.java b/common/src/main/java/io/modules/item/service/DictService.java new file mode 100644 index 0000000..00a86a6 --- /dev/null +++ b/common/src/main/java/io/modules/item/service/DictService.java @@ -0,0 +1,24 @@ +package io.modules.item.service; + +import io.common.service.CrudService; +import io.modules.item.dto.DictDTO; +import io.modules.item.entity.DictEntity; + +import java.util.List; + +/** + * 敏感词 + * + * @author Mark # + * @since 1.0.0 2024-12-12 + */ +public interface DictService extends CrudService { + + + /** + * 判断是否存在敏感字 + * @param key + * @return + */ + List isExistsList(String key); +} diff --git a/common/src/main/java/io/modules/item/service/HouseService.java b/common/src/main/java/io/modules/item/service/HouseService.java new file mode 100644 index 0000000..7515467 --- /dev/null +++ b/common/src/main/java/io/modules/item/service/HouseService.java @@ -0,0 +1,24 @@ +package io.modules.item.service; + +import io.common.service.CrudService; +import io.modules.item.dto.HouseDTO; +import io.modules.item.entity.HouseEntity; +import io.modules.item.entity.ViewEntity; + +import java.util.List; + +/** + * 主表 + */ +public interface HouseService extends CrudService { + + List score(); + + List query(); + + List view1(); + + List commit(); + + List listUser(Long userId); +} diff --git a/common/src/main/java/io/modules/item/service/OrderService.java b/common/src/main/java/io/modules/item/service/OrderService.java new file mode 100644 index 0000000..160b8e5 --- /dev/null +++ b/common/src/main/java/io/modules/item/service/OrderService.java @@ -0,0 +1,24 @@ +package io.modules.item.service; + + +import io.common.service.CrudService; +import io.modules.item.dto.OrderDTO; +import io.modules.item.entity.OrderEntity; + +import java.util.List; + +/** + * 订单表 + * + * @author Mark # + * @since 1.0.0 2025-02-14 + */ +public interface OrderService extends CrudService { + + /** + * 获取评论信息 + * @param id + * @return + */ + List getCommintList(Long id); +} \ No newline at end of file diff --git a/common/src/main/java/io/modules/item/service/ProvinceService.java b/common/src/main/java/io/modules/item/service/ProvinceService.java new file mode 100644 index 0000000..b77c27a --- /dev/null +++ b/common/src/main/java/io/modules/item/service/ProvinceService.java @@ -0,0 +1,24 @@ +package io.modules.item.service; + + +import io.common.service.CrudService; +import io.modules.item.dto.ProvinceDTO; +import io.modules.item.dto.ProvinceTree; +import io.modules.item.entity.ProvinceEntity; + +import java.util.List; + +/** + * 省份信息 + * + * @author Mark # + * @since 1.0.0 2025-02-14 + */ +public interface ProvinceService extends CrudService { + + /** + * 结构树 + * @return + */ + List tree(); +} \ No newline at end of file diff --git a/common/src/main/java/io/modules/item/service/SlidesService.java b/common/src/main/java/io/modules/item/service/SlidesService.java new file mode 100644 index 0000000..b49f77c --- /dev/null +++ b/common/src/main/java/io/modules/item/service/SlidesService.java @@ -0,0 +1,14 @@ +package io.modules.item.service; + + +import io.modules.item.dto.SlidesDTO; +import io.modules.item.entity.SlidesEntity; +import io.common.service.CrudService; + +/** + * 轮播图 + + */ +public interface SlidesService extends CrudService { + +} diff --git a/common/src/main/java/io/modules/item/service/UserBehaviorService.java b/common/src/main/java/io/modules/item/service/UserBehaviorService.java new file mode 100644 index 0000000..d4b7d5a --- /dev/null +++ b/common/src/main/java/io/modules/item/service/UserBehaviorService.java @@ -0,0 +1,36 @@ +package io.modules.item.service; + + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import io.common.service.CrudService; +import io.modules.item.dto.UserBehaviorDTO; +import io.modules.item.entity.UserBehaviorEntity; + +import java.util.List; +import java.util.Map; + +/** + * 用户行为表 + * + * @author Mark # + * @since 1.0.0 2024-12-16 + */ +public interface UserBehaviorService extends CrudService { + + + Boolean isExists( UserBehaviorDTO dto); + void deleteUserBehavior(UserBehaviorDTO dto); + + public List getTopItems(); + + + /** + * 查询是否收藏 + * @param itemId + * @param type + * @return + */ + Boolean getIsFavorite(Long itemId,Integer type); + + +} diff --git a/common/src/main/java/io/modules/item/service/UserService.java b/common/src/main/java/io/modules/item/service/UserService.java new file mode 100644 index 0000000..7ff478c --- /dev/null +++ b/common/src/main/java/io/modules/item/service/UserService.java @@ -0,0 +1,16 @@ +package io.modules.item.service; + + +import io.common.service.CrudService; +import io.modules.item.dto.UserDTO; +import io.modules.item.entity.FrontUserEntity; + +/** + * 用户 + * + * @author Mark # + * @since 1.0.0 2025-01-14 + */ +public interface UserService extends CrudService { + +} diff --git a/common/src/main/java/io/modules/item/service/impl/AddressServiceImpl.java b/common/src/main/java/io/modules/item/service/impl/AddressServiceImpl.java new file mode 100644 index 0000000..36af9fd --- /dev/null +++ b/common/src/main/java/io/modules/item/service/impl/AddressServiceImpl.java @@ -0,0 +1,34 @@ +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.AddressDao; +import io.modules.item.dto.AddressDTO; +import io.modules.item.entity.AddressEntity; +import io.modules.item.service.AddressService; +import org.springframework.stereotype.Service; + +import java.util.Map; + +/** + * 收货地址表 + * + * @author Mark # + * @since 1.0.0 2025-02-14 + */ +@Service +public class AddressServiceImpl extends CrudServiceImpl implements AddressService { + + @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; + } + + +} \ No newline at end of file diff --git a/common/src/main/java/io/modules/item/service/impl/AreaServiceImpl.java b/common/src/main/java/io/modules/item/service/impl/AreaServiceImpl.java new file mode 100644 index 0000000..5e0b28e --- /dev/null +++ b/common/src/main/java/io/modules/item/service/impl/AreaServiceImpl.java @@ -0,0 +1,33 @@ +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.AreaDao; +import io.modules.item.dto.AreaDTO; +import io.modules.item.entity.AreaEntity; +import io.modules.item.service.AreaService; +import org.springframework.stereotype.Service; +import java.util.Map; + +/** + * 地区信息 + * + * @author Mark # + * @since 1.0.0 2025-02-14 + */ +@Service +public class AreaServiceImpl extends CrudServiceImpl implements AreaService { + + @Override + public QueryWrapper getWrapper(Map params){ + String areaId = (String)params.get("areaId"); + String father = (String)params.get("father"); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq(StrUtil.isNotBlank(areaId), "area_id", areaId); + wrapper.eq(StrUtil.isNotBlank(father), "father", father); + return wrapper; + } + + +} \ No newline at end of file diff --git a/common/src/main/java/io/modules/item/service/impl/ArticleServiceImpl.java b/common/src/main/java/io/modules/item/service/impl/ArticleServiceImpl.java new file mode 100644 index 0000000..dcbd6e0 --- /dev/null +++ b/common/src/main/java/io/modules/item/service/impl/ArticleServiceImpl.java @@ -0,0 +1,42 @@ +package io.modules.item.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; + +import io.modules.item.dao.ArticleDao; +import io.modules.item.dto.ArticleDTO; +import io.modules.item.entity.ArticleEntity; +import io.modules.item.service.ArticleService; +import cn.hutool.core.util.StrUtil; +import io.common.service.impl.CrudServiceImpl; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + * 文章表 + */ +@Service +public class ArticleServiceImpl extends CrudServiceImpl implements ArticleService { + + @Override + public QueryWrapper getWrapper(Map params){ + String id = (String)params.get("id"); + String type = (String)params.get("type"); + Long userId = (Long)params.get("userId"); + String audit = (String)params.get("audit"); + + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq(StrUtil.isNotBlank(id), "id", id); + wrapper.eq(StrUtil.isNotBlank(type), "type", type); + wrapper.eq(StrUtil.isNotBlank(audit), "audit", audit); + if (userId != null){ + wrapper.eq("user_id", userId); + } + + return wrapper; + } + + + +} diff --git a/common/src/main/java/io/modules/item/service/impl/BookServiceImpl.java b/common/src/main/java/io/modules/item/service/impl/BookServiceImpl.java new file mode 100644 index 0000000..0b223e2 --- /dev/null +++ b/common/src/main/java/io/modules/item/service/impl/BookServiceImpl.java @@ -0,0 +1,32 @@ +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.WallDao; +import io.modules.item.dto.BookDTO; +import io.modules.item.entity.BookEntity; +import io.modules.item.service.BookService; +import org.springframework.stereotype.Service; + +import java.util.Map; + + +@Service +public class BookServiceImpl extends CrudServiceImpl implements BookService { + + @Override + public QueryWrapper getWrapper(Map params){ + String id = (String)params.get("id"); + String userId = (String)params.get("userId"); + + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq(StrUtil.isNotBlank(id), "id", id); + wrapper.eq(StrUtil.isNotBlank(userId), "userId", userId); + + return wrapper; + } + + +} diff --git a/common/src/main/java/io/modules/item/service/impl/CartServiceImpl.java b/common/src/main/java/io/modules/item/service/impl/CartServiceImpl.java new file mode 100644 index 0000000..a8efec7 --- /dev/null +++ b/common/src/main/java/io/modules/item/service/impl/CartServiceImpl.java @@ -0,0 +1,36 @@ +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.CartDao; +import io.modules.item.dto.CartDTO; +import io.modules.item.entity.CartEntity; +import io.modules.item.service.CartService; +import org.springframework.stereotype.Service; + +import java.util.Map; + +/** + * 购物车 + * + * @author Mark # + * @since 1.0.0 2025-03-12 + */ +@Service +public class CartServiceImpl extends CrudServiceImpl implements CartService { + + @Override + public QueryWrapper getWrapper(Map params){ + String id = (String)params.get("id"); + String userId = (String)params.get("userId"); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq(StrUtil.isNotBlank(id), "id", id); + wrapper.eq(StrUtil.isNotBlank(userId), "user_id", userId); + + return wrapper; + } + + +} \ No newline at end of file diff --git a/common/src/main/java/io/modules/item/service/impl/CategoriesServiceImpl.java b/common/src/main/java/io/modules/item/service/impl/CategoriesServiceImpl.java new file mode 100644 index 0000000..b36dbf8 --- /dev/null +++ b/common/src/main/java/io/modules/item/service/impl/CategoriesServiceImpl.java @@ -0,0 +1,37 @@ +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.CategoriesDao; +import io.modules.item.dto.CategoriesDTO; +import io.modules.item.entity.CategoriesEntity; +import io.modules.item.service.CategoriesService; +import org.springframework.stereotype.Service; + +import java.util.Map; + +/** + * 商品分类表 + * + * @author Mark # + * @since 1.0.0 2025-02-13 + */ +@Service +public class CategoriesServiceImpl extends CrudServiceImpl implements CategoriesService { + + @Override + public QueryWrapper getWrapper(Map params){ + String id = (String)params.get("id"); + String name = (String)params.get("name"); + + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq(StrUtil.isNotBlank(id), "id", id); + wrapper.like(StrUtil.isNotBlank(name), "name", name); + + return wrapper; + } + + +} diff --git a/common/src/main/java/io/modules/item/service/impl/CityServiceImpl.java b/common/src/main/java/io/modules/item/service/impl/CityServiceImpl.java new file mode 100644 index 0000000..ac1ba30 --- /dev/null +++ b/common/src/main/java/io/modules/item/service/impl/CityServiceImpl.java @@ -0,0 +1,37 @@ +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.CityDao; +import io.modules.item.dto.CityDTO; +import io.modules.item.entity.CityEntity; +import io.modules.item.service.CityService; +import org.springframework.stereotype.Service; + +import java.util.Map; + +/** + * 城市信息 + * + * @author Mark # + * @since 1.0.0 2025-02-14 + */ +@Service +public class CityServiceImpl extends CrudServiceImpl implements CityService { + + @Override + public QueryWrapper getWrapper(Map params){ + String cityId = (String)params.get("cityId"); + String father = (String)params.get("father"); + + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq(StrUtil.isNotBlank(cityId), "city_id", cityId); + wrapper.eq(StrUtil.isNotBlank(father), "father", father); + + return wrapper; + } + + +} \ No newline at end of file diff --git a/common/src/main/java/io/modules/item/service/impl/CommentServiceImpl.java b/common/src/main/java/io/modules/item/service/impl/CommentServiceImpl.java new file mode 100644 index 0000000..c3997fe --- /dev/null +++ b/common/src/main/java/io/modules/item/service/impl/CommentServiceImpl.java @@ -0,0 +1,35 @@ +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.CommentDao; +import io.modules.item.dto.CommentDTO; +import io.modules.item.entity.CommentEntity; +import io.modules.item.service.CommentService; +import org.springframework.stereotype.Service; + +import java.util.Map; + +/** + * 评论表 + + */ +@Service +public class CommentServiceImpl extends CrudServiceImpl implements CommentService { + + @Override + public QueryWrapper getWrapper(Map params){ + String id = (String)params.get("id"); + String itemId = (String)params.get("itemId"); + + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq(StrUtil.isNotBlank(id), "id", id); + wrapper.eq(StrUtil.isNotBlank(itemId), "item_id", itemId); + wrapper.orderByDesc("create_time"); + return wrapper; + } + + +} diff --git a/common/src/main/java/io/modules/item/service/impl/DictServiceImpl.java b/common/src/main/java/io/modules/item/service/impl/DictServiceImpl.java new file mode 100644 index 0000000..af92cb2 --- /dev/null +++ b/common/src/main/java/io/modules/item/service/impl/DictServiceImpl.java @@ -0,0 +1,63 @@ +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.DictDao; +import io.modules.item.dto.DictDTO; +import io.modules.item.entity.DictEntity; +import io.modules.item.service.DictService; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * 敏感词 + * + * @author Mark # + * @since 1.0.0 2024-12-12 + */ +@Service +public class DictServiceImpl extends CrudServiceImpl implements DictService { + + @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; + } + + + @Override + public List isExistsList(String key) { + + // 存储存在的敏感词 + List result = new ArrayList<>(); + List dictEntities = baseDao.selectList(null); + + // 检查字典库是否为空 + if (dictEntities == null || dictEntities.isEmpty()) { + // 如果返回空,则可以抛出异常,或者返回空列表 + return result; + } + // 遍历字典敏感词列表,判断每个敏感词是否包含key + for (DictEntity dictEntity : dictEntities) { + // 假设 DictEntity 类有一个字段 word 存储敏感词 + String word = dictEntity.getContent(); + if (word != null && word.contains(key)) { + // 如果敏感词包含 key,则添加到结果列表中 + result.add(word); + } + } + + return result; + } +} 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..a551a15 --- /dev/null +++ b/common/src/main/java/io/modules/item/service/impl/FrontUserServiceImpl.java @@ -0,0 +1,32 @@ +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.FrontUserDao; +import io.modules.item.dto.UserDTO; +import io.modules.item.entity.FrontUserEntity; +import io.modules.item.service.UserService; +import org.springframework.stereotype.Service; + +import java.util.Map; + +/** + * 用户 + */ +@Service +public class FrontUserServiceImpl extends CrudServiceImpl implements UserService { + + @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.eq(StrUtil.isNotBlank(username), "username", username); + return wrapper; + } + + +} diff --git a/common/src/main/java/io/modules/item/service/impl/HouseServiceImpl.java b/common/src/main/java/io/modules/item/service/impl/HouseServiceImpl.java new file mode 100644 index 0000000..b1fbd1f --- /dev/null +++ b/common/src/main/java/io/modules/item/service/impl/HouseServiceImpl.java @@ -0,0 +1,133 @@ +package io.modules.item.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.common.service.impl.CrudServiceImpl; +import io.modules.item.dao.FrontUserDao; +import io.modules.item.dao.ItemDao; +import io.modules.item.dao.UserBehaviorDao; +import io.modules.item.dto.HouseDTO; +import io.modules.item.entity.HouseEntity; +import io.modules.item.entity.UserBehaviorEntity; +import io.modules.item.entity.ViewEntity; +import io.modules.item.service.HouseService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 主表 + */ +@Service +public class HouseServiceImpl extends CrudServiceImpl implements HouseService { + + + @Autowired + private FrontUserDao frontUserDao; + + @Autowired + private UserBehaviorDao userBehaviorDao; + + @Override + public QueryWrapper getWrapper(Map params){ + String title = (String)params.get("title"); + String status = (String)params.get("status"); + String view = (String)params.get("view"); + String userId = (String)params.get("userId"); + + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.like(StrUtil.isNotBlank(title), "title", title); + wrapper.like(StrUtil.isNotBlank(status), "status", status); + wrapper.like(StrUtil.isNotBlank(userId), "user_id", userId); + wrapper.orderByDesc(StrUtil.isNotBlank(view), "view"); + wrapper.orderByDesc("create_time"); + return wrapper; + } + + + @Override + public List score() { + LambdaQueryWrapper lwq = new LambdaQueryWrapper<>(); + lwq.orderByDesc(HouseEntity::getView); + + + // 创建 Page 对象,设置当前页和每页大小 + Page page = new Page<>(1, 10); // 第1页,每页10条 + + // 执行分页查询 + IPage result = baseDao.selectPage(page, lwq); + + // 获取查询结果 + List list = result.getRecords(); + return list; + } + + @Override + public List query() { + ArrayList res = new ArrayList<>(); + Long item_total = baseDao.selectCount(null); + //查询数据总和 + HashMap a1 = new HashMap<>(); + a1.put("name", "商品总量"); + a1.put("value", item_total); + a1.put("tag", "条"); + res.add(a1); + + HashMap a2 = new HashMap<>(); + a2.put("name", "用户总量"); + a2.put("value", frontUserDao.selectCount(null)); + a2.put("tag", "位"); + res.add(a2); + return res; + } + + @Override + public List view1() { + List res = baseDao.view1(); + + return res; + } + + @Override + public List commit() { + LambdaQueryWrapper lwq = new LambdaQueryWrapper<>(); + lwq.orderByDesc(HouseEntity::getView); + + // 创建 Page 对象,设置当前页和每页大小 + Page page = new Page<>(1, 10); // 第1页,每页10条 + + // 执行分页查询 + IPage result = baseDao.selectPage(page, lwq); + + // 获取查询结果 + List list = result.getRecords(); + return list; + } + + @Override + public List listUser(Long userId) { + LambdaQueryWrapper lwq = new LambdaQueryWrapper<>(); + lwq.eq(UserBehaviorEntity::getUserId,userId); + lwq.eq(UserBehaviorEntity::getType,1); + List list = userBehaviorDao.selectList(lwq); + if (list.isEmpty()){ + return new ArrayList<>(); + } + List res = new ArrayList<>(); + + for (UserBehaviorEntity userBehaviorEntity : list) { + HouseEntity itemEntity = baseDao.selectById(userBehaviorEntity.getItemId()); + if (itemEntity != null){ + res.add(itemEntity); + } + } + return res; + } +} diff --git a/common/src/main/java/io/modules/item/service/impl/OrderServiceImpl.java b/common/src/main/java/io/modules/item/service/impl/OrderServiceImpl.java new file mode 100644 index 0000000..0dcbac7 --- /dev/null +++ b/common/src/main/java/io/modules/item/service/impl/OrderServiceImpl.java @@ -0,0 +1,70 @@ +package io.modules.item.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.OrderDao; +import io.modules.item.dto.OrderDTO; +import io.modules.item.dto.UserDTO; +import io.modules.item.entity.OrderEntity; +import io.modules.item.service.OrderService; +import io.modules.item.service.UserService; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * 订单表 + */ +@Service +public class OrderServiceImpl extends CrudServiceImpl implements OrderService { + + @Autowired + private UserService userService; + + @Override + public QueryWrapper getWrapper(Map params){ + String id = (String)params.get("id"); + String status = (String)params.get("status"); + String paymentStatus = (String)params.get("paymentStatus"); + Long userId = (Long)params.get("userId"); + + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq(StrUtil.isNotBlank(id), "id", id); + wrapper.eq(StrUtil.isNotBlank(status), "status", status); + wrapper.eq(StrUtil.isNotBlank(paymentStatus), "payment_status", paymentStatus); + wrapper.eq(userId !=null, "user_id", userId); + return wrapper; + } + + /** + * 获取评论数据列表 + * @param id + * @return + */ + @Override + public List getCommintList(Long id) { + LambdaQueryWrapper lwq = new LambdaQueryWrapper<>(); + lwq.eq(OrderEntity::getStatus,"已评价"); + List list = baseDao.selectList(lwq); + List stream = list.stream().map(e -> { + OrderDTO dto = new OrderDTO(); + BeanUtils.copyProperties(e, dto); + if (dto.getUserId() != null) { + UserDTO userDTO = userService.get(e.getUserId()); + if (userDTO!= null) { + dto.setUser(userDTO); + } + } + return dto; + }).collect(Collectors.toList()); + return stream; + } +} \ No newline at end of file diff --git a/common/src/main/java/io/modules/item/service/impl/ProvinceServiceImpl.java b/common/src/main/java/io/modules/item/service/impl/ProvinceServiceImpl.java new file mode 100644 index 0000000..e3d739c --- /dev/null +++ b/common/src/main/java/io/modules/item/service/impl/ProvinceServiceImpl.java @@ -0,0 +1,96 @@ +package io.modules.item.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.AreaDao; +import io.modules.item.dao.CityDao; +import io.modules.item.dao.ProvinceDao; +import io.modules.item.dto.AreaTree; +import io.modules.item.dto.CityTree; +import io.modules.item.dto.ProvinceDTO; +import io.modules.item.dto.ProvinceTree; +import io.modules.item.entity.AreaEntity; +import io.modules.item.entity.CityEntity; +import io.modules.item.entity.ProvinceEntity; +import io.modules.item.service.CityService; +import io.modules.item.service.ProvinceService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.awt.geom.Area; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 省份信息 + */ +@Service +public class ProvinceServiceImpl extends CrudServiceImpl implements ProvinceService { + + + @Autowired + private CityDao cityRepository; + + @Autowired + private AreaDao areaRepository; + + @Override + public QueryWrapper getWrapper(Map params){ + String provinceId = (String)params.get("province_id"); + + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq(StrUtil.isNotBlank(provinceId), "province_id", provinceId); + + return wrapper; + } + + + @Override + public List tree() { + List provinces = baseDao.selectList(null); + List provinceTrees = new ArrayList<>(); + for (ProvinceEntity province : provinces) { + ProvinceTree provinceTree = new ProvinceTree(); + provinceTree.setValue(province.getId()); + provinceTree.setLabel(province.getProvince()); + provinceTree.setChildren(getCityTree(province.getProvinceId())); // 获取该省的城市树 + provinceTrees.add(provinceTree); + } + return provinceTrees; + } + private List getCityTree(String provinceId) { + + LambdaQueryWrapper lwq = new LambdaQueryWrapper<>(); + lwq.eq(CityEntity::getFather, provinceId); + List cities = cityRepository.selectList(lwq); + List cityTrees = new ArrayList<>(); + for (CityEntity city : cities) { + CityTree cityTree = new CityTree(); + cityTree.setValue(city.getId()); + cityTree.setLabel(city.getCity()); + cityTree.setChildren(getAreaTree(city.getCityId())); // 获取该城市的地区树 + cityTrees.add(cityTree); + } + return cityTrees; + } + + + private List getAreaTree(String cityId) { + LambdaQueryWrapper lwq = new LambdaQueryWrapper<>(); + lwq.eq(AreaEntity::getFather, cityId); + List areas = areaRepository.selectList(lwq); + List areaTrees = new ArrayList<>(); + for (AreaEntity area : areas) { + AreaTree areaTree = new AreaTree(); + areaTree.setValue(area.getId()); + areaTree.setLabel(area.getArea()); + areaTrees.add(areaTree); + } + return areaTrees; + } + +} \ No newline at end of file diff --git a/common/src/main/java/io/modules/item/service/impl/SlidesServiceImpl.java b/common/src/main/java/io/modules/item/service/impl/SlidesServiceImpl.java new file mode 100644 index 0000000..0a10ad6 --- /dev/null +++ b/common/src/main/java/io/modules/item/service/impl/SlidesServiceImpl.java @@ -0,0 +1,34 @@ +package io.modules.item.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import io.modules.item.dao.SlidesDao; +import io.modules.item.dto.SlidesDTO; +import io.modules.item.entity.SlidesEntity; +import io.modules.item.service.SlidesService; +import cn.hutool.core.util.StrUtil; +import io.common.service.impl.CrudServiceImpl; +import org.springframework.stereotype.Service; + +import java.util.Map; + +/** + * 轮播图 + + */ +@Service +public class SlidesServiceImpl extends CrudServiceImpl implements SlidesService { + + @Override + public QueryWrapper getWrapper(Map params){ + String id = (String)params.get("id"); + String type = (String)params.get("type"); + + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq(StrUtil.isNotBlank(id), "id", id); + wrapper.eq(StrUtil.isNotBlank(type), "type", type); + + return wrapper; + } + + +} diff --git a/common/src/main/java/io/modules/item/service/impl/UserBehaviorServiceImpl.java b/common/src/main/java/io/modules/item/service/impl/UserBehaviorServiceImpl.java new file mode 100644 index 0000000..40207dc --- /dev/null +++ b/common/src/main/java/io/modules/item/service/impl/UserBehaviorServiceImpl.java @@ -0,0 +1,90 @@ +package io.modules.item.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.UserBehaviorDao; +import io.modules.item.dto.UserBehaviorDTO; +import io.modules.item.entity.UserBehaviorEntity; +import io.modules.item.service.UserBehaviorService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 用户行为表 + * + * @author Mark # + * @since 1.0.0 2024-12-16 + */ +@Service +public class UserBehaviorServiceImpl extends CrudServiceImpl implements UserBehaviorService { + + @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; + } + + + @Override + public Boolean isExists(UserBehaviorDTO dto) { + LambdaQueryWrapper lwq = new LambdaQueryWrapper<>(); + lwq.eq(UserBehaviorEntity::getType, dto.getType()); + lwq.eq(UserBehaviorEntity::getUserId, dto.getUserId()); + lwq.eq(UserBehaviorEntity::getItemId, dto.getItemId()); + Long count = baseDao.selectCount(lwq); + if (count == 0) { + return false; + } + return true; + } + + @Override + public void deleteUserBehavior(UserBehaviorDTO dto) { + LambdaQueryWrapper lwq = new LambdaQueryWrapper<>(); + lwq.eq(UserBehaviorEntity::getType, dto.getType()); + lwq.eq(UserBehaviorEntity::getUserId, dto.getUserId()); + lwq.eq(UserBehaviorEntity::getItemId, dto.getItemId()); + baseDao.delete(lwq); + + } + + @Override + public List getTopItems() { + QueryWrapper queryWrapper = new QueryWrapper<>(); + + // 聚合查询: 统计每个 item_id 的行为次数 + queryWrapper.select("item_id", "COUNT(*) as sum") + .groupBy("item_id") + .orderByDesc("sum") + .last("LIMIT 10"); // MyBatis Plus 支持原生 SQL 扩展 + List selectList = baseDao.selectList(queryWrapper); + // 使用 Java Stream 提取 item_id + List itemIds = selectList.stream() + .map(UserBehaviorEntity::getItemId) // 提取 item_id + .collect(Collectors.toList()); // 收集到一个 List 中 + return itemIds; + } + + @Override + public Boolean getIsFavorite(Long itemId, Integer type) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(UserBehaviorEntity::getItemId,itemId); + wrapper.eq(UserBehaviorEntity::getType,type); + List list = baseDao.selectList(wrapper); + if (list.isEmpty()){ + return false; + } + return true; + } + +} diff --git a/db/block_house.sql b/db/block_house.sql new file mode 100644 index 0000000..bee26a8 --- /dev/null +++ b/db/block_house.sql @@ -0,0 +1,3930 @@ +/* + Navicat Premium Data Transfer + + Source Server : localhost33060 + Source Server Type : MySQL + Source Server Version : 50744 + Source Host : localhost:33060 + Source Schema : block_house + + Target Server Type : MySQL + Target Server Version : 50744 + File Encoding : 65001 + + Date: 22/05/2025 13:34:09 +*/ + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- 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, 'dd6f92f81078380c68b34d52a4ec0f90', '2025-05-23 00:57:36', '2025-05-22 12:57:36', '2024-12-03 20:36:36'); + +-- ---------------------------- +-- Table structure for tb_address +-- ---------------------------- +DROP TABLE IF EXISTS `tb_address`; +CREATE TABLE `tb_address` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '编号', + `user_id` bigint(20) NULL DEFAULT NULL COMMENT '用户编号', + `recipient_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '收货人姓名', + `address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '详细地址', + `province` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '省份', + `city` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '城市', + `area` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '区域/街道', + `phone` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '收货人联系电话', + `is_default` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否是默认地址', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1899688916638879747 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '收货地址表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of tb_address +-- ---------------------------- +INSERT INTO `tb_address` VALUES (1895125766954299394, NULL, '小王', '菜鸟驿站', NULL, '山西省,阳泉市,城 区', NULL, '15477885623', 0, '2025-02-27 14:56:07'); +INSERT INTO `tb_address` VALUES (1899688916638879746, NULL, '李三', '东城区', NULL, '北京市,市辖区,西城区', NULL, '18796357898', 0, '2025-03-12 05:08:26'); + +-- ---------------------------- +-- Table structure for tb_area +-- ---------------------------- +DROP TABLE IF EXISTS `tb_area`; +CREATE TABLE `tb_area` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `area_id` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `area` varchar(60) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `father` varchar(6) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE = MyISAM AUTO_INCREMENT = 3145 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '地区信息' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of tb_area +-- ---------------------------- +INSERT INTO `tb_area` VALUES (1, '110101', '东城区', '110100'); +INSERT INTO `tb_area` VALUES (2, '110102', '西城区', '110100'); +INSERT INTO `tb_area` VALUES (3, '110103', '崇文区', '110100'); +INSERT INTO `tb_area` VALUES (4, '110104', '宣武区', '110100'); +INSERT INTO `tb_area` VALUES (5, '110105', '朝阳区', '110100'); +INSERT INTO `tb_area` VALUES (6, '110106', '丰台区', '110100'); +INSERT INTO `tb_area` VALUES (7, '110107', '石景山区', '110100'); +INSERT INTO `tb_area` VALUES (8, '110108', '海淀区', '110100'); +INSERT INTO `tb_area` VALUES (9, '110109', '门头沟区', '110100'); +INSERT INTO `tb_area` VALUES (10, '110111', '房山区', '110100'); +INSERT INTO `tb_area` VALUES (11, '110112', '通州区', '110100'); +INSERT INTO `tb_area` VALUES (12, '110113', '顺义区', '110100'); +INSERT INTO `tb_area` VALUES (13, '110114', '昌平区', '110100'); +INSERT INTO `tb_area` VALUES (14, '110115', '大兴区', '110100'); +INSERT INTO `tb_area` VALUES (15, '110116', '怀柔区', '110100'); +INSERT INTO `tb_area` VALUES (16, '110117', '平谷区', '110100'); +INSERT INTO `tb_area` VALUES (17, '110228', '密云县', '110200'); +INSERT INTO `tb_area` VALUES (18, '110229', '延庆县', '110200'); +INSERT INTO `tb_area` VALUES (19, '120101', '和平区', '120100'); +INSERT INTO `tb_area` VALUES (20, '120102', '河东区', '120100'); +INSERT INTO `tb_area` VALUES (21, '120103', '河西区', '120100'); +INSERT INTO `tb_area` VALUES (22, '120104', '南开区', '120100'); +INSERT INTO `tb_area` VALUES (23, '120105', '河北区', '120100'); +INSERT INTO `tb_area` VALUES (24, '120106', '红桥区', '120100'); +INSERT INTO `tb_area` VALUES (25, '120107', '塘沽区', '120100'); +INSERT INTO `tb_area` VALUES (26, '120108', '汉沽区', '120100'); +INSERT INTO `tb_area` VALUES (27, '120109', '大港区', '120100'); +INSERT INTO `tb_area` VALUES (28, '120110', '东丽区', '120100'); +INSERT INTO `tb_area` VALUES (29, '120111', '西青区', '120100'); +INSERT INTO `tb_area` VALUES (30, '120112', '津南区', '120100'); +INSERT INTO `tb_area` VALUES (31, '120113', '北辰区', '120100'); +INSERT INTO `tb_area` VALUES (32, '120114', '武清区', '120100'); +INSERT INTO `tb_area` VALUES (33, '120115', '宝坻区', '120100'); +INSERT INTO `tb_area` VALUES (34, '120221', '宁河县', '120200'); +INSERT INTO `tb_area` VALUES (35, '120223', '静海县', '120200'); +INSERT INTO `tb_area` VALUES (36, '120225', '蓟 县', '120200'); +INSERT INTO `tb_area` VALUES (37, '130101', '市辖区', '130100'); +INSERT INTO `tb_area` VALUES (38, '130102', '长安区', '130100'); +INSERT INTO `tb_area` VALUES (39, '130103', '桥东区', '130100'); +INSERT INTO `tb_area` VALUES (40, '130104', '桥西区', '130100'); +INSERT INTO `tb_area` VALUES (41, '130105', '新华区', '130100'); +INSERT INTO `tb_area` VALUES (42, '130107', '井陉矿区', '130100'); +INSERT INTO `tb_area` VALUES (43, '130108', '裕华区', '130100'); +INSERT INTO `tb_area` VALUES (44, '130121', '井陉县', '130100'); +INSERT INTO `tb_area` VALUES (45, '130123', '正定县', '130100'); +INSERT INTO `tb_area` VALUES (46, '130124', '栾城县', '130100'); +INSERT INTO `tb_area` VALUES (47, '130125', '行唐县', '130100'); +INSERT INTO `tb_area` VALUES (48, '130126', '灵寿县', '130100'); +INSERT INTO `tb_area` VALUES (49, '130127', '高邑县', '130100'); +INSERT INTO `tb_area` VALUES (50, '130128', '深泽县', '130100'); +INSERT INTO `tb_area` VALUES (51, '130129', '赞皇县', '130100'); +INSERT INTO `tb_area` VALUES (52, '130130', '无极县', '130100'); +INSERT INTO `tb_area` VALUES (53, '130131', '平山县', '130100'); +INSERT INTO `tb_area` VALUES (54, '130132', '元氏县', '130100'); +INSERT INTO `tb_area` VALUES (55, '130133', '赵 县', '130100'); +INSERT INTO `tb_area` VALUES (56, '130181', '辛集市', '130100'); +INSERT INTO `tb_area` VALUES (57, '130182', '藁城市', '130100'); +INSERT INTO `tb_area` VALUES (58, '130183', '晋州市', '130100'); +INSERT INTO `tb_area` VALUES (59, '130184', '新乐市', '130100'); +INSERT INTO `tb_area` VALUES (60, '130185', '鹿泉市', '130100'); +INSERT INTO `tb_area` VALUES (61, '130201', '市辖区', '130200'); +INSERT INTO `tb_area` VALUES (62, '130202', '路南区', '130200'); +INSERT INTO `tb_area` VALUES (63, '130203', '路北区', '130200'); +INSERT INTO `tb_area` VALUES (64, '130204', '古冶区', '130200'); +INSERT INTO `tb_area` VALUES (65, '130205', '开平区', '130200'); +INSERT INTO `tb_area` VALUES (66, '130207', '丰南区', '130200'); +INSERT INTO `tb_area` VALUES (67, '130208', '丰润区', '130200'); +INSERT INTO `tb_area` VALUES (68, '130223', '滦 县', '130200'); +INSERT INTO `tb_area` VALUES (69, '130224', '滦南县', '130200'); +INSERT INTO `tb_area` VALUES (70, '130225', '乐亭县', '130200'); +INSERT INTO `tb_area` VALUES (71, '130227', '迁西县', '130200'); +INSERT INTO `tb_area` VALUES (72, '130229', '玉田县', '130200'); +INSERT INTO `tb_area` VALUES (73, '130230', '唐海县', '130200'); +INSERT INTO `tb_area` VALUES (74, '130281', '遵化市', '130200'); +INSERT INTO `tb_area` VALUES (75, '130283', '迁安市', '130200'); +INSERT INTO `tb_area` VALUES (76, '130301', '市辖区', '130300'); +INSERT INTO `tb_area` VALUES (77, '130302', '海港区', '130300'); +INSERT INTO `tb_area` VALUES (78, '130303', '山海关区', '130300'); +INSERT INTO `tb_area` VALUES (79, '130304', '北戴河区', '130300'); +INSERT INTO `tb_area` VALUES (80, '130321', '青龙满族自治县', '130300'); +INSERT INTO `tb_area` VALUES (81, '130322', '昌黎县', '130300'); +INSERT INTO `tb_area` VALUES (82, '130323', '抚宁县', '130300'); +INSERT INTO `tb_area` VALUES (83, '130324', '卢龙县', '130300'); +INSERT INTO `tb_area` VALUES (84, '130401', '市辖区', '130400'); +INSERT INTO `tb_area` VALUES (85, '130402', '邯山区', '130400'); +INSERT INTO `tb_area` VALUES (86, '130403', '丛台区', '130400'); +INSERT INTO `tb_area` VALUES (87, '130404', '复兴区', '130400'); +INSERT INTO `tb_area` VALUES (88, '130406', '峰峰矿区', '130400'); +INSERT INTO `tb_area` VALUES (89, '130421', '邯郸县', '130400'); +INSERT INTO `tb_area` VALUES (90, '130423', '临漳县', '130400'); +INSERT INTO `tb_area` VALUES (91, '130424', '成安县', '130400'); +INSERT INTO `tb_area` VALUES (92, '130425', '大名县', '130400'); +INSERT INTO `tb_area` VALUES (93, '130426', '涉 县', '130400'); +INSERT INTO `tb_area` VALUES (94, '130427', '磁 县', '130400'); +INSERT INTO `tb_area` VALUES (95, '130428', '肥乡县', '130400'); +INSERT INTO `tb_area` VALUES (96, '130429', '永年县', '130400'); +INSERT INTO `tb_area` VALUES (97, '130430', '邱 县', '130400'); +INSERT INTO `tb_area` VALUES (98, '130431', '鸡泽县', '130400'); +INSERT INTO `tb_area` VALUES (99, '130432', '广平县', '130400'); +INSERT INTO `tb_area` VALUES (100, '130433', '馆陶县', '130400'); +INSERT INTO `tb_area` VALUES (101, '130434', '魏 县', '130400'); +INSERT INTO `tb_area` VALUES (102, '130435', '曲周县', '130400'); +INSERT INTO `tb_area` VALUES (103, '130481', '武安市', '130400'); +INSERT INTO `tb_area` VALUES (104, '130501', '市辖区', '130500'); +INSERT INTO `tb_area` VALUES (105, '130502', '桥东区', '130500'); +INSERT INTO `tb_area` VALUES (106, '130503', '桥西区', '130500'); +INSERT INTO `tb_area` VALUES (107, '130521', '邢台县', '130500'); +INSERT INTO `tb_area` VALUES (108, '130522', '临城县', '130500'); +INSERT INTO `tb_area` VALUES (109, '130523', '内丘县', '130500'); +INSERT INTO `tb_area` VALUES (110, '130524', '柏乡县', '130500'); +INSERT INTO `tb_area` VALUES (111, '130525', '隆尧县', '130500'); +INSERT INTO `tb_area` VALUES (112, '130526', '任 县', '130500'); +INSERT INTO `tb_area` VALUES (113, '130527', '南和县', '130500'); +INSERT INTO `tb_area` VALUES (114, '130528', '宁晋县', '130500'); +INSERT INTO `tb_area` VALUES (115, '130529', '巨鹿县', '130500'); +INSERT INTO `tb_area` VALUES (116, '130530', '新河县', '130500'); +INSERT INTO `tb_area` VALUES (117, '130531', '广宗县', '130500'); +INSERT INTO `tb_area` VALUES (118, '130532', '平乡县', '130500'); +INSERT INTO `tb_area` VALUES (119, '130533', '威 县', '130500'); +INSERT INTO `tb_area` VALUES (120, '130534', '清河县', '130500'); +INSERT INTO `tb_area` VALUES (121, '130535', '临西县', '130500'); +INSERT INTO `tb_area` VALUES (122, '130581', '南宫市', '130500'); +INSERT INTO `tb_area` VALUES (123, '130582', '沙河市', '130500'); +INSERT INTO `tb_area` VALUES (124, '130601', '市辖区', '130600'); +INSERT INTO `tb_area` VALUES (125, '130602', '新市区', '130600'); +INSERT INTO `tb_area` VALUES (126, '130603', '北市区', '130600'); +INSERT INTO `tb_area` VALUES (127, '130604', '南市区', '130600'); +INSERT INTO `tb_area` VALUES (128, '130621', '满城县', '130600'); +INSERT INTO `tb_area` VALUES (129, '130622', '清苑县', '130600'); +INSERT INTO `tb_area` VALUES (130, '130623', '涞水县', '130600'); +INSERT INTO `tb_area` VALUES (131, '130624', '阜平县', '130600'); +INSERT INTO `tb_area` VALUES (132, '130625', '徐水县', '130600'); +INSERT INTO `tb_area` VALUES (133, '130626', '定兴县', '130600'); +INSERT INTO `tb_area` VALUES (134, '130627', '唐 县', '130600'); +INSERT INTO `tb_area` VALUES (135, '130628', '高阳县', '130600'); +INSERT INTO `tb_area` VALUES (136, '130629', '容城县', '130600'); +INSERT INTO `tb_area` VALUES (137, '130630', '涞源县', '130600'); +INSERT INTO `tb_area` VALUES (138, '130631', '望都县', '130600'); +INSERT INTO `tb_area` VALUES (139, '130632', '安新县', '130600'); +INSERT INTO `tb_area` VALUES (140, '130633', '易 县', '130600'); +INSERT INTO `tb_area` VALUES (141, '130634', '曲阳县', '130600'); +INSERT INTO `tb_area` VALUES (142, '130635', '蠡 县', '130600'); +INSERT INTO `tb_area` VALUES (143, '130636', '顺平县', '130600'); +INSERT INTO `tb_area` VALUES (144, '130637', '博野县', '130600'); +INSERT INTO `tb_area` VALUES (145, '130638', '雄 县', '130600'); +INSERT INTO `tb_area` VALUES (146, '130681', '涿州市', '130600'); +INSERT INTO `tb_area` VALUES (147, '130682', '定州市', '130600'); +INSERT INTO `tb_area` VALUES (148, '130683', '安国市', '130600'); +INSERT INTO `tb_area` VALUES (149, '130684', '高碑店市', '130600'); +INSERT INTO `tb_area` VALUES (150, '130701', '市辖区', '130700'); +INSERT INTO `tb_area` VALUES (151, '130702', '桥东区', '130700'); +INSERT INTO `tb_area` VALUES (152, '130703', '桥西区', '130700'); +INSERT INTO `tb_area` VALUES (153, '130705', '宣化区', '130700'); +INSERT INTO `tb_area` VALUES (154, '130706', '下花园区', '130700'); +INSERT INTO `tb_area` VALUES (155, '130721', '宣化县', '130700'); +INSERT INTO `tb_area` VALUES (156, '130722', '张北县', '130700'); +INSERT INTO `tb_area` VALUES (157, '130723', '康保县', '130700'); +INSERT INTO `tb_area` VALUES (158, '130724', '沽源县', '130700'); +INSERT INTO `tb_area` VALUES (159, '130725', '尚义县', '130700'); +INSERT INTO `tb_area` VALUES (160, '130726', '蔚 县', '130700'); +INSERT INTO `tb_area` VALUES (161, '130727', '阳原县', '130700'); +INSERT INTO `tb_area` VALUES (162, '130728', '怀安县', '130700'); +INSERT INTO `tb_area` VALUES (163, '130729', '万全县', '130700'); +INSERT INTO `tb_area` VALUES (164, '130730', '怀来县', '130700'); +INSERT INTO `tb_area` VALUES (165, '130731', '涿鹿县', '130700'); +INSERT INTO `tb_area` VALUES (166, '130732', '赤城县', '130700'); +INSERT INTO `tb_area` VALUES (167, '130733', '崇礼县', '130700'); +INSERT INTO `tb_area` VALUES (168, '130801', '市辖区', '130800'); +INSERT INTO `tb_area` VALUES (169, '130802', '双桥区', '130800'); +INSERT INTO `tb_area` VALUES (170, '130803', '双滦区', '130800'); +INSERT INTO `tb_area` VALUES (171, '130804', '鹰手营子矿区', '130800'); +INSERT INTO `tb_area` VALUES (172, '130821', '承德县', '130800'); +INSERT INTO `tb_area` VALUES (173, '130822', '兴隆县', '130800'); +INSERT INTO `tb_area` VALUES (174, '130823', '平泉县', '130800'); +INSERT INTO `tb_area` VALUES (175, '130824', '滦平县', '130800'); +INSERT INTO `tb_area` VALUES (176, '130825', '隆化县', '130800'); +INSERT INTO `tb_area` VALUES (177, '130826', '丰宁满族自治县', '130800'); +INSERT INTO `tb_area` VALUES (178, '130827', '宽城满族自治县', '130800'); +INSERT INTO `tb_area` VALUES (179, '130828', '围场满族蒙古族自治县', '130800'); +INSERT INTO `tb_area` VALUES (180, '130901', '市辖区', '130900'); +INSERT INTO `tb_area` VALUES (181, '130902', '新华区', '130900'); +INSERT INTO `tb_area` VALUES (182, '130903', '运河区', '130900'); +INSERT INTO `tb_area` VALUES (183, '130921', '沧 县', '130900'); +INSERT INTO `tb_area` VALUES (184, '130922', '青 县', '130900'); +INSERT INTO `tb_area` VALUES (185, '130923', '东光县', '130900'); +INSERT INTO `tb_area` VALUES (186, '130924', '海兴县', '130900'); +INSERT INTO `tb_area` VALUES (187, '130925', '盐山县', '130900'); +INSERT INTO `tb_area` VALUES (188, '130926', '肃宁县', '130900'); +INSERT INTO `tb_area` VALUES (189, '130927', '南皮县', '130900'); +INSERT INTO `tb_area` VALUES (190, '130928', '吴桥县', '130900'); +INSERT INTO `tb_area` VALUES (191, '130929', '献 县', '130900'); +INSERT INTO `tb_area` VALUES (192, '130930', '孟村回族自治县', '130900'); +INSERT INTO `tb_area` VALUES (193, '130981', '泊头市', '130900'); +INSERT INTO `tb_area` VALUES (194, '130982', '任丘市', '130900'); +INSERT INTO `tb_area` VALUES (195, '130983', '黄骅市', '130900'); +INSERT INTO `tb_area` VALUES (196, '130984', '河间市', '130900'); +INSERT INTO `tb_area` VALUES (197, '131001', '市辖区', '131000'); +INSERT INTO `tb_area` VALUES (198, '131002', '安次区', '131000'); +INSERT INTO `tb_area` VALUES (199, '131003', '广阳区', '131000'); +INSERT INTO `tb_area` VALUES (200, '131022', '固安县', '131000'); +INSERT INTO `tb_area` VALUES (201, '131023', '永清县', '131000'); +INSERT INTO `tb_area` VALUES (202, '131024', '香河县', '131000'); +INSERT INTO `tb_area` VALUES (203, '131025', '大城县', '131000'); +INSERT INTO `tb_area` VALUES (204, '131026', '文安县', '131000'); +INSERT INTO `tb_area` VALUES (205, '131028', '大厂回族自治县', '131000'); +INSERT INTO `tb_area` VALUES (206, '131081', '霸州市', '131000'); +INSERT INTO `tb_area` VALUES (207, '131082', '三河市', '131000'); +INSERT INTO `tb_area` VALUES (208, '131101', '市辖区', '131100'); +INSERT INTO `tb_area` VALUES (209, '131102', '桃城区', '131100'); +INSERT INTO `tb_area` VALUES (210, '131121', '枣强县', '131100'); +INSERT INTO `tb_area` VALUES (211, '131122', '武邑县', '131100'); +INSERT INTO `tb_area` VALUES (212, '131123', '武强县', '131100'); +INSERT INTO `tb_area` VALUES (213, '131124', '饶阳县', '131100'); +INSERT INTO `tb_area` VALUES (214, '131125', '安平县', '131100'); +INSERT INTO `tb_area` VALUES (215, '131126', '故城县', '131100'); +INSERT INTO `tb_area` VALUES (216, '131127', '景 县', '131100'); +INSERT INTO `tb_area` VALUES (217, '131128', '阜城县', '131100'); +INSERT INTO `tb_area` VALUES (218, '131181', '冀州市', '131100'); +INSERT INTO `tb_area` VALUES (219, '131182', '深州市', '131100'); +INSERT INTO `tb_area` VALUES (220, '140101', '市辖区', '140100'); +INSERT INTO `tb_area` VALUES (221, '140105', '小店区', '140100'); +INSERT INTO `tb_area` VALUES (222, '140106', '迎泽区', '140100'); +INSERT INTO `tb_area` VALUES (223, '140107', '杏花岭区', '140100'); +INSERT INTO `tb_area` VALUES (224, '140108', '尖草坪区', '140100'); +INSERT INTO `tb_area` VALUES (225, '140109', '万柏林区', '140100'); +INSERT INTO `tb_area` VALUES (226, '140110', '晋源区', '140100'); +INSERT INTO `tb_area` VALUES (227, '140121', '清徐县', '140100'); +INSERT INTO `tb_area` VALUES (228, '140122', '阳曲县', '140100'); +INSERT INTO `tb_area` VALUES (229, '140123', '娄烦县', '140100'); +INSERT INTO `tb_area` VALUES (230, '140181', '古交市', '140100'); +INSERT INTO `tb_area` VALUES (231, '140201', '市辖区', '140200'); +INSERT INTO `tb_area` VALUES (232, '140202', '城 区', '140200'); +INSERT INTO `tb_area` VALUES (233, '140203', '矿 区', '140200'); +INSERT INTO `tb_area` VALUES (234, '140211', '南郊区', '140200'); +INSERT INTO `tb_area` VALUES (235, '140212', '新荣区', '140200'); +INSERT INTO `tb_area` VALUES (236, '140221', '阳高县', '140200'); +INSERT INTO `tb_area` VALUES (237, '140222', '天镇县', '140200'); +INSERT INTO `tb_area` VALUES (238, '140223', '广灵县', '140200'); +INSERT INTO `tb_area` VALUES (239, '140224', '灵丘县', '140200'); +INSERT INTO `tb_area` VALUES (240, '140225', '浑源县', '140200'); +INSERT INTO `tb_area` VALUES (241, '140226', '左云县', '140200'); +INSERT INTO `tb_area` VALUES (242, '140227', '大同县', '140200'); +INSERT INTO `tb_area` VALUES (243, '140301', '市辖区', '140300'); +INSERT INTO `tb_area` VALUES (244, '140302', '城 区', '140300'); +INSERT INTO `tb_area` VALUES (245, '140303', '矿 区', '140300'); +INSERT INTO `tb_area` VALUES (246, '140311', '郊 区', '140300'); +INSERT INTO `tb_area` VALUES (247, '140321', '平定县', '140300'); +INSERT INTO `tb_area` VALUES (248, '140322', '盂 县', '140300'); +INSERT INTO `tb_area` VALUES (249, '140401', '市辖区', '140400'); +INSERT INTO `tb_area` VALUES (250, '140402', '城 区', '140400'); +INSERT INTO `tb_area` VALUES (251, '140411', '郊 区', '140400'); +INSERT INTO `tb_area` VALUES (252, '140421', '长治县', '140400'); +INSERT INTO `tb_area` VALUES (253, '140423', '襄垣县', '140400'); +INSERT INTO `tb_area` VALUES (254, '140424', '屯留县', '140400'); +INSERT INTO `tb_area` VALUES (255, '140425', '平顺县', '140400'); +INSERT INTO `tb_area` VALUES (256, '140426', '黎城县', '140400'); +INSERT INTO `tb_area` VALUES (257, '140427', '壶关县', '140400'); +INSERT INTO `tb_area` VALUES (258, '140428', '长子县', '140400'); +INSERT INTO `tb_area` VALUES (259, '140429', '武乡县', '140400'); +INSERT INTO `tb_area` VALUES (260, '140430', '沁 县', '140400'); +INSERT INTO `tb_area` VALUES (261, '140431', '沁源县', '140400'); +INSERT INTO `tb_area` VALUES (262, '140481', '潞城市', '140400'); +INSERT INTO `tb_area` VALUES (263, '140501', '市辖区', '140500'); +INSERT INTO `tb_area` VALUES (264, '140502', '城 区', '140500'); +INSERT INTO `tb_area` VALUES (265, '140521', '沁水县', '140500'); +INSERT INTO `tb_area` VALUES (266, '140522', '阳城县', '140500'); +INSERT INTO `tb_area` VALUES (267, '140524', '陵川县', '140500'); +INSERT INTO `tb_area` VALUES (268, '140525', '泽州县', '140500'); +INSERT INTO `tb_area` VALUES (269, '140581', '高平市', '140500'); +INSERT INTO `tb_area` VALUES (270, '140601', '市辖区', '140600'); +INSERT INTO `tb_area` VALUES (271, '140602', '朔城区', '140600'); +INSERT INTO `tb_area` VALUES (272, '140603', '平鲁区', '140600'); +INSERT INTO `tb_area` VALUES (273, '140621', '山阴县', '140600'); +INSERT INTO `tb_area` VALUES (274, '140622', '应 县', '140600'); +INSERT INTO `tb_area` VALUES (275, '140623', '右玉县', '140600'); +INSERT INTO `tb_area` VALUES (276, '140624', '怀仁县', '140600'); +INSERT INTO `tb_area` VALUES (277, '140701', '市辖区', '140700'); +INSERT INTO `tb_area` VALUES (278, '140702', '榆次区', '140700'); +INSERT INTO `tb_area` VALUES (279, '140721', '榆社县', '140700'); +INSERT INTO `tb_area` VALUES (280, '140722', '左权县', '140700'); +INSERT INTO `tb_area` VALUES (281, '140723', '和顺县', '140700'); +INSERT INTO `tb_area` VALUES (282, '140724', '昔阳县', '140700'); +INSERT INTO `tb_area` VALUES (283, '140725', '寿阳县', '140700'); +INSERT INTO `tb_area` VALUES (284, '140726', '太谷县', '140700'); +INSERT INTO `tb_area` VALUES (285, '140727', '祁 县', '140700'); +INSERT INTO `tb_area` VALUES (286, '140728', '平遥县', '140700'); +INSERT INTO `tb_area` VALUES (287, '140729', '灵石县', '140700'); +INSERT INTO `tb_area` VALUES (288, '140781', '介休市', '140700'); +INSERT INTO `tb_area` VALUES (289, '140801', '市辖区', '140800'); +INSERT INTO `tb_area` VALUES (290, '140802', '盐湖区', '140800'); +INSERT INTO `tb_area` VALUES (291, '140821', '临猗县', '140800'); +INSERT INTO `tb_area` VALUES (292, '140822', '万荣县', '140800'); +INSERT INTO `tb_area` VALUES (293, '140823', '闻喜县', '140800'); +INSERT INTO `tb_area` VALUES (294, '140824', '稷山县', '140800'); +INSERT INTO `tb_area` VALUES (295, '140825', '新绛县', '140800'); +INSERT INTO `tb_area` VALUES (296, '140826', '绛 县', '140800'); +INSERT INTO `tb_area` VALUES (297, '140827', '垣曲县', '140800'); +INSERT INTO `tb_area` VALUES (298, '140828', '夏 县', '140800'); +INSERT INTO `tb_area` VALUES (299, '140829', '平陆县', '140800'); +INSERT INTO `tb_area` VALUES (300, '140830', '芮城县', '140800'); +INSERT INTO `tb_area` VALUES (301, '140881', '永济市', '140800'); +INSERT INTO `tb_area` VALUES (302, '140882', '河津市', '140800'); +INSERT INTO `tb_area` VALUES (303, '140901', '市辖区', '140900'); +INSERT INTO `tb_area` VALUES (304, '140902', '忻府区', '140900'); +INSERT INTO `tb_area` VALUES (305, '140921', '定襄县', '140900'); +INSERT INTO `tb_area` VALUES (306, '140922', '五台县', '140900'); +INSERT INTO `tb_area` VALUES (307, '140923', '代 县', '140900'); +INSERT INTO `tb_area` VALUES (308, '140924', '繁峙县', '140900'); +INSERT INTO `tb_area` VALUES (309, '140925', '宁武县', '140900'); +INSERT INTO `tb_area` VALUES (310, '140926', '静乐县', '140900'); +INSERT INTO `tb_area` VALUES (311, '140927', '神池县', '140900'); +INSERT INTO `tb_area` VALUES (312, '140928', '五寨县', '140900'); +INSERT INTO `tb_area` VALUES (313, '140929', '岢岚县', '140900'); +INSERT INTO `tb_area` VALUES (314, '140930', '河曲县', '140900'); +INSERT INTO `tb_area` VALUES (315, '140931', '保德县', '140900'); +INSERT INTO `tb_area` VALUES (316, '140932', '偏关县', '140900'); +INSERT INTO `tb_area` VALUES (317, '140981', '原平市', '140900'); +INSERT INTO `tb_area` VALUES (318, '141001', '市辖区', '141000'); +INSERT INTO `tb_area` VALUES (319, '141002', '尧都区', '141000'); +INSERT INTO `tb_area` VALUES (320, '141021', '曲沃县', '141000'); +INSERT INTO `tb_area` VALUES (321, '141022', '翼城县', '141000'); +INSERT INTO `tb_area` VALUES (322, '141023', '襄汾县', '141000'); +INSERT INTO `tb_area` VALUES (323, '141024', '洪洞县', '141000'); +INSERT INTO `tb_area` VALUES (324, '141025', '古 县', '141000'); +INSERT INTO `tb_area` VALUES (325, '141026', '安泽县', '141000'); +INSERT INTO `tb_area` VALUES (326, '141027', '浮山县', '141000'); +INSERT INTO `tb_area` VALUES (327, '141028', '吉 县', '141000'); +INSERT INTO `tb_area` VALUES (328, '141029', '乡宁县', '141000'); +INSERT INTO `tb_area` VALUES (329, '141030', '大宁县', '141000'); +INSERT INTO `tb_area` VALUES (330, '141031', '隰 县', '141000'); +INSERT INTO `tb_area` VALUES (331, '141032', '永和县', '141000'); +INSERT INTO `tb_area` VALUES (332, '141033', '蒲 县', '141000'); +INSERT INTO `tb_area` VALUES (333, '141034', '汾西县', '141000'); +INSERT INTO `tb_area` VALUES (334, '141081', '侯马市', '141000'); +INSERT INTO `tb_area` VALUES (335, '141082', '霍州市', '141000'); +INSERT INTO `tb_area` VALUES (336, '141101', '市辖区', '141100'); +INSERT INTO `tb_area` VALUES (337, '141102', '离石区', '141100'); +INSERT INTO `tb_area` VALUES (338, '141121', '文水县', '141100'); +INSERT INTO `tb_area` VALUES (339, '141122', '交城县', '141100'); +INSERT INTO `tb_area` VALUES (340, '141123', '兴 县', '141100'); +INSERT INTO `tb_area` VALUES (341, '141124', '临 县', '141100'); +INSERT INTO `tb_area` VALUES (342, '141125', '柳林县', '141100'); +INSERT INTO `tb_area` VALUES (343, '141126', '石楼县', '141100'); +INSERT INTO `tb_area` VALUES (344, '141127', '岚 县', '141100'); +INSERT INTO `tb_area` VALUES (345, '141128', '方山县', '141100'); +INSERT INTO `tb_area` VALUES (346, '141129', '中阳县', '141100'); +INSERT INTO `tb_area` VALUES (347, '141130', '交口县', '141100'); +INSERT INTO `tb_area` VALUES (348, '141181', '孝义市', '141100'); +INSERT INTO `tb_area` VALUES (349, '141182', '汾阳市', '141100'); +INSERT INTO `tb_area` VALUES (350, '150101', '市辖区', '150100'); +INSERT INTO `tb_area` VALUES (351, '150102', '新城区', '150100'); +INSERT INTO `tb_area` VALUES (352, '150103', '回民区', '150100'); +INSERT INTO `tb_area` VALUES (353, '150104', '玉泉区', '150100'); +INSERT INTO `tb_area` VALUES (354, '150105', '赛罕区', '150100'); +INSERT INTO `tb_area` VALUES (355, '150121', '土默特左旗', '150100'); +INSERT INTO `tb_area` VALUES (356, '150122', '托克托县', '150100'); +INSERT INTO `tb_area` VALUES (357, '150123', '和林格尔县', '150100'); +INSERT INTO `tb_area` VALUES (358, '150124', '清水河县', '150100'); +INSERT INTO `tb_area` VALUES (359, '150125', '武川县', '150100'); +INSERT INTO `tb_area` VALUES (360, '150201', '市辖区', '150200'); +INSERT INTO `tb_area` VALUES (361, '150202', '东河区', '150200'); +INSERT INTO `tb_area` VALUES (362, '150203', '昆都仑区', '150200'); +INSERT INTO `tb_area` VALUES (363, '150204', '青山区', '150200'); +INSERT INTO `tb_area` VALUES (364, '150205', '石拐区', '150200'); +INSERT INTO `tb_area` VALUES (365, '150206', '白云矿区', '150200'); +INSERT INTO `tb_area` VALUES (366, '150207', '九原区', '150200'); +INSERT INTO `tb_area` VALUES (367, '150221', '土默特右旗', '150200'); +INSERT INTO `tb_area` VALUES (368, '150222', '固阳县', '150200'); +INSERT INTO `tb_area` VALUES (369, '150223', '达尔罕茂明安联合旗', '150200'); +INSERT INTO `tb_area` VALUES (370, '150301', '市辖区', '150300'); +INSERT INTO `tb_area` VALUES (371, '150302', '海勃湾区', '150300'); +INSERT INTO `tb_area` VALUES (372, '150303', '海南区', '150300'); +INSERT INTO `tb_area` VALUES (373, '150304', '乌达区', '150300'); +INSERT INTO `tb_area` VALUES (374, '150401', '市辖区', '150400'); +INSERT INTO `tb_area` VALUES (375, '150402', '红山区', '150400'); +INSERT INTO `tb_area` VALUES (376, '150403', '元宝山区', '150400'); +INSERT INTO `tb_area` VALUES (377, '150404', '松山区', '150400'); +INSERT INTO `tb_area` VALUES (378, '150421', '阿鲁科尔沁旗', '150400'); +INSERT INTO `tb_area` VALUES (379, '150422', '巴林左旗', '150400'); +INSERT INTO `tb_area` VALUES (380, '150423', '巴林右旗', '150400'); +INSERT INTO `tb_area` VALUES (381, '150424', '林西县', '150400'); +INSERT INTO `tb_area` VALUES (382, '150425', '克什克腾旗', '150400'); +INSERT INTO `tb_area` VALUES (383, '150426', '翁牛特旗', '150400'); +INSERT INTO `tb_area` VALUES (384, '150428', '喀喇沁旗', '150400'); +INSERT INTO `tb_area` VALUES (385, '150429', '宁城县', '150400'); +INSERT INTO `tb_area` VALUES (386, '150430', '敖汉旗', '150400'); +INSERT INTO `tb_area` VALUES (387, '150501', '市辖区', '150500'); +INSERT INTO `tb_area` VALUES (388, '150502', '科尔沁区', '150500'); +INSERT INTO `tb_area` VALUES (389, '150521', '科尔沁左翼中旗', '150500'); +INSERT INTO `tb_area` VALUES (390, '150522', '科尔沁左翼后旗', '150500'); +INSERT INTO `tb_area` VALUES (391, '150523', '开鲁县', '150500'); +INSERT INTO `tb_area` VALUES (392, '150524', '库伦旗', '150500'); +INSERT INTO `tb_area` VALUES (393, '150525', '奈曼旗', '150500'); +INSERT INTO `tb_area` VALUES (394, '150526', '扎鲁特旗', '150500'); +INSERT INTO `tb_area` VALUES (395, '150581', '霍林郭勒市', '150500'); +INSERT INTO `tb_area` VALUES (396, '150602', '东胜区', '150600'); +INSERT INTO `tb_area` VALUES (397, '150621', '达拉特旗', '150600'); +INSERT INTO `tb_area` VALUES (398, '150622', '准格尔旗', '150600'); +INSERT INTO `tb_area` VALUES (399, '150623', '鄂托克前旗', '150600'); +INSERT INTO `tb_area` VALUES (400, '150624', '鄂托克旗', '150600'); +INSERT INTO `tb_area` VALUES (401, '150625', '杭锦旗', '150600'); +INSERT INTO `tb_area` VALUES (402, '150626', '乌审旗', '150600'); +INSERT INTO `tb_area` VALUES (403, '150627', '伊金霍洛旗', '150600'); +INSERT INTO `tb_area` VALUES (404, '150701', '市辖区', '150700'); +INSERT INTO `tb_area` VALUES (405, '150702', '海拉尔区', '150700'); +INSERT INTO `tb_area` VALUES (406, '150721', '阿荣旗', '150700'); +INSERT INTO `tb_area` VALUES (407, '150722', '莫力达瓦达斡尔族自治旗', '150700'); +INSERT INTO `tb_area` VALUES (408, '150723', '鄂伦春自治旗', '150700'); +INSERT INTO `tb_area` VALUES (409, '150724', '鄂温克族自治旗', '150700'); +INSERT INTO `tb_area` VALUES (410, '150725', '陈巴尔虎旗', '150700'); +INSERT INTO `tb_area` VALUES (411, '150726', '新巴尔虎左旗', '150700'); +INSERT INTO `tb_area` VALUES (412, '150727', '新巴尔虎右旗', '150700'); +INSERT INTO `tb_area` VALUES (413, '150781', '满洲里市', '150700'); +INSERT INTO `tb_area` VALUES (414, '150782', '牙克石市', '150700'); +INSERT INTO `tb_area` VALUES (415, '150783', '扎兰屯市', '150700'); +INSERT INTO `tb_area` VALUES (416, '150784', '额尔古纳市', '150700'); +INSERT INTO `tb_area` VALUES (417, '150785', '根河市', '150700'); +INSERT INTO `tb_area` VALUES (418, '150801', '市辖区', '150800'); +INSERT INTO `tb_area` VALUES (419, '150802', '临河区', '150800'); +INSERT INTO `tb_area` VALUES (420, '150821', '五原县', '150800'); +INSERT INTO `tb_area` VALUES (421, '150822', '磴口县', '150800'); +INSERT INTO `tb_area` VALUES (422, '150823', '乌拉特前旗', '150800'); +INSERT INTO `tb_area` VALUES (423, '150824', '乌拉特中旗', '150800'); +INSERT INTO `tb_area` VALUES (424, '150825', '乌拉特后旗', '150800'); +INSERT INTO `tb_area` VALUES (425, '150826', '杭锦后旗', '150800'); +INSERT INTO `tb_area` VALUES (426, '150901', '市辖区', '150900'); +INSERT INTO `tb_area` VALUES (427, '150902', '集宁区', '150900'); +INSERT INTO `tb_area` VALUES (428, '150921', '卓资县', '150900'); +INSERT INTO `tb_area` VALUES (429, '150922', '化德县', '150900'); +INSERT INTO `tb_area` VALUES (430, '150923', '商都县', '150900'); +INSERT INTO `tb_area` VALUES (431, '150924', '兴和县', '150900'); +INSERT INTO `tb_area` VALUES (432, '150925', '凉城县', '150900'); +INSERT INTO `tb_area` VALUES (433, '150926', '察哈尔右翼前旗', '150900'); +INSERT INTO `tb_area` VALUES (434, '150927', '察哈尔右翼中旗', '150900'); +INSERT INTO `tb_area` VALUES (435, '150928', '察哈尔右翼后旗', '150900'); +INSERT INTO `tb_area` VALUES (436, '150929', '四子王旗', '150900'); +INSERT INTO `tb_area` VALUES (437, '150981', '丰镇市', '150900'); +INSERT INTO `tb_area` VALUES (438, '152201', '乌兰浩特市', '152200'); +INSERT INTO `tb_area` VALUES (439, '152202', '阿尔山市', '152200'); +INSERT INTO `tb_area` VALUES (440, '152221', '科尔沁右翼前旗', '152200'); +INSERT INTO `tb_area` VALUES (441, '152222', '科尔沁右翼中旗', '152200'); +INSERT INTO `tb_area` VALUES (442, '152223', '扎赉特旗', '152200'); +INSERT INTO `tb_area` VALUES (443, '152224', '突泉县', '152200'); +INSERT INTO `tb_area` VALUES (444, '152501', '二连浩特市', '152500'); +INSERT INTO `tb_area` VALUES (445, '152502', '锡林浩特市', '152500'); +INSERT INTO `tb_area` VALUES (446, '152522', '阿巴嘎旗', '152500'); +INSERT INTO `tb_area` VALUES (447, '152523', '苏尼特左旗', '152500'); +INSERT INTO `tb_area` VALUES (448, '152524', '苏尼特右旗', '152500'); +INSERT INTO `tb_area` VALUES (449, '152525', '东乌珠穆沁旗', '152500'); +INSERT INTO `tb_area` VALUES (450, '152526', '西乌珠穆沁旗', '152500'); +INSERT INTO `tb_area` VALUES (451, '152527', '太仆寺旗', '152500'); +INSERT INTO `tb_area` VALUES (452, '152528', '镶黄旗', '152500'); +INSERT INTO `tb_area` VALUES (453, '152529', '正镶白旗', '152500'); +INSERT INTO `tb_area` VALUES (454, '152530', '正蓝旗', '152500'); +INSERT INTO `tb_area` VALUES (455, '152531', '多伦县', '152500'); +INSERT INTO `tb_area` VALUES (456, '152921', '阿拉善左旗', '152900'); +INSERT INTO `tb_area` VALUES (457, '152922', '阿拉善右旗', '152900'); +INSERT INTO `tb_area` VALUES (458, '152923', '额济纳旗', '152900'); +INSERT INTO `tb_area` VALUES (459, '210101', '市辖区', '210100'); +INSERT INTO `tb_area` VALUES (460, '210102', '和平区', '210100'); +INSERT INTO `tb_area` VALUES (461, '210103', '沈河区', '210100'); +INSERT INTO `tb_area` VALUES (462, '210104', '大东区', '210100'); +INSERT INTO `tb_area` VALUES (463, '210105', '皇姑区', '210100'); +INSERT INTO `tb_area` VALUES (464, '210106', '铁西区', '210100'); +INSERT INTO `tb_area` VALUES (465, '210111', '苏家屯区', '210100'); +INSERT INTO `tb_area` VALUES (466, '210112', '东陵区', '210100'); +INSERT INTO `tb_area` VALUES (467, '210113', '新城子区', '210100'); +INSERT INTO `tb_area` VALUES (468, '210114', '于洪区', '210100'); +INSERT INTO `tb_area` VALUES (469, '210122', '辽中县', '210100'); +INSERT INTO `tb_area` VALUES (470, '210123', '康平县', '210100'); +INSERT INTO `tb_area` VALUES (471, '210124', '法库县', '210100'); +INSERT INTO `tb_area` VALUES (472, '210181', '新民市', '210100'); +INSERT INTO `tb_area` VALUES (473, '210201', '市辖区', '210200'); +INSERT INTO `tb_area` VALUES (474, '210202', '中山区', '210200'); +INSERT INTO `tb_area` VALUES (475, '210203', '西岗区', '210200'); +INSERT INTO `tb_area` VALUES (476, '210204', '沙河口区', '210200'); +INSERT INTO `tb_area` VALUES (477, '210211', '甘井子区', '210200'); +INSERT INTO `tb_area` VALUES (478, '210212', '旅顺口区', '210200'); +INSERT INTO `tb_area` VALUES (479, '210213', '金州区', '210200'); +INSERT INTO `tb_area` VALUES (480, '210224', '长海县', '210200'); +INSERT INTO `tb_area` VALUES (481, '210281', '瓦房店市', '210200'); +INSERT INTO `tb_area` VALUES (482, '210282', '普兰店市', '210200'); +INSERT INTO `tb_area` VALUES (483, '210283', '庄河市', '210200'); +INSERT INTO `tb_area` VALUES (484, '210301', '市辖区', '210300'); +INSERT INTO `tb_area` VALUES (485, '210302', '铁东区', '210300'); +INSERT INTO `tb_area` VALUES (486, '210303', '铁西区', '210300'); +INSERT INTO `tb_area` VALUES (487, '210304', '立山区', '210300'); +INSERT INTO `tb_area` VALUES (488, '210311', '千山区', '210300'); +INSERT INTO `tb_area` VALUES (489, '210321', '台安县', '210300'); +INSERT INTO `tb_area` VALUES (490, '210323', '岫岩满族自治县', '210300'); +INSERT INTO `tb_area` VALUES (491, '210381', '海城市', '210300'); +INSERT INTO `tb_area` VALUES (492, '210401', '市辖区', '210400'); +INSERT INTO `tb_area` VALUES (493, '210402', '新抚区', '210400'); +INSERT INTO `tb_area` VALUES (494, '210403', '东洲区', '210400'); +INSERT INTO `tb_area` VALUES (495, '210404', '望花区', '210400'); +INSERT INTO `tb_area` VALUES (496, '210411', '顺城区', '210400'); +INSERT INTO `tb_area` VALUES (497, '210421', '抚顺县', '210400'); +INSERT INTO `tb_area` VALUES (498, '210422', '新宾满族自治县', '210400'); +INSERT INTO `tb_area` VALUES (499, '210423', '清原满族自治县', '210400'); +INSERT INTO `tb_area` VALUES (500, '210501', '市辖区', '210500'); +INSERT INTO `tb_area` VALUES (501, '210502', '平山区', '210500'); +INSERT INTO `tb_area` VALUES (502, '210503', '溪湖区', '210500'); +INSERT INTO `tb_area` VALUES (503, '210504', '明山区', '210500'); +INSERT INTO `tb_area` VALUES (504, '210505', '南芬区', '210500'); +INSERT INTO `tb_area` VALUES (505, '210521', '本溪满族自治县', '210500'); +INSERT INTO `tb_area` VALUES (506, '210522', '桓仁满族自治县', '210500'); +INSERT INTO `tb_area` VALUES (507, '210601', '市辖区', '210600'); +INSERT INTO `tb_area` VALUES (508, '210602', '元宝区', '210600'); +INSERT INTO `tb_area` VALUES (509, '210603', '振兴区', '210600'); +INSERT INTO `tb_area` VALUES (510, '210604', '振安区', '210600'); +INSERT INTO `tb_area` VALUES (511, '210624', '宽甸满族自治县', '210600'); +INSERT INTO `tb_area` VALUES (512, '210681', '东港市', '210600'); +INSERT INTO `tb_area` VALUES (513, '210682', '凤城市', '210600'); +INSERT INTO `tb_area` VALUES (514, '210701', '市辖区', '210700'); +INSERT INTO `tb_area` VALUES (515, '210702', '古塔区', '210700'); +INSERT INTO `tb_area` VALUES (516, '210703', '凌河区', '210700'); +INSERT INTO `tb_area` VALUES (517, '210711', '太和区', '210700'); +INSERT INTO `tb_area` VALUES (518, '210726', '黑山县', '210700'); +INSERT INTO `tb_area` VALUES (519, '210727', '义 县', '210700'); +INSERT INTO `tb_area` VALUES (520, '210781', '凌海市', '210700'); +INSERT INTO `tb_area` VALUES (521, '210782', '北宁市', '210700'); +INSERT INTO `tb_area` VALUES (522, '210801', '市辖区', '210800'); +INSERT INTO `tb_area` VALUES (523, '210802', '站前区', '210800'); +INSERT INTO `tb_area` VALUES (524, '210803', '西市区', '210800'); +INSERT INTO `tb_area` VALUES (525, '210804', '鲅鱼圈区', '210800'); +INSERT INTO `tb_area` VALUES (526, '210811', '老边区', '210800'); +INSERT INTO `tb_area` VALUES (527, '210881', '盖州市', '210800'); +INSERT INTO `tb_area` VALUES (528, '210882', '大石桥市', '210800'); +INSERT INTO `tb_area` VALUES (529, '210901', '市辖区', '210900'); +INSERT INTO `tb_area` VALUES (530, '210902', '海州区', '210900'); +INSERT INTO `tb_area` VALUES (531, '210903', '新邱区', '210900'); +INSERT INTO `tb_area` VALUES (532, '210904', '太平区', '210900'); +INSERT INTO `tb_area` VALUES (533, '210905', '清河门区', '210900'); +INSERT INTO `tb_area` VALUES (534, '210911', '细河区', '210900'); +INSERT INTO `tb_area` VALUES (535, '210921', '阜新蒙古族自治县', '210900'); +INSERT INTO `tb_area` VALUES (536, '210922', '彰武县', '210900'); +INSERT INTO `tb_area` VALUES (537, '211001', '市辖区', '211000'); +INSERT INTO `tb_area` VALUES (538, '211002', '白塔区', '211000'); +INSERT INTO `tb_area` VALUES (539, '211003', '文圣区', '211000'); +INSERT INTO `tb_area` VALUES (540, '211004', '宏伟区', '211000'); +INSERT INTO `tb_area` VALUES (541, '211005', '弓长岭区', '211000'); +INSERT INTO `tb_area` VALUES (542, '211011', '太子河区', '211000'); +INSERT INTO `tb_area` VALUES (543, '211021', '辽阳县', '211000'); +INSERT INTO `tb_area` VALUES (544, '211081', '灯塔市', '211000'); +INSERT INTO `tb_area` VALUES (545, '211101', '市辖区', '211100'); +INSERT INTO `tb_area` VALUES (546, '211102', '双台子区', '211100'); +INSERT INTO `tb_area` VALUES (547, '211103', '兴隆台区', '211100'); +INSERT INTO `tb_area` VALUES (548, '211121', '大洼县', '211100'); +INSERT INTO `tb_area` VALUES (549, '211122', '盘山县', '211100'); +INSERT INTO `tb_area` VALUES (550, '211201', '市辖区', '211200'); +INSERT INTO `tb_area` VALUES (551, '211202', '银州区', '211200'); +INSERT INTO `tb_area` VALUES (552, '211204', '清河区', '211200'); +INSERT INTO `tb_area` VALUES (553, '211221', '铁岭县', '211200'); +INSERT INTO `tb_area` VALUES (554, '211223', '西丰县', '211200'); +INSERT INTO `tb_area` VALUES (555, '211224', '昌图县', '211200'); +INSERT INTO `tb_area` VALUES (556, '211281', '调兵山市', '211200'); +INSERT INTO `tb_area` VALUES (557, '211282', '开原市', '211200'); +INSERT INTO `tb_area` VALUES (558, '211301', '市辖区', '211300'); +INSERT INTO `tb_area` VALUES (559, '211302', '双塔区', '211300'); +INSERT INTO `tb_area` VALUES (560, '211303', '龙城区', '211300'); +INSERT INTO `tb_area` VALUES (561, '211321', '朝阳县', '211300'); +INSERT INTO `tb_area` VALUES (562, '211322', '建平县', '211300'); +INSERT INTO `tb_area` VALUES (563, '211324', '喀喇沁左翼蒙古族自治县', '211300'); +INSERT INTO `tb_area` VALUES (564, '211381', '北票市', '211300'); +INSERT INTO `tb_area` VALUES (565, '211382', '凌源市', '211300'); +INSERT INTO `tb_area` VALUES (566, '211401', '市辖区', '211400'); +INSERT INTO `tb_area` VALUES (567, '211402', '连山区', '211400'); +INSERT INTO `tb_area` VALUES (568, '211403', '龙港区', '211400'); +INSERT INTO `tb_area` VALUES (569, '211404', '南票区', '211400'); +INSERT INTO `tb_area` VALUES (570, '211421', '绥中县', '211400'); +INSERT INTO `tb_area` VALUES (571, '211422', '建昌县', '211400'); +INSERT INTO `tb_area` VALUES (572, '211481', '兴城市', '211400'); +INSERT INTO `tb_area` VALUES (573, '220101', '市辖区', '220100'); +INSERT INTO `tb_area` VALUES (574, '220102', '南关区', '220100'); +INSERT INTO `tb_area` VALUES (575, '220103', '宽城区', '220100'); +INSERT INTO `tb_area` VALUES (576, '220104', '朝阳区', '220100'); +INSERT INTO `tb_area` VALUES (577, '220105', '二道区', '220100'); +INSERT INTO `tb_area` VALUES (578, '220106', '绿园区', '220100'); +INSERT INTO `tb_area` VALUES (579, '220112', '双阳区', '220100'); +INSERT INTO `tb_area` VALUES (580, '220122', '农安县', '220100'); +INSERT INTO `tb_area` VALUES (581, '220181', '九台市', '220100'); +INSERT INTO `tb_area` VALUES (582, '220182', '榆树市', '220100'); +INSERT INTO `tb_area` VALUES (583, '220183', '德惠市', '220100'); +INSERT INTO `tb_area` VALUES (584, '220201', '市辖区', '220200'); +INSERT INTO `tb_area` VALUES (585, '220202', '昌邑区', '220200'); +INSERT INTO `tb_area` VALUES (586, '220203', '龙潭区', '220200'); +INSERT INTO `tb_area` VALUES (587, '220204', '船营区', '220200'); +INSERT INTO `tb_area` VALUES (588, '220211', '丰满区', '220200'); +INSERT INTO `tb_area` VALUES (589, '220221', '永吉县', '220200'); +INSERT INTO `tb_area` VALUES (590, '220281', '蛟河市', '220200'); +INSERT INTO `tb_area` VALUES (591, '220282', '桦甸市', '220200'); +INSERT INTO `tb_area` VALUES (592, '220283', '舒兰市', '220200'); +INSERT INTO `tb_area` VALUES (593, '220284', '磐石市', '220200'); +INSERT INTO `tb_area` VALUES (594, '220301', '市辖区', '220300'); +INSERT INTO `tb_area` VALUES (595, '220302', '铁西区', '220300'); +INSERT INTO `tb_area` VALUES (596, '220303', '铁东区', '220300'); +INSERT INTO `tb_area` VALUES (597, '220322', '梨树县', '220300'); +INSERT INTO `tb_area` VALUES (598, '220323', '伊通满族自治县', '220300'); +INSERT INTO `tb_area` VALUES (599, '220381', '公主岭市', '220300'); +INSERT INTO `tb_area` VALUES (600, '220382', '双辽市', '220300'); +INSERT INTO `tb_area` VALUES (601, '220401', '市辖区', '220400'); +INSERT INTO `tb_area` VALUES (602, '220402', '龙山区', '220400'); +INSERT INTO `tb_area` VALUES (603, '220403', '西安区', '220400'); +INSERT INTO `tb_area` VALUES (604, '220421', '东丰县', '220400'); +INSERT INTO `tb_area` VALUES (605, '220422', '东辽县', '220400'); +INSERT INTO `tb_area` VALUES (606, '220501', '市辖区', '220500'); +INSERT INTO `tb_area` VALUES (607, '220502', '东昌区', '220500'); +INSERT INTO `tb_area` VALUES (608, '220503', '二道江区', '220500'); +INSERT INTO `tb_area` VALUES (609, '220521', '通化县', '220500'); +INSERT INTO `tb_area` VALUES (610, '220523', '辉南县', '220500'); +INSERT INTO `tb_area` VALUES (611, '220524', '柳河县', '220500'); +INSERT INTO `tb_area` VALUES (612, '220581', '梅河口市', '220500'); +INSERT INTO `tb_area` VALUES (613, '220582', '集安市', '220500'); +INSERT INTO `tb_area` VALUES (614, '220601', '市辖区', '220600'); +INSERT INTO `tb_area` VALUES (615, '220602', '八道江区', '220600'); +INSERT INTO `tb_area` VALUES (616, '220621', '抚松县', '220600'); +INSERT INTO `tb_area` VALUES (617, '220622', '靖宇县', '220600'); +INSERT INTO `tb_area` VALUES (618, '220623', '长白朝鲜族自治县', '220600'); +INSERT INTO `tb_area` VALUES (619, '220625', '江源县', '220600'); +INSERT INTO `tb_area` VALUES (620, '220681', '临江市', '220600'); +INSERT INTO `tb_area` VALUES (621, '220701', '市辖区', '220700'); +INSERT INTO `tb_area` VALUES (622, '220702', '宁江区', '220700'); +INSERT INTO `tb_area` VALUES (623, '220721', '前郭尔罗斯蒙古族自治县', '220700'); +INSERT INTO `tb_area` VALUES (624, '220722', '长岭县', '220700'); +INSERT INTO `tb_area` VALUES (625, '220723', '乾安县', '220700'); +INSERT INTO `tb_area` VALUES (626, '220724', '扶余县', '220700'); +INSERT INTO `tb_area` VALUES (627, '220801', '市辖区', '220800'); +INSERT INTO `tb_area` VALUES (628, '220802', '洮北区', '220800'); +INSERT INTO `tb_area` VALUES (629, '220821', '镇赉县', '220800'); +INSERT INTO `tb_area` VALUES (630, '220822', '通榆县', '220800'); +INSERT INTO `tb_area` VALUES (631, '220881', '洮南市', '220800'); +INSERT INTO `tb_area` VALUES (632, '220882', '大安市', '220800'); +INSERT INTO `tb_area` VALUES (633, '222401', '延吉市', '222400'); +INSERT INTO `tb_area` VALUES (634, '222402', '图们市', '222400'); +INSERT INTO `tb_area` VALUES (635, '222403', '敦化市', '222400'); +INSERT INTO `tb_area` VALUES (636, '222404', '珲春市', '222400'); +INSERT INTO `tb_area` VALUES (637, '222405', '龙井市', '222400'); +INSERT INTO `tb_area` VALUES (638, '222406', '和龙市', '222400'); +INSERT INTO `tb_area` VALUES (639, '222424', '汪清县', '222400'); +INSERT INTO `tb_area` VALUES (640, '222426', '安图县', '222400'); +INSERT INTO `tb_area` VALUES (641, '230101', '市辖区', '230100'); +INSERT INTO `tb_area` VALUES (642, '230102', '道里区', '230100'); +INSERT INTO `tb_area` VALUES (643, '230103', '南岗区', '230100'); +INSERT INTO `tb_area` VALUES (644, '230104', '道外区', '230100'); +INSERT INTO `tb_area` VALUES (645, '230106', '香坊区', '230100'); +INSERT INTO `tb_area` VALUES (646, '230107', '动力区', '230100'); +INSERT INTO `tb_area` VALUES (647, '230108', '平房区', '230100'); +INSERT INTO `tb_area` VALUES (648, '230109', '松北区', '230100'); +INSERT INTO `tb_area` VALUES (649, '230111', '呼兰区', '230100'); +INSERT INTO `tb_area` VALUES (650, '230123', '依兰县', '230100'); +INSERT INTO `tb_area` VALUES (651, '230124', '方正县', '230100'); +INSERT INTO `tb_area` VALUES (652, '230125', '宾 县', '230100'); +INSERT INTO `tb_area` VALUES (653, '230126', '巴彦县', '230100'); +INSERT INTO `tb_area` VALUES (654, '230127', '木兰县', '230100'); +INSERT INTO `tb_area` VALUES (655, '230128', '通河县', '230100'); +INSERT INTO `tb_area` VALUES (656, '230129', '延寿县', '230100'); +INSERT INTO `tb_area` VALUES (657, '230181', '阿城市', '230100'); +INSERT INTO `tb_area` VALUES (658, '230182', '双城市', '230100'); +INSERT INTO `tb_area` VALUES (659, '230183', '尚志市', '230100'); +INSERT INTO `tb_area` VALUES (660, '230184', '五常市', '230100'); +INSERT INTO `tb_area` VALUES (661, '230201', '市辖区', '230200'); +INSERT INTO `tb_area` VALUES (662, '230202', '龙沙区', '230200'); +INSERT INTO `tb_area` VALUES (663, '230203', '建华区', '230200'); +INSERT INTO `tb_area` VALUES (664, '230204', '铁锋区', '230200'); +INSERT INTO `tb_area` VALUES (665, '230205', '昂昂溪区', '230200'); +INSERT INTO `tb_area` VALUES (666, '230206', '富拉尔基区', '230200'); +INSERT INTO `tb_area` VALUES (667, '230207', '碾子山区', '230200'); +INSERT INTO `tb_area` VALUES (668, '230208', '梅里斯达斡尔族区', '230200'); +INSERT INTO `tb_area` VALUES (669, '230221', '龙江县', '230200'); +INSERT INTO `tb_area` VALUES (670, '230223', '依安县', '230200'); +INSERT INTO `tb_area` VALUES (671, '230224', '泰来县', '230200'); +INSERT INTO `tb_area` VALUES (672, '230225', '甘南县', '230200'); +INSERT INTO `tb_area` VALUES (673, '230227', '富裕县', '230200'); +INSERT INTO `tb_area` VALUES (674, '230229', '克山县', '230200'); +INSERT INTO `tb_area` VALUES (675, '230230', '克东县', '230200'); +INSERT INTO `tb_area` VALUES (676, '230231', '拜泉县', '230200'); +INSERT INTO `tb_area` VALUES (677, '230281', '讷河市', '230200'); +INSERT INTO `tb_area` VALUES (678, '230301', '市辖区', '230300'); +INSERT INTO `tb_area` VALUES (679, '230302', '鸡冠区', '230300'); +INSERT INTO `tb_area` VALUES (680, '230303', '恒山区', '230300'); +INSERT INTO `tb_area` VALUES (681, '230304', '滴道区', '230300'); +INSERT INTO `tb_area` VALUES (682, '230305', '梨树区', '230300'); +INSERT INTO `tb_area` VALUES (683, '230306', '城子河区', '230300'); +INSERT INTO `tb_area` VALUES (684, '230307', '麻山区', '230300'); +INSERT INTO `tb_area` VALUES (685, '230321', '鸡东县', '230300'); +INSERT INTO `tb_area` VALUES (686, '230381', '虎林市', '230300'); +INSERT INTO `tb_area` VALUES (687, '230382', '密山市', '230300'); +INSERT INTO `tb_area` VALUES (688, '230401', '市辖区', '230400'); +INSERT INTO `tb_area` VALUES (689, '230402', '向阳区', '230400'); +INSERT INTO `tb_area` VALUES (690, '230403', '工农区', '230400'); +INSERT INTO `tb_area` VALUES (691, '230404', '南山区', '230400'); +INSERT INTO `tb_area` VALUES (692, '230405', '兴安区', '230400'); +INSERT INTO `tb_area` VALUES (693, '230406', '东山区', '230400'); +INSERT INTO `tb_area` VALUES (694, '230407', '兴山区', '230400'); +INSERT INTO `tb_area` VALUES (695, '230421', '萝北县', '230400'); +INSERT INTO `tb_area` VALUES (696, '230422', '绥滨县', '230400'); +INSERT INTO `tb_area` VALUES (697, '230501', '市辖区', '230500'); +INSERT INTO `tb_area` VALUES (698, '230502', '尖山区', '230500'); +INSERT INTO `tb_area` VALUES (699, '230503', '岭东区', '230500'); +INSERT INTO `tb_area` VALUES (700, '230505', '四方台区', '230500'); +INSERT INTO `tb_area` VALUES (701, '230506', '宝山区', '230500'); +INSERT INTO `tb_area` VALUES (702, '230521', '集贤县', '230500'); +INSERT INTO `tb_area` VALUES (703, '230522', '友谊县', '230500'); +INSERT INTO `tb_area` VALUES (704, '230523', '宝清县', '230500'); +INSERT INTO `tb_area` VALUES (705, '230524', '饶河县', '230500'); +INSERT INTO `tb_area` VALUES (706, '230601', '市辖区', '230600'); +INSERT INTO `tb_area` VALUES (707, '230602', '萨尔图区', '230600'); +INSERT INTO `tb_area` VALUES (708, '230603', '龙凤区', '230600'); +INSERT INTO `tb_area` VALUES (709, '230604', '让胡路区', '230600'); +INSERT INTO `tb_area` VALUES (710, '230605', '红岗区', '230600'); +INSERT INTO `tb_area` VALUES (711, '230606', '大同区', '230600'); +INSERT INTO `tb_area` VALUES (712, '230621', '肇州县', '230600'); +INSERT INTO `tb_area` VALUES (713, '230622', '肇源县', '230600'); +INSERT INTO `tb_area` VALUES (714, '230623', '林甸县', '230600'); +INSERT INTO `tb_area` VALUES (715, '230624', '杜尔伯特蒙古族自治县', '230600'); +INSERT INTO `tb_area` VALUES (716, '230701', '市辖区', '230700'); +INSERT INTO `tb_area` VALUES (717, '230702', '伊春区', '230700'); +INSERT INTO `tb_area` VALUES (718, '230703', '南岔区', '230700'); +INSERT INTO `tb_area` VALUES (719, '230704', '友好区', '230700'); +INSERT INTO `tb_area` VALUES (720, '230705', '西林区', '230700'); +INSERT INTO `tb_area` VALUES (721, '230706', '翠峦区', '230700'); +INSERT INTO `tb_area` VALUES (722, '230707', '新青区', '230700'); +INSERT INTO `tb_area` VALUES (723, '230708', '美溪区', '230700'); +INSERT INTO `tb_area` VALUES (724, '230709', '金山屯区', '230700'); +INSERT INTO `tb_area` VALUES (725, '230710', '五营区', '230700'); +INSERT INTO `tb_area` VALUES (726, '230711', '乌马河区', '230700'); +INSERT INTO `tb_area` VALUES (727, '230712', '汤旺河区', '230700'); +INSERT INTO `tb_area` VALUES (728, '230713', '带岭区', '230700'); +INSERT INTO `tb_area` VALUES (729, '230714', '乌伊岭区', '230700'); +INSERT INTO `tb_area` VALUES (730, '230715', '红星区', '230700'); +INSERT INTO `tb_area` VALUES (731, '230716', '上甘岭区', '230700'); +INSERT INTO `tb_area` VALUES (732, '230722', '嘉荫县', '230700'); +INSERT INTO `tb_area` VALUES (733, '230781', '铁力市', '230700'); +INSERT INTO `tb_area` VALUES (734, '230801', '市辖区', '230800'); +INSERT INTO `tb_area` VALUES (735, '230802', '永红区', '230800'); +INSERT INTO `tb_area` VALUES (736, '230803', '向阳区', '230800'); +INSERT INTO `tb_area` VALUES (737, '230804', '前进区', '230800'); +INSERT INTO `tb_area` VALUES (738, '230805', '东风区', '230800'); +INSERT INTO `tb_area` VALUES (739, '230811', '郊 区', '230800'); +INSERT INTO `tb_area` VALUES (740, '230822', '桦南县', '230800'); +INSERT INTO `tb_area` VALUES (741, '230826', '桦川县', '230800'); +INSERT INTO `tb_area` VALUES (742, '230828', '汤原县', '230800'); +INSERT INTO `tb_area` VALUES (743, '230833', '抚远县', '230800'); +INSERT INTO `tb_area` VALUES (744, '230881', '同江市', '230800'); +INSERT INTO `tb_area` VALUES (745, '230882', '富锦市', '230800'); +INSERT INTO `tb_area` VALUES (746, '230901', '市辖区', '230900'); +INSERT INTO `tb_area` VALUES (747, '230902', '新兴区', '230900'); +INSERT INTO `tb_area` VALUES (748, '230903', '桃山区', '230900'); +INSERT INTO `tb_area` VALUES (749, '230904', '茄子河区', '230900'); +INSERT INTO `tb_area` VALUES (750, '230921', '勃利县', '230900'); +INSERT INTO `tb_area` VALUES (751, '231001', '市辖区', '231000'); +INSERT INTO `tb_area` VALUES (752, '231002', '东安区', '231000'); +INSERT INTO `tb_area` VALUES (753, '231003', '阳明区', '231000'); +INSERT INTO `tb_area` VALUES (754, '231004', '爱民区', '231000'); +INSERT INTO `tb_area` VALUES (755, '231005', '西安区', '231000'); +INSERT INTO `tb_area` VALUES (756, '231024', '东宁县', '231000'); +INSERT INTO `tb_area` VALUES (757, '231025', '林口县', '231000'); +INSERT INTO `tb_area` VALUES (758, '231081', '绥芬河市', '231000'); +INSERT INTO `tb_area` VALUES (759, '231083', '海林市', '231000'); +INSERT INTO `tb_area` VALUES (760, '231084', '宁安市', '231000'); +INSERT INTO `tb_area` VALUES (761, '231085', '穆棱市', '231000'); +INSERT INTO `tb_area` VALUES (762, '231101', '市辖区', '231100'); +INSERT INTO `tb_area` VALUES (763, '231102', '爱辉区', '231100'); +INSERT INTO `tb_area` VALUES (764, '231121', '嫩江县', '231100'); +INSERT INTO `tb_area` VALUES (765, '231123', '逊克县', '231100'); +INSERT INTO `tb_area` VALUES (766, '231124', '孙吴县', '231100'); +INSERT INTO `tb_area` VALUES (767, '231181', '北安市', '231100'); +INSERT INTO `tb_area` VALUES (768, '231182', '五大连池市', '231100'); +INSERT INTO `tb_area` VALUES (769, '231201', '市辖区', '231200'); +INSERT INTO `tb_area` VALUES (770, '231202', '北林区', '231200'); +INSERT INTO `tb_area` VALUES (771, '231221', '望奎县', '231200'); +INSERT INTO `tb_area` VALUES (772, '231222', '兰西县', '231200'); +INSERT INTO `tb_area` VALUES (773, '231223', '青冈县', '231200'); +INSERT INTO `tb_area` VALUES (774, '231224', '庆安县', '231200'); +INSERT INTO `tb_area` VALUES (775, '231225', '明水县', '231200'); +INSERT INTO `tb_area` VALUES (776, '231226', '绥棱县', '231200'); +INSERT INTO `tb_area` VALUES (777, '231281', '安达市', '231200'); +INSERT INTO `tb_area` VALUES (778, '231282', '肇东市', '231200'); +INSERT INTO `tb_area` VALUES (779, '231283', '海伦市', '231200'); +INSERT INTO `tb_area` VALUES (780, '232721', '呼玛县', '232700'); +INSERT INTO `tb_area` VALUES (781, '232722', '塔河县', '232700'); +INSERT INTO `tb_area` VALUES (782, '232723', '漠河县', '232700'); +INSERT INTO `tb_area` VALUES (783, '310101', '黄浦区', '310100'); +INSERT INTO `tb_area` VALUES (784, '310103', '卢湾区', '310100'); +INSERT INTO `tb_area` VALUES (785, '310104', '徐汇区', '310100'); +INSERT INTO `tb_area` VALUES (786, '310105', '长宁区', '310100'); +INSERT INTO `tb_area` VALUES (787, '310106', '静安区', '310100'); +INSERT INTO `tb_area` VALUES (788, '310107', '普陀区', '310100'); +INSERT INTO `tb_area` VALUES (789, '310108', '闸北区', '310100'); +INSERT INTO `tb_area` VALUES (790, '310109', '虹口区', '310100'); +INSERT INTO `tb_area` VALUES (791, '310110', '杨浦区', '310100'); +INSERT INTO `tb_area` VALUES (792, '310112', '闵行区', '310100'); +INSERT INTO `tb_area` VALUES (793, '310113', '宝山区', '310100'); +INSERT INTO `tb_area` VALUES (794, '310114', '嘉定区', '310100'); +INSERT INTO `tb_area` VALUES (795, '310115', '浦东新区', '310100'); +INSERT INTO `tb_area` VALUES (796, '310116', '金山区', '310100'); +INSERT INTO `tb_area` VALUES (797, '310117', '松江区', '310100'); +INSERT INTO `tb_area` VALUES (798, '310118', '青浦区', '310100'); +INSERT INTO `tb_area` VALUES (799, '310119', '南汇区', '310100'); +INSERT INTO `tb_area` VALUES (800, '310120', '奉贤区', '310100'); +INSERT INTO `tb_area` VALUES (801, '310230', '崇明县', '310200'); +INSERT INTO `tb_area` VALUES (802, '320101', '市辖区', '320100'); +INSERT INTO `tb_area` VALUES (803, '320102', '玄武区', '320100'); +INSERT INTO `tb_area` VALUES (804, '320103', '白下区', '320100'); +INSERT INTO `tb_area` VALUES (805, '320104', '秦淮区', '320100'); +INSERT INTO `tb_area` VALUES (806, '320105', '建邺区', '320100'); +INSERT INTO `tb_area` VALUES (807, '320106', '鼓楼区', '320100'); +INSERT INTO `tb_area` VALUES (808, '320107', '下关区', '320100'); +INSERT INTO `tb_area` VALUES (809, '320111', '浦口区', '320100'); +INSERT INTO `tb_area` VALUES (810, '320113', '栖霞区', '320100'); +INSERT INTO `tb_area` VALUES (811, '320114', '雨花台区', '320100'); +INSERT INTO `tb_area` VALUES (812, '320115', '江宁区', '320100'); +INSERT INTO `tb_area` VALUES (813, '320116', '六合区', '320100'); +INSERT INTO `tb_area` VALUES (814, '320124', '溧水县', '320100'); +INSERT INTO `tb_area` VALUES (815, '320125', '高淳县', '320100'); +INSERT INTO `tb_area` VALUES (816, '320201', '市辖区', '320200'); +INSERT INTO `tb_area` VALUES (817, '320202', '崇安区', '320200'); +INSERT INTO `tb_area` VALUES (818, '320203', '南长区', '320200'); +INSERT INTO `tb_area` VALUES (819, '320204', '北塘区', '320200'); +INSERT INTO `tb_area` VALUES (820, '320205', '锡山区', '320200'); +INSERT INTO `tb_area` VALUES (821, '320206', '惠山区', '320200'); +INSERT INTO `tb_area` VALUES (822, '320211', '滨湖区', '320200'); +INSERT INTO `tb_area` VALUES (823, '320281', '江阴市', '320200'); +INSERT INTO `tb_area` VALUES (824, '320282', '宜兴市', '320200'); +INSERT INTO `tb_area` VALUES (825, '320301', '市辖区', '320300'); +INSERT INTO `tb_area` VALUES (826, '320302', '鼓楼区', '320300'); +INSERT INTO `tb_area` VALUES (827, '320303', '云龙区', '320300'); +INSERT INTO `tb_area` VALUES (828, '320304', '九里区', '320300'); +INSERT INTO `tb_area` VALUES (829, '320305', '贾汪区', '320300'); +INSERT INTO `tb_area` VALUES (830, '320311', '泉山区', '320300'); +INSERT INTO `tb_area` VALUES (831, '320321', '丰 县', '320300'); +INSERT INTO `tb_area` VALUES (832, '320322', '沛 县', '320300'); +INSERT INTO `tb_area` VALUES (833, '320323', '铜山县', '320300'); +INSERT INTO `tb_area` VALUES (834, '320324', '睢宁县', '320300'); +INSERT INTO `tb_area` VALUES (835, '320381', '新沂市', '320300'); +INSERT INTO `tb_area` VALUES (836, '320382', '邳州市', '320300'); +INSERT INTO `tb_area` VALUES (837, '320401', '市辖区', '320400'); +INSERT INTO `tb_area` VALUES (838, '320402', '天宁区', '320400'); +INSERT INTO `tb_area` VALUES (839, '320404', '钟楼区', '320400'); +INSERT INTO `tb_area` VALUES (840, '320405', '戚墅堰区', '320400'); +INSERT INTO `tb_area` VALUES (841, '320411', '新北区', '320400'); +INSERT INTO `tb_area` VALUES (842, '320412', '武进区', '320400'); +INSERT INTO `tb_area` VALUES (843, '320481', '溧阳市', '320400'); +INSERT INTO `tb_area` VALUES (844, '320482', '金坛市', '320400'); +INSERT INTO `tb_area` VALUES (845, '320501', '市辖区', '320500'); +INSERT INTO `tb_area` VALUES (846, '320502', '沧浪区', '320500'); +INSERT INTO `tb_area` VALUES (847, '320503', '平江区', '320500'); +INSERT INTO `tb_area` VALUES (848, '320504', '金阊区', '320500'); +INSERT INTO `tb_area` VALUES (849, '320505', '虎丘区', '320500'); +INSERT INTO `tb_area` VALUES (850, '320506', '吴中区', '320500'); +INSERT INTO `tb_area` VALUES (851, '320507', '相城区', '320500'); +INSERT INTO `tb_area` VALUES (852, '320581', '常熟市', '320500'); +INSERT INTO `tb_area` VALUES (853, '320582', '张家港市', '320500'); +INSERT INTO `tb_area` VALUES (854, '320583', '昆山市', '320500'); +INSERT INTO `tb_area` VALUES (855, '320584', '吴江市', '320500'); +INSERT INTO `tb_area` VALUES (856, '320585', '太仓市', '320500'); +INSERT INTO `tb_area` VALUES (857, '320601', '市辖区', '320600'); +INSERT INTO `tb_area` VALUES (858, '320602', '崇川区', '320600'); +INSERT INTO `tb_area` VALUES (859, '320611', '港闸区', '320600'); +INSERT INTO `tb_area` VALUES (860, '320621', '海安县', '320600'); +INSERT INTO `tb_area` VALUES (861, '320623', '如东县', '320600'); +INSERT INTO `tb_area` VALUES (862, '320681', '启东市', '320600'); +INSERT INTO `tb_area` VALUES (863, '320682', '如皋市', '320600'); +INSERT INTO `tb_area` VALUES (864, '320683', '通州市', '320600'); +INSERT INTO `tb_area` VALUES (865, '320684', '海门市', '320600'); +INSERT INTO `tb_area` VALUES (866, '320701', '市辖区', '320700'); +INSERT INTO `tb_area` VALUES (867, '320703', '连云区', '320700'); +INSERT INTO `tb_area` VALUES (868, '320705', '新浦区', '320700'); +INSERT INTO `tb_area` VALUES (869, '320706', '海州区', '320700'); +INSERT INTO `tb_area` VALUES (870, '320721', '赣榆县', '320700'); +INSERT INTO `tb_area` VALUES (871, '320722', '东海县', '320700'); +INSERT INTO `tb_area` VALUES (872, '320723', '灌云县', '320700'); +INSERT INTO `tb_area` VALUES (873, '320724', '灌南县', '320700'); +INSERT INTO `tb_area` VALUES (874, '320801', '市辖区', '320800'); +INSERT INTO `tb_area` VALUES (875, '320802', '清河区', '320800'); +INSERT INTO `tb_area` VALUES (876, '320803', '楚州区', '320800'); +INSERT INTO `tb_area` VALUES (877, '320804', '淮阴区', '320800'); +INSERT INTO `tb_area` VALUES (878, '320811', '清浦区', '320800'); +INSERT INTO `tb_area` VALUES (879, '320826', '涟水县', '320800'); +INSERT INTO `tb_area` VALUES (880, '320829', '洪泽县', '320800'); +INSERT INTO `tb_area` VALUES (881, '320830', '盱眙县', '320800'); +INSERT INTO `tb_area` VALUES (882, '320831', '金湖县', '320800'); +INSERT INTO `tb_area` VALUES (883, '320901', '市辖区', '320900'); +INSERT INTO `tb_area` VALUES (884, '320902', '亭湖区', '320900'); +INSERT INTO `tb_area` VALUES (885, '320903', '盐都区', '320900'); +INSERT INTO `tb_area` VALUES (886, '320921', '响水县', '320900'); +INSERT INTO `tb_area` VALUES (887, '320922', '滨海县', '320900'); +INSERT INTO `tb_area` VALUES (888, '320923', '阜宁县', '320900'); +INSERT INTO `tb_area` VALUES (889, '320924', '射阳县', '320900'); +INSERT INTO `tb_area` VALUES (890, '320925', '建湖县', '320900'); +INSERT INTO `tb_area` VALUES (891, '320981', '东台市', '320900'); +INSERT INTO `tb_area` VALUES (892, '320982', '大丰市', '320900'); +INSERT INTO `tb_area` VALUES (893, '321001', '市辖区', '321000'); +INSERT INTO `tb_area` VALUES (894, '321002', '广陵区', '321000'); +INSERT INTO `tb_area` VALUES (895, '321003', '邗江区', '321000'); +INSERT INTO `tb_area` VALUES (896, '321011', '郊 区', '321000'); +INSERT INTO `tb_area` VALUES (897, '321023', '宝应县', '321000'); +INSERT INTO `tb_area` VALUES (898, '321081', '仪征市', '321000'); +INSERT INTO `tb_area` VALUES (899, '321084', '高邮市', '321000'); +INSERT INTO `tb_area` VALUES (900, '321088', '江都市', '321000'); +INSERT INTO `tb_area` VALUES (901, '321101', '市辖区', '321100'); +INSERT INTO `tb_area` VALUES (902, '321102', '京口区', '321100'); +INSERT INTO `tb_area` VALUES (903, '321111', '润州区', '321100'); +INSERT INTO `tb_area` VALUES (904, '321112', '丹徒区', '321100'); +INSERT INTO `tb_area` VALUES (905, '321181', '丹阳市', '321100'); +INSERT INTO `tb_area` VALUES (906, '321182', '扬中市', '321100'); +INSERT INTO `tb_area` VALUES (907, '321183', '句容市', '321100'); +INSERT INTO `tb_area` VALUES (908, '321201', '市辖区', '321200'); +INSERT INTO `tb_area` VALUES (909, '321202', '海陵区', '321200'); +INSERT INTO `tb_area` VALUES (910, '321203', '高港区', '321200'); +INSERT INTO `tb_area` VALUES (911, '321281', '兴化市', '321200'); +INSERT INTO `tb_area` VALUES (912, '321282', '靖江市', '321200'); +INSERT INTO `tb_area` VALUES (913, '321283', '泰兴市', '321200'); +INSERT INTO `tb_area` VALUES (914, '321284', '姜堰市', '321200'); +INSERT INTO `tb_area` VALUES (915, '321301', '市辖区', '321300'); +INSERT INTO `tb_area` VALUES (916, '321302', '宿城区', '321300'); +INSERT INTO `tb_area` VALUES (917, '321311', '宿豫区', '321300'); +INSERT INTO `tb_area` VALUES (918, '321322', '沭阳县', '321300'); +INSERT INTO `tb_area` VALUES (919, '321323', '泗阳县', '321300'); +INSERT INTO `tb_area` VALUES (920, '321324', '泗洪县', '321300'); +INSERT INTO `tb_area` VALUES (921, '330101', '市辖区', '330100'); +INSERT INTO `tb_area` VALUES (922, '330102', '上城区', '330100'); +INSERT INTO `tb_area` VALUES (923, '330103', '下城区', '330100'); +INSERT INTO `tb_area` VALUES (924, '330104', '江干区', '330100'); +INSERT INTO `tb_area` VALUES (925, '330105', '拱墅区', '330100'); +INSERT INTO `tb_area` VALUES (926, '330106', '西湖区', '330100'); +INSERT INTO `tb_area` VALUES (927, '330108', '滨江区', '330100'); +INSERT INTO `tb_area` VALUES (928, '330109', '萧山区', '330100'); +INSERT INTO `tb_area` VALUES (929, '330110', '余杭区', '330100'); +INSERT INTO `tb_area` VALUES (930, '330122', '桐庐县', '330100'); +INSERT INTO `tb_area` VALUES (931, '330127', '淳安县', '330100'); +INSERT INTO `tb_area` VALUES (932, '330182', '建德市', '330100'); +INSERT INTO `tb_area` VALUES (933, '330183', '富阳市', '330100'); +INSERT INTO `tb_area` VALUES (934, '330185', '临安市', '330100'); +INSERT INTO `tb_area` VALUES (935, '330201', '市辖区', '330200'); +INSERT INTO `tb_area` VALUES (936, '330203', '海曙区', '330200'); +INSERT INTO `tb_area` VALUES (937, '330204', '江东区', '330200'); +INSERT INTO `tb_area` VALUES (938, '330205', '江北区', '330200'); +INSERT INTO `tb_area` VALUES (939, '330206', '北仑区', '330200'); +INSERT INTO `tb_area` VALUES (940, '330211', '镇海区', '330200'); +INSERT INTO `tb_area` VALUES (941, '330212', '鄞州区', '330200'); +INSERT INTO `tb_area` VALUES (942, '330225', '象山县', '330200'); +INSERT INTO `tb_area` VALUES (943, '330226', '宁海县', '330200'); +INSERT INTO `tb_area` VALUES (944, '330281', '余姚市', '330200'); +INSERT INTO `tb_area` VALUES (945, '330282', '慈溪市', '330200'); +INSERT INTO `tb_area` VALUES (946, '330283', '奉化市', '330200'); +INSERT INTO `tb_area` VALUES (947, '330301', '市辖区', '330300'); +INSERT INTO `tb_area` VALUES (948, '330302', '鹿城区', '330300'); +INSERT INTO `tb_area` VALUES (949, '330303', '龙湾区', '330300'); +INSERT INTO `tb_area` VALUES (950, '330304', '瓯海区', '330300'); +INSERT INTO `tb_area` VALUES (951, '330322', '洞头县', '330300'); +INSERT INTO `tb_area` VALUES (952, '330324', '永嘉县', '330300'); +INSERT INTO `tb_area` VALUES (953, '330326', '平阳县', '330300'); +INSERT INTO `tb_area` VALUES (954, '330327', '苍南县', '330300'); +INSERT INTO `tb_area` VALUES (955, '330328', '文成县', '330300'); +INSERT INTO `tb_area` VALUES (956, '330329', '泰顺县', '330300'); +INSERT INTO `tb_area` VALUES (957, '330381', '瑞安市', '330300'); +INSERT INTO `tb_area` VALUES (958, '330382', '乐清市', '330300'); +INSERT INTO `tb_area` VALUES (959, '330401', '市辖区', '330400'); +INSERT INTO `tb_area` VALUES (960, '330402', '秀城区', '330400'); +INSERT INTO `tb_area` VALUES (961, '330411', '秀洲区', '330400'); +INSERT INTO `tb_area` VALUES (962, '330421', '嘉善县', '330400'); +INSERT INTO `tb_area` VALUES (963, '330424', '海盐县', '330400'); +INSERT INTO `tb_area` VALUES (964, '330481', '海宁市', '330400'); +INSERT INTO `tb_area` VALUES (965, '330482', '平湖市', '330400'); +INSERT INTO `tb_area` VALUES (966, '330483', '桐乡市', '330400'); +INSERT INTO `tb_area` VALUES (967, '330501', '市辖区', '330500'); +INSERT INTO `tb_area` VALUES (968, '330502', '吴兴区', '330500'); +INSERT INTO `tb_area` VALUES (969, '330503', '南浔区', '330500'); +INSERT INTO `tb_area` VALUES (970, '330521', '德清县', '330500'); +INSERT INTO `tb_area` VALUES (971, '330522', '长兴县', '330500'); +INSERT INTO `tb_area` VALUES (972, '330523', '安吉县', '330500'); +INSERT INTO `tb_area` VALUES (973, '330601', '市辖区', '330600'); +INSERT INTO `tb_area` VALUES (974, '330602', '越城区', '330600'); +INSERT INTO `tb_area` VALUES (975, '330621', '绍兴县', '330600'); +INSERT INTO `tb_area` VALUES (976, '330624', '新昌县', '330600'); +INSERT INTO `tb_area` VALUES (977, '330681', '诸暨市', '330600'); +INSERT INTO `tb_area` VALUES (978, '330682', '上虞市', '330600'); +INSERT INTO `tb_area` VALUES (979, '330683', '嵊州市', '330600'); +INSERT INTO `tb_area` VALUES (980, '330701', '市辖区', '330700'); +INSERT INTO `tb_area` VALUES (981, '330702', '婺城区', '330700'); +INSERT INTO `tb_area` VALUES (982, '330703', '金东区', '330700'); +INSERT INTO `tb_area` VALUES (983, '330723', '武义县', '330700'); +INSERT INTO `tb_area` VALUES (984, '330726', '浦江县', '330700'); +INSERT INTO `tb_area` VALUES (985, '330727', '磐安县', '330700'); +INSERT INTO `tb_area` VALUES (986, '330781', '兰溪市', '330700'); +INSERT INTO `tb_area` VALUES (987, '330782', '义乌市', '330700'); +INSERT INTO `tb_area` VALUES (988, '330783', '东阳市', '330700'); +INSERT INTO `tb_area` VALUES (989, '330784', '永康市', '330700'); +INSERT INTO `tb_area` VALUES (990, '330801', '市辖区', '330800'); +INSERT INTO `tb_area` VALUES (991, '330802', '柯城区', '330800'); +INSERT INTO `tb_area` VALUES (992, '330803', '衢江区', '330800'); +INSERT INTO `tb_area` VALUES (993, '330822', '常山县', '330800'); +INSERT INTO `tb_area` VALUES (994, '330824', '开化县', '330800'); +INSERT INTO `tb_area` VALUES (995, '330825', '龙游县', '330800'); +INSERT INTO `tb_area` VALUES (996, '330881', '江山市', '330800'); +INSERT INTO `tb_area` VALUES (997, '330901', '市辖区', '330900'); +INSERT INTO `tb_area` VALUES (998, '330902', '定海区', '330900'); +INSERT INTO `tb_area` VALUES (999, '330903', '普陀区', '330900'); +INSERT INTO `tb_area` VALUES (1000, '330921', '岱山县', '330900'); +INSERT INTO `tb_area` VALUES (1001, '330922', '嵊泗县', '330900'); +INSERT INTO `tb_area` VALUES (1002, '331001', '市辖区', '331000'); +INSERT INTO `tb_area` VALUES (1003, '331002', '椒江区', '331000'); +INSERT INTO `tb_area` VALUES (1004, '331003', '黄岩区', '331000'); +INSERT INTO `tb_area` VALUES (1005, '331004', '路桥区', '331000'); +INSERT INTO `tb_area` VALUES (1006, '331021', '玉环县', '331000'); +INSERT INTO `tb_area` VALUES (1007, '331022', '三门县', '331000'); +INSERT INTO `tb_area` VALUES (1008, '331023', '天台县', '331000'); +INSERT INTO `tb_area` VALUES (1009, '331024', '仙居县', '331000'); +INSERT INTO `tb_area` VALUES (1010, '331081', '温岭市', '331000'); +INSERT INTO `tb_area` VALUES (1011, '331082', '临海市', '331000'); +INSERT INTO `tb_area` VALUES (1012, '331101', '市辖区', '331100'); +INSERT INTO `tb_area` VALUES (1013, '331102', '莲都区', '331100'); +INSERT INTO `tb_area` VALUES (1014, '331121', '青田县', '331100'); +INSERT INTO `tb_area` VALUES (1015, '331122', '缙云县', '331100'); +INSERT INTO `tb_area` VALUES (1016, '331123', '遂昌县', '331100'); +INSERT INTO `tb_area` VALUES (1017, '331124', '松阳县', '331100'); +INSERT INTO `tb_area` VALUES (1018, '331125', '云和县', '331100'); +INSERT INTO `tb_area` VALUES (1019, '331126', '庆元县', '331100'); +INSERT INTO `tb_area` VALUES (1020, '331127', '景宁畲族自治县', '331100'); +INSERT INTO `tb_area` VALUES (1021, '331181', '龙泉市', '331100'); +INSERT INTO `tb_area` VALUES (1022, '340101', '市辖区', '340100'); +INSERT INTO `tb_area` VALUES (1023, '340102', '瑶海区', '340100'); +INSERT INTO `tb_area` VALUES (1024, '340103', '庐阳区', '340100'); +INSERT INTO `tb_area` VALUES (1025, '340104', '蜀山区', '340100'); +INSERT INTO `tb_area` VALUES (1026, '340111', '包河区', '340100'); +INSERT INTO `tb_area` VALUES (1027, '340121', '长丰县', '340100'); +INSERT INTO `tb_area` VALUES (1028, '340122', '肥东县', '340100'); +INSERT INTO `tb_area` VALUES (1029, '340123', '肥西县', '340100'); +INSERT INTO `tb_area` VALUES (1030, '340201', '市辖区', '340200'); +INSERT INTO `tb_area` VALUES (1031, '340202', '镜湖区', '340200'); +INSERT INTO `tb_area` VALUES (1032, '340203', '马塘区', '340200'); +INSERT INTO `tb_area` VALUES (1033, '340204', '新芜区', '340200'); +INSERT INTO `tb_area` VALUES (1034, '340207', '鸠江区', '340200'); +INSERT INTO `tb_area` VALUES (1035, '340221', '芜湖县', '340200'); +INSERT INTO `tb_area` VALUES (1036, '340222', '繁昌县', '340200'); +INSERT INTO `tb_area` VALUES (1037, '340223', '南陵县', '340200'); +INSERT INTO `tb_area` VALUES (1038, '340301', '市辖区', '340300'); +INSERT INTO `tb_area` VALUES (1039, '340302', '龙子湖区', '340300'); +INSERT INTO `tb_area` VALUES (1040, '340303', '蚌山区', '340300'); +INSERT INTO `tb_area` VALUES (1041, '340304', '禹会区', '340300'); +INSERT INTO `tb_area` VALUES (1042, '340311', '淮上区', '340300'); +INSERT INTO `tb_area` VALUES (1043, '340321', '怀远县', '340300'); +INSERT INTO `tb_area` VALUES (1044, '340322', '五河县', '340300'); +INSERT INTO `tb_area` VALUES (1045, '340323', '固镇县', '340300'); +INSERT INTO `tb_area` VALUES (1046, '340401', '市辖区', '340400'); +INSERT INTO `tb_area` VALUES (1047, '340402', '大通区', '340400'); +INSERT INTO `tb_area` VALUES (1048, '340403', '田家庵区', '340400'); +INSERT INTO `tb_area` VALUES (1049, '340404', '谢家集区', '340400'); +INSERT INTO `tb_area` VALUES (1050, '340405', '八公山区', '340400'); +INSERT INTO `tb_area` VALUES (1051, '340406', '潘集区', '340400'); +INSERT INTO `tb_area` VALUES (1052, '340421', '凤台县', '340400'); +INSERT INTO `tb_area` VALUES (1053, '340501', '市辖区', '340500'); +INSERT INTO `tb_area` VALUES (1054, '340502', '金家庄区', '340500'); +INSERT INTO `tb_area` VALUES (1055, '340503', '花山区', '340500'); +INSERT INTO `tb_area` VALUES (1056, '340504', '雨山区', '340500'); +INSERT INTO `tb_area` VALUES (1057, '340521', '当涂县', '340500'); +INSERT INTO `tb_area` VALUES (1058, '340601', '市辖区', '340600'); +INSERT INTO `tb_area` VALUES (1059, '340602', '杜集区', '340600'); +INSERT INTO `tb_area` VALUES (1060, '340603', '相山区', '340600'); +INSERT INTO `tb_area` VALUES (1061, '340604', '烈山区', '340600'); +INSERT INTO `tb_area` VALUES (1062, '340621', '濉溪县', '340600'); +INSERT INTO `tb_area` VALUES (1063, '340701', '市辖区', '340700'); +INSERT INTO `tb_area` VALUES (1064, '340702', '铜官山区', '340700'); +INSERT INTO `tb_area` VALUES (1065, '340703', '狮子山区', '340700'); +INSERT INTO `tb_area` VALUES (1066, '340711', '郊 区', '340700'); +INSERT INTO `tb_area` VALUES (1067, '340721', '铜陵县', '340700'); +INSERT INTO `tb_area` VALUES (1068, '340801', '市辖区', '340800'); +INSERT INTO `tb_area` VALUES (1069, '340802', '迎江区', '340800'); +INSERT INTO `tb_area` VALUES (1070, '340803', '大观区', '340800'); +INSERT INTO `tb_area` VALUES (1071, '340811', '郊 区', '340800'); +INSERT INTO `tb_area` VALUES (1072, '340822', '怀宁县', '340800'); +INSERT INTO `tb_area` VALUES (1073, '340823', '枞阳县', '340800'); +INSERT INTO `tb_area` VALUES (1074, '340824', '潜山县', '340800'); +INSERT INTO `tb_area` VALUES (1075, '340825', '太湖县', '340800'); +INSERT INTO `tb_area` VALUES (1076, '340826', '宿松县', '340800'); +INSERT INTO `tb_area` VALUES (1077, '340827', '望江县', '340800'); +INSERT INTO `tb_area` VALUES (1078, '340828', '岳西县', '340800'); +INSERT INTO `tb_area` VALUES (1079, '340881', '桐城市', '340800'); +INSERT INTO `tb_area` VALUES (1080, '341001', '市辖区', '341000'); +INSERT INTO `tb_area` VALUES (1081, '341002', '屯溪区', '341000'); +INSERT INTO `tb_area` VALUES (1082, '341003', '黄山区', '341000'); +INSERT INTO `tb_area` VALUES (1083, '341004', '徽州区', '341000'); +INSERT INTO `tb_area` VALUES (1084, '341021', '歙 县', '341000'); +INSERT INTO `tb_area` VALUES (1085, '341022', '休宁县', '341000'); +INSERT INTO `tb_area` VALUES (1086, '341023', '黟 县', '341000'); +INSERT INTO `tb_area` VALUES (1087, '341024', '祁门县', '341000'); +INSERT INTO `tb_area` VALUES (1088, '341101', '市辖区', '341100'); +INSERT INTO `tb_area` VALUES (1089, '341102', '琅琊区', '341100'); +INSERT INTO `tb_area` VALUES (1090, '341103', '南谯区', '341100'); +INSERT INTO `tb_area` VALUES (1091, '341122', '来安县', '341100'); +INSERT INTO `tb_area` VALUES (1092, '341124', '全椒县', '341100'); +INSERT INTO `tb_area` VALUES (1093, '341125', '定远县', '341100'); +INSERT INTO `tb_area` VALUES (1094, '341126', '凤阳县', '341100'); +INSERT INTO `tb_area` VALUES (1095, '341181', '天长市', '341100'); +INSERT INTO `tb_area` VALUES (1096, '341182', '明光市', '341100'); +INSERT INTO `tb_area` VALUES (1097, '341201', '市辖区', '341200'); +INSERT INTO `tb_area` VALUES (1098, '341202', '颍州区', '341200'); +INSERT INTO `tb_area` VALUES (1099, '341203', '颍东区', '341200'); +INSERT INTO `tb_area` VALUES (1100, '341204', '颍泉区', '341200'); +INSERT INTO `tb_area` VALUES (1101, '341221', '临泉县', '341200'); +INSERT INTO `tb_area` VALUES (1102, '341222', '太和县', '341200'); +INSERT INTO `tb_area` VALUES (1103, '341225', '阜南县', '341200'); +INSERT INTO `tb_area` VALUES (1104, '341226', '颍上县', '341200'); +INSERT INTO `tb_area` VALUES (1105, '341282', '界首市', '341200'); +INSERT INTO `tb_area` VALUES (1106, '341301', '市辖区', '341300'); +INSERT INTO `tb_area` VALUES (1107, '341302', '墉桥区', '341300'); +INSERT INTO `tb_area` VALUES (1108, '341321', '砀山县', '341300'); +INSERT INTO `tb_area` VALUES (1109, '341322', '萧 县', '341300'); +INSERT INTO `tb_area` VALUES (1110, '341323', '灵璧县', '341300'); +INSERT INTO `tb_area` VALUES (1111, '341324', '泗 县', '341300'); +INSERT INTO `tb_area` VALUES (1112, '341401', '市辖区', '341400'); +INSERT INTO `tb_area` VALUES (1113, '341402', '居巢区', '341400'); +INSERT INTO `tb_area` VALUES (1114, '341421', '庐江县', '341400'); +INSERT INTO `tb_area` VALUES (1115, '341422', '无为县', '341400'); +INSERT INTO `tb_area` VALUES (1116, '341423', '含山县', '341400'); +INSERT INTO `tb_area` VALUES (1117, '341424', '和 县', '341400'); +INSERT INTO `tb_area` VALUES (1118, '341501', '市辖区', '341500'); +INSERT INTO `tb_area` VALUES (1119, '341502', '金安区', '341500'); +INSERT INTO `tb_area` VALUES (1120, '341503', '裕安区', '341500'); +INSERT INTO `tb_area` VALUES (1121, '341521', '寿 县', '341500'); +INSERT INTO `tb_area` VALUES (1122, '341522', '霍邱县', '341500'); +INSERT INTO `tb_area` VALUES (1123, '341523', '舒城县', '341500'); +INSERT INTO `tb_area` VALUES (1124, '341524', '金寨县', '341500'); +INSERT INTO `tb_area` VALUES (1125, '341525', '霍山县', '341500'); +INSERT INTO `tb_area` VALUES (1126, '341601', '市辖区', '341600'); +INSERT INTO `tb_area` VALUES (1127, '341602', '谯城区', '341600'); +INSERT INTO `tb_area` VALUES (1128, '341621', '涡阳县', '341600'); +INSERT INTO `tb_area` VALUES (1129, '341622', '蒙城县', '341600'); +INSERT INTO `tb_area` VALUES (1130, '341623', '利辛县', '341600'); +INSERT INTO `tb_area` VALUES (1131, '341701', '市辖区', '341700'); +INSERT INTO `tb_area` VALUES (1132, '341702', '贵池区', '341700'); +INSERT INTO `tb_area` VALUES (1133, '341721', '东至县', '341700'); +INSERT INTO `tb_area` VALUES (1134, '341722', '石台县', '341700'); +INSERT INTO `tb_area` VALUES (1135, '341723', '青阳县', '341700'); +INSERT INTO `tb_area` VALUES (1136, '341801', '市辖区', '341800'); +INSERT INTO `tb_area` VALUES (1137, '341802', '宣州区', '341800'); +INSERT INTO `tb_area` VALUES (1138, '341821', '郎溪县', '341800'); +INSERT INTO `tb_area` VALUES (1139, '341822', '广德县', '341800'); +INSERT INTO `tb_area` VALUES (1140, '341823', '泾 县', '341800'); +INSERT INTO `tb_area` VALUES (1141, '341824', '绩溪县', '341800'); +INSERT INTO `tb_area` VALUES (1142, '341825', '旌德县', '341800'); +INSERT INTO `tb_area` VALUES (1143, '341881', '宁国市', '341800'); +INSERT INTO `tb_area` VALUES (1144, '350101', '市辖区', '350100'); +INSERT INTO `tb_area` VALUES (1145, '350102', '鼓楼区', '350100'); +INSERT INTO `tb_area` VALUES (1146, '350103', '台江区', '350100'); +INSERT INTO `tb_area` VALUES (1147, '350104', '仓山区', '350100'); +INSERT INTO `tb_area` VALUES (1148, '350105', '马尾区', '350100'); +INSERT INTO `tb_area` VALUES (1149, '350111', '晋安区', '350100'); +INSERT INTO `tb_area` VALUES (1150, '350121', '闽侯县', '350100'); +INSERT INTO `tb_area` VALUES (1151, '350122', '连江县', '350100'); +INSERT INTO `tb_area` VALUES (1152, '350123', '罗源县', '350100'); +INSERT INTO `tb_area` VALUES (1153, '350124', '闽清县', '350100'); +INSERT INTO `tb_area` VALUES (1154, '350125', '永泰县', '350100'); +INSERT INTO `tb_area` VALUES (1155, '350128', '平潭县', '350100'); +INSERT INTO `tb_area` VALUES (1156, '350181', '福清市', '350100'); +INSERT INTO `tb_area` VALUES (1157, '350182', '长乐市', '350100'); +INSERT INTO `tb_area` VALUES (1158, '350201', '市辖区', '350200'); +INSERT INTO `tb_area` VALUES (1159, '350203', '思明区', '350200'); +INSERT INTO `tb_area` VALUES (1160, '350205', '海沧区', '350200'); +INSERT INTO `tb_area` VALUES (1161, '350206', '湖里区', '350200'); +INSERT INTO `tb_area` VALUES (1162, '350211', '集美区', '350200'); +INSERT INTO `tb_area` VALUES (1163, '350212', '同安区', '350200'); +INSERT INTO `tb_area` VALUES (1164, '350213', '翔安区', '350200'); +INSERT INTO `tb_area` VALUES (1165, '350301', '市辖区', '350300'); +INSERT INTO `tb_area` VALUES (1166, '350302', '城厢区', '350300'); +INSERT INTO `tb_area` VALUES (1167, '350303', '涵江区', '350300'); +INSERT INTO `tb_area` VALUES (1168, '350304', '荔城区', '350300'); +INSERT INTO `tb_area` VALUES (1169, '350305', '秀屿区', '350300'); +INSERT INTO `tb_area` VALUES (1170, '350322', '仙游县', '350300'); +INSERT INTO `tb_area` VALUES (1171, '350401', '市辖区', '350400'); +INSERT INTO `tb_area` VALUES (1172, '350402', '梅列区', '350400'); +INSERT INTO `tb_area` VALUES (1173, '350403', '三元区', '350400'); +INSERT INTO `tb_area` VALUES (1174, '350421', '明溪县', '350400'); +INSERT INTO `tb_area` VALUES (1175, '350423', '清流县', '350400'); +INSERT INTO `tb_area` VALUES (1176, '350424', '宁化县', '350400'); +INSERT INTO `tb_area` VALUES (1177, '350425', '大田县', '350400'); +INSERT INTO `tb_area` VALUES (1178, '350426', '尤溪县', '350400'); +INSERT INTO `tb_area` VALUES (1179, '350427', '沙 县', '350400'); +INSERT INTO `tb_area` VALUES (1180, '350428', '将乐县', '350400'); +INSERT INTO `tb_area` VALUES (1181, '350429', '泰宁县', '350400'); +INSERT INTO `tb_area` VALUES (1182, '350430', '建宁县', '350400'); +INSERT INTO `tb_area` VALUES (1183, '350481', '永安市', '350400'); +INSERT INTO `tb_area` VALUES (1184, '350501', '市辖区', '350500'); +INSERT INTO `tb_area` VALUES (1185, '350502', '鲤城区', '350500'); +INSERT INTO `tb_area` VALUES (1186, '350503', '丰泽区', '350500'); +INSERT INTO `tb_area` VALUES (1187, '350504', '洛江区', '350500'); +INSERT INTO `tb_area` VALUES (1188, '350505', '泉港区', '350500'); +INSERT INTO `tb_area` VALUES (1189, '350521', '惠安县', '350500'); +INSERT INTO `tb_area` VALUES (1190, '350524', '安溪县', '350500'); +INSERT INTO `tb_area` VALUES (1191, '350525', '永春县', '350500'); +INSERT INTO `tb_area` VALUES (1192, '350526', '德化县', '350500'); +INSERT INTO `tb_area` VALUES (1193, '350527', '金门县', '350500'); +INSERT INTO `tb_area` VALUES (1194, '350581', '石狮市', '350500'); +INSERT INTO `tb_area` VALUES (1195, '350582', '晋江市', '350500'); +INSERT INTO `tb_area` VALUES (1196, '350583', '南安市', '350500'); +INSERT INTO `tb_area` VALUES (1197, '350601', '市辖区', '350600'); +INSERT INTO `tb_area` VALUES (1198, '350602', '芗城区', '350600'); +INSERT INTO `tb_area` VALUES (1199, '350603', '龙文区', '350600'); +INSERT INTO `tb_area` VALUES (1200, '350622', '云霄县', '350600'); +INSERT INTO `tb_area` VALUES (1201, '350623', '漳浦县', '350600'); +INSERT INTO `tb_area` VALUES (1202, '350624', '诏安县', '350600'); +INSERT INTO `tb_area` VALUES (1203, '350625', '长泰县', '350600'); +INSERT INTO `tb_area` VALUES (1204, '350626', '东山县', '350600'); +INSERT INTO `tb_area` VALUES (1205, '350627', '南靖县', '350600'); +INSERT INTO `tb_area` VALUES (1206, '350628', '平和县', '350600'); +INSERT INTO `tb_area` VALUES (1207, '350629', '华安县', '350600'); +INSERT INTO `tb_area` VALUES (1208, '350681', '龙海市', '350600'); +INSERT INTO `tb_area` VALUES (1209, '350701', '市辖区', '350700'); +INSERT INTO `tb_area` VALUES (1210, '350702', '延平区', '350700'); +INSERT INTO `tb_area` VALUES (1211, '350721', '顺昌县', '350700'); +INSERT INTO `tb_area` VALUES (1212, '350722', '浦城县', '350700'); +INSERT INTO `tb_area` VALUES (1213, '350723', '光泽县', '350700'); +INSERT INTO `tb_area` VALUES (1214, '350724', '松溪县', '350700'); +INSERT INTO `tb_area` VALUES (1215, '350725', '政和县', '350700'); +INSERT INTO `tb_area` VALUES (1216, '350781', '邵武市', '350700'); +INSERT INTO `tb_area` VALUES (1217, '350782', '武夷山市', '350700'); +INSERT INTO `tb_area` VALUES (1218, '350783', '建瓯市', '350700'); +INSERT INTO `tb_area` VALUES (1219, '350784', '建阳市', '350700'); +INSERT INTO `tb_area` VALUES (1220, '350801', '市辖区', '350800'); +INSERT INTO `tb_area` VALUES (1221, '350802', '新罗区', '350800'); +INSERT INTO `tb_area` VALUES (1222, '350821', '长汀县', '350800'); +INSERT INTO `tb_area` VALUES (1223, '350822', '永定县', '350800'); +INSERT INTO `tb_area` VALUES (1224, '350823', '上杭县', '350800'); +INSERT INTO `tb_area` VALUES (1225, '350824', '武平县', '350800'); +INSERT INTO `tb_area` VALUES (1226, '350825', '连城县', '350800'); +INSERT INTO `tb_area` VALUES (1227, '350881', '漳平市', '350800'); +INSERT INTO `tb_area` VALUES (1228, '350901', '市辖区', '350900'); +INSERT INTO `tb_area` VALUES (1229, '350902', '蕉城区', '350900'); +INSERT INTO `tb_area` VALUES (1230, '350921', '霞浦县', '350900'); +INSERT INTO `tb_area` VALUES (1231, '350922', '古田县', '350900'); +INSERT INTO `tb_area` VALUES (1232, '350923', '屏南县', '350900'); +INSERT INTO `tb_area` VALUES (1233, '350924', '寿宁县', '350900'); +INSERT INTO `tb_area` VALUES (1234, '350925', '周宁县', '350900'); +INSERT INTO `tb_area` VALUES (1235, '350926', '柘荣县', '350900'); +INSERT INTO `tb_area` VALUES (1236, '350981', '福安市', '350900'); +INSERT INTO `tb_area` VALUES (1237, '350982', '福鼎市', '350900'); +INSERT INTO `tb_area` VALUES (1238, '360101', '市辖区', '360100'); +INSERT INTO `tb_area` VALUES (1239, '360102', '东湖区', '360100'); +INSERT INTO `tb_area` VALUES (1240, '360103', '西湖区', '360100'); +INSERT INTO `tb_area` VALUES (1241, '360104', '青云谱区', '360100'); +INSERT INTO `tb_area` VALUES (1242, '360105', '湾里区', '360100'); +INSERT INTO `tb_area` VALUES (1243, '360111', '青山湖区', '360100'); +INSERT INTO `tb_area` VALUES (1244, '360121', '南昌县', '360100'); +INSERT INTO `tb_area` VALUES (1245, '360122', '新建县', '360100'); +INSERT INTO `tb_area` VALUES (1246, '360123', '安义县', '360100'); +INSERT INTO `tb_area` VALUES (1247, '360124', '进贤县', '360100'); +INSERT INTO `tb_area` VALUES (1248, '360201', '市辖区', '360200'); +INSERT INTO `tb_area` VALUES (1249, '360202', '昌江区', '360200'); +INSERT INTO `tb_area` VALUES (1250, '360203', '珠山区', '360200'); +INSERT INTO `tb_area` VALUES (1251, '360222', '浮梁县', '360200'); +INSERT INTO `tb_area` VALUES (1252, '360281', '乐平市', '360200'); +INSERT INTO `tb_area` VALUES (1253, '360301', '市辖区', '360300'); +INSERT INTO `tb_area` VALUES (1254, '360302', '安源区', '360300'); +INSERT INTO `tb_area` VALUES (1255, '360313', '湘东区', '360300'); +INSERT INTO `tb_area` VALUES (1256, '360321', '莲花县', '360300'); +INSERT INTO `tb_area` VALUES (1257, '360322', '上栗县', '360300'); +INSERT INTO `tb_area` VALUES (1258, '360323', '芦溪县', '360300'); +INSERT INTO `tb_area` VALUES (1259, '360401', '市辖区', '360400'); +INSERT INTO `tb_area` VALUES (1260, '360402', '庐山区', '360400'); +INSERT INTO `tb_area` VALUES (1261, '360403', '浔阳区', '360400'); +INSERT INTO `tb_area` VALUES (1262, '360421', '九江县', '360400'); +INSERT INTO `tb_area` VALUES (1263, '360423', '武宁县', '360400'); +INSERT INTO `tb_area` VALUES (1264, '360424', '修水县', '360400'); +INSERT INTO `tb_area` VALUES (1265, '360425', '永修县', '360400'); +INSERT INTO `tb_area` VALUES (1266, '360426', '德安县', '360400'); +INSERT INTO `tb_area` VALUES (1267, '360427', '星子县', '360400'); +INSERT INTO `tb_area` VALUES (1268, '360428', '都昌县', '360400'); +INSERT INTO `tb_area` VALUES (1269, '360429', '湖口县', '360400'); +INSERT INTO `tb_area` VALUES (1270, '360430', '彭泽县', '360400'); +INSERT INTO `tb_area` VALUES (1271, '360481', '瑞昌市', '360400'); +INSERT INTO `tb_area` VALUES (1272, '360501', '市辖区', '360500'); +INSERT INTO `tb_area` VALUES (1273, '360502', '渝水区', '360500'); +INSERT INTO `tb_area` VALUES (1274, '360521', '分宜县', '360500'); +INSERT INTO `tb_area` VALUES (1275, '360601', '市辖区', '360600'); +INSERT INTO `tb_area` VALUES (1276, '360602', '月湖区', '360600'); +INSERT INTO `tb_area` VALUES (1277, '360622', '余江县', '360600'); +INSERT INTO `tb_area` VALUES (1278, '360681', '贵溪市', '360600'); +INSERT INTO `tb_area` VALUES (1279, '360701', '市辖区', '360700'); +INSERT INTO `tb_area` VALUES (1280, '360702', '章贡区', '360700'); +INSERT INTO `tb_area` VALUES (1281, '360721', '赣 县', '360700'); +INSERT INTO `tb_area` VALUES (1282, '360722', '信丰县', '360700'); +INSERT INTO `tb_area` VALUES (1283, '360723', '大余县', '360700'); +INSERT INTO `tb_area` VALUES (1284, '360724', '上犹县', '360700'); +INSERT INTO `tb_area` VALUES (1285, '360725', '崇义县', '360700'); +INSERT INTO `tb_area` VALUES (1286, '360726', '安远县', '360700'); +INSERT INTO `tb_area` VALUES (1287, '360727', '龙南县', '360700'); +INSERT INTO `tb_area` VALUES (1288, '360728', '定南县', '360700'); +INSERT INTO `tb_area` VALUES (1289, '360729', '全南县', '360700'); +INSERT INTO `tb_area` VALUES (1290, '360730', '宁都县', '360700'); +INSERT INTO `tb_area` VALUES (1291, '360731', '于都县', '360700'); +INSERT INTO `tb_area` VALUES (1292, '360732', '兴国县', '360700'); +INSERT INTO `tb_area` VALUES (1293, '360733', '会昌县', '360700'); +INSERT INTO `tb_area` VALUES (1294, '360734', '寻乌县', '360700'); +INSERT INTO `tb_area` VALUES (1295, '360735', '石城县', '360700'); +INSERT INTO `tb_area` VALUES (1296, '360781', '瑞金市', '360700'); +INSERT INTO `tb_area` VALUES (1297, '360782', '南康市', '360700'); +INSERT INTO `tb_area` VALUES (1298, '360801', '市辖区', '360800'); +INSERT INTO `tb_area` VALUES (1299, '360802', '吉州区', '360800'); +INSERT INTO `tb_area` VALUES (1300, '360803', '青原区', '360800'); +INSERT INTO `tb_area` VALUES (1301, '360821', '吉安县', '360800'); +INSERT INTO `tb_area` VALUES (1302, '360822', '吉水县', '360800'); +INSERT INTO `tb_area` VALUES (1303, '360823', '峡江县', '360800'); +INSERT INTO `tb_area` VALUES (1304, '360824', '新干县', '360800'); +INSERT INTO `tb_area` VALUES (1305, '360825', '永丰县', '360800'); +INSERT INTO `tb_area` VALUES (1306, '360826', '泰和县', '360800'); +INSERT INTO `tb_area` VALUES (1307, '360827', '遂川县', '360800'); +INSERT INTO `tb_area` VALUES (1308, '360828', '万安县', '360800'); +INSERT INTO `tb_area` VALUES (1309, '360829', '安福县', '360800'); +INSERT INTO `tb_area` VALUES (1310, '360830', '永新县', '360800'); +INSERT INTO `tb_area` VALUES (1311, '360881', '井冈山市', '360800'); +INSERT INTO `tb_area` VALUES (1312, '360901', '市辖区', '360900'); +INSERT INTO `tb_area` VALUES (1313, '360902', '袁州区', '360900'); +INSERT INTO `tb_area` VALUES (1314, '360921', '奉新县', '360900'); +INSERT INTO `tb_area` VALUES (1315, '360922', '万载县', '360900'); +INSERT INTO `tb_area` VALUES (1316, '360923', '上高县', '360900'); +INSERT INTO `tb_area` VALUES (1317, '360924', '宜丰县', '360900'); +INSERT INTO `tb_area` VALUES (1318, '360925', '靖安县', '360900'); +INSERT INTO `tb_area` VALUES (1319, '360926', '铜鼓县', '360900'); +INSERT INTO `tb_area` VALUES (1320, '360981', '丰城市', '360900'); +INSERT INTO `tb_area` VALUES (1321, '360982', '樟树市', '360900'); +INSERT INTO `tb_area` VALUES (1322, '360983', '高安市', '360900'); +INSERT INTO `tb_area` VALUES (1323, '361001', '市辖区', '361000'); +INSERT INTO `tb_area` VALUES (1324, '361002', '临川区', '361000'); +INSERT INTO `tb_area` VALUES (1325, '361021', '南城县', '361000'); +INSERT INTO `tb_area` VALUES (1326, '361022', '黎川县', '361000'); +INSERT INTO `tb_area` VALUES (1327, '361023', '南丰县', '361000'); +INSERT INTO `tb_area` VALUES (1328, '361024', '崇仁县', '361000'); +INSERT INTO `tb_area` VALUES (1329, '361025', '乐安县', '361000'); +INSERT INTO `tb_area` VALUES (1330, '361026', '宜黄县', '361000'); +INSERT INTO `tb_area` VALUES (1331, '361027', '金溪县', '361000'); +INSERT INTO `tb_area` VALUES (1332, '361028', '资溪县', '361000'); +INSERT INTO `tb_area` VALUES (1333, '361029', '东乡县', '361000'); +INSERT INTO `tb_area` VALUES (1334, '361030', '广昌县', '361000'); +INSERT INTO `tb_area` VALUES (1335, '361101', '市辖区', '361100'); +INSERT INTO `tb_area` VALUES (1336, '361102', '信州区', '361100'); +INSERT INTO `tb_area` VALUES (1337, '361121', '上饶县', '361100'); +INSERT INTO `tb_area` VALUES (1338, '361122', '广丰县', '361100'); +INSERT INTO `tb_area` VALUES (1339, '361123', '玉山县', '361100'); +INSERT INTO `tb_area` VALUES (1340, '361124', '铅山县', '361100'); +INSERT INTO `tb_area` VALUES (1341, '361125', '横峰县', '361100'); +INSERT INTO `tb_area` VALUES (1342, '361126', '弋阳县', '361100'); +INSERT INTO `tb_area` VALUES (1343, '361127', '余干县', '361100'); +INSERT INTO `tb_area` VALUES (1344, '361128', '鄱阳县', '361100'); +INSERT INTO `tb_area` VALUES (1345, '361129', '万年县', '361100'); +INSERT INTO `tb_area` VALUES (1346, '361130', '婺源县', '361100'); +INSERT INTO `tb_area` VALUES (1347, '361181', '德兴市', '361100'); +INSERT INTO `tb_area` VALUES (1348, '370101', '市辖区', '370100'); +INSERT INTO `tb_area` VALUES (1349, '370102', '历下区', '370100'); +INSERT INTO `tb_area` VALUES (1350, '370103', '市中区', '370100'); +INSERT INTO `tb_area` VALUES (1351, '370104', '槐荫区', '370100'); +INSERT INTO `tb_area` VALUES (1352, '370105', '天桥区', '370100'); +INSERT INTO `tb_area` VALUES (1353, '370112', '历城区', '370100'); +INSERT INTO `tb_area` VALUES (1354, '370113', '长清区', '370100'); +INSERT INTO `tb_area` VALUES (1355, '370124', '平阴县', '370100'); +INSERT INTO `tb_area` VALUES (1356, '370125', '济阳县', '370100'); +INSERT INTO `tb_area` VALUES (1357, '370126', '商河县', '370100'); +INSERT INTO `tb_area` VALUES (1358, '370181', '章丘市', '370100'); +INSERT INTO `tb_area` VALUES (1359, '370201', '市辖区', '370200'); +INSERT INTO `tb_area` VALUES (1360, '370202', '市南区', '370200'); +INSERT INTO `tb_area` VALUES (1361, '370203', '市北区', '370200'); +INSERT INTO `tb_area` VALUES (1362, '370205', '四方区', '370200'); +INSERT INTO `tb_area` VALUES (1363, '370211', '黄岛区', '370200'); +INSERT INTO `tb_area` VALUES (1364, '370212', '崂山区', '370200'); +INSERT INTO `tb_area` VALUES (1365, '370213', '李沧区', '370200'); +INSERT INTO `tb_area` VALUES (1366, '370214', '城阳区', '370200'); +INSERT INTO `tb_area` VALUES (1367, '370281', '胶州市', '370200'); +INSERT INTO `tb_area` VALUES (1368, '370282', '即墨市', '370200'); +INSERT INTO `tb_area` VALUES (1369, '370283', '平度市', '370200'); +INSERT INTO `tb_area` VALUES (1370, '370284', '胶南市', '370200'); +INSERT INTO `tb_area` VALUES (1371, '370285', '莱西市', '370200'); +INSERT INTO `tb_area` VALUES (1372, '370301', '市辖区', '370300'); +INSERT INTO `tb_area` VALUES (1373, '370302', '淄川区', '370300'); +INSERT INTO `tb_area` VALUES (1374, '370303', '张店区', '370300'); +INSERT INTO `tb_area` VALUES (1375, '370304', '博山区', '370300'); +INSERT INTO `tb_area` VALUES (1376, '370305', '临淄区', '370300'); +INSERT INTO `tb_area` VALUES (1377, '370306', '周村区', '370300'); +INSERT INTO `tb_area` VALUES (1378, '370321', '桓台县', '370300'); +INSERT INTO `tb_area` VALUES (1379, '370322', '高青县', '370300'); +INSERT INTO `tb_area` VALUES (1380, '370323', '沂源县', '370300'); +INSERT INTO `tb_area` VALUES (1381, '370401', '市辖区', '370400'); +INSERT INTO `tb_area` VALUES (1382, '370402', '市中区', '370400'); +INSERT INTO `tb_area` VALUES (1383, '370403', '薛城区', '370400'); +INSERT INTO `tb_area` VALUES (1384, '370404', '峄城区', '370400'); +INSERT INTO `tb_area` VALUES (1385, '370405', '台儿庄区', '370400'); +INSERT INTO `tb_area` VALUES (1386, '370406', '山亭区', '370400'); +INSERT INTO `tb_area` VALUES (1387, '370481', '滕州市', '370400'); +INSERT INTO `tb_area` VALUES (1388, '370501', '市辖区', '370500'); +INSERT INTO `tb_area` VALUES (1389, '370502', '东营区', '370500'); +INSERT INTO `tb_area` VALUES (1390, '370503', '河口区', '370500'); +INSERT INTO `tb_area` VALUES (1391, '370521', '垦利县', '370500'); +INSERT INTO `tb_area` VALUES (1392, '370522', '利津县', '370500'); +INSERT INTO `tb_area` VALUES (1393, '370523', '广饶县', '370500'); +INSERT INTO `tb_area` VALUES (1394, '370601', '市辖区', '370600'); +INSERT INTO `tb_area` VALUES (1395, '370602', '芝罘区', '370600'); +INSERT INTO `tb_area` VALUES (1396, '370611', '福山区', '370600'); +INSERT INTO `tb_area` VALUES (1397, '370612', '牟平区', '370600'); +INSERT INTO `tb_area` VALUES (1398, '370613', '莱山区', '370600'); +INSERT INTO `tb_area` VALUES (1399, '370634', '长岛县', '370600'); +INSERT INTO `tb_area` VALUES (1400, '370681', '龙口市', '370600'); +INSERT INTO `tb_area` VALUES (1401, '370682', '莱阳市', '370600'); +INSERT INTO `tb_area` VALUES (1402, '370683', '莱州市', '370600'); +INSERT INTO `tb_area` VALUES (1403, '370684', '蓬莱市', '370600'); +INSERT INTO `tb_area` VALUES (1404, '370685', '招远市', '370600'); +INSERT INTO `tb_area` VALUES (1405, '370686', '栖霞市', '370600'); +INSERT INTO `tb_area` VALUES (1406, '370687', '海阳市', '370600'); +INSERT INTO `tb_area` VALUES (1407, '370701', '市辖区', '370700'); +INSERT INTO `tb_area` VALUES (1408, '370702', '潍城区', '370700'); +INSERT INTO `tb_area` VALUES (1409, '370703', '寒亭区', '370700'); +INSERT INTO `tb_area` VALUES (1410, '370704', '坊子区', '370700'); +INSERT INTO `tb_area` VALUES (1411, '370705', '奎文区', '370700'); +INSERT INTO `tb_area` VALUES (1412, '370724', '临朐县', '370700'); +INSERT INTO `tb_area` VALUES (1413, '370725', '昌乐县', '370700'); +INSERT INTO `tb_area` VALUES (1414, '370781', '青州市', '370700'); +INSERT INTO `tb_area` VALUES (1415, '370782', '诸城市', '370700'); +INSERT INTO `tb_area` VALUES (1416, '370783', '寿光市', '370700'); +INSERT INTO `tb_area` VALUES (1417, '370784', '安丘市', '370700'); +INSERT INTO `tb_area` VALUES (1418, '370785', '高密市', '370700'); +INSERT INTO `tb_area` VALUES (1419, '370786', '昌邑市', '370700'); +INSERT INTO `tb_area` VALUES (1420, '370801', '市辖区', '370800'); +INSERT INTO `tb_area` VALUES (1421, '370802', '市中区', '370800'); +INSERT INTO `tb_area` VALUES (1422, '370811', '任城区', '370800'); +INSERT INTO `tb_area` VALUES (1423, '370826', '微山县', '370800'); +INSERT INTO `tb_area` VALUES (1424, '370827', '鱼台县', '370800'); +INSERT INTO `tb_area` VALUES (1425, '370828', '金乡县', '370800'); +INSERT INTO `tb_area` VALUES (1426, '370829', '嘉祥县', '370800'); +INSERT INTO `tb_area` VALUES (1427, '370830', '汶上县', '370800'); +INSERT INTO `tb_area` VALUES (1428, '370831', '泗水县', '370800'); +INSERT INTO `tb_area` VALUES (1429, '370832', '梁山县', '370800'); +INSERT INTO `tb_area` VALUES (1430, '370881', '曲阜市', '370800'); +INSERT INTO `tb_area` VALUES (1431, '370882', '兖州市', '370800'); +INSERT INTO `tb_area` VALUES (1432, '370883', '邹城市', '370800'); +INSERT INTO `tb_area` VALUES (1433, '370901', '市辖区', '370900'); +INSERT INTO `tb_area` VALUES (1434, '370902', '泰山区', '370900'); +INSERT INTO `tb_area` VALUES (1435, '370903', '岱岳区', '370900'); +INSERT INTO `tb_area` VALUES (1436, '370921', '宁阳县', '370900'); +INSERT INTO `tb_area` VALUES (1437, '370923', '东平县', '370900'); +INSERT INTO `tb_area` VALUES (1438, '370982', '新泰市', '370900'); +INSERT INTO `tb_area` VALUES (1439, '370983', '肥城市', '370900'); +INSERT INTO `tb_area` VALUES (1440, '371001', '市辖区', '371000'); +INSERT INTO `tb_area` VALUES (1441, '371002', '环翠区', '371000'); +INSERT INTO `tb_area` VALUES (1442, '371081', '文登市', '371000'); +INSERT INTO `tb_area` VALUES (1443, '371082', '荣成市', '371000'); +INSERT INTO `tb_area` VALUES (1444, '371083', '乳山市', '371000'); +INSERT INTO `tb_area` VALUES (1445, '371101', '市辖区', '371100'); +INSERT INTO `tb_area` VALUES (1446, '371102', '东港区', '371100'); +INSERT INTO `tb_area` VALUES (1447, '371103', '岚山区', '371100'); +INSERT INTO `tb_area` VALUES (1448, '371121', '五莲县', '371100'); +INSERT INTO `tb_area` VALUES (1449, '371122', '莒 县', '371100'); +INSERT INTO `tb_area` VALUES (1450, '371201', '市辖区', '371200'); +INSERT INTO `tb_area` VALUES (1451, '371202', '莱城区', '371200'); +INSERT INTO `tb_area` VALUES (1452, '371203', '钢城区', '371200'); +INSERT INTO `tb_area` VALUES (1453, '371301', '市辖区', '371300'); +INSERT INTO `tb_area` VALUES (1454, '371302', '兰山区', '371300'); +INSERT INTO `tb_area` VALUES (1455, '371311', '罗庄区', '371300'); +INSERT INTO `tb_area` VALUES (1456, '371312', '河东区', '371300'); +INSERT INTO `tb_area` VALUES (1457, '371321', '沂南县', '371300'); +INSERT INTO `tb_area` VALUES (1458, '371322', '郯城县', '371300'); +INSERT INTO `tb_area` VALUES (1459, '371323', '沂水县', '371300'); +INSERT INTO `tb_area` VALUES (1460, '371324', '苍山县', '371300'); +INSERT INTO `tb_area` VALUES (1461, '371325', '费 县', '371300'); +INSERT INTO `tb_area` VALUES (1462, '371326', '平邑县', '371300'); +INSERT INTO `tb_area` VALUES (1463, '371327', '莒南县', '371300'); +INSERT INTO `tb_area` VALUES (1464, '371328', '蒙阴县', '371300'); +INSERT INTO `tb_area` VALUES (1465, '371329', '临沭县', '371300'); +INSERT INTO `tb_area` VALUES (1466, '371401', '市辖区', '371400'); +INSERT INTO `tb_area` VALUES (1467, '371402', '德城区', '371400'); +INSERT INTO `tb_area` VALUES (1468, '371421', '陵 县', '371400'); +INSERT INTO `tb_area` VALUES (1469, '371422', '宁津县', '371400'); +INSERT INTO `tb_area` VALUES (1470, '371423', '庆云县', '371400'); +INSERT INTO `tb_area` VALUES (1471, '371424', '临邑县', '371400'); +INSERT INTO `tb_area` VALUES (1472, '371425', '齐河县', '371400'); +INSERT INTO `tb_area` VALUES (1473, '371426', '平原县', '371400'); +INSERT INTO `tb_area` VALUES (1474, '371427', '夏津县', '371400'); +INSERT INTO `tb_area` VALUES (1475, '371428', '武城县', '371400'); +INSERT INTO `tb_area` VALUES (1476, '371481', '乐陵市', '371400'); +INSERT INTO `tb_area` VALUES (1477, '371482', '禹城市', '371400'); +INSERT INTO `tb_area` VALUES (1478, '371501', '市辖区', '371500'); +INSERT INTO `tb_area` VALUES (1479, '371502', '东昌府区', '371500'); +INSERT INTO `tb_area` VALUES (1480, '371521', '阳谷县', '371500'); +INSERT INTO `tb_area` VALUES (1481, '371522', '莘 县', '371500'); +INSERT INTO `tb_area` VALUES (1482, '371523', '茌平县', '371500'); +INSERT INTO `tb_area` VALUES (1483, '371524', '东阿县', '371500'); +INSERT INTO `tb_area` VALUES (1484, '371525', '冠 县', '371500'); +INSERT INTO `tb_area` VALUES (1485, '371526', '高唐县', '371500'); +INSERT INTO `tb_area` VALUES (1486, '371581', '临清市', '371500'); +INSERT INTO `tb_area` VALUES (1487, '371601', '市辖区', '371600'); +INSERT INTO `tb_area` VALUES (1488, '371602', '滨城区', '371600'); +INSERT INTO `tb_area` VALUES (1489, '371621', '惠民县', '371600'); +INSERT INTO `tb_area` VALUES (1490, '371622', '阳信县', '371600'); +INSERT INTO `tb_area` VALUES (1491, '371623', '无棣县', '371600'); +INSERT INTO `tb_area` VALUES (1492, '371624', '沾化县', '371600'); +INSERT INTO `tb_area` VALUES (1493, '371625', '博兴县', '371600'); +INSERT INTO `tb_area` VALUES (1494, '371626', '邹平县', '371600'); +INSERT INTO `tb_area` VALUES (1495, '371701', '市辖区', '371700'); +INSERT INTO `tb_area` VALUES (1496, '371702', '牡丹区', '371700'); +INSERT INTO `tb_area` VALUES (1497, '371721', '曹 县', '371700'); +INSERT INTO `tb_area` VALUES (1498, '371722', '单 县', '371700'); +INSERT INTO `tb_area` VALUES (1499, '371723', '成武县', '371700'); +INSERT INTO `tb_area` VALUES (1500, '371724', '巨野县', '371700'); +INSERT INTO `tb_area` VALUES (1501, '371725', '郓城县', '371700'); +INSERT INTO `tb_area` VALUES (1502, '371726', '鄄城县', '371700'); +INSERT INTO `tb_area` VALUES (1503, '371727', '定陶县', '371700'); +INSERT INTO `tb_area` VALUES (1504, '371728', '东明县', '371700'); +INSERT INTO `tb_area` VALUES (1505, '410101', '市辖区', '410100'); +INSERT INTO `tb_area` VALUES (1506, '410102', '中原区', '410100'); +INSERT INTO `tb_area` VALUES (1507, '410103', '二七区', '410100'); +INSERT INTO `tb_area` VALUES (1508, '410104', '管城回族区', '410100'); +INSERT INTO `tb_area` VALUES (1509, '410105', '金水区', '410100'); +INSERT INTO `tb_area` VALUES (1510, '410106', '上街区', '410100'); +INSERT INTO `tb_area` VALUES (1511, '410108', '邙山区', '410100'); +INSERT INTO `tb_area` VALUES (1512, '410122', '中牟县', '410100'); +INSERT INTO `tb_area` VALUES (1513, '410181', '巩义市', '410100'); +INSERT INTO `tb_area` VALUES (1514, '410182', '荥阳市', '410100'); +INSERT INTO `tb_area` VALUES (1515, '410183', '新密市', '410100'); +INSERT INTO `tb_area` VALUES (1516, '410184', '新郑市', '410100'); +INSERT INTO `tb_area` VALUES (1517, '410185', '登封市', '410100'); +INSERT INTO `tb_area` VALUES (1518, '410201', '市辖区', '410200'); +INSERT INTO `tb_area` VALUES (1519, '410202', '龙亭区', '410200'); +INSERT INTO `tb_area` VALUES (1520, '410203', '顺河回族区', '410200'); +INSERT INTO `tb_area` VALUES (1521, '410204', '鼓楼区', '410200'); +INSERT INTO `tb_area` VALUES (1522, '410205', '南关区', '410200'); +INSERT INTO `tb_area` VALUES (1523, '410211', '郊 区', '410200'); +INSERT INTO `tb_area` VALUES (1524, '410221', '杞 县', '410200'); +INSERT INTO `tb_area` VALUES (1525, '410222', '通许县', '410200'); +INSERT INTO `tb_area` VALUES (1526, '410223', '尉氏县', '410200'); +INSERT INTO `tb_area` VALUES (1527, '410224', '开封县', '410200'); +INSERT INTO `tb_area` VALUES (1528, '410225', '兰考县', '410200'); +INSERT INTO `tb_area` VALUES (1529, '410301', '市辖区', '410300'); +INSERT INTO `tb_area` VALUES (1530, '410302', '老城区', '410300'); +INSERT INTO `tb_area` VALUES (1531, '410303', '西工区', '410300'); +INSERT INTO `tb_area` VALUES (1532, '410304', '廛河回族区', '410300'); +INSERT INTO `tb_area` VALUES (1533, '410305', '涧西区', '410300'); +INSERT INTO `tb_area` VALUES (1534, '410306', '吉利区', '410300'); +INSERT INTO `tb_area` VALUES (1535, '410307', '洛龙区', '410300'); +INSERT INTO `tb_area` VALUES (1536, '410322', '孟津县', '410300'); +INSERT INTO `tb_area` VALUES (1537, '410323', '新安县', '410300'); +INSERT INTO `tb_area` VALUES (1538, '410324', '栾川县', '410300'); +INSERT INTO `tb_area` VALUES (1539, '410325', '嵩 县', '410300'); +INSERT INTO `tb_area` VALUES (1540, '410326', '汝阳县', '410300'); +INSERT INTO `tb_area` VALUES (1541, '410327', '宜阳县', '410300'); +INSERT INTO `tb_area` VALUES (1542, '410328', '洛宁县', '410300'); +INSERT INTO `tb_area` VALUES (1543, '410329', '伊川县', '410300'); +INSERT INTO `tb_area` VALUES (1544, '410381', '偃师市', '410300'); +INSERT INTO `tb_area` VALUES (1545, '410401', '市辖区', '410400'); +INSERT INTO `tb_area` VALUES (1546, '410402', '新华区', '410400'); +INSERT INTO `tb_area` VALUES (1547, '410403', '卫东区', '410400'); +INSERT INTO `tb_area` VALUES (1548, '410404', '石龙区', '410400'); +INSERT INTO `tb_area` VALUES (1549, '410411', '湛河区', '410400'); +INSERT INTO `tb_area` VALUES (1550, '410421', '宝丰县', '410400'); +INSERT INTO `tb_area` VALUES (1551, '410422', '叶 县', '410400'); +INSERT INTO `tb_area` VALUES (1552, '410423', '鲁山县', '410400'); +INSERT INTO `tb_area` VALUES (1553, '410425', '郏 县', '410400'); +INSERT INTO `tb_area` VALUES (1554, '410481', '舞钢市', '410400'); +INSERT INTO `tb_area` VALUES (1555, '410482', '汝州市', '410400'); +INSERT INTO `tb_area` VALUES (1556, '410501', '市辖区', '410500'); +INSERT INTO `tb_area` VALUES (1557, '410502', '文峰区', '410500'); +INSERT INTO `tb_area` VALUES (1558, '410503', '北关区', '410500'); +INSERT INTO `tb_area` VALUES (1559, '410505', '殷都区', '410500'); +INSERT INTO `tb_area` VALUES (1560, '410506', '龙安区', '410500'); +INSERT INTO `tb_area` VALUES (1561, '410522', '安阳县', '410500'); +INSERT INTO `tb_area` VALUES (1562, '410523', '汤阴县', '410500'); +INSERT INTO `tb_area` VALUES (1563, '410526', '滑 县', '410500'); +INSERT INTO `tb_area` VALUES (1564, '410527', '内黄县', '410500'); +INSERT INTO `tb_area` VALUES (1565, '410581', '林州市', '410500'); +INSERT INTO `tb_area` VALUES (1566, '410601', '市辖区', '410600'); +INSERT INTO `tb_area` VALUES (1567, '410602', '鹤山区', '410600'); +INSERT INTO `tb_area` VALUES (1568, '410603', '山城区', '410600'); +INSERT INTO `tb_area` VALUES (1569, '410611', '淇滨区', '410600'); +INSERT INTO `tb_area` VALUES (1570, '410621', '浚 县', '410600'); +INSERT INTO `tb_area` VALUES (1571, '410622', '淇 县', '410600'); +INSERT INTO `tb_area` VALUES (1572, '410701', '市辖区', '410700'); +INSERT INTO `tb_area` VALUES (1573, '410702', '红旗区', '410700'); +INSERT INTO `tb_area` VALUES (1574, '410703', '卫滨区', '410700'); +INSERT INTO `tb_area` VALUES (1575, '410704', '凤泉区', '410700'); +INSERT INTO `tb_area` VALUES (1576, '410711', '牧野区', '410700'); +INSERT INTO `tb_area` VALUES (1577, '410721', '新乡县', '410700'); +INSERT INTO `tb_area` VALUES (1578, '410724', '获嘉县', '410700'); +INSERT INTO `tb_area` VALUES (1579, '410725', '原阳县', '410700'); +INSERT INTO `tb_area` VALUES (1580, '410726', '延津县', '410700'); +INSERT INTO `tb_area` VALUES (1581, '410727', '封丘县', '410700'); +INSERT INTO `tb_area` VALUES (1582, '410728', '长垣县', '410700'); +INSERT INTO `tb_area` VALUES (1583, '410781', '卫辉市', '410700'); +INSERT INTO `tb_area` VALUES (1584, '410782', '辉县市', '410700'); +INSERT INTO `tb_area` VALUES (1585, '410801', '市辖区', '410800'); +INSERT INTO `tb_area` VALUES (1586, '410802', '解放区', '410800'); +INSERT INTO `tb_area` VALUES (1587, '410803', '中站区', '410800'); +INSERT INTO `tb_area` VALUES (1588, '410804', '马村区', '410800'); +INSERT INTO `tb_area` VALUES (1589, '410811', '山阳区', '410800'); +INSERT INTO `tb_area` VALUES (1590, '410821', '修武县', '410800'); +INSERT INTO `tb_area` VALUES (1591, '410822', '博爱县', '410800'); +INSERT INTO `tb_area` VALUES (1592, '410823', '武陟县', '410800'); +INSERT INTO `tb_area` VALUES (1593, '410825', '温 县', '410800'); +INSERT INTO `tb_area` VALUES (1594, '410881', '济源市', '410800'); +INSERT INTO `tb_area` VALUES (1595, '410882', '沁阳市', '410800'); +INSERT INTO `tb_area` VALUES (1596, '410883', '孟州市', '410800'); +INSERT INTO `tb_area` VALUES (1597, '410901', '市辖区', '410900'); +INSERT INTO `tb_area` VALUES (1598, '410902', '华龙区', '410900'); +INSERT INTO `tb_area` VALUES (1599, '410922', '清丰县', '410900'); +INSERT INTO `tb_area` VALUES (1600, '410923', '南乐县', '410900'); +INSERT INTO `tb_area` VALUES (1601, '410926', '范 县', '410900'); +INSERT INTO `tb_area` VALUES (1602, '410927', '台前县', '410900'); +INSERT INTO `tb_area` VALUES (1603, '410928', '濮阳县', '410900'); +INSERT INTO `tb_area` VALUES (1604, '411001', '市辖区', '411000'); +INSERT INTO `tb_area` VALUES (1605, '411002', '魏都区', '411000'); +INSERT INTO `tb_area` VALUES (1606, '411023', '许昌县', '411000'); +INSERT INTO `tb_area` VALUES (1607, '411024', '鄢陵县', '411000'); +INSERT INTO `tb_area` VALUES (1608, '411025', '襄城县', '411000'); +INSERT INTO `tb_area` VALUES (1609, '411081', '禹州市', '411000'); +INSERT INTO `tb_area` VALUES (1610, '411082', '长葛市', '411000'); +INSERT INTO `tb_area` VALUES (1611, '411101', '市辖区', '411100'); +INSERT INTO `tb_area` VALUES (1612, '411102', '源汇区', '411100'); +INSERT INTO `tb_area` VALUES (1613, '411103', '郾城区', '411100'); +INSERT INTO `tb_area` VALUES (1614, '411104', '召陵区', '411100'); +INSERT INTO `tb_area` VALUES (1615, '411121', '舞阳县', '411100'); +INSERT INTO `tb_area` VALUES (1616, '411122', '临颍县', '411100'); +INSERT INTO `tb_area` VALUES (1617, '411201', '市辖区', '411200'); +INSERT INTO `tb_area` VALUES (1618, '411202', '湖滨区', '411200'); +INSERT INTO `tb_area` VALUES (1619, '411221', '渑池县', '411200'); +INSERT INTO `tb_area` VALUES (1620, '411222', '陕 县', '411200'); +INSERT INTO `tb_area` VALUES (1621, '411224', '卢氏县', '411200'); +INSERT INTO `tb_area` VALUES (1622, '411281', '义马市', '411200'); +INSERT INTO `tb_area` VALUES (1623, '411282', '灵宝市', '411200'); +INSERT INTO `tb_area` VALUES (1624, '411301', '市辖区', '411300'); +INSERT INTO `tb_area` VALUES (1625, '411302', '宛城区', '411300'); +INSERT INTO `tb_area` VALUES (1626, '411303', '卧龙区', '411300'); +INSERT INTO `tb_area` VALUES (1627, '411321', '南召县', '411300'); +INSERT INTO `tb_area` VALUES (1628, '411322', '方城县', '411300'); +INSERT INTO `tb_area` VALUES (1629, '411323', '西峡县', '411300'); +INSERT INTO `tb_area` VALUES (1630, '411324', '镇平县', '411300'); +INSERT INTO `tb_area` VALUES (1631, '411325', '内乡县', '411300'); +INSERT INTO `tb_area` VALUES (1632, '411326', '淅川县', '411300'); +INSERT INTO `tb_area` VALUES (1633, '411327', '社旗县', '411300'); +INSERT INTO `tb_area` VALUES (1634, '411328', '唐河县', '411300'); +INSERT INTO `tb_area` VALUES (1635, '411329', '新野县', '411300'); +INSERT INTO `tb_area` VALUES (1636, '411330', '桐柏县', '411300'); +INSERT INTO `tb_area` VALUES (1637, '411381', '邓州市', '411300'); +INSERT INTO `tb_area` VALUES (1638, '411401', '市辖区', '411400'); +INSERT INTO `tb_area` VALUES (1639, '411402', '梁园区', '411400'); +INSERT INTO `tb_area` VALUES (1640, '411403', '睢阳区', '411400'); +INSERT INTO `tb_area` VALUES (1641, '411421', '民权县', '411400'); +INSERT INTO `tb_area` VALUES (1642, '411422', '睢 县', '411400'); +INSERT INTO `tb_area` VALUES (1643, '411423', '宁陵县', '411400'); +INSERT INTO `tb_area` VALUES (1644, '411424', '柘城县', '411400'); +INSERT INTO `tb_area` VALUES (1645, '411425', '虞城县', '411400'); +INSERT INTO `tb_area` VALUES (1646, '411426', '夏邑县', '411400'); +INSERT INTO `tb_area` VALUES (1647, '411481', '永城市', '411400'); +INSERT INTO `tb_area` VALUES (1648, '411501', '市辖区', '411500'); +INSERT INTO `tb_area` VALUES (1649, '411502', '师河区', '411500'); +INSERT INTO `tb_area` VALUES (1650, '411503', '平桥区', '411500'); +INSERT INTO `tb_area` VALUES (1651, '411521', '罗山县', '411500'); +INSERT INTO `tb_area` VALUES (1652, '411522', '光山县', '411500'); +INSERT INTO `tb_area` VALUES (1653, '411523', '新 县', '411500'); +INSERT INTO `tb_area` VALUES (1654, '411524', '商城县', '411500'); +INSERT INTO `tb_area` VALUES (1655, '411525', '固始县', '411500'); +INSERT INTO `tb_area` VALUES (1656, '411526', '潢川县', '411500'); +INSERT INTO `tb_area` VALUES (1657, '411527', '淮滨县', '411500'); +INSERT INTO `tb_area` VALUES (1658, '411528', '息 县', '411500'); +INSERT INTO `tb_area` VALUES (1659, '411601', '市辖区', '411600'); +INSERT INTO `tb_area` VALUES (1660, '411602', '川汇区', '411600'); +INSERT INTO `tb_area` VALUES (1661, '411621', '扶沟县', '411600'); +INSERT INTO `tb_area` VALUES (1662, '411622', '西华县', '411600'); +INSERT INTO `tb_area` VALUES (1663, '411623', '商水县', '411600'); +INSERT INTO `tb_area` VALUES (1664, '411624', '沈丘县', '411600'); +INSERT INTO `tb_area` VALUES (1665, '411625', '郸城县', '411600'); +INSERT INTO `tb_area` VALUES (1666, '411626', '淮阳县', '411600'); +INSERT INTO `tb_area` VALUES (1667, '411627', '太康县', '411600'); +INSERT INTO `tb_area` VALUES (1668, '411628', '鹿邑县', '411600'); +INSERT INTO `tb_area` VALUES (1669, '411681', '项城市', '411600'); +INSERT INTO `tb_area` VALUES (1670, '411701', '市辖区', '411700'); +INSERT INTO `tb_area` VALUES (1671, '411702', '驿城区', '411700'); +INSERT INTO `tb_area` VALUES (1672, '411721', '西平县', '411700'); +INSERT INTO `tb_area` VALUES (1673, '411722', '上蔡县', '411700'); +INSERT INTO `tb_area` VALUES (1674, '411723', '平舆县', '411700'); +INSERT INTO `tb_area` VALUES (1675, '411724', '正阳县', '411700'); +INSERT INTO `tb_area` VALUES (1676, '411725', '确山县', '411700'); +INSERT INTO `tb_area` VALUES (1677, '411726', '泌阳县', '411700'); +INSERT INTO `tb_area` VALUES (1678, '411727', '汝南县', '411700'); +INSERT INTO `tb_area` VALUES (1679, '411728', '遂平县', '411700'); +INSERT INTO `tb_area` VALUES (1680, '411729', '新蔡县', '411700'); +INSERT INTO `tb_area` VALUES (1681, '420101', '市辖区', '420100'); +INSERT INTO `tb_area` VALUES (1682, '420102', '江岸区', '420100'); +INSERT INTO `tb_area` VALUES (1683, '420103', '江汉区', '420100'); +INSERT INTO `tb_area` VALUES (1684, '420104', '乔口区', '420100'); +INSERT INTO `tb_area` VALUES (1685, '420105', '汉阳区', '420100'); +INSERT INTO `tb_area` VALUES (1686, '420106', '武昌区', '420100'); +INSERT INTO `tb_area` VALUES (1687, '420107', '青山区', '420100'); +INSERT INTO `tb_area` VALUES (1688, '420111', '洪山区', '420100'); +INSERT INTO `tb_area` VALUES (1689, '420112', '东西湖区', '420100'); +INSERT INTO `tb_area` VALUES (1690, '420113', '汉南区', '420100'); +INSERT INTO `tb_area` VALUES (1691, '420114', '蔡甸区', '420100'); +INSERT INTO `tb_area` VALUES (1692, '420115', '江夏区', '420100'); +INSERT INTO `tb_area` VALUES (1693, '420116', '黄陂区', '420100'); +INSERT INTO `tb_area` VALUES (1694, '420117', '新洲区', '420100'); +INSERT INTO `tb_area` VALUES (1695, '420201', '市辖区', '420200'); +INSERT INTO `tb_area` VALUES (1696, '420202', '黄石港区', '420200'); +INSERT INTO `tb_area` VALUES (1697, '420203', '西塞山区', '420200'); +INSERT INTO `tb_area` VALUES (1698, '420204', '下陆区', '420200'); +INSERT INTO `tb_area` VALUES (1699, '420205', '铁山区', '420200'); +INSERT INTO `tb_area` VALUES (1700, '420222', '阳新县', '420200'); +INSERT INTO `tb_area` VALUES (1701, '420281', '大冶市', '420200'); +INSERT INTO `tb_area` VALUES (1702, '420301', '市辖区', '420300'); +INSERT INTO `tb_area` VALUES (1703, '420302', '茅箭区', '420300'); +INSERT INTO `tb_area` VALUES (1704, '420303', '张湾区', '420300'); +INSERT INTO `tb_area` VALUES (1705, '420321', '郧 县', '420300'); +INSERT INTO `tb_area` VALUES (1706, '420322', '郧西县', '420300'); +INSERT INTO `tb_area` VALUES (1707, '420323', '竹山县', '420300'); +INSERT INTO `tb_area` VALUES (1708, '420324', '竹溪县', '420300'); +INSERT INTO `tb_area` VALUES (1709, '420325', '房 县', '420300'); +INSERT INTO `tb_area` VALUES (1710, '420381', '丹江口市', '420300'); +INSERT INTO `tb_area` VALUES (1711, '420501', '市辖区', '420500'); +INSERT INTO `tb_area` VALUES (1712, '420502', '西陵区', '420500'); +INSERT INTO `tb_area` VALUES (1713, '420503', '伍家岗区', '420500'); +INSERT INTO `tb_area` VALUES (1714, '420504', '点军区', '420500'); +INSERT INTO `tb_area` VALUES (1715, '420505', '猇亭区', '420500'); +INSERT INTO `tb_area` VALUES (1716, '420506', '夷陵区', '420500'); +INSERT INTO `tb_area` VALUES (1717, '420525', '远安县', '420500'); +INSERT INTO `tb_area` VALUES (1718, '420526', '兴山县', '420500'); +INSERT INTO `tb_area` VALUES (1719, '420527', '秭归县', '420500'); +INSERT INTO `tb_area` VALUES (1720, '420528', '长阳土家族自治县', '420500'); +INSERT INTO `tb_area` VALUES (1721, '420529', '五峰土家族自治县', '420500'); +INSERT INTO `tb_area` VALUES (1722, '420581', '宜都市', '420500'); +INSERT INTO `tb_area` VALUES (1723, '420582', '当阳市', '420500'); +INSERT INTO `tb_area` VALUES (1724, '420583', '枝江市', '420500'); +INSERT INTO `tb_area` VALUES (1725, '420601', '市辖区', '420600'); +INSERT INTO `tb_area` VALUES (1726, '420602', '襄城区', '420600'); +INSERT INTO `tb_area` VALUES (1727, '420606', '樊城区', '420600'); +INSERT INTO `tb_area` VALUES (1728, '420607', '襄阳区', '420600'); +INSERT INTO `tb_area` VALUES (1729, '420624', '南漳县', '420600'); +INSERT INTO `tb_area` VALUES (1730, '420625', '谷城县', '420600'); +INSERT INTO `tb_area` VALUES (1731, '420626', '保康县', '420600'); +INSERT INTO `tb_area` VALUES (1732, '420682', '老河口市', '420600'); +INSERT INTO `tb_area` VALUES (1733, '420683', '枣阳市', '420600'); +INSERT INTO `tb_area` VALUES (1734, '420684', '宜城市', '420600'); +INSERT INTO `tb_area` VALUES (1735, '420701', '市辖区', '420700'); +INSERT INTO `tb_area` VALUES (1736, '420702', '梁子湖区', '420700'); +INSERT INTO `tb_area` VALUES (1737, '420703', '华容区', '420700'); +INSERT INTO `tb_area` VALUES (1738, '420704', '鄂城区', '420700'); +INSERT INTO `tb_area` VALUES (1739, '420801', '市辖区', '420800'); +INSERT INTO `tb_area` VALUES (1740, '420802', '东宝区', '420800'); +INSERT INTO `tb_area` VALUES (1741, '420804', '掇刀区', '420800'); +INSERT INTO `tb_area` VALUES (1742, '420821', '京山县', '420800'); +INSERT INTO `tb_area` VALUES (1743, '420822', '沙洋县', '420800'); +INSERT INTO `tb_area` VALUES (1744, '420881', '钟祥市', '420800'); +INSERT INTO `tb_area` VALUES (1745, '420901', '市辖区', '420900'); +INSERT INTO `tb_area` VALUES (1746, '420902', '孝南区', '420900'); +INSERT INTO `tb_area` VALUES (1747, '420921', '孝昌县', '420900'); +INSERT INTO `tb_area` VALUES (1748, '420922', '大悟县', '420900'); +INSERT INTO `tb_area` VALUES (1749, '420923', '云梦县', '420900'); +INSERT INTO `tb_area` VALUES (1750, '420981', '应城市', '420900'); +INSERT INTO `tb_area` VALUES (1751, '420982', '安陆市', '420900'); +INSERT INTO `tb_area` VALUES (1752, '420984', '汉川市', '420900'); +INSERT INTO `tb_area` VALUES (1753, '421001', '市辖区', '421000'); +INSERT INTO `tb_area` VALUES (1754, '421002', '沙市区', '421000'); +INSERT INTO `tb_area` VALUES (1755, '421003', '荆州区', '421000'); +INSERT INTO `tb_area` VALUES (1756, '421022', '公安县', '421000'); +INSERT INTO `tb_area` VALUES (1757, '421023', '监利县', '421000'); +INSERT INTO `tb_area` VALUES (1758, '421024', '江陵县', '421000'); +INSERT INTO `tb_area` VALUES (1759, '421081', '石首市', '421000'); +INSERT INTO `tb_area` VALUES (1760, '421083', '洪湖市', '421000'); +INSERT INTO `tb_area` VALUES (1761, '421087', '松滋市', '421000'); +INSERT INTO `tb_area` VALUES (1762, '421101', '市辖区', '421100'); +INSERT INTO `tb_area` VALUES (1763, '421102', '黄州区', '421100'); +INSERT INTO `tb_area` VALUES (1764, '421121', '团风县', '421100'); +INSERT INTO `tb_area` VALUES (1765, '421122', '红安县', '421100'); +INSERT INTO `tb_area` VALUES (1766, '421123', '罗田县', '421100'); +INSERT INTO `tb_area` VALUES (1767, '421124', '英山县', '421100'); +INSERT INTO `tb_area` VALUES (1768, '421125', '浠水县', '421100'); +INSERT INTO `tb_area` VALUES (1769, '421126', '蕲春县', '421100'); +INSERT INTO `tb_area` VALUES (1770, '421127', '黄梅县', '421100'); +INSERT INTO `tb_area` VALUES (1771, '421181', '麻城市', '421100'); +INSERT INTO `tb_area` VALUES (1772, '421182', '武穴市', '421100'); +INSERT INTO `tb_area` VALUES (1773, '421201', '市辖区', '421200'); +INSERT INTO `tb_area` VALUES (1774, '421202', '咸安区', '421200'); +INSERT INTO `tb_area` VALUES (1775, '421221', '嘉鱼县', '421200'); +INSERT INTO `tb_area` VALUES (1776, '421222', '通城县', '421200'); +INSERT INTO `tb_area` VALUES (1777, '421223', '崇阳县', '421200'); +INSERT INTO `tb_area` VALUES (1778, '421224', '通山县', '421200'); +INSERT INTO `tb_area` VALUES (1779, '421281', '赤壁市', '421200'); +INSERT INTO `tb_area` VALUES (1780, '421301', '市辖区', '421300'); +INSERT INTO `tb_area` VALUES (1781, '421302', '曾都区', '421300'); +INSERT INTO `tb_area` VALUES (1782, '421381', '广水市', '421300'); +INSERT INTO `tb_area` VALUES (1783, '422801', '恩施市', '422800'); +INSERT INTO `tb_area` VALUES (1784, '422802', '利川市', '422800'); +INSERT INTO `tb_area` VALUES (1785, '422822', '建始县', '422800'); +INSERT INTO `tb_area` VALUES (1786, '422823', '巴东县', '422800'); +INSERT INTO `tb_area` VALUES (1787, '422825', '宣恩县', '422800'); +INSERT INTO `tb_area` VALUES (1788, '422826', '咸丰县', '422800'); +INSERT INTO `tb_area` VALUES (1789, '422827', '来凤县', '422800'); +INSERT INTO `tb_area` VALUES (1790, '422828', '鹤峰县', '422800'); +INSERT INTO `tb_area` VALUES (1791, '429004', '仙桃市', '429000'); +INSERT INTO `tb_area` VALUES (1792, '429005', '潜江市', '429000'); +INSERT INTO `tb_area` VALUES (1793, '429006', '天门市', '429000'); +INSERT INTO `tb_area` VALUES (1794, '429021', '神农架林区', '429000'); +INSERT INTO `tb_area` VALUES (1795, '430101', '市辖区', '430100'); +INSERT INTO `tb_area` VALUES (1796, '430102', '芙蓉区', '430100'); +INSERT INTO `tb_area` VALUES (1797, '430103', '天心区', '430100'); +INSERT INTO `tb_area` VALUES (1798, '430104', '岳麓区', '430100'); +INSERT INTO `tb_area` VALUES (1799, '430105', '开福区', '430100'); +INSERT INTO `tb_area` VALUES (1800, '430111', '雨花区', '430100'); +INSERT INTO `tb_area` VALUES (1801, '430121', '长沙县', '430100'); +INSERT INTO `tb_area` VALUES (1802, '430122', '望城县', '430100'); +INSERT INTO `tb_area` VALUES (1803, '430124', '宁乡县', '430100'); +INSERT INTO `tb_area` VALUES (1804, '430181', '浏阳市', '430100'); +INSERT INTO `tb_area` VALUES (1805, '430201', '市辖区', '430200'); +INSERT INTO `tb_area` VALUES (1806, '430202', '荷塘区', '430200'); +INSERT INTO `tb_area` VALUES (1807, '430203', '芦淞区', '430200'); +INSERT INTO `tb_area` VALUES (1808, '430204', '石峰区', '430200'); +INSERT INTO `tb_area` VALUES (1809, '430211', '天元区', '430200'); +INSERT INTO `tb_area` VALUES (1810, '430221', '株洲县', '430200'); +INSERT INTO `tb_area` VALUES (1811, '430223', '攸 县', '430200'); +INSERT INTO `tb_area` VALUES (1812, '430224', '茶陵县', '430200'); +INSERT INTO `tb_area` VALUES (1813, '430225', '炎陵县', '430200'); +INSERT INTO `tb_area` VALUES (1814, '430281', '醴陵市', '430200'); +INSERT INTO `tb_area` VALUES (1815, '430301', '市辖区', '430300'); +INSERT INTO `tb_area` VALUES (1816, '430302', '雨湖区', '430300'); +INSERT INTO `tb_area` VALUES (1817, '430304', '岳塘区', '430300'); +INSERT INTO `tb_area` VALUES (1818, '430321', '湘潭县', '430300'); +INSERT INTO `tb_area` VALUES (1819, '430381', '湘乡市', '430300'); +INSERT INTO `tb_area` VALUES (1820, '430382', '韶山市', '430300'); +INSERT INTO `tb_area` VALUES (1821, '430401', '市辖区', '430400'); +INSERT INTO `tb_area` VALUES (1822, '430405', '珠晖区', '430400'); +INSERT INTO `tb_area` VALUES (1823, '430406', '雁峰区', '430400'); +INSERT INTO `tb_area` VALUES (1824, '430407', '石鼓区', '430400'); +INSERT INTO `tb_area` VALUES (1825, '430408', '蒸湘区', '430400'); +INSERT INTO `tb_area` VALUES (1826, '430412', '南岳区', '430400'); +INSERT INTO `tb_area` VALUES (1827, '430421', '衡阳县', '430400'); +INSERT INTO `tb_area` VALUES (1828, '430422', '衡南县', '430400'); +INSERT INTO `tb_area` VALUES (1829, '430423', '衡山县', '430400'); +INSERT INTO `tb_area` VALUES (1830, '430424', '衡东县', '430400'); +INSERT INTO `tb_area` VALUES (1831, '430426', '祁东县', '430400'); +INSERT INTO `tb_area` VALUES (1832, '430481', '耒阳市', '430400'); +INSERT INTO `tb_area` VALUES (1833, '430482', '常宁市', '430400'); +INSERT INTO `tb_area` VALUES (1834, '430501', '市辖区', '430500'); +INSERT INTO `tb_area` VALUES (1835, '430502', '双清区', '430500'); +INSERT INTO `tb_area` VALUES (1836, '430503', '大祥区', '430500'); +INSERT INTO `tb_area` VALUES (1837, '430511', '北塔区', '430500'); +INSERT INTO `tb_area` VALUES (1838, '430521', '邵东县', '430500'); +INSERT INTO `tb_area` VALUES (1839, '430522', '新邵县', '430500'); +INSERT INTO `tb_area` VALUES (1840, '430523', '邵阳县', '430500'); +INSERT INTO `tb_area` VALUES (1841, '430524', '隆回县', '430500'); +INSERT INTO `tb_area` VALUES (1842, '430525', '洞口县', '430500'); +INSERT INTO `tb_area` VALUES (1843, '430527', '绥宁县', '430500'); +INSERT INTO `tb_area` VALUES (1844, '430528', '新宁县', '430500'); +INSERT INTO `tb_area` VALUES (1845, '430529', '城步苗族自治县', '430500'); +INSERT INTO `tb_area` VALUES (1846, '430581', '武冈市', '430500'); +INSERT INTO `tb_area` VALUES (1847, '430601', '市辖区', '430600'); +INSERT INTO `tb_area` VALUES (1848, '430602', '岳阳楼区', '430600'); +INSERT INTO `tb_area` VALUES (1849, '430603', '云溪区', '430600'); +INSERT INTO `tb_area` VALUES (1850, '430611', '君山区', '430600'); +INSERT INTO `tb_area` VALUES (1851, '430621', '岳阳县', '430600'); +INSERT INTO `tb_area` VALUES (1852, '430623', '华容县', '430600'); +INSERT INTO `tb_area` VALUES (1853, '430624', '湘阴县', '430600'); +INSERT INTO `tb_area` VALUES (1854, '430626', '平江县', '430600'); +INSERT INTO `tb_area` VALUES (1855, '430681', '汨罗市', '430600'); +INSERT INTO `tb_area` VALUES (1856, '430682', '临湘市', '430600'); +INSERT INTO `tb_area` VALUES (1857, '430701', '市辖区', '430700'); +INSERT INTO `tb_area` VALUES (1858, '430702', '武陵区', '430700'); +INSERT INTO `tb_area` VALUES (1859, '430703', '鼎城区', '430700'); +INSERT INTO `tb_area` VALUES (1860, '430721', '安乡县', '430700'); +INSERT INTO `tb_area` VALUES (1861, '430722', '汉寿县', '430700'); +INSERT INTO `tb_area` VALUES (1862, '430723', '澧 县', '430700'); +INSERT INTO `tb_area` VALUES (1863, '430724', '临澧县', '430700'); +INSERT INTO `tb_area` VALUES (1864, '430725', '桃源县', '430700'); +INSERT INTO `tb_area` VALUES (1865, '430726', '石门县', '430700'); +INSERT INTO `tb_area` VALUES (1866, '430781', '津市市', '430700'); +INSERT INTO `tb_area` VALUES (1867, '430801', '市辖区', '430800'); +INSERT INTO `tb_area` VALUES (1868, '430802', '永定区', '430800'); +INSERT INTO `tb_area` VALUES (1869, '430811', '武陵源区', '430800'); +INSERT INTO `tb_area` VALUES (1870, '430821', '慈利县', '430800'); +INSERT INTO `tb_area` VALUES (1871, '430822', '桑植县', '430800'); +INSERT INTO `tb_area` VALUES (1872, '430901', '市辖区', '430900'); +INSERT INTO `tb_area` VALUES (1873, '430902', '资阳区', '430900'); +INSERT INTO `tb_area` VALUES (1874, '430903', '赫山区', '430900'); +INSERT INTO `tb_area` VALUES (1875, '430921', '南 县', '430900'); +INSERT INTO `tb_area` VALUES (1876, '430922', '桃江县', '430900'); +INSERT INTO `tb_area` VALUES (1877, '430923', '安化县', '430900'); +INSERT INTO `tb_area` VALUES (1878, '430981', '沅江市', '430900'); +INSERT INTO `tb_area` VALUES (1879, '431001', '市辖区', '431000'); +INSERT INTO `tb_area` VALUES (1880, '431002', '北湖区', '431000'); +INSERT INTO `tb_area` VALUES (1881, '431003', '苏仙区', '431000'); +INSERT INTO `tb_area` VALUES (1882, '431021', '桂阳县', '431000'); +INSERT INTO `tb_area` VALUES (1883, '431022', '宜章县', '431000'); +INSERT INTO `tb_area` VALUES (1884, '431023', '永兴县', '431000'); +INSERT INTO `tb_area` VALUES (1885, '431024', '嘉禾县', '431000'); +INSERT INTO `tb_area` VALUES (1886, '431025', '临武县', '431000'); +INSERT INTO `tb_area` VALUES (1887, '431026', '汝城县', '431000'); +INSERT INTO `tb_area` VALUES (1888, '431027', '桂东县', '431000'); +INSERT INTO `tb_area` VALUES (1889, '431028', '安仁县', '431000'); +INSERT INTO `tb_area` VALUES (1890, '431081', '资兴市', '431000'); +INSERT INTO `tb_area` VALUES (1891, '431101', '市辖区', '431100'); +INSERT INTO `tb_area` VALUES (1892, '431102', '芝山区', '431100'); +INSERT INTO `tb_area` VALUES (1893, '431103', '冷水滩区', '431100'); +INSERT INTO `tb_area` VALUES (1894, '431121', '祁阳县', '431100'); +INSERT INTO `tb_area` VALUES (1895, '431122', '东安县', '431100'); +INSERT INTO `tb_area` VALUES (1896, '431123', '双牌县', '431100'); +INSERT INTO `tb_area` VALUES (1897, '431124', '道 县', '431100'); +INSERT INTO `tb_area` VALUES (1898, '431125', '江永县', '431100'); +INSERT INTO `tb_area` VALUES (1899, '431126', '宁远县', '431100'); +INSERT INTO `tb_area` VALUES (1900, '431127', '蓝山县', '431100'); +INSERT INTO `tb_area` VALUES (1901, '431128', '新田县', '431100'); +INSERT INTO `tb_area` VALUES (1902, '431129', '江华瑶族自治县', '431100'); +INSERT INTO `tb_area` VALUES (1903, '431201', '市辖区', '431200'); +INSERT INTO `tb_area` VALUES (1904, '431202', '鹤城区', '431200'); +INSERT INTO `tb_area` VALUES (1905, '431221', '中方县', '431200'); +INSERT INTO `tb_area` VALUES (1906, '431222', '沅陵县', '431200'); +INSERT INTO `tb_area` VALUES (1907, '431223', '辰溪县', '431200'); +INSERT INTO `tb_area` VALUES (1908, '431224', '溆浦县', '431200'); +INSERT INTO `tb_area` VALUES (1909, '431225', '会同县', '431200'); +INSERT INTO `tb_area` VALUES (1910, '431226', '麻阳苗族自治县', '431200'); +INSERT INTO `tb_area` VALUES (1911, '431227', '新晃侗族自治县', '431200'); +INSERT INTO `tb_area` VALUES (1912, '431228', '芷江侗族自治县', '431200'); +INSERT INTO `tb_area` VALUES (1913, '431229', '靖州苗族侗族自治县', '431200'); +INSERT INTO `tb_area` VALUES (1914, '431230', '通道侗族自治县', '431200'); +INSERT INTO `tb_area` VALUES (1915, '431281', '洪江市', '431200'); +INSERT INTO `tb_area` VALUES (1916, '431301', '市辖区', '431300'); +INSERT INTO `tb_area` VALUES (1917, '431302', '娄星区', '431300'); +INSERT INTO `tb_area` VALUES (1918, '431321', '双峰县', '431300'); +INSERT INTO `tb_area` VALUES (1919, '431322', '新化县', '431300'); +INSERT INTO `tb_area` VALUES (1920, '431381', '冷水江市', '431300'); +INSERT INTO `tb_area` VALUES (1921, '431382', '涟源市', '431300'); +INSERT INTO `tb_area` VALUES (1922, '433101', '吉首市', '433100'); +INSERT INTO `tb_area` VALUES (1923, '433122', '泸溪县', '433100'); +INSERT INTO `tb_area` VALUES (1924, '433123', '凤凰县', '433100'); +INSERT INTO `tb_area` VALUES (1925, '433124', '花垣县', '433100'); +INSERT INTO `tb_area` VALUES (1926, '433125', '保靖县', '433100'); +INSERT INTO `tb_area` VALUES (1927, '433126', '古丈县', '433100'); +INSERT INTO `tb_area` VALUES (1928, '433127', '永顺县', '433100'); +INSERT INTO `tb_area` VALUES (1929, '433130', '龙山县', '433100'); +INSERT INTO `tb_area` VALUES (1930, '440101', '市辖区', '440100'); +INSERT INTO `tb_area` VALUES (1931, '440102', '东山区', '440100'); +INSERT INTO `tb_area` VALUES (1932, '440103', '荔湾区', '440100'); +INSERT INTO `tb_area` VALUES (1933, '440104', '越秀区', '440100'); +INSERT INTO `tb_area` VALUES (1934, '440105', '海珠区', '440100'); +INSERT INTO `tb_area` VALUES (1935, '440106', '天河区', '440100'); +INSERT INTO `tb_area` VALUES (1936, '440107', '芳村区', '440100'); +INSERT INTO `tb_area` VALUES (1937, '440111', '白云区', '440100'); +INSERT INTO `tb_area` VALUES (1938, '440112', '黄埔区', '440100'); +INSERT INTO `tb_area` VALUES (1939, '440113', '番禺区', '440100'); +INSERT INTO `tb_area` VALUES (1940, '440114', '花都区', '440100'); +INSERT INTO `tb_area` VALUES (1941, '440183', '增城市', '440100'); +INSERT INTO `tb_area` VALUES (1942, '440184', '从化市', '440100'); +INSERT INTO `tb_area` VALUES (1943, '440201', '市辖区', '440200'); +INSERT INTO `tb_area` VALUES (1944, '440203', '武江区', '440200'); +INSERT INTO `tb_area` VALUES (1945, '440204', '浈江区', '440200'); +INSERT INTO `tb_area` VALUES (1946, '440205', '曲江区', '440200'); +INSERT INTO `tb_area` VALUES (1947, '440222', '始兴县', '440200'); +INSERT INTO `tb_area` VALUES (1948, '440224', '仁化县', '440200'); +INSERT INTO `tb_area` VALUES (1949, '440229', '翁源县', '440200'); +INSERT INTO `tb_area` VALUES (1950, '440232', '乳源瑶族自治县', '440200'); +INSERT INTO `tb_area` VALUES (1951, '440233', '新丰县', '440200'); +INSERT INTO `tb_area` VALUES (1952, '440281', '乐昌市', '440200'); +INSERT INTO `tb_area` VALUES (1953, '440282', '南雄市', '440200'); +INSERT INTO `tb_area` VALUES (1954, '440301', '市辖区', '440300'); +INSERT INTO `tb_area` VALUES (1955, '440303', '罗湖区', '440300'); +INSERT INTO `tb_area` VALUES (1956, '440304', '福田区', '440300'); +INSERT INTO `tb_area` VALUES (1957, '440305', '南山区', '440300'); +INSERT INTO `tb_area` VALUES (1958, '440306', '宝安区', '440300'); +INSERT INTO `tb_area` VALUES (1959, '440307', '龙岗区', '440300'); +INSERT INTO `tb_area` VALUES (1960, '440308', '盐田区', '440300'); +INSERT INTO `tb_area` VALUES (1961, '440401', '市辖区', '440400'); +INSERT INTO `tb_area` VALUES (1962, '440402', '香洲区', '440400'); +INSERT INTO `tb_area` VALUES (1963, '440403', '斗门区', '440400'); +INSERT INTO `tb_area` VALUES (1964, '440404', '金湾区', '440400'); +INSERT INTO `tb_area` VALUES (1965, '440501', '市辖区', '440500'); +INSERT INTO `tb_area` VALUES (1966, '440507', '龙湖区', '440500'); +INSERT INTO `tb_area` VALUES (1967, '440511', '金平区', '440500'); +INSERT INTO `tb_area` VALUES (1968, '440512', '濠江区', '440500'); +INSERT INTO `tb_area` VALUES (1969, '440513', '潮阳区', '440500'); +INSERT INTO `tb_area` VALUES (1970, '440514', '潮南区', '440500'); +INSERT INTO `tb_area` VALUES (1971, '440515', '澄海区', '440500'); +INSERT INTO `tb_area` VALUES (1972, '440523', '南澳县', '440500'); +INSERT INTO `tb_area` VALUES (1973, '440601', '市辖区', '440600'); +INSERT INTO `tb_area` VALUES (1974, '440604', '禅城区', '440600'); +INSERT INTO `tb_area` VALUES (1975, '440605', '南海区', '440600'); +INSERT INTO `tb_area` VALUES (1976, '440606', '顺德区', '440600'); +INSERT INTO `tb_area` VALUES (1977, '440607', '三水区', '440600'); +INSERT INTO `tb_area` VALUES (1978, '440608', '高明区', '440600'); +INSERT INTO `tb_area` VALUES (1979, '440701', '市辖区', '440700'); +INSERT INTO `tb_area` VALUES (1980, '440703', '蓬江区', '440700'); +INSERT INTO `tb_area` VALUES (1981, '440704', '江海区', '440700'); +INSERT INTO `tb_area` VALUES (1982, '440705', '新会区', '440700'); +INSERT INTO `tb_area` VALUES (1983, '440781', '台山市', '440700'); +INSERT INTO `tb_area` VALUES (1984, '440783', '开平市', '440700'); +INSERT INTO `tb_area` VALUES (1985, '440784', '鹤山市', '440700'); +INSERT INTO `tb_area` VALUES (1986, '440785', '恩平市', '440700'); +INSERT INTO `tb_area` VALUES (1987, '440801', '市辖区', '440800'); +INSERT INTO `tb_area` VALUES (1988, '440802', '赤坎区', '440800'); +INSERT INTO `tb_area` VALUES (1989, '440803', '霞山区', '440800'); +INSERT INTO `tb_area` VALUES (1990, '440804', '坡头区', '440800'); +INSERT INTO `tb_area` VALUES (1991, '440811', '麻章区', '440800'); +INSERT INTO `tb_area` VALUES (1992, '440823', '遂溪县', '440800'); +INSERT INTO `tb_area` VALUES (1993, '440825', '徐闻县', '440800'); +INSERT INTO `tb_area` VALUES (1994, '440881', '廉江市', '440800'); +INSERT INTO `tb_area` VALUES (1995, '440882', '雷州市', '440800'); +INSERT INTO `tb_area` VALUES (1996, '440883', '吴川市', '440800'); +INSERT INTO `tb_area` VALUES (1997, '440901', '市辖区', '440900'); +INSERT INTO `tb_area` VALUES (1998, '440902', '茂南区', '440900'); +INSERT INTO `tb_area` VALUES (1999, '440903', '茂港区', '440900'); +INSERT INTO `tb_area` VALUES (2000, '440923', '电白县', '440900'); +INSERT INTO `tb_area` VALUES (2001, '440981', '高州市', '440900'); +INSERT INTO `tb_area` VALUES (2002, '440982', '化州市', '440900'); +INSERT INTO `tb_area` VALUES (2003, '440983', '信宜市', '440900'); +INSERT INTO `tb_area` VALUES (2004, '441201', '市辖区', '441200'); +INSERT INTO `tb_area` VALUES (2005, '441202', '端州区', '441200'); +INSERT INTO `tb_area` VALUES (2006, '441203', '鼎湖区', '441200'); +INSERT INTO `tb_area` VALUES (2007, '441223', '广宁县', '441200'); +INSERT INTO `tb_area` VALUES (2008, '441224', '怀集县', '441200'); +INSERT INTO `tb_area` VALUES (2009, '441225', '封开县', '441200'); +INSERT INTO `tb_area` VALUES (2010, '441226', '德庆县', '441200'); +INSERT INTO `tb_area` VALUES (2011, '441283', '高要市', '441200'); +INSERT INTO `tb_area` VALUES (2012, '441284', '四会市', '441200'); +INSERT INTO `tb_area` VALUES (2013, '441301', '市辖区', '441300'); +INSERT INTO `tb_area` VALUES (2014, '441302', '惠城区', '441300'); +INSERT INTO `tb_area` VALUES (2015, '441303', '惠阳区', '441300'); +INSERT INTO `tb_area` VALUES (2016, '441322', '博罗县', '441300'); +INSERT INTO `tb_area` VALUES (2017, '441323', '惠东县', '441300'); +INSERT INTO `tb_area` VALUES (2018, '441324', '龙门县', '441300'); +INSERT INTO `tb_area` VALUES (2019, '441401', '市辖区', '441400'); +INSERT INTO `tb_area` VALUES (2020, '441402', '梅江区', '441400'); +INSERT INTO `tb_area` VALUES (2021, '441421', '梅 县', '441400'); +INSERT INTO `tb_area` VALUES (2022, '441422', '大埔县', '441400'); +INSERT INTO `tb_area` VALUES (2023, '441423', '丰顺县', '441400'); +INSERT INTO `tb_area` VALUES (2024, '441424', '五华县', '441400'); +INSERT INTO `tb_area` VALUES (2025, '441426', '平远县', '441400'); +INSERT INTO `tb_area` VALUES (2026, '441427', '蕉岭县', '441400'); +INSERT INTO `tb_area` VALUES (2027, '441481', '兴宁市', '441400'); +INSERT INTO `tb_area` VALUES (2028, '441501', '市辖区', '441500'); +INSERT INTO `tb_area` VALUES (2029, '441502', '城 区', '441500'); +INSERT INTO `tb_area` VALUES (2030, '441521', '海丰县', '441500'); +INSERT INTO `tb_area` VALUES (2031, '441523', '陆河县', '441500'); +INSERT INTO `tb_area` VALUES (2032, '441581', '陆丰市', '441500'); +INSERT INTO `tb_area` VALUES (2033, '441601', '市辖区', '441600'); +INSERT INTO `tb_area` VALUES (2034, '441602', '源城区', '441600'); +INSERT INTO `tb_area` VALUES (2035, '441621', '紫金县', '441600'); +INSERT INTO `tb_area` VALUES (2036, '441622', '龙川县', '441600'); +INSERT INTO `tb_area` VALUES (2037, '441623', '连平县', '441600'); +INSERT INTO `tb_area` VALUES (2038, '441624', '和平县', '441600'); +INSERT INTO `tb_area` VALUES (2039, '441625', '东源县', '441600'); +INSERT INTO `tb_area` VALUES (2040, '441701', '市辖区', '441700'); +INSERT INTO `tb_area` VALUES (2041, '441702', '江城区', '441700'); +INSERT INTO `tb_area` VALUES (2042, '441721', '阳西县', '441700'); +INSERT INTO `tb_area` VALUES (2043, '441723', '阳东县', '441700'); +INSERT INTO `tb_area` VALUES (2044, '441781', '阳春市', '441700'); +INSERT INTO `tb_area` VALUES (2045, '441801', '市辖区', '441800'); +INSERT INTO `tb_area` VALUES (2046, '441802', '清城区', '441800'); +INSERT INTO `tb_area` VALUES (2047, '441821', '佛冈县', '441800'); +INSERT INTO `tb_area` VALUES (2048, '441823', '阳山县', '441800'); +INSERT INTO `tb_area` VALUES (2049, '441825', '连山壮族瑶族自治县', '441800'); +INSERT INTO `tb_area` VALUES (2050, '441826', '连南瑶族自治县', '441800'); +INSERT INTO `tb_area` VALUES (2051, '441827', '清新县', '441800'); +INSERT INTO `tb_area` VALUES (2052, '441881', '英德市', '441800'); +INSERT INTO `tb_area` VALUES (2053, '441882', '连州市', '441800'); +INSERT INTO `tb_area` VALUES (2054, '445101', '市辖区', '445100'); +INSERT INTO `tb_area` VALUES (2055, '445102', '湘桥区', '445100'); +INSERT INTO `tb_area` VALUES (2056, '445121', '潮安县', '445100'); +INSERT INTO `tb_area` VALUES (2057, '445122', '饶平县', '445100'); +INSERT INTO `tb_area` VALUES (2058, '445201', '市辖区', '445200'); +INSERT INTO `tb_area` VALUES (2059, '445202', '榕城区', '445200'); +INSERT INTO `tb_area` VALUES (2060, '445221', '揭东县', '445200'); +INSERT INTO `tb_area` VALUES (2061, '445222', '揭西县', '445200'); +INSERT INTO `tb_area` VALUES (2062, '445224', '惠来县', '445200'); +INSERT INTO `tb_area` VALUES (2063, '445281', '普宁市', '445200'); +INSERT INTO `tb_area` VALUES (2064, '445301', '市辖区', '445300'); +INSERT INTO `tb_area` VALUES (2065, '445302', '云城区', '445300'); +INSERT INTO `tb_area` VALUES (2066, '445321', '新兴县', '445300'); +INSERT INTO `tb_area` VALUES (2067, '445322', '郁南县', '445300'); +INSERT INTO `tb_area` VALUES (2068, '445323', '云安县', '445300'); +INSERT INTO `tb_area` VALUES (2069, '445381', '罗定市', '445300'); +INSERT INTO `tb_area` VALUES (2070, '450101', '市辖区', '450100'); +INSERT INTO `tb_area` VALUES (2071, '450102', '兴宁区', '450100'); +INSERT INTO `tb_area` VALUES (2072, '450103', '青秀区', '450100'); +INSERT INTO `tb_area` VALUES (2073, '450105', '江南区', '450100'); +INSERT INTO `tb_area` VALUES (2074, '450107', '西乡塘区', '450100'); +INSERT INTO `tb_area` VALUES (2075, '450108', '良庆区', '450100'); +INSERT INTO `tb_area` VALUES (2076, '450109', '邕宁区', '450100'); +INSERT INTO `tb_area` VALUES (2077, '450122', '武鸣县', '450100'); +INSERT INTO `tb_area` VALUES (2078, '450123', '隆安县', '450100'); +INSERT INTO `tb_area` VALUES (2079, '450124', '马山县', '450100'); +INSERT INTO `tb_area` VALUES (2080, '450125', '上林县', '450100'); +INSERT INTO `tb_area` VALUES (2081, '450126', '宾阳县', '450100'); +INSERT INTO `tb_area` VALUES (2082, '450127', '横 县', '450100'); +INSERT INTO `tb_area` VALUES (2083, '450201', '市辖区', '450200'); +INSERT INTO `tb_area` VALUES (2084, '450202', '城中区', '450200'); +INSERT INTO `tb_area` VALUES (2085, '450203', '鱼峰区', '450200'); +INSERT INTO `tb_area` VALUES (2086, '450204', '柳南区', '450200'); +INSERT INTO `tb_area` VALUES (2087, '450205', '柳北区', '450200'); +INSERT INTO `tb_area` VALUES (2088, '450221', '柳江县', '450200'); +INSERT INTO `tb_area` VALUES (2089, '450222', '柳城县', '450200'); +INSERT INTO `tb_area` VALUES (2090, '450223', '鹿寨县', '450200'); +INSERT INTO `tb_area` VALUES (2091, '450224', '融安县', '450200'); +INSERT INTO `tb_area` VALUES (2092, '450225', '融水苗族自治县', '450200'); +INSERT INTO `tb_area` VALUES (2093, '450226', '三江侗族自治县', '450200'); +INSERT INTO `tb_area` VALUES (2094, '450301', '市辖区', '450300'); +INSERT INTO `tb_area` VALUES (2095, '450302', '秀峰区', '450300'); +INSERT INTO `tb_area` VALUES (2096, '450303', '叠彩区', '450300'); +INSERT INTO `tb_area` VALUES (2097, '450304', '象山区', '450300'); +INSERT INTO `tb_area` VALUES (2098, '450305', '七星区', '450300'); +INSERT INTO `tb_area` VALUES (2099, '450311', '雁山区', '450300'); +INSERT INTO `tb_area` VALUES (2100, '450321', '阳朔县', '450300'); +INSERT INTO `tb_area` VALUES (2101, '450322', '临桂县', '450300'); +INSERT INTO `tb_area` VALUES (2102, '450323', '灵川县', '450300'); +INSERT INTO `tb_area` VALUES (2103, '450324', '全州县', '450300'); +INSERT INTO `tb_area` VALUES (2104, '450325', '兴安县', '450300'); +INSERT INTO `tb_area` VALUES (2105, '450326', '永福县', '450300'); +INSERT INTO `tb_area` VALUES (2106, '450327', '灌阳县', '450300'); +INSERT INTO `tb_area` VALUES (2107, '450328', '龙胜各族自治县', '450300'); +INSERT INTO `tb_area` VALUES (2108, '450329', '资源县', '450300'); +INSERT INTO `tb_area` VALUES (2109, '450330', '平乐县', '450300'); +INSERT INTO `tb_area` VALUES (2110, '450331', '荔蒲县', '450300'); +INSERT INTO `tb_area` VALUES (2111, '450332', '恭城瑶族自治县', '450300'); +INSERT INTO `tb_area` VALUES (2112, '450401', '市辖区', '450400'); +INSERT INTO `tb_area` VALUES (2113, '450403', '万秀区', '450400'); +INSERT INTO `tb_area` VALUES (2114, '450404', '蝶山区', '450400'); +INSERT INTO `tb_area` VALUES (2115, '450405', '长洲区', '450400'); +INSERT INTO `tb_area` VALUES (2116, '450421', '苍梧县', '450400'); +INSERT INTO `tb_area` VALUES (2117, '450422', '藤 县', '450400'); +INSERT INTO `tb_area` VALUES (2118, '450423', '蒙山县', '450400'); +INSERT INTO `tb_area` VALUES (2119, '450481', '岑溪市', '450400'); +INSERT INTO `tb_area` VALUES (2120, '450501', '市辖区', '450500'); +INSERT INTO `tb_area` VALUES (2121, '450502', '海城区', '450500'); +INSERT INTO `tb_area` VALUES (2122, '450503', '银海区', '450500'); +INSERT INTO `tb_area` VALUES (2123, '450512', '铁山港区', '450500'); +INSERT INTO `tb_area` VALUES (2124, '450521', '合浦县', '450500'); +INSERT INTO `tb_area` VALUES (2125, '450601', '市辖区', '450600'); +INSERT INTO `tb_area` VALUES (2126, '450602', '港口区', '450600'); +INSERT INTO `tb_area` VALUES (2127, '450603', '防城区', '450600'); +INSERT INTO `tb_area` VALUES (2128, '450621', '上思县', '450600'); +INSERT INTO `tb_area` VALUES (2129, '450681', '东兴市', '450600'); +INSERT INTO `tb_area` VALUES (2130, '450701', '市辖区', '450700'); +INSERT INTO `tb_area` VALUES (2131, '450702', '钦南区', '450700'); +INSERT INTO `tb_area` VALUES (2132, '450703', '钦北区', '450700'); +INSERT INTO `tb_area` VALUES (2133, '450721', '灵山县', '450700'); +INSERT INTO `tb_area` VALUES (2134, '450722', '浦北县', '450700'); +INSERT INTO `tb_area` VALUES (2135, '450801', '市辖区', '450800'); +INSERT INTO `tb_area` VALUES (2136, '450802', '港北区', '450800'); +INSERT INTO `tb_area` VALUES (2137, '450803', '港南区', '450800'); +INSERT INTO `tb_area` VALUES (2138, '450804', '覃塘区', '450800'); +INSERT INTO `tb_area` VALUES (2139, '450821', '平南县', '450800'); +INSERT INTO `tb_area` VALUES (2140, '450881', '桂平市', '450800'); +INSERT INTO `tb_area` VALUES (2141, '450901', '市辖区', '450900'); +INSERT INTO `tb_area` VALUES (2142, '450902', '玉州区', '450900'); +INSERT INTO `tb_area` VALUES (2143, '450921', '容 县', '450900'); +INSERT INTO `tb_area` VALUES (2144, '450922', '陆川县', '450900'); +INSERT INTO `tb_area` VALUES (2145, '450923', '博白县', '450900'); +INSERT INTO `tb_area` VALUES (2146, '450924', '兴业县', '450900'); +INSERT INTO `tb_area` VALUES (2147, '450981', '北流市', '450900'); +INSERT INTO `tb_area` VALUES (2148, '451001', '市辖区', '451000'); +INSERT INTO `tb_area` VALUES (2149, '451002', '右江区', '451000'); +INSERT INTO `tb_area` VALUES (2150, '451021', '田阳县', '451000'); +INSERT INTO `tb_area` VALUES (2151, '451022', '田东县', '451000'); +INSERT INTO `tb_area` VALUES (2152, '451023', '平果县', '451000'); +INSERT INTO `tb_area` VALUES (2153, '451024', '德保县', '451000'); +INSERT INTO `tb_area` VALUES (2154, '451025', '靖西县', '451000'); +INSERT INTO `tb_area` VALUES (2155, '451026', '那坡县', '451000'); +INSERT INTO `tb_area` VALUES (2156, '451027', '凌云县', '451000'); +INSERT INTO `tb_area` VALUES (2157, '451028', '乐业县', '451000'); +INSERT INTO `tb_area` VALUES (2158, '451029', '田林县', '451000'); +INSERT INTO `tb_area` VALUES (2159, '451030', '西林县', '451000'); +INSERT INTO `tb_area` VALUES (2160, '451031', '隆林各族自治县', '451000'); +INSERT INTO `tb_area` VALUES (2161, '451101', '市辖区', '451100'); +INSERT INTO `tb_area` VALUES (2162, '451102', '八步区', '451100'); +INSERT INTO `tb_area` VALUES (2163, '451121', '昭平县', '451100'); +INSERT INTO `tb_area` VALUES (2164, '451122', '钟山县', '451100'); +INSERT INTO `tb_area` VALUES (2165, '451123', '富川瑶族自治县', '451100'); +INSERT INTO `tb_area` VALUES (2166, '451201', '市辖区', '451200'); +INSERT INTO `tb_area` VALUES (2167, '451202', '金城江区', '451200'); +INSERT INTO `tb_area` VALUES (2168, '451221', '南丹县', '451200'); +INSERT INTO `tb_area` VALUES (2169, '451222', '天峨县', '451200'); +INSERT INTO `tb_area` VALUES (2170, '451223', '凤山县', '451200'); +INSERT INTO `tb_area` VALUES (2171, '451224', '东兰县', '451200'); +INSERT INTO `tb_area` VALUES (2172, '451225', '罗城仫佬族自治县', '451200'); +INSERT INTO `tb_area` VALUES (2173, '451226', '环江毛南族自治县', '451200'); +INSERT INTO `tb_area` VALUES (2174, '451227', '巴马瑶族自治县', '451200'); +INSERT INTO `tb_area` VALUES (2175, '451228', '都安瑶族自治县', '451200'); +INSERT INTO `tb_area` VALUES (2176, '451229', '大化瑶族自治县', '451200'); +INSERT INTO `tb_area` VALUES (2177, '451281', '宜州市', '451200'); +INSERT INTO `tb_area` VALUES (2178, '451301', '市辖区', '451300'); +INSERT INTO `tb_area` VALUES (2179, '451302', '兴宾区', '451300'); +INSERT INTO `tb_area` VALUES (2180, '451321', '忻城县', '451300'); +INSERT INTO `tb_area` VALUES (2181, '451322', '象州县', '451300'); +INSERT INTO `tb_area` VALUES (2182, '451323', '武宣县', '451300'); +INSERT INTO `tb_area` VALUES (2183, '451324', '金秀瑶族自治县', '451300'); +INSERT INTO `tb_area` VALUES (2184, '451381', '合山市', '451300'); +INSERT INTO `tb_area` VALUES (2185, '451401', '市辖区', '451400'); +INSERT INTO `tb_area` VALUES (2186, '451402', '江洲区', '451400'); +INSERT INTO `tb_area` VALUES (2187, '451421', '扶绥县', '451400'); +INSERT INTO `tb_area` VALUES (2188, '451422', '宁明县', '451400'); +INSERT INTO `tb_area` VALUES (2189, '451423', '龙州县', '451400'); +INSERT INTO `tb_area` VALUES (2190, '451424', '大新县', '451400'); +INSERT INTO `tb_area` VALUES (2191, '451425', '天等县', '451400'); +INSERT INTO `tb_area` VALUES (2192, '451481', '凭祥市', '451400'); +INSERT INTO `tb_area` VALUES (2193, '460101', '市辖区', '460100'); +INSERT INTO `tb_area` VALUES (2194, '460105', '秀英区', '460100'); +INSERT INTO `tb_area` VALUES (2195, '460106', '龙华区', '460100'); +INSERT INTO `tb_area` VALUES (2196, '460107', '琼山区', '460100'); +INSERT INTO `tb_area` VALUES (2197, '460108', '美兰区', '460100'); +INSERT INTO `tb_area` VALUES (2198, '460201', '市辖区', '460200'); +INSERT INTO `tb_area` VALUES (2199, '469001', '五指山市', '469000'); +INSERT INTO `tb_area` VALUES (2200, '469002', '琼海市', '469000'); +INSERT INTO `tb_area` VALUES (2201, '469003', '儋州市', '469000'); +INSERT INTO `tb_area` VALUES (2202, '469005', '文昌市', '469000'); +INSERT INTO `tb_area` VALUES (2203, '469006', '万宁市', '469000'); +INSERT INTO `tb_area` VALUES (2204, '469007', '东方市', '469000'); +INSERT INTO `tb_area` VALUES (2205, '469025', '定安县', '469000'); +INSERT INTO `tb_area` VALUES (2206, '469026', '屯昌县', '469000'); +INSERT INTO `tb_area` VALUES (2207, '469027', '澄迈县', '469000'); +INSERT INTO `tb_area` VALUES (2208, '469028', '临高县', '469000'); +INSERT INTO `tb_area` VALUES (2209, '469030', '白沙黎族自治县', '469000'); +INSERT INTO `tb_area` VALUES (2210, '469031', '昌江黎族自治县', '469000'); +INSERT INTO `tb_area` VALUES (2211, '469033', '乐东黎族自治县', '469000'); +INSERT INTO `tb_area` VALUES (2212, '469034', '陵水黎族自治县', '469000'); +INSERT INTO `tb_area` VALUES (2213, '469035', '保亭黎族苗族自治县', '469000'); +INSERT INTO `tb_area` VALUES (2214, '469036', '琼中黎族苗族自治县', '469000'); +INSERT INTO `tb_area` VALUES (2215, '469037', '西沙群岛', '469000'); +INSERT INTO `tb_area` VALUES (2216, '469038', '南沙群岛', '469000'); +INSERT INTO `tb_area` VALUES (2217, '469039', '中沙群岛的岛礁及其海域', '469000'); +INSERT INTO `tb_area` VALUES (2218, '500101', '万州区', '500100'); +INSERT INTO `tb_area` VALUES (2219, '500102', '涪陵区', '500100'); +INSERT INTO `tb_area` VALUES (2220, '500103', '渝中区', '500100'); +INSERT INTO `tb_area` VALUES (2221, '500104', '大渡口区', '500100'); +INSERT INTO `tb_area` VALUES (2222, '500105', '江北区', '500100'); +INSERT INTO `tb_area` VALUES (2223, '500106', '沙坪坝区', '500100'); +INSERT INTO `tb_area` VALUES (2224, '500107', '九龙坡区', '500100'); +INSERT INTO `tb_area` VALUES (2225, '500108', '南岸区', '500100'); +INSERT INTO `tb_area` VALUES (2226, '500109', '北碚区', '500100'); +INSERT INTO `tb_area` VALUES (2227, '500110', '万盛区', '500100'); +INSERT INTO `tb_area` VALUES (2228, '500111', '双桥区', '500100'); +INSERT INTO `tb_area` VALUES (2229, '500112', '渝北区', '500100'); +INSERT INTO `tb_area` VALUES (2230, '500113', '巴南区', '500100'); +INSERT INTO `tb_area` VALUES (2231, '500114', '黔江区', '500100'); +INSERT INTO `tb_area` VALUES (2232, '500115', '长寿区', '500100'); +INSERT INTO `tb_area` VALUES (2233, '500222', '綦江县', '500200'); +INSERT INTO `tb_area` VALUES (2234, '500223', '潼南县', '500200'); +INSERT INTO `tb_area` VALUES (2235, '500224', '铜梁县', '500200'); +INSERT INTO `tb_area` VALUES (2236, '500225', '大足县', '500200'); +INSERT INTO `tb_area` VALUES (2237, '500226', '荣昌县', '500200'); +INSERT INTO `tb_area` VALUES (2238, '500227', '璧山县', '500200'); +INSERT INTO `tb_area` VALUES (2239, '500228', '梁平县', '500200'); +INSERT INTO `tb_area` VALUES (2240, '500229', '城口县', '500200'); +INSERT INTO `tb_area` VALUES (2241, '500230', '丰都县', '500200'); +INSERT INTO `tb_area` VALUES (2242, '500231', '垫江县', '500200'); +INSERT INTO `tb_area` VALUES (2243, '500232', '武隆县', '500200'); +INSERT INTO `tb_area` VALUES (2244, '500233', '忠 县', '500200'); +INSERT INTO `tb_area` VALUES (2245, '500234', '开 县', '500200'); +INSERT INTO `tb_area` VALUES (2246, '500235', '云阳县', '500200'); +INSERT INTO `tb_area` VALUES (2247, '500236', '奉节县', '500200'); +INSERT INTO `tb_area` VALUES (2248, '500237', '巫山县', '500200'); +INSERT INTO `tb_area` VALUES (2249, '500238', '巫溪县', '500200'); +INSERT INTO `tb_area` VALUES (2250, '500240', '石柱土家族自治县', '500200'); +INSERT INTO `tb_area` VALUES (2251, '500241', '秀山土家族苗族自治县', '500200'); +INSERT INTO `tb_area` VALUES (2252, '500242', '酉阳土家族苗族自治县', '500200'); +INSERT INTO `tb_area` VALUES (2253, '500243', '彭水苗族土家族自治县', '500200'); +INSERT INTO `tb_area` VALUES (2254, '500381', '江津市', '500300'); +INSERT INTO `tb_area` VALUES (2255, '500382', '合川市', '500300'); +INSERT INTO `tb_area` VALUES (2256, '500383', '永川市', '500300'); +INSERT INTO `tb_area` VALUES (2257, '500384', '南川市', '500300'); +INSERT INTO `tb_area` VALUES (2258, '510101', '市辖区', '510100'); +INSERT INTO `tb_area` VALUES (2259, '510104', '锦江区', '510100'); +INSERT INTO `tb_area` VALUES (2260, '510105', '青羊区', '510100'); +INSERT INTO `tb_area` VALUES (2261, '510106', '金牛区', '510100'); +INSERT INTO `tb_area` VALUES (2262, '510107', '武侯区', '510100'); +INSERT INTO `tb_area` VALUES (2263, '510108', '成华区', '510100'); +INSERT INTO `tb_area` VALUES (2264, '510112', '龙泉驿区', '510100'); +INSERT INTO `tb_area` VALUES (2265, '510113', '青白江区', '510100'); +INSERT INTO `tb_area` VALUES (2266, '510114', '新都区', '510100'); +INSERT INTO `tb_area` VALUES (2267, '510115', '温江区', '510100'); +INSERT INTO `tb_area` VALUES (2268, '510121', '金堂县', '510100'); +INSERT INTO `tb_area` VALUES (2269, '510122', '双流县', '510100'); +INSERT INTO `tb_area` VALUES (2270, '510124', '郫 县', '510100'); +INSERT INTO `tb_area` VALUES (2271, '510129', '大邑县', '510100'); +INSERT INTO `tb_area` VALUES (2272, '510131', '蒲江县', '510100'); +INSERT INTO `tb_area` VALUES (2273, '510132', '新津县', '510100'); +INSERT INTO `tb_area` VALUES (2274, '510181', '都江堰市', '510100'); +INSERT INTO `tb_area` VALUES (2275, '510182', '彭州市', '510100'); +INSERT INTO `tb_area` VALUES (2276, '510183', '邛崃市', '510100'); +INSERT INTO `tb_area` VALUES (2277, '510184', '崇州市', '510100'); +INSERT INTO `tb_area` VALUES (2278, '510301', '市辖区', '510300'); +INSERT INTO `tb_area` VALUES (2279, '510302', '自流井区', '510300'); +INSERT INTO `tb_area` VALUES (2280, '510303', '贡井区', '510300'); +INSERT INTO `tb_area` VALUES (2281, '510304', '大安区', '510300'); +INSERT INTO `tb_area` VALUES (2282, '510311', '沿滩区', '510300'); +INSERT INTO `tb_area` VALUES (2283, '510321', '荣 县', '510300'); +INSERT INTO `tb_area` VALUES (2284, '510322', '富顺县', '510300'); +INSERT INTO `tb_area` VALUES (2285, '510401', '市辖区', '510400'); +INSERT INTO `tb_area` VALUES (2286, '510402', '东 区', '510400'); +INSERT INTO `tb_area` VALUES (2287, '510403', '西 区', '510400'); +INSERT INTO `tb_area` VALUES (2288, '510411', '仁和区', '510400'); +INSERT INTO `tb_area` VALUES (2289, '510421', '米易县', '510400'); +INSERT INTO `tb_area` VALUES (2290, '510422', '盐边县', '510400'); +INSERT INTO `tb_area` VALUES (2291, '510501', '市辖区', '510500'); +INSERT INTO `tb_area` VALUES (2292, '510502', '江阳区', '510500'); +INSERT INTO `tb_area` VALUES (2293, '510503', '纳溪区', '510500'); +INSERT INTO `tb_area` VALUES (2294, '510504', '龙马潭区', '510500'); +INSERT INTO `tb_area` VALUES (2295, '510521', '泸 县', '510500'); +INSERT INTO `tb_area` VALUES (2296, '510522', '合江县', '510500'); +INSERT INTO `tb_area` VALUES (2297, '510524', '叙永县', '510500'); +INSERT INTO `tb_area` VALUES (2298, '510525', '古蔺县', '510500'); +INSERT INTO `tb_area` VALUES (2299, '510601', '市辖区', '510600'); +INSERT INTO `tb_area` VALUES (2300, '510603', '旌阳区', '510600'); +INSERT INTO `tb_area` VALUES (2301, '510623', '中江县', '510600'); +INSERT INTO `tb_area` VALUES (2302, '510626', '罗江县', '510600'); +INSERT INTO `tb_area` VALUES (2303, '510681', '广汉市', '510600'); +INSERT INTO `tb_area` VALUES (2304, '510682', '什邡市', '510600'); +INSERT INTO `tb_area` VALUES (2305, '510683', '绵竹市', '510600'); +INSERT INTO `tb_area` VALUES (2306, '510701', '市辖区', '510700'); +INSERT INTO `tb_area` VALUES (2307, '510703', '涪城区', '510700'); +INSERT INTO `tb_area` VALUES (2308, '510704', '游仙区', '510700'); +INSERT INTO `tb_area` VALUES (2309, '510722', '三台县', '510700'); +INSERT INTO `tb_area` VALUES (2310, '510723', '盐亭县', '510700'); +INSERT INTO `tb_area` VALUES (2311, '510724', '安 县', '510700'); +INSERT INTO `tb_area` VALUES (2312, '510725', '梓潼县', '510700'); +INSERT INTO `tb_area` VALUES (2313, '510726', '北川羌族自治县', '510700'); +INSERT INTO `tb_area` VALUES (2314, '510727', '平武县', '510700'); +INSERT INTO `tb_area` VALUES (2315, '510781', '江油市', '510700'); +INSERT INTO `tb_area` VALUES (2316, '510801', '市辖区', '510800'); +INSERT INTO `tb_area` VALUES (2317, '510802', '市中区', '510800'); +INSERT INTO `tb_area` VALUES (2318, '510811', '元坝区', '510800'); +INSERT INTO `tb_area` VALUES (2319, '510812', '朝天区', '510800'); +INSERT INTO `tb_area` VALUES (2320, '510821', '旺苍县', '510800'); +INSERT INTO `tb_area` VALUES (2321, '510822', '青川县', '510800'); +INSERT INTO `tb_area` VALUES (2322, '510823', '剑阁县', '510800'); +INSERT INTO `tb_area` VALUES (2323, '510824', '苍溪县', '510800'); +INSERT INTO `tb_area` VALUES (2324, '510901', '市辖区', '510900'); +INSERT INTO `tb_area` VALUES (2325, '510903', '船山区', '510900'); +INSERT INTO `tb_area` VALUES (2326, '510904', '安居区', '510900'); +INSERT INTO `tb_area` VALUES (2327, '510921', '蓬溪县', '510900'); +INSERT INTO `tb_area` VALUES (2328, '510922', '射洪县', '510900'); +INSERT INTO `tb_area` VALUES (2329, '510923', '大英县', '510900'); +INSERT INTO `tb_area` VALUES (2330, '511001', '市辖区', '511000'); +INSERT INTO `tb_area` VALUES (2331, '511002', '市中区', '511000'); +INSERT INTO `tb_area` VALUES (2332, '511011', '东兴区', '511000'); +INSERT INTO `tb_area` VALUES (2333, '511024', '威远县', '511000'); +INSERT INTO `tb_area` VALUES (2334, '511025', '资中县', '511000'); +INSERT INTO `tb_area` VALUES (2335, '511028', '隆昌县', '511000'); +INSERT INTO `tb_area` VALUES (2336, '511101', '市辖区', '511100'); +INSERT INTO `tb_area` VALUES (2337, '511102', '市中区', '511100'); +INSERT INTO `tb_area` VALUES (2338, '511111', '沙湾区', '511100'); +INSERT INTO `tb_area` VALUES (2339, '511112', '五通桥区', '511100'); +INSERT INTO `tb_area` VALUES (2340, '511113', '金口河区', '511100'); +INSERT INTO `tb_area` VALUES (2341, '511123', '犍为县', '511100'); +INSERT INTO `tb_area` VALUES (2342, '511124', '井研县', '511100'); +INSERT INTO `tb_area` VALUES (2343, '511126', '夹江县', '511100'); +INSERT INTO `tb_area` VALUES (2344, '511129', '沐川县', '511100'); +INSERT INTO `tb_area` VALUES (2345, '511132', '峨边彝族自治县', '511100'); +INSERT INTO `tb_area` VALUES (2346, '511133', '马边彝族自治县', '511100'); +INSERT INTO `tb_area` VALUES (2347, '511181', '峨眉山市', '511100'); +INSERT INTO `tb_area` VALUES (2348, '511301', '市辖区', '511300'); +INSERT INTO `tb_area` VALUES (2349, '511302', '顺庆区', '511300'); +INSERT INTO `tb_area` VALUES (2350, '511303', '高坪区', '511300'); +INSERT INTO `tb_area` VALUES (2351, '511304', '嘉陵区', '511300'); +INSERT INTO `tb_area` VALUES (2352, '511321', '南部县', '511300'); +INSERT INTO `tb_area` VALUES (2353, '511322', '营山县', '511300'); +INSERT INTO `tb_area` VALUES (2354, '511323', '蓬安县', '511300'); +INSERT INTO `tb_area` VALUES (2355, '511324', '仪陇县', '511300'); +INSERT INTO `tb_area` VALUES (2356, '511325', '西充县', '511300'); +INSERT INTO `tb_area` VALUES (2357, '511381', '阆中市', '511300'); +INSERT INTO `tb_area` VALUES (2358, '511401', '市辖区', '511400'); +INSERT INTO `tb_area` VALUES (2359, '511402', '东坡区', '511400'); +INSERT INTO `tb_area` VALUES (2360, '511421', '仁寿县', '511400'); +INSERT INTO `tb_area` VALUES (2361, '511422', '彭山县', '511400'); +INSERT INTO `tb_area` VALUES (2362, '511423', '洪雅县', '511400'); +INSERT INTO `tb_area` VALUES (2363, '511424', '丹棱县', '511400'); +INSERT INTO `tb_area` VALUES (2364, '511425', '青神县', '511400'); +INSERT INTO `tb_area` VALUES (2365, '511501', '市辖区', '511500'); +INSERT INTO `tb_area` VALUES (2366, '511502', '翠屏区', '511500'); +INSERT INTO `tb_area` VALUES (2367, '511521', '宜宾县', '511500'); +INSERT INTO `tb_area` VALUES (2368, '511522', '南溪县', '511500'); +INSERT INTO `tb_area` VALUES (2369, '511523', '江安县', '511500'); +INSERT INTO `tb_area` VALUES (2370, '511524', '长宁县', '511500'); +INSERT INTO `tb_area` VALUES (2371, '511525', '高 县', '511500'); +INSERT INTO `tb_area` VALUES (2372, '511526', '珙 县', '511500'); +INSERT INTO `tb_area` VALUES (2373, '511527', '筠连县', '511500'); +INSERT INTO `tb_area` VALUES (2374, '511528', '兴文县', '511500'); +INSERT INTO `tb_area` VALUES (2375, '511529', '屏山县', '511500'); +INSERT INTO `tb_area` VALUES (2376, '511601', '市辖区', '511600'); +INSERT INTO `tb_area` VALUES (2377, '511602', '广安区', '511600'); +INSERT INTO `tb_area` VALUES (2378, '511621', '岳池县', '511600'); +INSERT INTO `tb_area` VALUES (2379, '511622', '武胜县', '511600'); +INSERT INTO `tb_area` VALUES (2380, '511623', '邻水县', '511600'); +INSERT INTO `tb_area` VALUES (2381, '511681', '华莹市', '511600'); +INSERT INTO `tb_area` VALUES (2382, '511701', '市辖区', '511700'); +INSERT INTO `tb_area` VALUES (2383, '511702', '通川区', '511700'); +INSERT INTO `tb_area` VALUES (2384, '511721', '达 县', '511700'); +INSERT INTO `tb_area` VALUES (2385, '511722', '宣汉县', '511700'); +INSERT INTO `tb_area` VALUES (2386, '511723', '开江县', '511700'); +INSERT INTO `tb_area` VALUES (2387, '511724', '大竹县', '511700'); +INSERT INTO `tb_area` VALUES (2388, '511725', '渠 县', '511700'); +INSERT INTO `tb_area` VALUES (2389, '511781', '万源市', '511700'); +INSERT INTO `tb_area` VALUES (2390, '511801', '市辖区', '511800'); +INSERT INTO `tb_area` VALUES (2391, '511802', '雨城区', '511800'); +INSERT INTO `tb_area` VALUES (2392, '511821', '名山县', '511800'); +INSERT INTO `tb_area` VALUES (2393, '511822', '荥经县', '511800'); +INSERT INTO `tb_area` VALUES (2394, '511823', '汉源县', '511800'); +INSERT INTO `tb_area` VALUES (2395, '511824', '石棉县', '511800'); +INSERT INTO `tb_area` VALUES (2396, '511825', '天全县', '511800'); +INSERT INTO `tb_area` VALUES (2397, '511826', '芦山县', '511800'); +INSERT INTO `tb_area` VALUES (2398, '511827', '宝兴县', '511800'); +INSERT INTO `tb_area` VALUES (2399, '511901', '市辖区', '511900'); +INSERT INTO `tb_area` VALUES (2400, '511902', '巴州区', '511900'); +INSERT INTO `tb_area` VALUES (2401, '511921', '通江县', '511900'); +INSERT INTO `tb_area` VALUES (2402, '511922', '南江县', '511900'); +INSERT INTO `tb_area` VALUES (2403, '511923', '平昌县', '511900'); +INSERT INTO `tb_area` VALUES (2404, '512001', '市辖区', '512000'); +INSERT INTO `tb_area` VALUES (2405, '512002', '雁江区', '512000'); +INSERT INTO `tb_area` VALUES (2406, '512021', '安岳县', '512000'); +INSERT INTO `tb_area` VALUES (2407, '512022', '乐至县', '512000'); +INSERT INTO `tb_area` VALUES (2408, '512081', '简阳市', '512000'); +INSERT INTO `tb_area` VALUES (2409, '513221', '汶川县', '513200'); +INSERT INTO `tb_area` VALUES (2410, '513222', '理 县', '513200'); +INSERT INTO `tb_area` VALUES (2411, '513223', '茂 县', '513200'); +INSERT INTO `tb_area` VALUES (2412, '513224', '松潘县', '513200'); +INSERT INTO `tb_area` VALUES (2413, '513225', '九寨沟县', '513200'); +INSERT INTO `tb_area` VALUES (2414, '513226', '金川县', '513200'); +INSERT INTO `tb_area` VALUES (2415, '513227', '小金县', '513200'); +INSERT INTO `tb_area` VALUES (2416, '513228', '黑水县', '513200'); +INSERT INTO `tb_area` VALUES (2417, '513229', '马尔康县', '513200'); +INSERT INTO `tb_area` VALUES (2418, '513230', '壤塘县', '513200'); +INSERT INTO `tb_area` VALUES (2419, '513231', '阿坝县', '513200'); +INSERT INTO `tb_area` VALUES (2420, '513232', '若尔盖县', '513200'); +INSERT INTO `tb_area` VALUES (2421, '513233', '红原县', '513200'); +INSERT INTO `tb_area` VALUES (2422, '513321', '康定县', '513300'); +INSERT INTO `tb_area` VALUES (2423, '513322', '泸定县', '513300'); +INSERT INTO `tb_area` VALUES (2424, '513323', '丹巴县', '513300'); +INSERT INTO `tb_area` VALUES (2425, '513324', '九龙县', '513300'); +INSERT INTO `tb_area` VALUES (2426, '513325', '雅江县', '513300'); +INSERT INTO `tb_area` VALUES (2427, '513326', '道孚县', '513300'); +INSERT INTO `tb_area` VALUES (2428, '513327', '炉霍县', '513300'); +INSERT INTO `tb_area` VALUES (2429, '513328', '甘孜县', '513300'); +INSERT INTO `tb_area` VALUES (2430, '513329', '新龙县', '513300'); +INSERT INTO `tb_area` VALUES (2431, '513330', '德格县', '513300'); +INSERT INTO `tb_area` VALUES (2432, '513331', '白玉县', '513300'); +INSERT INTO `tb_area` VALUES (2433, '513332', '石渠县', '513300'); +INSERT INTO `tb_area` VALUES (2434, '513333', '色达县', '513300'); +INSERT INTO `tb_area` VALUES (2435, '513334', '理塘县', '513300'); +INSERT INTO `tb_area` VALUES (2436, '513335', '巴塘县', '513300'); +INSERT INTO `tb_area` VALUES (2437, '513336', '乡城县', '513300'); +INSERT INTO `tb_area` VALUES (2438, '513337', '稻城县', '513300'); +INSERT INTO `tb_area` VALUES (2439, '513338', '得荣县', '513300'); +INSERT INTO `tb_area` VALUES (2440, '513401', '西昌市', '513400'); +INSERT INTO `tb_area` VALUES (2441, '513422', '木里藏族自治县', '513400'); +INSERT INTO `tb_area` VALUES (2442, '513423', '盐源县', '513400'); +INSERT INTO `tb_area` VALUES (2443, '513424', '德昌县', '513400'); +INSERT INTO `tb_area` VALUES (2444, '513425', '会理县', '513400'); +INSERT INTO `tb_area` VALUES (2445, '513426', '会东县', '513400'); +INSERT INTO `tb_area` VALUES (2446, '513427', '宁南县', '513400'); +INSERT INTO `tb_area` VALUES (2447, '513428', '普格县', '513400'); +INSERT INTO `tb_area` VALUES (2448, '513429', '布拖县', '513400'); +INSERT INTO `tb_area` VALUES (2449, '513430', '金阳县', '513400'); +INSERT INTO `tb_area` VALUES (2450, '513431', '昭觉县', '513400'); +INSERT INTO `tb_area` VALUES (2451, '513432', '喜德县', '513400'); +INSERT INTO `tb_area` VALUES (2452, '513433', '冕宁县', '513400'); +INSERT INTO `tb_area` VALUES (2453, '513434', '越西县', '513400'); +INSERT INTO `tb_area` VALUES (2454, '513435', '甘洛县', '513400'); +INSERT INTO `tb_area` VALUES (2455, '513436', '美姑县', '513400'); +INSERT INTO `tb_area` VALUES (2456, '513437', '雷波县', '513400'); +INSERT INTO `tb_area` VALUES (2457, '520101', '市辖区', '520100'); +INSERT INTO `tb_area` VALUES (2458, '520102', '南明区', '520100'); +INSERT INTO `tb_area` VALUES (2459, '520103', '云岩区', '520100'); +INSERT INTO `tb_area` VALUES (2460, '520111', '花溪区', '520100'); +INSERT INTO `tb_area` VALUES (2461, '520112', '乌当区', '520100'); +INSERT INTO `tb_area` VALUES (2462, '520113', '白云区', '520100'); +INSERT INTO `tb_area` VALUES (2463, '520114', '小河区', '520100'); +INSERT INTO `tb_area` VALUES (2464, '520121', '开阳县', '520100'); +INSERT INTO `tb_area` VALUES (2465, '520122', '息烽县', '520100'); +INSERT INTO `tb_area` VALUES (2466, '520123', '修文县', '520100'); +INSERT INTO `tb_area` VALUES (2467, '520181', '清镇市', '520100'); +INSERT INTO `tb_area` VALUES (2468, '520201', '钟山区', '520200'); +INSERT INTO `tb_area` VALUES (2469, '520203', '六枝特区', '520200'); +INSERT INTO `tb_area` VALUES (2470, '520221', '水城县', '520200'); +INSERT INTO `tb_area` VALUES (2471, '520222', '盘 县', '520200'); +INSERT INTO `tb_area` VALUES (2472, '520301', '市辖区', '520300'); +INSERT INTO `tb_area` VALUES (2473, '520302', '红花岗区', '520300'); +INSERT INTO `tb_area` VALUES (2474, '520303', '汇川区', '520300'); +INSERT INTO `tb_area` VALUES (2475, '520321', '遵义县', '520300'); +INSERT INTO `tb_area` VALUES (2476, '520322', '桐梓县', '520300'); +INSERT INTO `tb_area` VALUES (2477, '520323', '绥阳县', '520300'); +INSERT INTO `tb_area` VALUES (2478, '520324', '正安县', '520300'); +INSERT INTO `tb_area` VALUES (2479, '520325', '道真仡佬族苗族自治县', '520300'); +INSERT INTO `tb_area` VALUES (2480, '520326', '务川仡佬族苗族自治县', '520300'); +INSERT INTO `tb_area` VALUES (2481, '520327', '凤冈县', '520300'); +INSERT INTO `tb_area` VALUES (2482, '520328', '湄潭县', '520300'); +INSERT INTO `tb_area` VALUES (2483, '520329', '余庆县', '520300'); +INSERT INTO `tb_area` VALUES (2484, '520330', '习水县', '520300'); +INSERT INTO `tb_area` VALUES (2485, '520381', '赤水市', '520300'); +INSERT INTO `tb_area` VALUES (2486, '520382', '仁怀市', '520300'); +INSERT INTO `tb_area` VALUES (2487, '520401', '市辖区', '520400'); +INSERT INTO `tb_area` VALUES (2488, '520402', '西秀区', '520400'); +INSERT INTO `tb_area` VALUES (2489, '520421', '平坝县', '520400'); +INSERT INTO `tb_area` VALUES (2490, '520422', '普定县', '520400'); +INSERT INTO `tb_area` VALUES (2491, '520423', '镇宁布依族苗族自治县', '520400'); +INSERT INTO `tb_area` VALUES (2492, '520424', '关岭布依族苗族自治县', '520400'); +INSERT INTO `tb_area` VALUES (2493, '520425', '紫云苗族布依族自治县', '520400'); +INSERT INTO `tb_area` VALUES (2494, '522201', '铜仁市', '522200'); +INSERT INTO `tb_area` VALUES (2495, '522222', '江口县', '522200'); +INSERT INTO `tb_area` VALUES (2496, '522223', '玉屏侗族自治县', '522200'); +INSERT INTO `tb_area` VALUES (2497, '522224', '石阡县', '522200'); +INSERT INTO `tb_area` VALUES (2498, '522225', '思南县', '522200'); +INSERT INTO `tb_area` VALUES (2499, '522226', '印江土家族苗族自治县', '522200'); +INSERT INTO `tb_area` VALUES (2500, '522227', '德江县', '522200'); +INSERT INTO `tb_area` VALUES (2501, '522228', '沿河土家族自治县', '522200'); +INSERT INTO `tb_area` VALUES (2502, '522229', '松桃苗族自治县', '522200'); +INSERT INTO `tb_area` VALUES (2503, '522230', '万山特区', '522200'); +INSERT INTO `tb_area` VALUES (2504, '522301', '兴义市', '522300'); +INSERT INTO `tb_area` VALUES (2505, '522322', '兴仁县', '522300'); +INSERT INTO `tb_area` VALUES (2506, '522323', '普安县', '522300'); +INSERT INTO `tb_area` VALUES (2507, '522324', '晴隆县', '522300'); +INSERT INTO `tb_area` VALUES (2508, '522325', '贞丰县', '522300'); +INSERT INTO `tb_area` VALUES (2509, '522326', '望谟县', '522300'); +INSERT INTO `tb_area` VALUES (2510, '522327', '册亨县', '522300'); +INSERT INTO `tb_area` VALUES (2511, '522328', '安龙县', '522300'); +INSERT INTO `tb_area` VALUES (2512, '522401', '毕节市', '522400'); +INSERT INTO `tb_area` VALUES (2513, '522422', '大方县', '522400'); +INSERT INTO `tb_area` VALUES (2514, '522423', '黔西县', '522400'); +INSERT INTO `tb_area` VALUES (2515, '522424', '金沙县', '522400'); +INSERT INTO `tb_area` VALUES (2516, '522425', '织金县', '522400'); +INSERT INTO `tb_area` VALUES (2517, '522426', '纳雍县', '522400'); +INSERT INTO `tb_area` VALUES (2518, '522427', '威宁彝族回族苗族自治县', '522400'); +INSERT INTO `tb_area` VALUES (2519, '522428', '赫章县', '522400'); +INSERT INTO `tb_area` VALUES (2520, '522601', '凯里市', '522600'); +INSERT INTO `tb_area` VALUES (2521, '522622', '黄平县', '522600'); +INSERT INTO `tb_area` VALUES (2522, '522623', '施秉县', '522600'); +INSERT INTO `tb_area` VALUES (2523, '522624', '三穗县', '522600'); +INSERT INTO `tb_area` VALUES (2524, '522625', '镇远县', '522600'); +INSERT INTO `tb_area` VALUES (2525, '522626', '岑巩县', '522600'); +INSERT INTO `tb_area` VALUES (2526, '522627', '天柱县', '522600'); +INSERT INTO `tb_area` VALUES (2527, '522628', '锦屏县', '522600'); +INSERT INTO `tb_area` VALUES (2528, '522629', '剑河县', '522600'); +INSERT INTO `tb_area` VALUES (2529, '522630', '台江县', '522600'); +INSERT INTO `tb_area` VALUES (2530, '522631', '黎平县', '522600'); +INSERT INTO `tb_area` VALUES (2531, '522632', '榕江县', '522600'); +INSERT INTO `tb_area` VALUES (2532, '522633', '从江县', '522600'); +INSERT INTO `tb_area` VALUES (2533, '522634', '雷山县', '522600'); +INSERT INTO `tb_area` VALUES (2534, '522635', '麻江县', '522600'); +INSERT INTO `tb_area` VALUES (2535, '522636', '丹寨县', '522600'); +INSERT INTO `tb_area` VALUES (2536, '522701', '都匀市', '522700'); +INSERT INTO `tb_area` VALUES (2537, '522702', '福泉市', '522700'); +INSERT INTO `tb_area` VALUES (2538, '522722', '荔波县', '522700'); +INSERT INTO `tb_area` VALUES (2539, '522723', '贵定县', '522700'); +INSERT INTO `tb_area` VALUES (2540, '522725', '瓮安县', '522700'); +INSERT INTO `tb_area` VALUES (2541, '522726', '独山县', '522700'); +INSERT INTO `tb_area` VALUES (2542, '522727', '平塘县', '522700'); +INSERT INTO `tb_area` VALUES (2543, '522728', '罗甸县', '522700'); +INSERT INTO `tb_area` VALUES (2544, '522729', '长顺县', '522700'); +INSERT INTO `tb_area` VALUES (2545, '522730', '龙里县', '522700'); +INSERT INTO `tb_area` VALUES (2546, '522731', '惠水县', '522700'); +INSERT INTO `tb_area` VALUES (2547, '522732', '三都水族自治县', '522700'); +INSERT INTO `tb_area` VALUES (2548, '530101', '市辖区', '530100'); +INSERT INTO `tb_area` VALUES (2549, '530102', '五华区', '530100'); +INSERT INTO `tb_area` VALUES (2550, '530103', '盘龙区', '530100'); +INSERT INTO `tb_area` VALUES (2551, '530111', '官渡区', '530100'); +INSERT INTO `tb_area` VALUES (2552, '530112', '西山区', '530100'); +INSERT INTO `tb_area` VALUES (2553, '530113', '东川区', '530100'); +INSERT INTO `tb_area` VALUES (2554, '530121', '呈贡县', '530100'); +INSERT INTO `tb_area` VALUES (2555, '530122', '晋宁县', '530100'); +INSERT INTO `tb_area` VALUES (2556, '530124', '富民县', '530100'); +INSERT INTO `tb_area` VALUES (2557, '530125', '宜良县', '530100'); +INSERT INTO `tb_area` VALUES (2558, '530126', '石林彝族自治县', '530100'); +INSERT INTO `tb_area` VALUES (2559, '530127', '嵩明县', '530100'); +INSERT INTO `tb_area` VALUES (2560, '530128', '禄劝彝族苗族自治县', '530100'); +INSERT INTO `tb_area` VALUES (2561, '530129', '寻甸回族彝族自治县', '530100'); +INSERT INTO `tb_area` VALUES (2562, '530181', '安宁市', '530100'); +INSERT INTO `tb_area` VALUES (2563, '530301', '市辖区', '530300'); +INSERT INTO `tb_area` VALUES (2564, '530302', '麒麟区', '530300'); +INSERT INTO `tb_area` VALUES (2565, '530321', '马龙县', '530300'); +INSERT INTO `tb_area` VALUES (2566, '530322', '陆良县', '530300'); +INSERT INTO `tb_area` VALUES (2567, '530323', '师宗县', '530300'); +INSERT INTO `tb_area` VALUES (2568, '530324', '罗平县', '530300'); +INSERT INTO `tb_area` VALUES (2569, '530325', '富源县', '530300'); +INSERT INTO `tb_area` VALUES (2570, '530326', '会泽县', '530300'); +INSERT INTO `tb_area` VALUES (2571, '530328', '沾益县', '530300'); +INSERT INTO `tb_area` VALUES (2572, '530381', '宣威市', '530300'); +INSERT INTO `tb_area` VALUES (2573, '530401', '市辖区', '530400'); +INSERT INTO `tb_area` VALUES (2574, '530402', '红塔区', '530400'); +INSERT INTO `tb_area` VALUES (2575, '530421', '江川县', '530400'); +INSERT INTO `tb_area` VALUES (2576, '530422', '澄江县', '530400'); +INSERT INTO `tb_area` VALUES (2577, '530423', '通海县', '530400'); +INSERT INTO `tb_area` VALUES (2578, '530424', '华宁县', '530400'); +INSERT INTO `tb_area` VALUES (2579, '530425', '易门县', '530400'); +INSERT INTO `tb_area` VALUES (2580, '530426', '峨山彝族自治县', '530400'); +INSERT INTO `tb_area` VALUES (2581, '530427', '新平彝族傣族自治县', '530400'); +INSERT INTO `tb_area` VALUES (2582, '530428', '元江哈尼族彝族傣族自治县', '530400'); +INSERT INTO `tb_area` VALUES (2583, '530501', '市辖区', '530500'); +INSERT INTO `tb_area` VALUES (2584, '530502', '隆阳区', '530500'); +INSERT INTO `tb_area` VALUES (2585, '530521', '施甸县', '530500'); +INSERT INTO `tb_area` VALUES (2586, '530522', '腾冲县', '530500'); +INSERT INTO `tb_area` VALUES (2587, '530523', '龙陵县', '530500'); +INSERT INTO `tb_area` VALUES (2588, '530524', '昌宁县', '530500'); +INSERT INTO `tb_area` VALUES (2589, '530601', '市辖区', '530600'); +INSERT INTO `tb_area` VALUES (2590, '530602', '昭阳区', '530600'); +INSERT INTO `tb_area` VALUES (2591, '530621', '鲁甸县', '530600'); +INSERT INTO `tb_area` VALUES (2592, '530622', '巧家县', '530600'); +INSERT INTO `tb_area` VALUES (2593, '530623', '盐津县', '530600'); +INSERT INTO `tb_area` VALUES (2594, '530624', '大关县', '530600'); +INSERT INTO `tb_area` VALUES (2595, '530625', '永善县', '530600'); +INSERT INTO `tb_area` VALUES (2596, '530626', '绥江县', '530600'); +INSERT INTO `tb_area` VALUES (2597, '530627', '镇雄县', '530600'); +INSERT INTO `tb_area` VALUES (2598, '530628', '彝良县', '530600'); +INSERT INTO `tb_area` VALUES (2599, '530629', '威信县', '530600'); +INSERT INTO `tb_area` VALUES (2600, '530630', '水富县', '530600'); +INSERT INTO `tb_area` VALUES (2601, '530701', '市辖区', '530700'); +INSERT INTO `tb_area` VALUES (2602, '530702', '古城区', '530700'); +INSERT INTO `tb_area` VALUES (2603, '530721', '玉龙纳西族自治县', '530700'); +INSERT INTO `tb_area` VALUES (2604, '530722', '永胜县', '530700'); +INSERT INTO `tb_area` VALUES (2605, '530723', '华坪县', '530700'); +INSERT INTO `tb_area` VALUES (2606, '530724', '宁蒗彝族自治县', '530700'); +INSERT INTO `tb_area` VALUES (2607, '530801', '市辖区', '530800'); +INSERT INTO `tb_area` VALUES (2608, '530802', '翠云区', '530800'); +INSERT INTO `tb_area` VALUES (2609, '530821', '普洱哈尼族彝族自治县', '530800'); +INSERT INTO `tb_area` VALUES (2610, '530822', '墨江哈尼族自治县', '530800'); +INSERT INTO `tb_area` VALUES (2611, '530823', '景东彝族自治县', '530800'); +INSERT INTO `tb_area` VALUES (2612, '530824', '景谷傣族彝族自治县', '530800'); +INSERT INTO `tb_area` VALUES (2613, '530825', '镇沅彝族哈尼族拉祜族自治县', '530800'); +INSERT INTO `tb_area` VALUES (2614, '530826', '江城哈尼族彝族自治县', '530800'); +INSERT INTO `tb_area` VALUES (2615, '530827', '孟连傣族拉祜族佤族自治县', '530800'); +INSERT INTO `tb_area` VALUES (2616, '530828', '澜沧拉祜族自治县', '530800'); +INSERT INTO `tb_area` VALUES (2617, '530829', '西盟佤族自治县', '530800'); +INSERT INTO `tb_area` VALUES (2618, '530901', '市辖区', '530900'); +INSERT INTO `tb_area` VALUES (2619, '530902', '临翔区', '530900'); +INSERT INTO `tb_area` VALUES (2620, '530921', '凤庆县', '530900'); +INSERT INTO `tb_area` VALUES (2621, '530922', '云 县', '530900'); +INSERT INTO `tb_area` VALUES (2622, '530923', '永德县', '530900'); +INSERT INTO `tb_area` VALUES (2623, '530924', '镇康县', '530900'); +INSERT INTO `tb_area` VALUES (2624, '530925', '双江拉祜族佤族布朗族傣族自治县', '530900'); +INSERT INTO `tb_area` VALUES (2625, '530926', '耿马傣族佤族自治县', '530900'); +INSERT INTO `tb_area` VALUES (2626, '530927', '沧源佤族自治县', '530900'); +INSERT INTO `tb_area` VALUES (2627, '532301', '楚雄市', '532300'); +INSERT INTO `tb_area` VALUES (2628, '532322', '双柏县', '532300'); +INSERT INTO `tb_area` VALUES (2629, '532323', '牟定县', '532300'); +INSERT INTO `tb_area` VALUES (2630, '532324', '南华县', '532300'); +INSERT INTO `tb_area` VALUES (2631, '532325', '姚安县', '532300'); +INSERT INTO `tb_area` VALUES (2632, '532326', '大姚县', '532300'); +INSERT INTO `tb_area` VALUES (2633, '532327', '永仁县', '532300'); +INSERT INTO `tb_area` VALUES (2634, '532328', '元谋县', '532300'); +INSERT INTO `tb_area` VALUES (2635, '532329', '武定县', '532300'); +INSERT INTO `tb_area` VALUES (2636, '532331', '禄丰县', '532300'); +INSERT INTO `tb_area` VALUES (2637, '532501', '个旧市', '532500'); +INSERT INTO `tb_area` VALUES (2638, '532502', '开远市', '532500'); +INSERT INTO `tb_area` VALUES (2639, '532522', '蒙自县', '532500'); +INSERT INTO `tb_area` VALUES (2640, '532523', '屏边苗族自治县', '532500'); +INSERT INTO `tb_area` VALUES (2641, '532524', '建水县', '532500'); +INSERT INTO `tb_area` VALUES (2642, '532525', '石屏县', '532500'); +INSERT INTO `tb_area` VALUES (2643, '532526', '弥勒县', '532500'); +INSERT INTO `tb_area` VALUES (2644, '532527', '泸西县', '532500'); +INSERT INTO `tb_area` VALUES (2645, '532528', '元阳县', '532500'); +INSERT INTO `tb_area` VALUES (2646, '532529', '红河县', '532500'); +INSERT INTO `tb_area` VALUES (2647, '532530', '金平苗族瑶族傣族自治县', '532500'); +INSERT INTO `tb_area` VALUES (2648, '532531', '绿春县', '532500'); +INSERT INTO `tb_area` VALUES (2649, '532532', '河口瑶族自治县', '532500'); +INSERT INTO `tb_area` VALUES (2650, '532621', '文山县', '532600'); +INSERT INTO `tb_area` VALUES (2651, '532622', '砚山县', '532600'); +INSERT INTO `tb_area` VALUES (2652, '532623', '西畴县', '532600'); +INSERT INTO `tb_area` VALUES (2653, '532624', '麻栗坡县', '532600'); +INSERT INTO `tb_area` VALUES (2654, '532625', '马关县', '532600'); +INSERT INTO `tb_area` VALUES (2655, '532626', '丘北县', '532600'); +INSERT INTO `tb_area` VALUES (2656, '532627', '广南县', '532600'); +INSERT INTO `tb_area` VALUES (2657, '532628', '富宁县', '532600'); +INSERT INTO `tb_area` VALUES (2658, '532801', '景洪市', '532800'); +INSERT INTO `tb_area` VALUES (2659, '532822', '勐海县', '532800'); +INSERT INTO `tb_area` VALUES (2660, '532823', '勐腊县', '532800'); +INSERT INTO `tb_area` VALUES (2661, '532901', '大理市', '532900'); +INSERT INTO `tb_area` VALUES (2662, '532922', '漾濞彝族自治县', '532900'); +INSERT INTO `tb_area` VALUES (2663, '532923', '祥云县', '532900'); +INSERT INTO `tb_area` VALUES (2664, '532924', '宾川县', '532900'); +INSERT INTO `tb_area` VALUES (2665, '532925', '弥渡县', '532900'); +INSERT INTO `tb_area` VALUES (2666, '532926', '南涧彝族自治县', '532900'); +INSERT INTO `tb_area` VALUES (2667, '532927', '巍山彝族回族自治县', '532900'); +INSERT INTO `tb_area` VALUES (2668, '532928', '永平县', '532900'); +INSERT INTO `tb_area` VALUES (2669, '532929', '云龙县', '532900'); +INSERT INTO `tb_area` VALUES (2670, '532930', '洱源县', '532900'); +INSERT INTO `tb_area` VALUES (2671, '532931', '剑川县', '532900'); +INSERT INTO `tb_area` VALUES (2672, '532932', '鹤庆县', '532900'); +INSERT INTO `tb_area` VALUES (2673, '533102', '瑞丽市', '533100'); +INSERT INTO `tb_area` VALUES (2674, '533103', '潞西市', '533100'); +INSERT INTO `tb_area` VALUES (2675, '533122', '梁河县', '533100'); +INSERT INTO `tb_area` VALUES (2676, '533123', '盈江县', '533100'); +INSERT INTO `tb_area` VALUES (2677, '533124', '陇川县', '533100'); +INSERT INTO `tb_area` VALUES (2678, '533321', '泸水县', '533300'); +INSERT INTO `tb_area` VALUES (2679, '533323', '福贡县', '533300'); +INSERT INTO `tb_area` VALUES (2680, '533324', '贡山独龙族怒族自治县', '533300'); +INSERT INTO `tb_area` VALUES (2681, '533325', '兰坪白族普米族自治县', '533300'); +INSERT INTO `tb_area` VALUES (2682, '533421', '香格里拉县', '533400'); +INSERT INTO `tb_area` VALUES (2683, '533422', '德钦县', '533400'); +INSERT INTO `tb_area` VALUES (2684, '533423', '维西傈僳族自治县', '533400'); +INSERT INTO `tb_area` VALUES (2685, '540101', '市辖区', '540100'); +INSERT INTO `tb_area` VALUES (2686, '540102', '城关区', '540100'); +INSERT INTO `tb_area` VALUES (2687, '540121', '林周县', '540100'); +INSERT INTO `tb_area` VALUES (2688, '540122', '当雄县', '540100'); +INSERT INTO `tb_area` VALUES (2689, '540123', '尼木县', '540100'); +INSERT INTO `tb_area` VALUES (2690, '540124', '曲水县', '540100'); +INSERT INTO `tb_area` VALUES (2691, '540125', '堆龙德庆县', '540100'); +INSERT INTO `tb_area` VALUES (2692, '540126', '达孜县', '540100'); +INSERT INTO `tb_area` VALUES (2693, '540127', '墨竹工卡县', '540100'); +INSERT INTO `tb_area` VALUES (2694, '542121', '昌都县', '542100'); +INSERT INTO `tb_area` VALUES (2695, '542122', '江达县', '542100'); +INSERT INTO `tb_area` VALUES (2696, '542123', '贡觉县', '542100'); +INSERT INTO `tb_area` VALUES (2697, '542124', '类乌齐县', '542100'); +INSERT INTO `tb_area` VALUES (2698, '542125', '丁青县', '542100'); +INSERT INTO `tb_area` VALUES (2699, '542126', '察雅县', '542100'); +INSERT INTO `tb_area` VALUES (2700, '542127', '八宿县', '542100'); +INSERT INTO `tb_area` VALUES (2701, '542128', '左贡县', '542100'); +INSERT INTO `tb_area` VALUES (2702, '542129', '芒康县', '542100'); +INSERT INTO `tb_area` VALUES (2703, '542132', '洛隆县', '542100'); +INSERT INTO `tb_area` VALUES (2704, '542133', '边坝县', '542100'); +INSERT INTO `tb_area` VALUES (2705, '542221', '乃东县', '542200'); +INSERT INTO `tb_area` VALUES (2706, '542222', '扎囊县', '542200'); +INSERT INTO `tb_area` VALUES (2707, '542223', '贡嘎县', '542200'); +INSERT INTO `tb_area` VALUES (2708, '542224', '桑日县', '542200'); +INSERT INTO `tb_area` VALUES (2709, '542225', '琼结县', '542200'); +INSERT INTO `tb_area` VALUES (2710, '542226', '曲松县', '542200'); +INSERT INTO `tb_area` VALUES (2711, '542227', '措美县', '542200'); +INSERT INTO `tb_area` VALUES (2712, '542228', '洛扎县', '542200'); +INSERT INTO `tb_area` VALUES (2713, '542229', '加查县', '542200'); +INSERT INTO `tb_area` VALUES (2714, '542231', '隆子县', '542200'); +INSERT INTO `tb_area` VALUES (2715, '542232', '错那县', '542200'); +INSERT INTO `tb_area` VALUES (2716, '542233', '浪卡子县', '542200'); +INSERT INTO `tb_area` VALUES (2717, '542301', '日喀则市', '542300'); +INSERT INTO `tb_area` VALUES (2718, '542322', '南木林县', '542300'); +INSERT INTO `tb_area` VALUES (2719, '542323', '江孜县', '542300'); +INSERT INTO `tb_area` VALUES (2720, '542324', '定日县', '542300'); +INSERT INTO `tb_area` VALUES (2721, '542325', '萨迦县', '542300'); +INSERT INTO `tb_area` VALUES (2722, '542326', '拉孜县', '542300'); +INSERT INTO `tb_area` VALUES (2723, '542327', '昂仁县', '542300'); +INSERT INTO `tb_area` VALUES (2724, '542328', '谢通门县', '542300'); +INSERT INTO `tb_area` VALUES (2725, '542329', '白朗县', '542300'); +INSERT INTO `tb_area` VALUES (2726, '542330', '仁布县', '542300'); +INSERT INTO `tb_area` VALUES (2727, '542331', '康马县', '542300'); +INSERT INTO `tb_area` VALUES (2728, '542332', '定结县', '542300'); +INSERT INTO `tb_area` VALUES (2729, '542333', '仲巴县', '542300'); +INSERT INTO `tb_area` VALUES (2730, '542334', '亚东县', '542300'); +INSERT INTO `tb_area` VALUES (2731, '542335', '吉隆县', '542300'); +INSERT INTO `tb_area` VALUES (2732, '542336', '聂拉木县', '542300'); +INSERT INTO `tb_area` VALUES (2733, '542337', '萨嘎县', '542300'); +INSERT INTO `tb_area` VALUES (2734, '542338', '岗巴县', '542300'); +INSERT INTO `tb_area` VALUES (2735, '542421', '那曲县', '542400'); +INSERT INTO `tb_area` VALUES (2736, '542422', '嘉黎县', '542400'); +INSERT INTO `tb_area` VALUES (2737, '542423', '比如县', '542400'); +INSERT INTO `tb_area` VALUES (2738, '542424', '聂荣县', '542400'); +INSERT INTO `tb_area` VALUES (2739, '542425', '安多县', '542400'); +INSERT INTO `tb_area` VALUES (2740, '542426', '申扎县', '542400'); +INSERT INTO `tb_area` VALUES (2741, '542427', '索 县', '542400'); +INSERT INTO `tb_area` VALUES (2742, '542428', '班戈县', '542400'); +INSERT INTO `tb_area` VALUES (2743, '542429', '巴青县', '542400'); +INSERT INTO `tb_area` VALUES (2744, '542430', '尼玛县', '542400'); +INSERT INTO `tb_area` VALUES (2745, '542521', '普兰县', '542500'); +INSERT INTO `tb_area` VALUES (2746, '542522', '札达县', '542500'); +INSERT INTO `tb_area` VALUES (2747, '542523', '噶尔县', '542500'); +INSERT INTO `tb_area` VALUES (2748, '542524', '日土县', '542500'); +INSERT INTO `tb_area` VALUES (2749, '542525', '革吉县', '542500'); +INSERT INTO `tb_area` VALUES (2750, '542526', '改则县', '542500'); +INSERT INTO `tb_area` VALUES (2751, '542527', '措勤县', '542500'); +INSERT INTO `tb_area` VALUES (2752, '542621', '林芝县', '542600'); +INSERT INTO `tb_area` VALUES (2753, '542622', '工布江达县', '542600'); +INSERT INTO `tb_area` VALUES (2754, '542623', '米林县', '542600'); +INSERT INTO `tb_area` VALUES (2755, '542624', '墨脱县', '542600'); +INSERT INTO `tb_area` VALUES (2756, '542625', '波密县', '542600'); +INSERT INTO `tb_area` VALUES (2757, '542626', '察隅县', '542600'); +INSERT INTO `tb_area` VALUES (2758, '542627', '朗 县', '542600'); +INSERT INTO `tb_area` VALUES (2759, '610101', '市辖区', '610100'); +INSERT INTO `tb_area` VALUES (2760, '610102', '新城区', '610100'); +INSERT INTO `tb_area` VALUES (2761, '610103', '碑林区', '610100'); +INSERT INTO `tb_area` VALUES (2762, '610104', '莲湖区', '610100'); +INSERT INTO `tb_area` VALUES (2763, '610111', '灞桥区', '610100'); +INSERT INTO `tb_area` VALUES (2764, '610112', '未央区', '610100'); +INSERT INTO `tb_area` VALUES (2765, '610113', '雁塔区', '610100'); +INSERT INTO `tb_area` VALUES (2766, '610114', '阎良区', '610100'); +INSERT INTO `tb_area` VALUES (2767, '610115', '临潼区', '610100'); +INSERT INTO `tb_area` VALUES (2768, '610116', '长安区', '610100'); +INSERT INTO `tb_area` VALUES (2769, '610122', '蓝田县', '610100'); +INSERT INTO `tb_area` VALUES (2770, '610124', '周至县', '610100'); +INSERT INTO `tb_area` VALUES (2771, '610125', '户 县', '610100'); +INSERT INTO `tb_area` VALUES (2772, '610126', '高陵县', '610100'); +INSERT INTO `tb_area` VALUES (2773, '610201', '市辖区', '610200'); +INSERT INTO `tb_area` VALUES (2774, '610202', '王益区', '610200'); +INSERT INTO `tb_area` VALUES (2775, '610203', '印台区', '610200'); +INSERT INTO `tb_area` VALUES (2776, '610204', '耀州区', '610200'); +INSERT INTO `tb_area` VALUES (2777, '610222', '宜君县', '610200'); +INSERT INTO `tb_area` VALUES (2778, '610301', '市辖区', '610300'); +INSERT INTO `tb_area` VALUES (2779, '610302', '渭滨区', '610300'); +INSERT INTO `tb_area` VALUES (2780, '610303', '金台区', '610300'); +INSERT INTO `tb_area` VALUES (2781, '610304', '陈仓区', '610300'); +INSERT INTO `tb_area` VALUES (2782, '610322', '凤翔县', '610300'); +INSERT INTO `tb_area` VALUES (2783, '610323', '岐山县', '610300'); +INSERT INTO `tb_area` VALUES (2784, '610324', '扶风县', '610300'); +INSERT INTO `tb_area` VALUES (2785, '610326', '眉 县', '610300'); +INSERT INTO `tb_area` VALUES (2786, '610327', '陇 县', '610300'); +INSERT INTO `tb_area` VALUES (2787, '610328', '千阳县', '610300'); +INSERT INTO `tb_area` VALUES (2788, '610329', '麟游县', '610300'); +INSERT INTO `tb_area` VALUES (2789, '610330', '凤 县', '610300'); +INSERT INTO `tb_area` VALUES (2790, '610331', '太白县', '610300'); +INSERT INTO `tb_area` VALUES (2791, '610401', '市辖区', '610400'); +INSERT INTO `tb_area` VALUES (2792, '610402', '秦都区', '610400'); +INSERT INTO `tb_area` VALUES (2793, '610403', '杨凌区', '610400'); +INSERT INTO `tb_area` VALUES (2794, '610404', '渭城区', '610400'); +INSERT INTO `tb_area` VALUES (2795, '610422', '三原县', '610400'); +INSERT INTO `tb_area` VALUES (2796, '610423', '泾阳县', '610400'); +INSERT INTO `tb_area` VALUES (2797, '610424', '乾 县', '610400'); +INSERT INTO `tb_area` VALUES (2798, '610425', '礼泉县', '610400'); +INSERT INTO `tb_area` VALUES (2799, '610426', '永寿县', '610400'); +INSERT INTO `tb_area` VALUES (2800, '610427', '彬 县', '610400'); +INSERT INTO `tb_area` VALUES (2801, '610428', '长武县', '610400'); +INSERT INTO `tb_area` VALUES (2802, '610429', '旬邑县', '610400'); +INSERT INTO `tb_area` VALUES (2803, '610430', '淳化县', '610400'); +INSERT INTO `tb_area` VALUES (2804, '610431', '武功县', '610400'); +INSERT INTO `tb_area` VALUES (2805, '610481', '兴平市', '610400'); +INSERT INTO `tb_area` VALUES (2806, '610501', '市辖区', '610500'); +INSERT INTO `tb_area` VALUES (2807, '610502', '临渭区', '610500'); +INSERT INTO `tb_area` VALUES (2808, '610521', '华 县', '610500'); +INSERT INTO `tb_area` VALUES (2809, '610522', '潼关县', '610500'); +INSERT INTO `tb_area` VALUES (2810, '610523', '大荔县', '610500'); +INSERT INTO `tb_area` VALUES (2811, '610524', '合阳县', '610500'); +INSERT INTO `tb_area` VALUES (2812, '610525', '澄城县', '610500'); +INSERT INTO `tb_area` VALUES (2813, '610526', '蒲城县', '610500'); +INSERT INTO `tb_area` VALUES (2814, '610527', '白水县', '610500'); +INSERT INTO `tb_area` VALUES (2815, '610528', '富平县', '610500'); +INSERT INTO `tb_area` VALUES (2816, '610581', '韩城市', '610500'); +INSERT INTO `tb_area` VALUES (2817, '610582', '华阴市', '610500'); +INSERT INTO `tb_area` VALUES (2818, '610601', '市辖区', '610600'); +INSERT INTO `tb_area` VALUES (2819, '610602', '宝塔区', '610600'); +INSERT INTO `tb_area` VALUES (2820, '610621', '延长县', '610600'); +INSERT INTO `tb_area` VALUES (2821, '610622', '延川县', '610600'); +INSERT INTO `tb_area` VALUES (2822, '610623', '子长县', '610600'); +INSERT INTO `tb_area` VALUES (2823, '610624', '安塞县', '610600'); +INSERT INTO `tb_area` VALUES (2824, '610625', '志丹县', '610600'); +INSERT INTO `tb_area` VALUES (2825, '610626', '吴旗县', '610600'); +INSERT INTO `tb_area` VALUES (2826, '610627', '甘泉县', '610600'); +INSERT INTO `tb_area` VALUES (2827, '610628', '富 县', '610600'); +INSERT INTO `tb_area` VALUES (2828, '610629', '洛川县', '610600'); +INSERT INTO `tb_area` VALUES (2829, '610630', '宜川县', '610600'); +INSERT INTO `tb_area` VALUES (2830, '610631', '黄龙县', '610600'); +INSERT INTO `tb_area` VALUES (2831, '610632', '黄陵县', '610600'); +INSERT INTO `tb_area` VALUES (2832, '610701', '市辖区', '610700'); +INSERT INTO `tb_area` VALUES (2833, '610702', '汉台区', '610700'); +INSERT INTO `tb_area` VALUES (2834, '610721', '南郑县', '610700'); +INSERT INTO `tb_area` VALUES (2835, '610722', '城固县', '610700'); +INSERT INTO `tb_area` VALUES (2836, '610723', '洋 县', '610700'); +INSERT INTO `tb_area` VALUES (2837, '610724', '西乡县', '610700'); +INSERT INTO `tb_area` VALUES (2838, '610725', '勉 县', '610700'); +INSERT INTO `tb_area` VALUES (2839, '610726', '宁强县', '610700'); +INSERT INTO `tb_area` VALUES (2840, '610727', '略阳县', '610700'); +INSERT INTO `tb_area` VALUES (2841, '610728', '镇巴县', '610700'); +INSERT INTO `tb_area` VALUES (2842, '610729', '留坝县', '610700'); +INSERT INTO `tb_area` VALUES (2843, '610730', '佛坪县', '610700'); +INSERT INTO `tb_area` VALUES (2844, '610801', '市辖区', '610800'); +INSERT INTO `tb_area` VALUES (2845, '610802', '榆阳区', '610800'); +INSERT INTO `tb_area` VALUES (2846, '610821', '神木县', '610800'); +INSERT INTO `tb_area` VALUES (2847, '610822', '府谷县', '610800'); +INSERT INTO `tb_area` VALUES (2848, '610823', '横山县', '610800'); +INSERT INTO `tb_area` VALUES (2849, '610824', '靖边县', '610800'); +INSERT INTO `tb_area` VALUES (2850, '610825', '定边县', '610800'); +INSERT INTO `tb_area` VALUES (2851, '610826', '绥德县', '610800'); +INSERT INTO `tb_area` VALUES (2852, '610827', '米脂县', '610800'); +INSERT INTO `tb_area` VALUES (2853, '610828', '佳 县', '610800'); +INSERT INTO `tb_area` VALUES (2854, '610829', '吴堡县', '610800'); +INSERT INTO `tb_area` VALUES (2855, '610830', '清涧县', '610800'); +INSERT INTO `tb_area` VALUES (2856, '610831', '子洲县', '610800'); +INSERT INTO `tb_area` VALUES (2857, '610901', '市辖区', '610900'); +INSERT INTO `tb_area` VALUES (2858, '610902', '汉滨区', '610900'); +INSERT INTO `tb_area` VALUES (2859, '610921', '汉阴县', '610900'); +INSERT INTO `tb_area` VALUES (2860, '610922', '石泉县', '610900'); +INSERT INTO `tb_area` VALUES (2861, '610923', '宁陕县', '610900'); +INSERT INTO `tb_area` VALUES (2862, '610924', '紫阳县', '610900'); +INSERT INTO `tb_area` VALUES (2863, '610925', '岚皋县', '610900'); +INSERT INTO `tb_area` VALUES (2864, '610926', '平利县', '610900'); +INSERT INTO `tb_area` VALUES (2865, '610927', '镇坪县', '610900'); +INSERT INTO `tb_area` VALUES (2866, '610928', '旬阳县', '610900'); +INSERT INTO `tb_area` VALUES (2867, '610929', '白河县', '610900'); +INSERT INTO `tb_area` VALUES (2868, '611001', '市辖区', '611000'); +INSERT INTO `tb_area` VALUES (2869, '611002', '商州区', '611000'); +INSERT INTO `tb_area` VALUES (2870, '611021', '洛南县', '611000'); +INSERT INTO `tb_area` VALUES (2871, '611022', '丹凤县', '611000'); +INSERT INTO `tb_area` VALUES (2872, '611023', '商南县', '611000'); +INSERT INTO `tb_area` VALUES (2873, '611024', '山阳县', '611000'); +INSERT INTO `tb_area` VALUES (2874, '611025', '镇安县', '611000'); +INSERT INTO `tb_area` VALUES (2875, '611026', '柞水县', '611000'); +INSERT INTO `tb_area` VALUES (2876, '620101', '市辖区', '620100'); +INSERT INTO `tb_area` VALUES (2877, '620102', '城关区', '620100'); +INSERT INTO `tb_area` VALUES (2878, '620103', '七里河区', '620100'); +INSERT INTO `tb_area` VALUES (2879, '620104', '西固区', '620100'); +INSERT INTO `tb_area` VALUES (2880, '620105', '安宁区', '620100'); +INSERT INTO `tb_area` VALUES (2881, '620111', '红古区', '620100'); +INSERT INTO `tb_area` VALUES (2882, '620121', '永登县', '620100'); +INSERT INTO `tb_area` VALUES (2883, '620122', '皋兰县', '620100'); +INSERT INTO `tb_area` VALUES (2884, '620123', '榆中县', '620100'); +INSERT INTO `tb_area` VALUES (2885, '620201', '市辖区', '620200'); +INSERT INTO `tb_area` VALUES (2886, '620301', '市辖区', '620300'); +INSERT INTO `tb_area` VALUES (2887, '620302', '金川区', '620300'); +INSERT INTO `tb_area` VALUES (2888, '620321', '永昌县', '620300'); +INSERT INTO `tb_area` VALUES (2889, '620401', '市辖区', '620400'); +INSERT INTO `tb_area` VALUES (2890, '620402', '白银区', '620400'); +INSERT INTO `tb_area` VALUES (2891, '620403', '平川区', '620400'); +INSERT INTO `tb_area` VALUES (2892, '620421', '靖远县', '620400'); +INSERT INTO `tb_area` VALUES (2893, '620422', '会宁县', '620400'); +INSERT INTO `tb_area` VALUES (2894, '620423', '景泰县', '620400'); +INSERT INTO `tb_area` VALUES (2895, '620501', '市辖区', '620500'); +INSERT INTO `tb_area` VALUES (2896, '620502', '秦城区', '620500'); +INSERT INTO `tb_area` VALUES (2897, '620503', '北道区', '620500'); +INSERT INTO `tb_area` VALUES (2898, '620521', '清水县', '620500'); +INSERT INTO `tb_area` VALUES (2899, '620522', '秦安县', '620500'); +INSERT INTO `tb_area` VALUES (2900, '620523', '甘谷县', '620500'); +INSERT INTO `tb_area` VALUES (2901, '620524', '武山县', '620500'); +INSERT INTO `tb_area` VALUES (2902, '620525', '张家川回族自治县', '620500'); +INSERT INTO `tb_area` VALUES (2903, '620601', '市辖区', '620600'); +INSERT INTO `tb_area` VALUES (2904, '620602', '凉州区', '620600'); +INSERT INTO `tb_area` VALUES (2905, '620621', '民勤县', '620600'); +INSERT INTO `tb_area` VALUES (2906, '620622', '古浪县', '620600'); +INSERT INTO `tb_area` VALUES (2907, '620623', '天祝藏族自治县', '620600'); +INSERT INTO `tb_area` VALUES (2908, '620701', '市辖区', '620700'); +INSERT INTO `tb_area` VALUES (2909, '620702', '甘州区', '620700'); +INSERT INTO `tb_area` VALUES (2910, '620721', '肃南裕固族自治县', '620700'); +INSERT INTO `tb_area` VALUES (2911, '620722', '民乐县', '620700'); +INSERT INTO `tb_area` VALUES (2912, '620723', '临泽县', '620700'); +INSERT INTO `tb_area` VALUES (2913, '620724', '高台县', '620700'); +INSERT INTO `tb_area` VALUES (2914, '620725', '山丹县', '620700'); +INSERT INTO `tb_area` VALUES (2915, '620801', '市辖区', '620800'); +INSERT INTO `tb_area` VALUES (2916, '620802', '崆峒区', '620800'); +INSERT INTO `tb_area` VALUES (2917, '620821', '泾川县', '620800'); +INSERT INTO `tb_area` VALUES (2918, '620822', '灵台县', '620800'); +INSERT INTO `tb_area` VALUES (2919, '620823', '崇信县', '620800'); +INSERT INTO `tb_area` VALUES (2920, '620824', '华亭县', '620800'); +INSERT INTO `tb_area` VALUES (2921, '620825', '庄浪县', '620800'); +INSERT INTO `tb_area` VALUES (2922, '620826', '静宁县', '620800'); +INSERT INTO `tb_area` VALUES (2923, '620901', '市辖区', '620900'); +INSERT INTO `tb_area` VALUES (2924, '620902', '肃州区', '620900'); +INSERT INTO `tb_area` VALUES (2925, '620921', '金塔县', '620900'); +INSERT INTO `tb_area` VALUES (2926, '620922', '安西县', '620900'); +INSERT INTO `tb_area` VALUES (2927, '620923', '肃北蒙古族自治县', '620900'); +INSERT INTO `tb_area` VALUES (2928, '620924', '阿克塞哈萨克族自治县', '620900'); +INSERT INTO `tb_area` VALUES (2929, '620981', '玉门市', '620900'); +INSERT INTO `tb_area` VALUES (2930, '620982', '敦煌市', '620900'); +INSERT INTO `tb_area` VALUES (2931, '621001', '市辖区', '621000'); +INSERT INTO `tb_area` VALUES (2932, '621002', '西峰区', '621000'); +INSERT INTO `tb_area` VALUES (2933, '621021', '庆城县', '621000'); +INSERT INTO `tb_area` VALUES (2934, '621022', '环 县', '621000'); +INSERT INTO `tb_area` VALUES (2935, '621023', '华池县', '621000'); +INSERT INTO `tb_area` VALUES (2936, '621024', '合水县', '621000'); +INSERT INTO `tb_area` VALUES (2937, '621025', '正宁县', '621000'); +INSERT INTO `tb_area` VALUES (2938, '621026', '宁 县', '621000'); +INSERT INTO `tb_area` VALUES (2939, '621027', '镇原县', '621000'); +INSERT INTO `tb_area` VALUES (2940, '621101', '市辖区', '621100'); +INSERT INTO `tb_area` VALUES (2941, '621102', '安定区', '621100'); +INSERT INTO `tb_area` VALUES (2942, '621121', '通渭县', '621100'); +INSERT INTO `tb_area` VALUES (2943, '621122', '陇西县', '621100'); +INSERT INTO `tb_area` VALUES (2944, '621123', '渭源县', '621100'); +INSERT INTO `tb_area` VALUES (2945, '621124', '临洮县', '621100'); +INSERT INTO `tb_area` VALUES (2946, '621125', '漳 县', '621100'); +INSERT INTO `tb_area` VALUES (2947, '621126', '岷 县', '621100'); +INSERT INTO `tb_area` VALUES (2948, '621201', '市辖区', '621200'); +INSERT INTO `tb_area` VALUES (2949, '621202', '武都区', '621200'); +INSERT INTO `tb_area` VALUES (2950, '621221', '成 县', '621200'); +INSERT INTO `tb_area` VALUES (2951, '621222', '文 县', '621200'); +INSERT INTO `tb_area` VALUES (2952, '621223', '宕昌县', '621200'); +INSERT INTO `tb_area` VALUES (2953, '621224', '康 县', '621200'); +INSERT INTO `tb_area` VALUES (2954, '621225', '西和县', '621200'); +INSERT INTO `tb_area` VALUES (2955, '621226', '礼 县', '621200'); +INSERT INTO `tb_area` VALUES (2956, '621227', '徽 县', '621200'); +INSERT INTO `tb_area` VALUES (2957, '621228', '两当县', '621200'); +INSERT INTO `tb_area` VALUES (2958, '622901', '临夏市', '622900'); +INSERT INTO `tb_area` VALUES (2959, '622921', '临夏县', '622900'); +INSERT INTO `tb_area` VALUES (2960, '622922', '康乐县', '622900'); +INSERT INTO `tb_area` VALUES (2961, '622923', '永靖县', '622900'); +INSERT INTO `tb_area` VALUES (2962, '622924', '广河县', '622900'); +INSERT INTO `tb_area` VALUES (2963, '622925', '和政县', '622900'); +INSERT INTO `tb_area` VALUES (2964, '622926', '东乡族自治县', '622900'); +INSERT INTO `tb_area` VALUES (2965, '622927', '积石山保安族东乡族撒拉族自治县', '622900'); +INSERT INTO `tb_area` VALUES (2966, '623001', '合作市', '623000'); +INSERT INTO `tb_area` VALUES (2967, '623021', '临潭县', '623000'); +INSERT INTO `tb_area` VALUES (2968, '623022', '卓尼县', '623000'); +INSERT INTO `tb_area` VALUES (2969, '623023', '舟曲县', '623000'); +INSERT INTO `tb_area` VALUES (2970, '623024', '迭部县', '623000'); +INSERT INTO `tb_area` VALUES (2971, '623025', '玛曲县', '623000'); +INSERT INTO `tb_area` VALUES (2972, '623026', '碌曲县', '623000'); +INSERT INTO `tb_area` VALUES (2973, '623027', '夏河县', '623000'); +INSERT INTO `tb_area` VALUES (2974, '630101', '市辖区', '630100'); +INSERT INTO `tb_area` VALUES (2975, '630102', '城东区', '630100'); +INSERT INTO `tb_area` VALUES (2976, '630103', '城中区', '630100'); +INSERT INTO `tb_area` VALUES (2977, '630104', '城西区', '630100'); +INSERT INTO `tb_area` VALUES (2978, '630105', '城北区', '630100'); +INSERT INTO `tb_area` VALUES (2979, '630121', '大通回族土族自治县', '630100'); +INSERT INTO `tb_area` VALUES (2980, '630122', '湟中县', '630100'); +INSERT INTO `tb_area` VALUES (2981, '630123', '湟源县', '630100'); +INSERT INTO `tb_area` VALUES (2982, '632121', '平安县', '632100'); +INSERT INTO `tb_area` VALUES (2983, '632122', '民和回族土族自治县', '632100'); +INSERT INTO `tb_area` VALUES (2984, '632123', '乐都县', '632100'); +INSERT INTO `tb_area` VALUES (2985, '632126', '互助土族自治县', '632100'); +INSERT INTO `tb_area` VALUES (2986, '632127', '化隆回族自治县', '632100'); +INSERT INTO `tb_area` VALUES (2987, '632128', '循化撒拉族自治县', '632100'); +INSERT INTO `tb_area` VALUES (2988, '632221', '门源回族自治县', '632200'); +INSERT INTO `tb_area` VALUES (2989, '632222', '祁连县', '632200'); +INSERT INTO `tb_area` VALUES (2990, '632223', '海晏县', '632200'); +INSERT INTO `tb_area` VALUES (2991, '632224', '刚察县', '632200'); +INSERT INTO `tb_area` VALUES (2992, '632321', '同仁县', '632300'); +INSERT INTO `tb_area` VALUES (2993, '632322', '尖扎县', '632300'); +INSERT INTO `tb_area` VALUES (2994, '632323', '泽库县', '632300'); +INSERT INTO `tb_area` VALUES (2995, '632324', '河南蒙古族自治县', '632300'); +INSERT INTO `tb_area` VALUES (2996, '632521', '共和县', '632500'); +INSERT INTO `tb_area` VALUES (2997, '632522', '同德县', '632500'); +INSERT INTO `tb_area` VALUES (2998, '632523', '贵德县', '632500'); +INSERT INTO `tb_area` VALUES (2999, '632524', '兴海县', '632500'); +INSERT INTO `tb_area` VALUES (3000, '632525', '贵南县', '632500'); +INSERT INTO `tb_area` VALUES (3001, '632621', '玛沁县', '632600'); +INSERT INTO `tb_area` VALUES (3002, '632622', '班玛县', '632600'); +INSERT INTO `tb_area` VALUES (3003, '632623', '甘德县', '632600'); +INSERT INTO `tb_area` VALUES (3004, '632624', '达日县', '632600'); +INSERT INTO `tb_area` VALUES (3005, '632625', '久治县', '632600'); +INSERT INTO `tb_area` VALUES (3006, '632626', '玛多县', '632600'); +INSERT INTO `tb_area` VALUES (3007, '632721', '玉树县', '632700'); +INSERT INTO `tb_area` VALUES (3008, '632722', '杂多县', '632700'); +INSERT INTO `tb_area` VALUES (3009, '632723', '称多县', '632700'); +INSERT INTO `tb_area` VALUES (3010, '632724', '治多县', '632700'); +INSERT INTO `tb_area` VALUES (3011, '632725', '囊谦县', '632700'); +INSERT INTO `tb_area` VALUES (3012, '632726', '曲麻莱县', '632700'); +INSERT INTO `tb_area` VALUES (3013, '632801', '格尔木市', '632800'); +INSERT INTO `tb_area` VALUES (3014, '632802', '德令哈市', '632800'); +INSERT INTO `tb_area` VALUES (3015, '632821', '乌兰县', '632800'); +INSERT INTO `tb_area` VALUES (3016, '632822', '都兰县', '632800'); +INSERT INTO `tb_area` VALUES (3017, '632823', '天峻县', '632800'); +INSERT INTO `tb_area` VALUES (3018, '640101', '市辖区', '640100'); +INSERT INTO `tb_area` VALUES (3019, '640104', '兴庆区', '640100'); +INSERT INTO `tb_area` VALUES (3020, '640105', '西夏区', '640100'); +INSERT INTO `tb_area` VALUES (3021, '640106', '金凤区', '640100'); +INSERT INTO `tb_area` VALUES (3022, '640121', '永宁县', '640100'); +INSERT INTO `tb_area` VALUES (3023, '640122', '贺兰县', '640100'); +INSERT INTO `tb_area` VALUES (3024, '640181', '灵武市', '640100'); +INSERT INTO `tb_area` VALUES (3025, '640201', '市辖区', '640200'); +INSERT INTO `tb_area` VALUES (3026, '640202', '大武口区', '640200'); +INSERT INTO `tb_area` VALUES (3027, '640205', '惠农区', '640200'); +INSERT INTO `tb_area` VALUES (3028, '640221', '平罗县', '640200'); +INSERT INTO `tb_area` VALUES (3029, '640301', '市辖区', '640300'); +INSERT INTO `tb_area` VALUES (3030, '640302', '利通区', '640300'); +INSERT INTO `tb_area` VALUES (3031, '640323', '盐池县', '640300'); +INSERT INTO `tb_area` VALUES (3032, '640324', '同心县', '640300'); +INSERT INTO `tb_area` VALUES (3033, '640381', '青铜峡市', '640300'); +INSERT INTO `tb_area` VALUES (3034, '640401', '市辖区', '640400'); +INSERT INTO `tb_area` VALUES (3035, '640402', '原州区', '640400'); +INSERT INTO `tb_area` VALUES (3036, '640422', '西吉县', '640400'); +INSERT INTO `tb_area` VALUES (3037, '640423', '隆德县', '640400'); +INSERT INTO `tb_area` VALUES (3038, '640424', '泾源县', '640400'); +INSERT INTO `tb_area` VALUES (3039, '640425', '彭阳县', '640400'); +INSERT INTO `tb_area` VALUES (3040, '640501', '市辖区', '640500'); +INSERT INTO `tb_area` VALUES (3041, '640502', '沙坡头区', '640500'); +INSERT INTO `tb_area` VALUES (3042, '640521', '中宁县', '640500'); +INSERT INTO `tb_area` VALUES (3043, '640522', '海原县', '640500'); +INSERT INTO `tb_area` VALUES (3044, '650101', '市辖区', '650100'); +INSERT INTO `tb_area` VALUES (3045, '650102', '天山区', '650100'); +INSERT INTO `tb_area` VALUES (3046, '650103', '沙依巴克区', '650100'); +INSERT INTO `tb_area` VALUES (3047, '650104', '新市区', '650100'); +INSERT INTO `tb_area` VALUES (3048, '650105', '水磨沟区', '650100'); +INSERT INTO `tb_area` VALUES (3049, '650106', '头屯河区', '650100'); +INSERT INTO `tb_area` VALUES (3050, '650107', '达坂城区', '650100'); +INSERT INTO `tb_area` VALUES (3051, '650108', '东山区', '650100'); +INSERT INTO `tb_area` VALUES (3052, '650121', '乌鲁木齐县', '650100'); +INSERT INTO `tb_area` VALUES (3053, '650201', '市辖区', '650200'); +INSERT INTO `tb_area` VALUES (3054, '650202', '独山子区', '650200'); +INSERT INTO `tb_area` VALUES (3055, '650203', '克拉玛依区', '650200'); +INSERT INTO `tb_area` VALUES (3056, '650204', '白碱滩区', '650200'); +INSERT INTO `tb_area` VALUES (3057, '650205', '乌尔禾区', '650200'); +INSERT INTO `tb_area` VALUES (3058, '652101', '吐鲁番市', '652100'); +INSERT INTO `tb_area` VALUES (3059, '652122', '鄯善县', '652100'); +INSERT INTO `tb_area` VALUES (3060, '652123', '托克逊县', '652100'); +INSERT INTO `tb_area` VALUES (3061, '652201', '哈密市', '652200'); +INSERT INTO `tb_area` VALUES (3062, '652222', '巴里坤哈萨克自治县', '652200'); +INSERT INTO `tb_area` VALUES (3063, '652223', '伊吾县', '652200'); +INSERT INTO `tb_area` VALUES (3064, '652301', '昌吉市', '652300'); +INSERT INTO `tb_area` VALUES (3065, '652302', '阜康市', '652300'); +INSERT INTO `tb_area` VALUES (3066, '652303', '米泉市', '652300'); +INSERT INTO `tb_area` VALUES (3067, '652323', '呼图壁县', '652300'); +INSERT INTO `tb_area` VALUES (3068, '652324', '玛纳斯县', '652300'); +INSERT INTO `tb_area` VALUES (3069, '652325', '奇台县', '652300'); +INSERT INTO `tb_area` VALUES (3070, '652327', '吉木萨尔县', '652300'); +INSERT INTO `tb_area` VALUES (3071, '652328', '木垒哈萨克自治县', '652300'); +INSERT INTO `tb_area` VALUES (3072, '652701', '博乐市', '652700'); +INSERT INTO `tb_area` VALUES (3073, '652722', '精河县', '652700'); +INSERT INTO `tb_area` VALUES (3074, '652723', '温泉县', '652700'); +INSERT INTO `tb_area` VALUES (3075, '652801', '库尔勒市', '652800'); +INSERT INTO `tb_area` VALUES (3076, '652822', '轮台县', '652800'); +INSERT INTO `tb_area` VALUES (3077, '652823', '尉犁县', '652800'); +INSERT INTO `tb_area` VALUES (3078, '652824', '若羌县', '652800'); +INSERT INTO `tb_area` VALUES (3079, '652825', '且末县', '652800'); +INSERT INTO `tb_area` VALUES (3080, '652826', '焉耆回族自治县', '652800'); +INSERT INTO `tb_area` VALUES (3081, '652827', '和静县', '652800'); +INSERT INTO `tb_area` VALUES (3082, '652828', '和硕县', '652800'); +INSERT INTO `tb_area` VALUES (3083, '652829', '博湖县', '652800'); +INSERT INTO `tb_area` VALUES (3084, '652901', '阿克苏市', '652900'); +INSERT INTO `tb_area` VALUES (3085, '652922', '温宿县', '652900'); +INSERT INTO `tb_area` VALUES (3086, '652923', '库车县', '652900'); +INSERT INTO `tb_area` VALUES (3087, '652924', '沙雅县', '652900'); +INSERT INTO `tb_area` VALUES (3088, '652925', '新和县', '652900'); +INSERT INTO `tb_area` VALUES (3089, '652926', '拜城县', '652900'); +INSERT INTO `tb_area` VALUES (3090, '652927', '乌什县', '652900'); +INSERT INTO `tb_area` VALUES (3091, '652928', '阿瓦提县', '652900'); +INSERT INTO `tb_area` VALUES (3092, '652929', '柯坪县', '652900'); +INSERT INTO `tb_area` VALUES (3093, '653001', '阿图什市', '653000'); +INSERT INTO `tb_area` VALUES (3094, '653022', '阿克陶县', '653000'); +INSERT INTO `tb_area` VALUES (3095, '653023', '阿合奇县', '653000'); +INSERT INTO `tb_area` VALUES (3096, '653024', '乌恰县', '653000'); +INSERT INTO `tb_area` VALUES (3097, '653101', '喀什市', '653100'); +INSERT INTO `tb_area` VALUES (3098, '653121', '疏附县', '653100'); +INSERT INTO `tb_area` VALUES (3099, '653122', '疏勒县', '653100'); +INSERT INTO `tb_area` VALUES (3100, '653123', '英吉沙县', '653100'); +INSERT INTO `tb_area` VALUES (3101, '653124', '泽普县', '653100'); +INSERT INTO `tb_area` VALUES (3102, '653125', '莎车县', '653100'); +INSERT INTO `tb_area` VALUES (3103, '653126', '叶城县', '653100'); +INSERT INTO `tb_area` VALUES (3104, '653127', '麦盖提县', '653100'); +INSERT INTO `tb_area` VALUES (3105, '653128', '岳普湖县', '653100'); +INSERT INTO `tb_area` VALUES (3106, '653129', '伽师县', '653100'); +INSERT INTO `tb_area` VALUES (3107, '653130', '巴楚县', '653100'); +INSERT INTO `tb_area` VALUES (3108, '653131', '塔什库尔干塔吉克自治县', '653100'); +INSERT INTO `tb_area` VALUES (3109, '653201', '和田市', '653200'); +INSERT INTO `tb_area` VALUES (3110, '653221', '和田县', '653200'); +INSERT INTO `tb_area` VALUES (3111, '653222', '墨玉县', '653200'); +INSERT INTO `tb_area` VALUES (3112, '653223', '皮山县', '653200'); +INSERT INTO `tb_area` VALUES (3113, '653224', '洛浦县', '653200'); +INSERT INTO `tb_area` VALUES (3114, '653225', '策勒县', '653200'); +INSERT INTO `tb_area` VALUES (3115, '653226', '于田县', '653200'); +INSERT INTO `tb_area` VALUES (3116, '653227', '民丰县', '653200'); +INSERT INTO `tb_area` VALUES (3117, '654002', '伊宁市', '654000'); +INSERT INTO `tb_area` VALUES (3118, '654003', '奎屯市', '654000'); +INSERT INTO `tb_area` VALUES (3119, '654021', '伊宁县', '654000'); +INSERT INTO `tb_area` VALUES (3120, '654022', '察布查尔锡伯自治县', '654000'); +INSERT INTO `tb_area` VALUES (3121, '654023', '霍城县', '654000'); +INSERT INTO `tb_area` VALUES (3122, '654024', '巩留县', '654000'); +INSERT INTO `tb_area` VALUES (3123, '654025', '新源县', '654000'); +INSERT INTO `tb_area` VALUES (3124, '654026', '昭苏县', '654000'); +INSERT INTO `tb_area` VALUES (3125, '654027', '特克斯县', '654000'); +INSERT INTO `tb_area` VALUES (3126, '654028', '尼勒克县', '654000'); +INSERT INTO `tb_area` VALUES (3127, '654201', '塔城市', '654200'); +INSERT INTO `tb_area` VALUES (3128, '654202', '乌苏市', '654200'); +INSERT INTO `tb_area` VALUES (3129, '654221', '额敏县', '654200'); +INSERT INTO `tb_area` VALUES (3130, '654223', '沙湾县', '654200'); +INSERT INTO `tb_area` VALUES (3131, '654224', '托里县', '654200'); +INSERT INTO `tb_area` VALUES (3132, '654225', '裕民县', '654200'); +INSERT INTO `tb_area` VALUES (3133, '654226', '和布克赛尔蒙古自治县', '654200'); +INSERT INTO `tb_area` VALUES (3134, '654301', '阿勒泰市', '654300'); +INSERT INTO `tb_area` VALUES (3135, '654321', '布尔津县', '654300'); +INSERT INTO `tb_area` VALUES (3136, '654322', '富蕴县', '654300'); +INSERT INTO `tb_area` VALUES (3137, '654323', '福海县', '654300'); +INSERT INTO `tb_area` VALUES (3138, '654324', '哈巴河县', '654300'); +INSERT INTO `tb_area` VALUES (3139, '654325', '青河县', '654300'); +INSERT INTO `tb_area` VALUES (3140, '654326', '吉木乃县', '654300'); +INSERT INTO `tb_area` VALUES (3141, '659001', '石河子市', '659000'); +INSERT INTO `tb_area` VALUES (3142, '659002', '阿拉尔市', '659000'); +INSERT INTO `tb_area` VALUES (3143, '659003', '图木舒克市', '659000'); +INSERT INTO `tb_area` VALUES (3144, '659004', '五家渠市', '659000'); + +-- ---------------------------- +-- Table structure for tb_cart +-- ---------------------------- +DROP TABLE IF EXISTS `tb_cart`; +CREATE TABLE `tb_cart` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '编号', + `user_id` bigint(20) NULL DEFAULT NULL COMMENT '用户ID', + `product_id` bigint(20) NULL DEFAULT NULL COMMENT '商品ID', + `quantity` int(10) NOT NULL DEFAULT 1 COMMENT '商品数量', + `created_time` datetime NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间', + `price` decimal(10, 2) NULL DEFAULT NULL COMMENT '加入时价格', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1925045411911942147 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '购物车' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of tb_cart +-- ---------------------------- +INSERT INTO `tb_cart` VALUES (1917093948036243458, 1888931423629377538, 9787559485049, 1, '2025-04-29 13:49:49', 1500.00); +INSERT INTO `tb_cart` VALUES (1925018977885593601, 1888931423629377538, 9787559485055, 1, '2025-05-21 10:41:04', 6600.00); +INSERT INTO `tb_cart` VALUES (1925045411911942146, 1888931423629377538, 9787559485056, 1, '2025-05-21 12:26:06', 6600.00); + +-- ---------------------------- +-- Table structure for tb_categories +-- ---------------------------- +DROP TABLE IF EXISTS `tb_categories`; +CREATE TABLE `tb_categories` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '编号', + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '名称', + `image` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '图片', + `parent_id` int(11) NULL DEFAULT NULL COMMENT '父编号', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间', + `sort` tinyint(1) NULL DEFAULT NULL COMMENT '排序', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 11 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '商品分类表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of tb_categories +-- ---------------------------- +INSERT INTO `tb_categories` VALUES (1, '手机数码', NULL, 0, '2025-02-27 05:00:01', 1); +INSERT INTO `tb_categories` VALUES (2, '电脑办公', NULL, 0, '2025-02-27 05:00:02', 2); +INSERT INTO `tb_categories` VALUES (3, '家用电器', NULL, 0, '2025-02-27 05:00:03', 3); +INSERT INTO `tb_categories` VALUES (4, '智能穿戴', NULL, 0, '2025-02-27 05:00:04', 4); +INSERT INTO `tb_categories` VALUES (5, '摄影摄像', NULL, 0, '2025-02-27 05:00:05', 5); +INSERT INTO `tb_categories` VALUES (6, '游戏设备', NULL, 0, '2025-02-27 05:00:06', 6); +INSERT INTO `tb_categories` VALUES (7, '影音娱乐', NULL, 0, '2025-02-27 05:00:07', 7); +INSERT INTO `tb_categories` VALUES (8, '配件耗材', NULL, 0, '2025-02-27 05:00:08', 8); +INSERT INTO `tb_categories` VALUES (9, '智能家居', NULL, 0, '2025-02-27 05:00:09', 9); +INSERT INTO `tb_categories` VALUES (10, '电动交通工具', NULL, 0, '2025-02-27 05:00:10', 10); + +-- ---------------------------- +-- Table structure for tb_city +-- ---------------------------- +DROP TABLE IF EXISTS `tb_city`; +CREATE TABLE `tb_city` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `city_id` varchar(6) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `city` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `father` varchar(6) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE = MyISAM AUTO_INCREMENT = 346 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '城市信息' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of tb_city +-- ---------------------------- +INSERT INTO `tb_city` VALUES (1, '110100', '市辖区', '110000'); +INSERT INTO `tb_city` VALUES (2, '110200', '县', '110000'); +INSERT INTO `tb_city` VALUES (3, '120100', '市辖区', '120000'); +INSERT INTO `tb_city` VALUES (4, '120200', '县', '120000'); +INSERT INTO `tb_city` VALUES (5, '130100', '石家庄市', '130000'); +INSERT INTO `tb_city` VALUES (6, '130200', '唐山市', '130000'); +INSERT INTO `tb_city` VALUES (7, '130300', '秦皇岛市', '130000'); +INSERT INTO `tb_city` VALUES (8, '130400', '邯郸市', '130000'); +INSERT INTO `tb_city` VALUES (9, '130500', '邢台市', '130000'); +INSERT INTO `tb_city` VALUES (10, '130600', '保定市', '130000'); +INSERT INTO `tb_city` VALUES (11, '130700', '张家口市', '130000'); +INSERT INTO `tb_city` VALUES (12, '130800', '承德市', '130000'); +INSERT INTO `tb_city` VALUES (13, '130900', '沧州市', '130000'); +INSERT INTO `tb_city` VALUES (14, '131000', '廊坊市', '130000'); +INSERT INTO `tb_city` VALUES (15, '131100', '衡水市', '130000'); +INSERT INTO `tb_city` VALUES (16, '140100', '太原市', '140000'); +INSERT INTO `tb_city` VALUES (17, '140200', '大同市', '140000'); +INSERT INTO `tb_city` VALUES (18, '140300', '阳泉市', '140000'); +INSERT INTO `tb_city` VALUES (19, '140400', '长治市', '140000'); +INSERT INTO `tb_city` VALUES (20, '140500', '晋城市', '140000'); +INSERT INTO `tb_city` VALUES (21, '140600', '朔州市', '140000'); +INSERT INTO `tb_city` VALUES (22, '140700', '晋中市', '140000'); +INSERT INTO `tb_city` VALUES (23, '140800', '运城市', '140000'); +INSERT INTO `tb_city` VALUES (24, '140900', '忻州市', '140000'); +INSERT INTO `tb_city` VALUES (25, '141000', '临汾市', '140000'); +INSERT INTO `tb_city` VALUES (26, '141100', '吕梁市', '140000'); +INSERT INTO `tb_city` VALUES (27, '150100', '呼和浩特市', '150000'); +INSERT INTO `tb_city` VALUES (28, '150200', '包头市', '150000'); +INSERT INTO `tb_city` VALUES (29, '150300', '乌海市', '150000'); +INSERT INTO `tb_city` VALUES (30, '150400', '赤峰市', '150000'); +INSERT INTO `tb_city` VALUES (31, '150500', '通辽市', '150000'); +INSERT INTO `tb_city` VALUES (32, '150600', '鄂尔多斯市', '150000'); +INSERT INTO `tb_city` VALUES (33, '150700', '呼伦贝尔市', '150000'); +INSERT INTO `tb_city` VALUES (34, '150800', '巴彦淖尔市', '150000'); +INSERT INTO `tb_city` VALUES (35, '150900', '乌兰察布市', '150000'); +INSERT INTO `tb_city` VALUES (36, '152200', '兴安盟', '150000'); +INSERT INTO `tb_city` VALUES (37, '152500', '锡林郭勒盟', '150000'); +INSERT INTO `tb_city` VALUES (38, '152900', '阿拉善盟', '150000'); +INSERT INTO `tb_city` VALUES (39, '210100', '沈阳市', '210000'); +INSERT INTO `tb_city` VALUES (40, '210200', '大连市', '210000'); +INSERT INTO `tb_city` VALUES (41, '210300', '鞍山市', '210000'); +INSERT INTO `tb_city` VALUES (42, '210400', '抚顺市', '210000'); +INSERT INTO `tb_city` VALUES (43, '210500', '本溪市', '210000'); +INSERT INTO `tb_city` VALUES (44, '210600', '丹东市', '210000'); +INSERT INTO `tb_city` VALUES (45, '210700', '锦州市', '210000'); +INSERT INTO `tb_city` VALUES (46, '210800', '营口市', '210000'); +INSERT INTO `tb_city` VALUES (47, '210900', '阜新市', '210000'); +INSERT INTO `tb_city` VALUES (48, '211000', '辽阳市', '210000'); +INSERT INTO `tb_city` VALUES (49, '211100', '盘锦市', '210000'); +INSERT INTO `tb_city` VALUES (50, '211200', '铁岭市', '210000'); +INSERT INTO `tb_city` VALUES (51, '211300', '朝阳市', '210000'); +INSERT INTO `tb_city` VALUES (52, '211400', '葫芦岛市', '210000'); +INSERT INTO `tb_city` VALUES (53, '220100', '长春市', '220000'); +INSERT INTO `tb_city` VALUES (54, '220200', '吉林市', '220000'); +INSERT INTO `tb_city` VALUES (55, '220300', '四平市', '220000'); +INSERT INTO `tb_city` VALUES (56, '220400', '辽源市', '220000'); +INSERT INTO `tb_city` VALUES (57, '220500', '通化市', '220000'); +INSERT INTO `tb_city` VALUES (58, '220600', '白山市', '220000'); +INSERT INTO `tb_city` VALUES (59, '220700', '松原市', '220000'); +INSERT INTO `tb_city` VALUES (60, '220800', '白城市', '220000'); +INSERT INTO `tb_city` VALUES (61, '222400', '延边朝鲜族自治州', '220000'); +INSERT INTO `tb_city` VALUES (62, '230100', '哈尔滨市', '230000'); +INSERT INTO `tb_city` VALUES (63, '230200', '齐齐哈尔市', '230000'); +INSERT INTO `tb_city` VALUES (64, '230300', '鸡西市', '230000'); +INSERT INTO `tb_city` VALUES (65, '230400', '鹤岗市', '230000'); +INSERT INTO `tb_city` VALUES (66, '230500', '双鸭山市', '230000'); +INSERT INTO `tb_city` VALUES (67, '230600', '大庆市', '230000'); +INSERT INTO `tb_city` VALUES (68, '230700', '伊春市', '230000'); +INSERT INTO `tb_city` VALUES (69, '230800', '佳木斯市', '230000'); +INSERT INTO `tb_city` VALUES (70, '230900', '七台河市', '230000'); +INSERT INTO `tb_city` VALUES (71, '231000', '牡丹江市', '230000'); +INSERT INTO `tb_city` VALUES (72, '231100', '黑河市', '230000'); +INSERT INTO `tb_city` VALUES (73, '231200', '绥化市', '230000'); +INSERT INTO `tb_city` VALUES (74, '232700', '大兴安岭地区', '230000'); +INSERT INTO `tb_city` VALUES (75, '310100', '市辖区', '310000'); +INSERT INTO `tb_city` VALUES (76, '310200', '县', '310000'); +INSERT INTO `tb_city` VALUES (77, '320100', '南京市', '320000'); +INSERT INTO `tb_city` VALUES (78, '320200', '无锡市', '320000'); +INSERT INTO `tb_city` VALUES (79, '320300', '徐州市', '320000'); +INSERT INTO `tb_city` VALUES (80, '320400', '常州市', '320000'); +INSERT INTO `tb_city` VALUES (81, '320500', '苏州市', '320000'); +INSERT INTO `tb_city` VALUES (82, '320600', '南通市', '320000'); +INSERT INTO `tb_city` VALUES (83, '320700', '连云港市', '320000'); +INSERT INTO `tb_city` VALUES (84, '320800', '淮安市', '320000'); +INSERT INTO `tb_city` VALUES (85, '320900', '盐城市', '320000'); +INSERT INTO `tb_city` VALUES (86, '321000', '扬州市', '320000'); +INSERT INTO `tb_city` VALUES (87, '321100', '镇江市', '320000'); +INSERT INTO `tb_city` VALUES (88, '321200', '泰州市', '320000'); +INSERT INTO `tb_city` VALUES (89, '321300', '宿迁市', '320000'); +INSERT INTO `tb_city` VALUES (90, '330100', '杭州市', '330000'); +INSERT INTO `tb_city` VALUES (91, '330200', '宁波市', '330000'); +INSERT INTO `tb_city` VALUES (92, '330300', '温州市', '330000'); +INSERT INTO `tb_city` VALUES (93, '330400', '嘉兴市', '330000'); +INSERT INTO `tb_city` VALUES (94, '330500', '湖州市', '330000'); +INSERT INTO `tb_city` VALUES (95, '330600', '绍兴市', '330000'); +INSERT INTO `tb_city` VALUES (96, '330700', '金华市', '330000'); +INSERT INTO `tb_city` VALUES (97, '330800', '衢州市', '330000'); +INSERT INTO `tb_city` VALUES (98, '330900', '舟山市', '330000'); +INSERT INTO `tb_city` VALUES (99, '331000', '台州市', '330000'); +INSERT INTO `tb_city` VALUES (100, '331100', '丽水市', '330000'); +INSERT INTO `tb_city` VALUES (101, '340100', '合肥市', '340000'); +INSERT INTO `tb_city` VALUES (102, '340200', '芜湖市', '340000'); +INSERT INTO `tb_city` VALUES (103, '340300', '蚌埠市', '340000'); +INSERT INTO `tb_city` VALUES (104, '340400', '淮南市', '340000'); +INSERT INTO `tb_city` VALUES (105, '340500', '马鞍山市', '340000'); +INSERT INTO `tb_city` VALUES (106, '340600', '淮北市', '340000'); +INSERT INTO `tb_city` VALUES (107, '340700', '铜陵市', '340000'); +INSERT INTO `tb_city` VALUES (108, '340800', '安庆市', '340000'); +INSERT INTO `tb_city` VALUES (109, '341000', '黄山市', '340000'); +INSERT INTO `tb_city` VALUES (110, '341100', '滁州市', '340000'); +INSERT INTO `tb_city` VALUES (111, '341200', '阜阳市', '340000'); +INSERT INTO `tb_city` VALUES (112, '341300', '宿州市', '340000'); +INSERT INTO `tb_city` VALUES (113, '341400', '巢湖市', '340000'); +INSERT INTO `tb_city` VALUES (114, '341500', '六安市', '340000'); +INSERT INTO `tb_city` VALUES (115, '341600', '亳州市', '340000'); +INSERT INTO `tb_city` VALUES (116, '341700', '池州市', '340000'); +INSERT INTO `tb_city` VALUES (117, '341800', '宣城市', '340000'); +INSERT INTO `tb_city` VALUES (118, '350100', '福州市', '350000'); +INSERT INTO `tb_city` VALUES (119, '350200', '厦门市', '350000'); +INSERT INTO `tb_city` VALUES (120, '350300', '莆田市', '350000'); +INSERT INTO `tb_city` VALUES (121, '350400', '三明市', '350000'); +INSERT INTO `tb_city` VALUES (122, '350500', '泉州市', '350000'); +INSERT INTO `tb_city` VALUES (123, '350600', '漳州市', '350000'); +INSERT INTO `tb_city` VALUES (124, '350700', '南平市', '350000'); +INSERT INTO `tb_city` VALUES (125, '350800', '龙岩市', '350000'); +INSERT INTO `tb_city` VALUES (126, '350900', '宁德市', '350000'); +INSERT INTO `tb_city` VALUES (127, '360100', '南昌市', '360000'); +INSERT INTO `tb_city` VALUES (128, '360200', '景德镇市', '360000'); +INSERT INTO `tb_city` VALUES (129, '360300', '萍乡市', '360000'); +INSERT INTO `tb_city` VALUES (130, '360400', '九江市', '360000'); +INSERT INTO `tb_city` VALUES (131, '360500', '新余市', '360000'); +INSERT INTO `tb_city` VALUES (132, '360600', '鹰潭市', '360000'); +INSERT INTO `tb_city` VALUES (133, '360700', '赣州市', '360000'); +INSERT INTO `tb_city` VALUES (134, '360800', '吉安市', '360000'); +INSERT INTO `tb_city` VALUES (135, '360900', '宜春市', '360000'); +INSERT INTO `tb_city` VALUES (136, '361000', '抚州市', '360000'); +INSERT INTO `tb_city` VALUES (137, '361100', '上饶市', '360000'); +INSERT INTO `tb_city` VALUES (138, '370100', '济南市', '370000'); +INSERT INTO `tb_city` VALUES (139, '370200', '青岛市', '370000'); +INSERT INTO `tb_city` VALUES (140, '370300', '淄博市', '370000'); +INSERT INTO `tb_city` VALUES (141, '370400', '枣庄市', '370000'); +INSERT INTO `tb_city` VALUES (142, '370500', '东营市', '370000'); +INSERT INTO `tb_city` VALUES (143, '370600', '烟台市', '370000'); +INSERT INTO `tb_city` VALUES (144, '370700', '潍坊市', '370000'); +INSERT INTO `tb_city` VALUES (145, '370800', '济宁市', '370000'); +INSERT INTO `tb_city` VALUES (146, '370900', '泰安市', '370000'); +INSERT INTO `tb_city` VALUES (147, '371000', '威海市', '370000'); +INSERT INTO `tb_city` VALUES (148, '371100', '日照市', '370000'); +INSERT INTO `tb_city` VALUES (149, '371200', '莱芜市', '370000'); +INSERT INTO `tb_city` VALUES (150, '371300', '临沂市', '370000'); +INSERT INTO `tb_city` VALUES (151, '371400', '德州市', '370000'); +INSERT INTO `tb_city` VALUES (152, '371500', '聊城市', '370000'); +INSERT INTO `tb_city` VALUES (153, '371600', '滨州市', '370000'); +INSERT INTO `tb_city` VALUES (154, '371700', '荷泽市', '370000'); +INSERT INTO `tb_city` VALUES (155, '410100', '郑州市', '410000'); +INSERT INTO `tb_city` VALUES (156, '410200', '开封市', '410000'); +INSERT INTO `tb_city` VALUES (157, '410300', '洛阳市', '410000'); +INSERT INTO `tb_city` VALUES (158, '410400', '平顶山市', '410000'); +INSERT INTO `tb_city` VALUES (159, '410500', '安阳市', '410000'); +INSERT INTO `tb_city` VALUES (160, '410600', '鹤壁市', '410000'); +INSERT INTO `tb_city` VALUES (161, '410700', '新乡市', '410000'); +INSERT INTO `tb_city` VALUES (162, '410800', '焦作市', '410000'); +INSERT INTO `tb_city` VALUES (163, '410900', '濮阳市', '410000'); +INSERT INTO `tb_city` VALUES (164, '411000', '许昌市', '410000'); +INSERT INTO `tb_city` VALUES (165, '411100', '漯河市', '410000'); +INSERT INTO `tb_city` VALUES (166, '411200', '三门峡市', '410000'); +INSERT INTO `tb_city` VALUES (167, '411300', '南阳市', '410000'); +INSERT INTO `tb_city` VALUES (168, '411400', '商丘市', '410000'); +INSERT INTO `tb_city` VALUES (169, '411500', '信阳市', '410000'); +INSERT INTO `tb_city` VALUES (170, '411600', '周口市', '410000'); +INSERT INTO `tb_city` VALUES (171, '411700', '驻马店市', '410000'); +INSERT INTO `tb_city` VALUES (172, '420100', '武汉市', '420000'); +INSERT INTO `tb_city` VALUES (173, '420200', '黄石市', '420000'); +INSERT INTO `tb_city` VALUES (174, '420300', '十堰市', '420000'); +INSERT INTO `tb_city` VALUES (175, '420500', '宜昌市', '420000'); +INSERT INTO `tb_city` VALUES (176, '420600', '襄樊市', '420000'); +INSERT INTO `tb_city` VALUES (177, '420700', '鄂州市', '420000'); +INSERT INTO `tb_city` VALUES (178, '420800', '荆门市', '420000'); +INSERT INTO `tb_city` VALUES (179, '420900', '孝感市', '420000'); +INSERT INTO `tb_city` VALUES (180, '421000', '荆州市', '420000'); +INSERT INTO `tb_city` VALUES (181, '421100', '黄冈市', '420000'); +INSERT INTO `tb_city` VALUES (182, '421200', '咸宁市', '420000'); +INSERT INTO `tb_city` VALUES (183, '421300', '随州市', '420000'); +INSERT INTO `tb_city` VALUES (184, '422800', '恩施土家族苗族自治州', '420000'); +INSERT INTO `tb_city` VALUES (185, '429000', '省直辖行政单位', '420000'); +INSERT INTO `tb_city` VALUES (186, '430100', '长沙市', '430000'); +INSERT INTO `tb_city` VALUES (187, '430200', '株洲市', '430000'); +INSERT INTO `tb_city` VALUES (188, '430300', '湘潭市', '430000'); +INSERT INTO `tb_city` VALUES (189, '430400', '衡阳市', '430000'); +INSERT INTO `tb_city` VALUES (190, '430500', '邵阳市', '430000'); +INSERT INTO `tb_city` VALUES (191, '430600', '岳阳市', '430000'); +INSERT INTO `tb_city` VALUES (192, '430700', '常德市', '430000'); +INSERT INTO `tb_city` VALUES (193, '430800', '张家界市', '430000'); +INSERT INTO `tb_city` VALUES (194, '430900', '益阳市', '430000'); +INSERT INTO `tb_city` VALUES (195, '431000', '郴州市', '430000'); +INSERT INTO `tb_city` VALUES (196, '431100', '永州市', '430000'); +INSERT INTO `tb_city` VALUES (197, '431200', '怀化市', '430000'); +INSERT INTO `tb_city` VALUES (198, '431300', '娄底市', '430000'); +INSERT INTO `tb_city` VALUES (199, '433100', '湘西土家族苗族自治州', '430000'); +INSERT INTO `tb_city` VALUES (200, '440100', '广州市', '440000'); +INSERT INTO `tb_city` VALUES (201, '440200', '韶关市', '440000'); +INSERT INTO `tb_city` VALUES (202, '440300', '深圳市', '440000'); +INSERT INTO `tb_city` VALUES (203, '440400', '珠海市', '440000'); +INSERT INTO `tb_city` VALUES (204, '440500', '汕头市', '440000'); +INSERT INTO `tb_city` VALUES (205, '440600', '佛山市', '440000'); +INSERT INTO `tb_city` VALUES (206, '440700', '江门市', '440000'); +INSERT INTO `tb_city` VALUES (207, '440800', '湛江市', '440000'); +INSERT INTO `tb_city` VALUES (208, '440900', '茂名市', '440000'); +INSERT INTO `tb_city` VALUES (209, '441200', '肇庆市', '440000'); +INSERT INTO `tb_city` VALUES (210, '441300', '惠州市', '440000'); +INSERT INTO `tb_city` VALUES (211, '441400', '梅州市', '440000'); +INSERT INTO `tb_city` VALUES (212, '441500', '汕尾市', '440000'); +INSERT INTO `tb_city` VALUES (213, '441600', '河源市', '440000'); +INSERT INTO `tb_city` VALUES (214, '441700', '阳江市', '440000'); +INSERT INTO `tb_city` VALUES (215, '441800', '清远市', '440000'); +INSERT INTO `tb_city` VALUES (216, '441900', '东莞市', '440000'); +INSERT INTO `tb_city` VALUES (217, '442000', '中山市', '440000'); +INSERT INTO `tb_city` VALUES (218, '445100', '潮州市', '440000'); +INSERT INTO `tb_city` VALUES (219, '445200', '揭阳市', '440000'); +INSERT INTO `tb_city` VALUES (220, '445300', '云浮市', '440000'); +INSERT INTO `tb_city` VALUES (221, '450100', '南宁市', '450000'); +INSERT INTO `tb_city` VALUES (222, '450200', '柳州市', '450000'); +INSERT INTO `tb_city` VALUES (223, '450300', '桂林市', '450000'); +INSERT INTO `tb_city` VALUES (224, '450400', '梧州市', '450000'); +INSERT INTO `tb_city` VALUES (225, '450500', '北海市', '450000'); +INSERT INTO `tb_city` VALUES (226, '450600', '防城港市', '450000'); +INSERT INTO `tb_city` VALUES (227, '450700', '钦州市', '450000'); +INSERT INTO `tb_city` VALUES (228, '450800', '贵港市', '450000'); +INSERT INTO `tb_city` VALUES (229, '450900', '玉林市', '450000'); +INSERT INTO `tb_city` VALUES (230, '451000', '百色市', '450000'); +INSERT INTO `tb_city` VALUES (231, '451100', '贺州市', '450000'); +INSERT INTO `tb_city` VALUES (232, '451200', '河池市', '450000'); +INSERT INTO `tb_city` VALUES (233, '451300', '来宾市', '450000'); +INSERT INTO `tb_city` VALUES (234, '451400', '崇左市', '450000'); +INSERT INTO `tb_city` VALUES (235, '460100', '海口市', '460000'); +INSERT INTO `tb_city` VALUES (236, '460200', '三亚市', '460000'); +INSERT INTO `tb_city` VALUES (237, '469000', '省直辖县级行政单位', '460000'); +INSERT INTO `tb_city` VALUES (238, '500100', '市辖区', '500000'); +INSERT INTO `tb_city` VALUES (239, '500200', '县', '500000'); +INSERT INTO `tb_city` VALUES (240, '500300', '市', '500000'); +INSERT INTO `tb_city` VALUES (241, '510100', '成都市', '510000'); +INSERT INTO `tb_city` VALUES (242, '510300', '自贡市', '510000'); +INSERT INTO `tb_city` VALUES (243, '510400', '攀枝花市', '510000'); +INSERT INTO `tb_city` VALUES (244, '510500', '泸州市', '510000'); +INSERT INTO `tb_city` VALUES (245, '510600', '德阳市', '510000'); +INSERT INTO `tb_city` VALUES (246, '510700', '绵阳市', '510000'); +INSERT INTO `tb_city` VALUES (247, '510800', '广元市', '510000'); +INSERT INTO `tb_city` VALUES (248, '510900', '遂宁市', '510000'); +INSERT INTO `tb_city` VALUES (249, '511000', '内江市', '510000'); +INSERT INTO `tb_city` VALUES (250, '511100', '乐山市', '510000'); +INSERT INTO `tb_city` VALUES (251, '511300', '南充市', '510000'); +INSERT INTO `tb_city` VALUES (252, '511400', '眉山市', '510000'); +INSERT INTO `tb_city` VALUES (253, '511500', '宜宾市', '510000'); +INSERT INTO `tb_city` VALUES (254, '511600', '广安市', '510000'); +INSERT INTO `tb_city` VALUES (255, '511700', '达州市', '510000'); +INSERT INTO `tb_city` VALUES (256, '511800', '雅安市', '510000'); +INSERT INTO `tb_city` VALUES (257, '511900', '巴中市', '510000'); +INSERT INTO `tb_city` VALUES (258, '512000', '资阳市', '510000'); +INSERT INTO `tb_city` VALUES (259, '513200', '阿坝藏族羌族自治州', '510000'); +INSERT INTO `tb_city` VALUES (260, '513300', '甘孜藏族自治州', '510000'); +INSERT INTO `tb_city` VALUES (261, '513400', '凉山彝族自治州', '510000'); +INSERT INTO `tb_city` VALUES (262, '520100', '贵阳市', '520000'); +INSERT INTO `tb_city` VALUES (263, '520200', '六盘水市', '520000'); +INSERT INTO `tb_city` VALUES (264, '520300', '遵义市', '520000'); +INSERT INTO `tb_city` VALUES (265, '520400', '安顺市', '520000'); +INSERT INTO `tb_city` VALUES (266, '522200', '铜仁地区', '520000'); +INSERT INTO `tb_city` VALUES (267, '522300', '黔西南布依族苗族自治州', '520000'); +INSERT INTO `tb_city` VALUES (268, '522400', '毕节地区', '520000'); +INSERT INTO `tb_city` VALUES (269, '522600', '黔东南苗族侗族自治州', '520000'); +INSERT INTO `tb_city` VALUES (270, '522700', '黔南布依族苗族自治州', '520000'); +INSERT INTO `tb_city` VALUES (271, '530100', '昆明市', '530000'); +INSERT INTO `tb_city` VALUES (272, '530300', '曲靖市', '530000'); +INSERT INTO `tb_city` VALUES (273, '530400', '玉溪市', '530000'); +INSERT INTO `tb_city` VALUES (274, '530500', '保山市', '530000'); +INSERT INTO `tb_city` VALUES (275, '530600', '昭通市', '530000'); +INSERT INTO `tb_city` VALUES (276, '530700', '丽江市', '530000'); +INSERT INTO `tb_city` VALUES (277, '530800', '思茅市', '530000'); +INSERT INTO `tb_city` VALUES (278, '530900', '临沧市', '530000'); +INSERT INTO `tb_city` VALUES (279, '532300', '楚雄彝族自治州', '530000'); +INSERT INTO `tb_city` VALUES (280, '532500', '红河哈尼族彝族自治州', '530000'); +INSERT INTO `tb_city` VALUES (281, '532600', '文山壮族苗族自治州', '530000'); +INSERT INTO `tb_city` VALUES (282, '532800', '西双版纳傣族自治州', '530000'); +INSERT INTO `tb_city` VALUES (283, '532900', '大理白族自治州', '530000'); +INSERT INTO `tb_city` VALUES (284, '533100', '德宏傣族景颇族自治州', '530000'); +INSERT INTO `tb_city` VALUES (285, '533300', '怒江傈僳族自治州', '530000'); +INSERT INTO `tb_city` VALUES (286, '533400', '迪庆藏族自治州', '530000'); +INSERT INTO `tb_city` VALUES (287, '540100', '拉萨市', '540000'); +INSERT INTO `tb_city` VALUES (288, '542100', '昌都地区', '540000'); +INSERT INTO `tb_city` VALUES (289, '542200', '山南地区', '540000'); +INSERT INTO `tb_city` VALUES (290, '542300', '日喀则地区', '540000'); +INSERT INTO `tb_city` VALUES (291, '542400', '那曲地区', '540000'); +INSERT INTO `tb_city` VALUES (292, '542500', '阿里地区', '540000'); +INSERT INTO `tb_city` VALUES (293, '542600', '林芝地区', '540000'); +INSERT INTO `tb_city` VALUES (294, '610100', '西安市', '610000'); +INSERT INTO `tb_city` VALUES (295, '610200', '铜川市', '610000'); +INSERT INTO `tb_city` VALUES (296, '610300', '宝鸡市', '610000'); +INSERT INTO `tb_city` VALUES (297, '610400', '咸阳市', '610000'); +INSERT INTO `tb_city` VALUES (298, '610500', '渭南市', '610000'); +INSERT INTO `tb_city` VALUES (299, '610600', '延安市', '610000'); +INSERT INTO `tb_city` VALUES (300, '610700', '汉中市', '610000'); +INSERT INTO `tb_city` VALUES (301, '610800', '榆林市', '610000'); +INSERT INTO `tb_city` VALUES (302, '610900', '安康市', '610000'); +INSERT INTO `tb_city` VALUES (303, '611000', '商洛市', '610000'); +INSERT INTO `tb_city` VALUES (304, '620100', '兰州市', '620000'); +INSERT INTO `tb_city` VALUES (305, '620200', '嘉峪关市', '620000'); +INSERT INTO `tb_city` VALUES (306, '620300', '金昌市', '620000'); +INSERT INTO `tb_city` VALUES (307, '620400', '白银市', '620000'); +INSERT INTO `tb_city` VALUES (308, '620500', '天水市', '620000'); +INSERT INTO `tb_city` VALUES (309, '620600', '武威市', '620000'); +INSERT INTO `tb_city` VALUES (310, '620700', '张掖市', '620000'); +INSERT INTO `tb_city` VALUES (311, '620800', '平凉市', '620000'); +INSERT INTO `tb_city` VALUES (312, '620900', '酒泉市', '620000'); +INSERT INTO `tb_city` VALUES (313, '621000', '庆阳市', '620000'); +INSERT INTO `tb_city` VALUES (314, '621100', '定西市', '620000'); +INSERT INTO `tb_city` VALUES (315, '621200', '陇南市', '620000'); +INSERT INTO `tb_city` VALUES (316, '622900', '临夏回族自治州', '620000'); +INSERT INTO `tb_city` VALUES (317, '623000', '甘南藏族自治州', '620000'); +INSERT INTO `tb_city` VALUES (318, '630100', '西宁市', '630000'); +INSERT INTO `tb_city` VALUES (319, '632100', '海东地区', '630000'); +INSERT INTO `tb_city` VALUES (320, '632200', '海北藏族自治州', '630000'); +INSERT INTO `tb_city` VALUES (321, '632300', '黄南藏族自治州', '630000'); +INSERT INTO `tb_city` VALUES (322, '632500', '海南藏族自治州', '630000'); +INSERT INTO `tb_city` VALUES (323, '632600', '果洛藏族自治州', '630000'); +INSERT INTO `tb_city` VALUES (324, '632700', '玉树藏族自治州', '630000'); +INSERT INTO `tb_city` VALUES (325, '632800', '海西蒙古族藏族自治州', '630000'); +INSERT INTO `tb_city` VALUES (326, '640100', '银川市', '640000'); +INSERT INTO `tb_city` VALUES (327, '640200', '石嘴山市', '640000'); +INSERT INTO `tb_city` VALUES (328, '640300', '吴忠市', '640000'); +INSERT INTO `tb_city` VALUES (329, '640400', '固原市', '640000'); +INSERT INTO `tb_city` VALUES (330, '640500', '中卫市', '640000'); +INSERT INTO `tb_city` VALUES (331, '650100', '乌鲁木齐市', '650000'); +INSERT INTO `tb_city` VALUES (332, '650200', '克拉玛依市', '650000'); +INSERT INTO `tb_city` VALUES (333, '652100', '吐鲁番地区', '650000'); +INSERT INTO `tb_city` VALUES (334, '652200', '哈密地区', '650000'); +INSERT INTO `tb_city` VALUES (335, '652300', '昌吉回族自治州', '650000'); +INSERT INTO `tb_city` VALUES (336, '652700', '博尔塔拉蒙古自治州', '650000'); +INSERT INTO `tb_city` VALUES (337, '652800', '巴音郭楞蒙古自治州', '650000'); +INSERT INTO `tb_city` VALUES (338, '652900', '阿克苏地区', '650000'); +INSERT INTO `tb_city` VALUES (339, '653000', '克孜勒苏柯尔克孜自治州', '650000'); +INSERT INTO `tb_city` VALUES (340, '653100', '喀什地区', '650000'); +INSERT INTO `tb_city` VALUES (341, '653200', '和田地区', '650000'); +INSERT INTO `tb_city` VALUES (342, '654000', '伊犁哈萨克自治州', '650000'); +INSERT INTO `tb_city` VALUES (343, '654200', '塔城地区', '650000'); +INSERT INTO `tb_city` VALUES (344, '654300', '阿勒泰地区', '650000'); +INSERT INTO `tb_city` VALUES (345, '659000', '省直辖行政单位', '650000'); + +-- ---------------------------- +-- 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 '用户编号', + `nick_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '用户昵称', + `content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL COMMENT '内容', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间', + `item_id` bigint(20) NOT NULL COMMENT '关联编号', + `score` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '评分', + `type` int(1) NULL DEFAULT NULL COMMENT '0', + 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 (1867216713729224706, 1863920777825390593, '12', '首先爆一爆结局(个人猜测)\r\n\r\n\r\n整个功夫,只是那个救小女孩的小男孩的一个梦幻或者说,一个想象而已! \r\n请注意小男孩和小女孩最后牵手时周围的人们,大家可以看到那个剃头的光屁股家伙在旁边勾女,包租公婆在旁边散步,火云邪神(?)在指挥交通…… 还有4眼崽...\r\n这些,都只不过是小男孩的想象而已!把周围人想象成自己世界里的绝世高手!\r\n\r\n\r\n《功夫》开头有些像普鲁斯特《追忆似水年华》的意识流的手法,隐藏的故事情节反而是解释整部影片超现实场景的合理解释。\r\n其实影片所述故事很简单:一个卖假书的老乞丐向一位少年兜售假武林秘笈,少年信以为真,用自己全部储蓄买了一本《如来神掌》,练习几次后,天真地以为已练成绝世武功,偶遇一群大孩子欺负一位失语的小女孩,想见义勇为不成,却被侮辱一番,伤了自尊,小女孩来感谢并安慰他,他当时正羞辱难当,就闷头跑了。接下来他去糖果店打工,这期间他每天看到各种各样的人,有糖果店门口指挥交通的“火云邪神”,有露屁股青年,有路过的“神雕侠侣”以及影片中出现的大量武林高手。有一天小女孩路过糖果店遇到他,两人高兴地拉着手走入店中。这时又一个小孩碰到老乞丐,于是又一个梦想的轮回开始了。\r\n\r\n大家一定很奇怪,影片的大部分内容及主人公星爷那里去了?这大概也是星爷的高超之处:影片表面的主人公是星爷,而背后的主人公是那个小男孩,而星爷所经历的种种离奇古怪荒诞不经的奇遇都是小男孩的梦,是一个梦想,是内心复杂的一系列活动。那些武林高手则是男孩每天身边所见所闻的平常人,只不过男孩把他们幻想成自己想象世界中的高手以作为心理映象的具体化。\r\n影片有几处场景或细节暗示了以上的解释,比较明显的是结局处星爷与少女在糖果店对视,这时男孩梦醒,回到现实,两人拉手入店,镜头外拓显示大场景,你会发现“火云邪神”在公路中央指挥交通,露屁股青年在墙边与人聊天,“神雕侠侣”身着西装和旗袍从路边经过,还有“金丝眼镜”,当然还有其他一些不明显的片中出现的“高手”,我第一遍看的枪版,没发现这么多,后来也是与同学交流才知,最后老乞丐出现,你会发现他根本没变老,这是因为男孩根本就没长大过。\r\n比较隐晦的有:老乞丐向男孩卖书时曾说“我不入地狱,谁入地狱”,这句话在男孩幼小的心灵中印下很深的烙印,所以他梦想中的正派人物“神雕侠侣”的小龙女在与“火云邪神”对决时也说了这句话,同时照应《大话西游》中观音的”等你真正明白了你师父的舍身成仁······”;有一个蝴蝶破茧而出的情节有双重含义,表面是星爷脱胎换骨,内涵是引用了庄周梦蝶之说,男孩梦到了自己变成了武功高强的星爷,还是星爷梦到了自己有回到自己的金色童年,一股意识流在时空中穿梭,在星爷的电影世界和他的现实世界中穿梭,在星爷人生的现状和他的金色童年时代穿梭。星爷被“火云邪神”顶到空中,轻飘飘地飞起来,引用了人们普遍做过的梦,即梦到自己在飞。\r\n隐蔽更深的是星爷引用很多金庸武侠中的人名“神雕侠侣”,武功“以琴为兵”及情节“重伤而成高手”,因为那个男孩和所有同龄孩子一样,一般喜欢看武侠小说,于是他的梦想中就映象了许多小说中的人物,而把自己想成主人公,这常常也是很多男孩子童年时的武侠梦。\r\n\r\n\r\n如果还不认同,再对比乞丐前后的样子:一模一样!!难道一个那么老的乞丐会在过了二十年后仍然毛\r\n\r\n发不变?他是上帝?不!乞丐根本是个骗子,如来神掌重来不曾有过!高强的武功从来不曾出现过!小\r\n\r\n男孩不过是在自尊受到伤害后,去做了个糖果店学徒而已! \r\n\r\n小男孩是成功的,让他受骗的如来神掌却迎回了那个美丽的小女孩 ..\r\n儿时的我们不是有同样的一个梦.成为高手..英雄救美吗??\r\n\r\n\r\n影片开头,功夫二字的出现,初看,以为是一座雄伟的山峰,但是随着镜头的升高和展开,却发现原来不过是刻在地面上的功夫两个字,这时候一只彩蝶飞舞而过。很明显,这表明了山外有山的道理。彩蝶在功夫中直接影射周,实际上代表一种高于世俗的视角。在影片结尾周被打上天,从而使出如来神掌也是一个道理,不同的水平和角度,对事物的认知往往有天壤之别,能力自然也有天壤之别。\r\n\r\n发现被殴打的居然是一个警察,警察的身体飞来撞碎罪恶克星的牌匾,其中的社会涵义不需多言,这里,容易忽略一个细节,就是能够将警察扔出如此大力道的人,绝非一般的人,这里应该是第一个功夫初级高手出现的地方。鳄鱼帮老大发威结束,出门发现街道空无一人,斧头帮出现,警察局关门,这时候才明白,之所以鳄鱼帮会到警察局闹事,并非警察敢惹他们,而是和斧头帮勾结起来的一个阴谋。鳄鱼帮老大被砍死后,探长点钱的场面也说明了这一点。这里有个伏笔,就是琛哥(斧头帮老大)的两个招手动作,第一次是要斧头砍冯小刚,第二次是要枪来射杀鳄鱼帮夫人,到后面琛哥的第三次招手却没有杀人,而只是要了一根香烟,是为什么呢?到时候再说。\r\n鳄鱼帮被灭之后,一段好莱坞式的舞蹈,表现了斧头帮不断的扩大实力,其中一个镜头,是琛哥在地板上跳舞\r\n地板上的图案,正好是一朵花的形状,花象征着美好的事物,在上面跳舞就是对美好的践踏,后来火云邪神的保命暗器也是一朵金花中间插一根毒针,那朵金花展开来正好就是地板上的图案,而此时在图案上跳舞的琛哥就是金花中间的毒针,在影片结尾,毒针被周拔掉了,这里再次看到周的用心之处。当然,金花与毒针也可以理解成驻扎在美好中的罪恶,去掉心中的罪恶,剩下的就是善,也表明了善为本,人之初,性本善的意思,\r\n\r\n到此,功夫的片头算是结束,一段文字对当代社会的映射不言而喻。\r\n\r\n画面转到一个似乎与世隔绝的贫困社区-猪笼城寨(诸龙?)。按照顺序,社区中“隐藏”的三位“高手”和他们各自的拿手功夫一起依次出场,\r\n\r\n这里面值得一提的就是功夫里面高手们的事件触发顺序,后面你会发现这三位高手的事件触发顺序一直都是按照他们的工夫高低有次序排列的,功夫越差,出场越早,越不会伪装,越早显露武功,而且也越早被杀。有心人可以观察看看还有很多类似的细节。非常有意思的一件事情是,三位高手一直以为他们在瞒着大家,到头来却发现还有连自己都没有发现更高的高手在身边。表面上,更高的高手就是包租公和包租婆,他们显然早就知道这三人的真实实力,到后来,三人大战斧头帮之后,包租婆执意要赶走他们,并不是怕他们会带来麻烦,而是包租婆知道,他们三个一显露武功,就很快会招来杀身之祸,越高深的高手,越明白山外有山的道理,包租婆实际上是想要保住他们的性命,包租婆作弊抽签而赶走三人也表明了包租婆真正的立场。\r\n\r\n为什么说包租公和包租婆是表面上的高手呢?这里我们不妨做一个大胆的猜想,按照前面说过的“功夫越差,出场越早,越早显露武功,而且也越早被杀”的规律,不难看出,阿鬼他们三个在江湖上仅仅是会些三脚猫功夫的小人物而已,而诛杀他们三个的肝肠寸断二人组胜出一筹,包租公和包租婆又比他们高一个档次。然而大家发现没有,在社区和斧头帮争斗的过程中,社区中的“普通”百姓尽管危难重重,但无一伤亡,连阿鬼他们三个“高手”都难逃一死,难道他们都是深藏不露的高手?如果你觉得我是异想天开,请注意以下两个关于酱爆的镜头。\r\n\r\n镜头一:\r\n周星驰第一次敲诈勒索酱爆之前,酱爆给肥猪搭档剪发的迅捷,记得那喳喳喳几声么?前后不过三秒钟,呵呵,什么,夸张手法?事实证明,工夫里面的对人体能的夸张似乎都另有深意,比如包租公从三楼重重摔落到地面安然无恙,包租婆和周飞一样的奔跑速度,到后来发现那些原来都不是夸张,因为他们本来就是高手,那么酱爆的三秒种剪发呢。整个影片中没有以刀剑为武器的高手,这里我们不禁要问既然是表现中国功夫的电影,又怎能不表现中国刀法和剑法?事实上,真的没有么,酱爆的三秒种剪发用的是什么呢。\r\n就在斧头帮二当家威胁酱爆的时候,眼看就要砍死酱爆,电光火石之间,二当家被塞进了几丈开外的油桶里,令人奇怪的是,谁都没有看到发生了什么,没错,当时,酱爆身后是站着苦力强,而且后来也是苦力强承认是他干的,但是苦力强有如此的本领么?假如他的速度能够快到常人看不到地步,后来也没那么容易被杀吧。可以肯定,绝不是苦力强的手笔,事实上,影片出现的高手中,恐怕只有后来的周和火云邪神才能勉强有如此的速度。那么究竟是谁呢。无论是谁,他都不能露面,因为后面还有戏看呢。\r\n\r\n如此看来,酱爆在这个影片中的作用,显然不仅仅是无意义或者纯搞笑的无厘头。\r\n包租公出场,按照顺序“拜访”三位“高手”,对三位高手的态度很有意思,阿鬼——你真懂事,胜哥——调戏笑骂,苦力强的功夫实在不值一提,后面与斧头帮的打斗可以看得出来,几乎要被众人围攻得逞。三位高手对待他人的态度也是很有层次感,越强的越待人有礼,到了苦力强那里,因为他的修为最差,自然以为自己是唯一隐藏的高手,因此对人没有任何阿谀奉承,伪装的最差。对应到现实中,也是同样的道理,越有实力的越不张扬,越虚弱的,却越急于显露。\r\n\r\n酱爆出场,牵引出包租婆,包租婆下楼,再次按照同样的顺序“拜访”三位“高手”,我们再一次看到三位“高手”对包租婆态度的层次。\r\n\r\n周出场了,冒充斧头帮,以勒索为目的,但是却找错了地方,酱爆对于周的勒索和后来真正的斧头帮二当家的威胁都只有“我不怕”的回应,这是酱爆真的很傻么?周第一眼见到酱爆的半个屁股就不知所以,有不祥的预感,后来和猪笼城寨村民们的对阵也证明了这个城寨的卧虎藏龙之势,周先选择了一个外表上绝对和实力挂不上钩的大婶,结果,呵呵,后来他拼命想要找到更矮,更年长,更年幼的,结果却出乎他的意料。这里还是那句话,深藏不露的才是真高人。忽然想到,以此处显露的村民们的实力来看,恐怕即使没有位位“高手”的出头也没有人能伤他们分毫吧。\r\n\r\n之后的斧头帮二当家被一高手办掉,前面说过了,然后斧头帮大举进攻,阿珍被帮众按倒在地,望了包租公一眼,包租公回望她一眼。阿珍分明是在问:“怎么办,你这个高手还不出面”,而包租公地回答是:“不行,不能暴露”,把泥土盖在脸上表明自己的决心和无奈:我宁可过苦难的生活,也不愿背负高手的虚名。\r\n\r\n此处,众村民都被按倒在地,只有苦力强是最倔强的一个,而胜哥已经按捺不住想要亮出自己的功夫,而阿鬼却还想要继续奉承一下,还是层次非常分明的处理。\r\n\r\n琛哥来了,看到二当家的样子的一笑解释了他为什么最后一次招手没有杀周星驰的原因。我们看到琛哥做为斧头帮的老大,非常自傲,只有威胁到他的人物,才会处之而后快,后面周开锁的桥段,琛哥说:这种小角色,迟早会用得到。可见他认为周对他构不成什么威胁,但最后琛哥还是没能摆脱被实力更高的人干掉的结局。\r\n\r\n果然,最先沉不住气的苦力强出头了,这里并不是贬低苦力强的品德,诸龙城寨的村民都有着高尚的品德,他们与世无争,但是遇到这样的事情,任何人都会出手相救的,就比如包租公包租婆,他们绝不可能眼看着这个女孩子被烧死(恐怕这女孩子自己也不会允许的),只不过苦力强最先沉不住气而已。\r\n\r\n周阴错阳差的炮仗是他自己获得了进入斧头帮的机会,一直想要做坏人的周到了此刻,却犹豫不决,以此为分割点,以前的周如果是对现实的逃避的话,那么自此,周开始了与自己内心本质的痛苦挣扎,一直到他看清自己,释放自己的那一刻。\r\n\r\n广告牌子是周身世的线索,周的表面身份是一个孤儿,但是他来自于哪里呢?在影片最后,广告牌的再次出现给了我们答案。\r\n不知道这段回忆唤起了多少人的同感,谁在儿时没有过同样的幻想,梦想自己成为绝世高手,除恶惩奸,结果被人家笑话的经历,甚至,长大以后,连我们自己甚至都觉得自己那时的幼稚可笑,不愿回首,这和当时周的心态何其的相似,不堪回首儿时的“幼稚”与“天真”,对世界失去信心,不断逃避,当面对真正的诱惑的时候,却又犹豫不决,挣扎自己,不肯堕落。周的经历在片中的典型环境中得到放大,使得他的回忆更痛苦,挣扎更激烈,但是最后对自己的释放也最彻底。\r\n\r\n简简单单的一个冰淇淋就打断了正在立誓要杀人的周,女主角出场。都市灯红酒绿的熏染使得周没有认出来儿时的棒糖女孩,就是说他忘记了最珍贵的天真与纯洁,甚至自己都在唾骂诅咒儿时的自己,抢走冰淇淋在电车上的笑更是令人心酸的意味深长,棒糖女孩无论怎么追,都无法追上有轨电车,但是本就是本,一切都要回归原本,不需强求,就像最后周还会回来找她,会找回自己,会回到他来的地方一样。\r\n\r\n包租婆欲救三位“高手”的性命而逼他们赶快离开的的过程中,前面被淋汽油的那一家子来到谢,小孩子的一句话:“谢谢你救了我们”中的“你”显然是指苦力强,为什么不是“谢谢\'你们\'呢”,救了我们,我们指谁们?救的是性命么?只怕另有深意。\r\n\r\n作为一个真正高手,被比自己弱小的人保全了身份,因为这个多少有些自私的原因而导致他们不得不远走高飞,一向不敢反抗的村民与包租婆的争吵就代表高手内心的自责和挣扎。到底是选择勇敢的担负其他们应该担负的责任,还是继续逃避,但是最后包租婆的狮子一声吼下定决心,唤醒高手们心底苦于隐居的根源,曾经的痛苦致使他们选择继续退避,他们认为也许可以躲过一劫,这也为后来包租婆他们更深的自责打下伏笔:他们不该继续逃避和退让。\r\n\r\n想来想去,周决定杀包租婆从而进入斧头帮,这段“刺杀”非常有喜剧效果,我看这段的时候,前仰后合,不能自已。这里是周对自己心底的善否定打击付诸实施的开端,肥猪搭档在这里的演绎,完全表明了肥猪搭档其实就是周自己,整个影片,会找到肥猪搭档很多对周要做坏人的疑问,或者说是完全的否定,周在自己出生地上上演的刺杀也通过这个配角演变成了对自己的伤害。周落荒而逃之后在红绿灯塔中的痛苦再次体现其内心的挣扎,对黑漆漆的灯塔的数次打击表明他正在打破禁锢,释放自己,挣扎的结果和诸龙城寨村民的结果一致,失败了,选择继续逃避。\r\n\r\n\r\n周对看到的两个瞎子的一番讽刺就是对弱小没有实力的讽刺,在没有认清事物本质之前就给于否定显然是错误的,那边包租婆也在犯着同样的错误,作弊抽签,“逼走”三位“高手”,下下签也同时表明了包租婆他们心中的不安和三位“高手”之后的命运。\r\n肝肠寸断搭档的专业和他们杀手榜第一位的称号马上告诉我们,这两个周眼中被完全否定的人物恰恰是三位“高手”致命的威胁,周和包租婆都错了。\r\n\r\n肝肠断组合提到三位高手时的叙述顺序按照三人修为的高低排序。三位高手的一段切磋仍然层次分明,对切磋武学的兴趣,三位对各自武功的评价,错落有致。\r\n三位高手先后被害,包租婆包租公终于出手,狮吼功和太极发挥的非常精彩,扬眉吐气。之所以扬眉吐气,是因为三位高手的遇害真正唤醒了诸龙城寨的高手们,使他们意识到退让解决不了问题,从而从猪笼中解脱自己,释放自己,到这里,恐怕之前送给苦力强的鸡蛋的意义也已完全的表现出来,三位“高手”用生命换来众人的解脱释然,自然是要大肆感谢一番的。\r\n\r\n琛哥他们丢了魂一样的驾车逃跑这一段也很搞笑。颤抖的双手烧到自己的头发,浑浑噩噩用酒去救火,无疑是火上浇油。\r\n\r\n如果说从前的城寨有笼子的禁锢之意的话,那么此时才能被称为真正的“诸龙”城寨,众村民在三高手的尸体前放声痛哭,包租公自责自己是小市民,阿珍对包租公他们的痛斥实际上也是对“诸龙”城寨所有村民的痛斥。\r\n\r\n对于“诸龙”城寨得村民来说,肝肠断组合已经不是威胁,但是以酱爆为首的村民还是要报仇,声讨斧头帮,这里面比较奇怪的一个问题就是,当时火云邪神并没有出现,而村民又看到了包租公婆的实力完全可以铲平斧头帮,但是为什么他们还要寻找“万中无一”的高手呢?这只能再次证明村民们的真实实力和修为远远超出凡人,他们知道包租公婆的实力外露必会引来更大的灾难。这里,我想,他们指的灾难并不是火云邪神,而火云邪神也并不是天下第一,从火云邪神后来屡次使诈可以看到,他本身的品质决定了它不可能有太高的修为。村民们所指的灾难,恐怕对于不同的人有着不同的意义,那是他们各自心甘情愿到这里隐居的根源,使他们一直以来都在逃避的东西,他们绝不是指斧头帮或者那个还没有出现的火云邪神,他们是要下决心鼓起勇气面对他们应该面对的现实,不再继续逃避。\r\n\r\n在村民们解脱之后,接下来轮到周了,周和棒糖女的这段戏是周内心挣扎的高潮,周的演绎实在是无可挑剔。\r\n\r\n在被电车上四眼仔侮辱一番之后,周一个尴尬的甩头发,他觉得这样很帅很酷很牛比,事实上,这个丑态百出的动作恰恰说明他现在对坏人生活的盲目向往完全是错的,事实上,以他们两个难道还敌不过你个文弱的四眼仔么?问这样问题的肯定不少,但是回头想想,就算是他们两个把四眼仔揍了一顿,他们就胜利了?他们雄赳赳气昂昂的下了电车之后,能做的无非也是这样一个“酷酷”的甩头动作而已,结果都是一样的,之后周问搭档,信不信我打烂它眼镜?你发誓!你看不起我?呵呵,周身边这个肥猪配角的安排真实绝妙,完全是一幕自问自答得演绎,胖瘦两个对立体现他自己内心的两种对立人生观,而整个影片都看见周表面向往的那种人生观的虚无和脆弱,反而事实一次又一次证明了他自己对他目前错误人生观的否定。\r\n\r\n周气急败坏了,他真的下定决心要做成一次坏事——抢劫棒糖女,彻底消灭隐藏在心中的那份天真!气势汹汹的他已经快要沦为一个低能儿,居然连插销都不拔,就妄图打开冰淇淋车门实施抢劫,反而越嚣张越没有理智。\r\n\r\n见到棒棒女之后,周直接绕过了对自己的种种疑惑,绕过最后一道防线,直接冲击他自己的内心之本,隐藏在心中的棒糖女,无论他怎样欺辱棒糖女,无论棒糖女多么的柔弱怜惜,这个斗争根本就是荒谬的,后面的海报也说明了这一点,试问怎么可能和自己的“本”斗呢?正在周无可奈何的时候,胖搭档拔开了插销,帮她找到了钱,或者说,是他内心的“本”不忍看到挣扎的痛苦,能够救他的只有自己,这场抢劫,与其说是他欺辱了自己的“本”,不如说是他自己的“本”施舍了他。这场争斗无论如何也是荒谬的。\r\n\r\n周毫不在意的扔掉装棒糖的盒子,慌张的拿走下面盒子里的钱。却看到棒糖女小心拾起那个他没有在意的盒子,打开盖子,看到了棒糖,一直以来,从他儿时救棒糖女的失败开始一直到今天,早已忘记了儿时天真的周这才明白她一直以来为何如此挣扎和痛苦,才看清了他一直以来最大的敌人是谁,这时候的音乐我超级喜欢,给我的感觉就像加州旅店般苍凉与透彻。\r\n\r\n如此辛酸的讽刺,斗了半天,到此刻才看清敌人的真面目,才看清自己,本来“雄心壮志”的他一下子就愣在那里,面对着棒糖女的递过来的五彩棒糖,才认清敌人的周的内心才真正开始了一个短暂而公平的对抗,然而,这个斗争不可能长久的,而且这个争斗也是无法躲避的,如果不是琛哥派人找到周拉他下水,恐怕周此刻就会认输,得到彻底的解脱。\r\n\r\n无情地扇落棒糖,碎成几片的棒糖如同周自己的心一样,此刻他内心的痛苦可想而知。\r\n\r\n周拼命的跑,仍然妄图甩掉他刚认清的“敌人”,他此刻已经完全没有和这个“敌人”斗的勇气,只想逃避,把刚刚抢来的钱也全部塞给了胖搭档,但是他仰天感叹,马上又明白,他能甩掉自己么?疲惫的他一下子瘫倒在路边,就在这时候,琛哥来找他了。\r\n\r\n琛哥派人来了,一口喘气的机会也没有给周和观众,满身邋遢的周来到灯红酒绿的夜总会,爵士乐和灯光美女交错的迷幻般的诱惑,使他不由自主地跟着打起拍子来,但是,动作笨拙不合拍的他显然没有影片开始时琛哥的舞蹈来的老到,以迷茫的周为中心的舞池周围散落着麻醉而且同样迷茫的人们,这真是周向往中的世界么,至少在这样的世界里,没人能给他答案。\r\n\r\n刚刚要放弃和自己内心的斗争的疲惫的周怎么也没有想到,这么容易就加入了斧头帮,琛哥看周都比此刻的周自己看得透彻,两句话表现出琛哥对周和对自己的认识,也表现出琛哥利用和控制周的易如反掌和满足。\r\n\r\n不正常人类研究中心,和诸龙城寨一样,世界上既然有曾经禁锢正义的诸龙城寨,就有禁锢邪恶的不正常人类研究中心,在周跨进研究中心的第一步,就感到煞气逼人,一抬头,天空中的景象壮观而恐怖,结合周获得的那张地图,可知,此时天空中的旋涡中心正好对应研究中心中的中心,而地图所指火云邪神的位置却在末端边缘处,个人猜测就后来火云邪神的功力来看,他不可能是造成这可怖现象的主角(续集伏笔)。\r\n\r\n\r\n\r\n带回火云邪神,邪神牛比轰轰的抓住子弹:“天下武功,无坚不破,唯快不破”,。斧头帮被镇住了,全体同仁向邪神顶礼膜拜,连琛哥自己都不例外,邪神就坐在地板上金花图案的中心,可是黑帮全体完全无视或者说蔑视象征人之本源的金花,反而对金花之上的一根嚣张跋扈的毒刺顶礼膜拜。\r\n\r\n包租公婆来了,本来是找斧头帮算账的,不想却碰到功力略胜二位的邪神,其中打斗的过程周的逐渐被唤醒的过程还是很明晰,尽管包租公婆不敌邪神,但是借助大喇叭钟却也逼得邪神露出来本来阴险面目,借助大喇叭钟不能说是战胜了邪神,而是真正敲响周的最后一记警钟,而邪神下三滥的手段也让周认清了隐藏在他自己心中的丑陋,周对自己从前有了新的认识,一记闷棍打的琛哥魂飞魄散,你搞得我好乱啊。此刻,周真正回归原本,也就是出茧了,表面上是邪神打通了周的任督二脉,真正使他自己获得新生的却是他自己。此刻的周尽管被邪神百般摧残,看似令人心痛,但是周那一切小棍敲头却让我破涕为笑,因为此刻的周证明了他于之前的判若两人,证明了他已经破壳而出了。\r\n\r\n尽管周自己得到解脱了,但是心中的那份遗憾却总也挥之不去,此刻,他唯一的愿望也就是能够抚平他曾经的执迷不悟所带来的遗憾和创伤。包租公的对阿鬼和周的两次“你还是用中文吧”,表明任何人自己内心的残缺都只有自己明白,也只有自己才能弥补,正如后来包租婆自己所说:“关键还是他本身的体质”\r\n\r\n周和邪神的较量,如同之前周和自己的较量一样,过程荒谬,邪神的种种自大就预示了结果。\r\n\r\n小孩子打架才用踩脚趾这招,呵呵,那些说功夫幼稚,只是给幼儿园儿童看的人们你们怎么看呢?周星星,你怎能预料会有这样的人啊。\r\n\r\n哈哈,这个邪神的嘴脸在我看来经典的很,绝妙讽刺了邪神自以为是的观点“唯快不破”,恰恰是被他瞧不起的踩脚趾打击的无地自容。\r\n\r\n周飞上天空,如同那展翅飞舞的彩蝶,脚下逐渐远去的地面,自己不断上升的视角,此时的周的境界已然不同。周易如反掌的收拾掉邪神。邪神自不量力挣扎就像当初周一掌扇掉棒糖一样可笑,你还不醒悟么?周轻轻抽掉毒针,展开绚丽的金花,任它飘散人间,安抚世间以及他自己的心灵。\r\n\r\n邪神意识到他自己的错误,但是还没有意识到他所面对的广博,周的一句“你想学,我教你啊”,震得邪神是心头大惊,他再抬头望周的脸庞,发觉那如此的深邃和无穷,完全望不到尽头,邪神自此彻底认输。\r\n\r\n如来神掌,浩瀚无边,万物之本,棒糖女在另一方虽不知周的转变,却依然无怨无悔的向着她的心愿前行,那颗彩色的梦想虽然曾经经历过创伤和迷失,但是终究会回归原本,周和棒糖女儿时的天真梦想终究会从断掉的地方重新开始并得到圆满,之后传递给所有怀有天真和希望的人们。\r\n\r\n关于结局的猜测,我怕引起更大的“误会”,给人抓住更多的“把柄”,因此只留了这几个问题,“个人`感觉”上,我一直就认为鼻涕小公子就是儿时的火云邪神,结果居然有人和我有一模一样的想法!哈哈!可谓妙哉`!', '2025-02-11 16:16:56', 1291543, '5.00', 0); +INSERT INTO `tb_comment` VALUES (1889325851787395074, 1888931423629377538, NULL, '

这个不错

', '2025-02-11 16:23:47', 1867221170365947966, NULL, 1); +INSERT INTO `tb_comment` VALUES (1889328978494263298, 1888931423629377538, NULL, '

我呀,必须是我。否则衣帽间那一屋子的衣服,茶室里一屋子的茶具,都是我自己买的奖品呀!

', '2025-02-11 16:23:52', 1867221170365947966, NULL, 1); +INSERT INTO `tb_comment` VALUES (1889329028440035330, 1888931423629377538, NULL, '
越牛逼的人,越勤奋到可怕!\n\n1️⃣俞敏洪老师很牛,但更牛的是他的勤奋努力!\n\n这是我昨天听他小伙伴分享的故事:\n\n他说有一次见俞敏洪,俞老师问他:“你一周看几本书?”\n\n他有点开心说:“每周一本…”\n\n俞老师说:“我每天至少读书4小时。不论多忙,比如董事会、公司管理还是杂事一堆,雷打不动每天读书4小时。”\n\n他很吃惊,没想到这么日理万机、会议都排得毫无缝隙的俞老师,每天回到家都读书4小时,孜孜不倦地勤奋。\n\n2️⃣越牛逼的人,越惜时!\n牛逼的人,时间观跟大多数人不一样。\n\n我们很多人,“无聊感”、“疲惫感”是主旋律,但牛人眼里是“兴奋感”、“有趣感”\n\n也许你觉得:这么牛逼也太无趣了吧?打游戏、刷视频都不干!太没劲了吧…\n\n但是,在他们眼中:读书、写作、运动就是快乐的,本质上跟很多人的“打游戏”、“刷dou音”是一样的快乐\n\n只不过牛人的爱好,是激发自己上进的,是高级深层次的快乐。所以,他们特别惜时,让时间成为更好自己的养料。\n\n🌿没有任何人从一开始就牛逼,因为他们延迟满足、高层次追求、惜时如命、勤奋到可怕。\n\n如果你问他们为啥这么勤奋?我想,大概是对生命充满好奇,想见到更广的世界,以及更好的自己!


', '2025-02-11 16:23:50', 1867221170365947966, NULL, 1); +INSERT INTO `tb_comment` VALUES (1889336984518909953, 1888931423629377538, NULL, '

直接用手机nfc功能,一毛也不用花

', '2025-02-11 16:23:49', 1867221170365947971, NULL, 1); + +-- ---------------------------- +-- Table structure for tb_house +-- ---------------------------- +DROP TABLE IF EXISTS `tb_house`; +CREATE TABLE `tb_house` ( + `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '编号', + `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '标题', + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '小区名称', + `city` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '城市', + `type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '户型', + `area` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '面积', + `floor` int(5) NULL DEFAULT NULL COMMENT '楼层', + `face` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '朝向', + `decoration` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '装修', + `image` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '图片', + `price` double(10, 2) NULL DEFAULT NULL COMMENT '价格 x元/平方', + `description` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL COMMENT '描述', + `tag` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '标签', + `hex` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL COMMENT '密钥', + `sort` int(10) NOT NULL DEFAULT 1 COMMENT '排序', + `status` tinyint(1) NOT NULL DEFAULT 0 COMMENT '状态[\r\n{name:\"未审核\",status:0},\r\n{name:\"上架\",status:1},\r\n{name:\"下架\",status:2},\r\n{name:\"审核失败\",status:3},\r\n]', + `view` int(10) NOT NULL DEFAULT 0 COMMENT '点击次数', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间', + `user_id` bigint(20) NULL DEFAULT NULL COMMENT '用户编号', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 9787559485060 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '商品表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of tb_house +-- ---------------------------- +INSERT INTO `tb_house` VALUES (9787559485052, '房东急售近地铁 近医院 诚心出售', '阳光公寓', '上海', '住宅', '88.5', 10, '南', '精装修', 'http://localhost:18081/360x312c.webp', 8500.00, '

靠近地铁,生活便利

', '广州', '0xd9d3be6fa92e176644670250962e2977d77ed42ab8f7b748312443b3aac853a13cfb4515d8871ed6', 1, 1, 30, '2025-05-22 09:52:19', 1888931423629377539); +INSERT INTO `tb_house` VALUES (9787559485053, '房东急售近地铁 近医院 诚心出售', '城市花园', '北京', '别墅', '240.0', 2, '东南', '豪华装修', 'http://localhost:18081/360x312c (1).webp', 32000.00, '

带花园泳池,适合家庭居住

', '上海', '0xabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcd', 2, 1, 27, '2025-05-22 09:52:20', 1888931423629377539); +INSERT INTO `tb_house` VALUES (9787559485054, '房东急售近地铁 近医院 诚心出售', '学府小区', '深圳', '学区房', '73.0', 6, '西', '简装修', 'http://localhost:18081/360x312c (1).webp', 6600.00, '

临近重点小学,交通便利

', '深圳', '0x82e8d73db53b3d9fec96515d65276e40f8164027934321a266082d377c9026dc58c72bd08f77718c', 3, 1, 13, '2025-05-22 09:52:20', 1888931423629377539); +INSERT INTO `tb_house` VALUES (9787559485055, '房东急售近地铁 近医院 诚心出售', '学府小区', '深圳', '学区房', '73.0', 6, '西', '简装修', 'http://localhost:18081/360x312c (1).webp', 6600.00, '

临近重点小学,交通便利

', '深圳', '0x6291976f726a21ad016b8f5635e1767efbacf6b8e9d158cc2d8557d12a79c5334868af15fd5d538b', 3, 1, 12, '2025-05-22 09:52:21', 1888931423629377539); +INSERT INTO `tb_house` VALUES (9787559485056, '房东急售近地铁 近医院 诚心出售', '学府小区', '深圳', '学区房', '140', 6, '西', '简装修', 'http://localhost:18081/360x312c (1).webp', 6600.00, '

临近重点小学,交通便利

', '深圳', '0x8dc7b1d0216024c4f5a1bea8f85dbfd8e219c00fcf4b2ed33e42a8c83e8bd9374dfb2b428d58677f', 3, 1, 14, '2025-05-22 11:24:35', 1888931423629377538); +INSERT INTO `tb_house` VALUES (9787559485057, '房东急售近地铁 近医院 诚心出售', '学府小区', '深圳', '学区房', '73.0', 6, '西', '简装修', 'http://localhost:18081/360x312c (1).webp', 6600.00, '

临近重点小学,交通便利

', '深圳', '0xbdae6f8b2c2e39593d4703db3041862cf25104ddfc4ec3e09f99c18fabb68b8dababf2a7a8b5882f', 3, 1, 27, '2025-05-22 09:52:22', 1888931423629377539); +INSERT INTO `tb_house` VALUES (9787559485058, '房东急售近地铁 近医院 诚心出售', '学府小区', '深圳', '学区房', '73.0', 6, '西', '简装修', 'http://localhost:18081/360x312c (1).webp', 6600.00, '

临近重点小学,交通便利

', '深圳', '0xcafc386cb9c9f7dbbebcd056b875d2b383d632e26ed806a6208c005b6d1965cfc145237971357d69', 3, 1, 10, '2025-05-22 09:52:23', 1888931423629377539); +INSERT INTO `tb_house` VALUES (9787559485059, '房东急售近地铁 近医院 诚心出售', '学府小区', '深圳', '学区房', '73.0', 6, '西', '简装修', 'http://localhost:18081/360x312c (1).webp', 6600.00, '

临近重点小学,交通便利

', '深圳', '0xc43c2dd4fe52e4ef1b30e2c50ea9797ef02071f6ecfafd6379ff3d18ba9ebd71fd3405f75c59cfb3', 3, 1, 39, '2025-05-22 09:52:23', 1888931423629377539); + +-- ---------------------------- +-- Table structure for tb_order +-- ---------------------------- +DROP TABLE IF EXISTS `tb_order`; +CREATE TABLE `tb_order` ( + `id` bigint(20) NOT NULL COMMENT '订单编号', + `user_id` bigint(20) NOT NULL COMMENT '申请用户编号', + `item_id` bigint(20) NOT NULL COMMENT '申请房源编号', + `item_user_id` bigint(20) NULL DEFAULT NULL COMMENT '被申请用户编号', + `user_house_id` bigint(20) NULL DEFAULT NULL COMMENT '用户申请房源编号', + `status` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '待审核' COMMENT '0待审核\r\n1 已拒绝 \r\n2已同意\r\n3 已评价', + `score` int(5) NULL DEFAULT NULL COMMENT '订单评价分数', + `content` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '评价内容', + `refuse` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '拒绝描述', + `price` decimal(10, 2) NULL DEFAULT NULL COMMENT '补差价', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '换住创建时间', + `hex` varchar(600) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '哈希', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '订单表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of tb_order +-- ---------------------------- +INSERT INTO `tb_order` VALUES (1925380852120829954, 1888931423629377538, 9787559485059, 1888931423629377539, 9787559485056, '待审核', NULL, NULL, NULL, NULL, '2025-05-22 12:25:29', '1'); +INSERT INTO `tb_order` VALUES (1925392372137463809, 1888931423629377539, 9787559485056, 1888931423629377538, 9787559485059, '待审核', NULL, NULL, NULL, NULL, '2025-05-22 11:24:48', '0x4fcf21434426a4a3c83470f2bd4d8d4c93becd89a55e8b61737ef6156c159e2cacfd6035f9a3dbb8'); + +-- ---------------------------- +-- Table structure for tb_province +-- ---------------------------- +DROP TABLE IF EXISTS `tb_province`; +CREATE TABLE `tb_province` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `province_id` varchar(6) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `province` varchar(40) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE = MyISAM AUTO_INCREMENT = 35 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '省份信息' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of tb_province +-- ---------------------------- +INSERT INTO `tb_province` VALUES (1, '110000', '北京市'); +INSERT INTO `tb_province` VALUES (2, '120000', '天津市'); +INSERT INTO `tb_province` VALUES (3, '130000', '河北省'); +INSERT INTO `tb_province` VALUES (4, '140000', '山西省'); +INSERT INTO `tb_province` VALUES (5, '150000', '内蒙古自治区'); +INSERT INTO `tb_province` VALUES (6, '210000', '辽宁省'); +INSERT INTO `tb_province` VALUES (7, '220000', '吉林省'); +INSERT INTO `tb_province` VALUES (8, '230000', '黑龙江省'); +INSERT INTO `tb_province` VALUES (9, '310000', '上海市'); +INSERT INTO `tb_province` VALUES (10, '320000', '江苏省'); +INSERT INTO `tb_province` VALUES (11, '330000', '浙江省'); +INSERT INTO `tb_province` VALUES (12, '340000', '安徽省'); +INSERT INTO `tb_province` VALUES (13, '350000', '福建省'); +INSERT INTO `tb_province` VALUES (14, '360000', '江西省'); +INSERT INTO `tb_province` VALUES (15, '370000', '山东省'); +INSERT INTO `tb_province` VALUES (16, '410000', '河南省'); +INSERT INTO `tb_province` VALUES (17, '420000', '湖北省'); +INSERT INTO `tb_province` VALUES (18, '430000', '湖南省'); +INSERT INTO `tb_province` VALUES (19, '440000', '广东省'); +INSERT INTO `tb_province` VALUES (20, '450000', '广西壮族自治区'); +INSERT INTO `tb_province` VALUES (21, '460000', '海南省'); +INSERT INTO `tb_province` VALUES (22, '500000', '重庆市'); +INSERT INTO `tb_province` VALUES (23, '510000', '四川省'); +INSERT INTO `tb_province` VALUES (24, '520000', '贵州省'); +INSERT INTO `tb_province` VALUES (25, '530000', '云南省'); +INSERT INTO `tb_province` VALUES (26, '540000', '西藏自治区'); +INSERT INTO `tb_province` VALUES (27, '610000', '陕西省'); +INSERT INTO `tb_province` VALUES (28, '620000', '甘肃省'); +INSERT INTO `tb_province` VALUES (29, '630000', '青海省'); +INSERT INTO `tb_province` VALUES (30, '640000', '宁夏回族自治区'); +INSERT INTO `tb_province` VALUES (31, '650000', '新疆维吾尔自治区'); +INSERT INTO `tb_province` VALUES (32, '710000', '台湾省'); +INSERT INTO `tb_province` VALUES (33, '810000', '香港特别行政区'); +INSERT INTO `tb_province` VALUES (34, '820000', '澳门特别行政区'); + +-- ---------------------------- +-- 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 = 17 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '轮播图' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of tb_slides +-- ---------------------------- +INSERT INTO `tb_slides` VALUES (3, '水龙头轮播图', 1, 'bd592e8c-64dd-4610-b860-b3ed8554aba1.jpg', '2025-02-27 04:56:21', '首页轮播'); +INSERT INTO `tb_slides` VALUES (16, '饭桌上的舞蹈', NULL, 'bd592e8c-64dd-4610-b860-b3ed8554aba1.jpg', '2025-02-13 21:55:22', 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 = 1925392134131683330 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '用户Token' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of tb_token +-- ---------------------------- +INSERT INTO `tb_token` VALUES (1863921548927258625, 1863920777825390593, '424a16be3b8e449384eb634f9744f937', '2025-02-10 14:19:37', '2025-02-10 14:19:37'); +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, '661543f57ceb44eca22396b0a6aedd4a', '2025-05-22 12:57:30', '2025-05-22 12:57:30'); +INSERT INTO `tb_token` VALUES (1925392134131683329, 1888931423629377539, 'cb7d0bc6033f4c50b2868705fd48f032', '2025-05-22 11:24:50', '2025-05-22 11:24:50'); + +-- ---------------------------- +-- 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 = 1889341410696552451 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); + +-- ---------------------------- +-- 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 NULL DEFAULT NULL 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 '介绍', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1888931423629377543 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '用户' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of tb_user +-- ---------------------------- +INSERT INTO `tb_user` VALUES (1863920777825390593, '18796357645', '50deed89a90161a0c57384bbc70a311c445b47a8af6897053e95f2201598889b', '2024-12-03 20:18:38', '12', '18796357645'); +INSERT INTO `tb_user` VALUES (1888931423629377538, '123456', '8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92', '2025-02-10 20:42:01', '阎震南', '18796357645'); +INSERT INTO `tb_user` VALUES (1888931423629377539, '234567', '8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92', '2010-07-13 07:12:50', '韦致远', '18796357645'); +INSERT INTO `tb_user` VALUES (1888931423629377540, '14210238611', 'P2ISnWAS0B', '2025-01-15 05:30:28', '唐杰宏', '18796357645'); +INSERT INTO `tb_user` VALUES (1888931423629377541, '7554347435', 'rI6MCEVnSg', '2004-07-25 08:33:17', '程睿', '18796357645'); +INSERT INTO `tb_user` VALUES (1888931423629377542, '18281782563', 'UdghV1N4vF', '2004-12-08 21:45:46', '阎震南', '18796357645'); + +-- ---------------------------- +-- 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 = 1925415463760723970 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); +INSERT INTO `tb_user_behavior` VALUES (1895125950090194945, 1888931423629377538, 9787513943901, '2025-02-27 14:56:50', 1); +INSERT INTO `tb_user_behavior` VALUES (1895126437938188289, 1888931423629377538, 9787533960216, '2025-02-27 14:58:47', 1); +INSERT INTO `tb_user_behavior` VALUES (1895299299839844353, 1888931423629377538, 9787559484953, '2025-02-28 02:25:40', 1); +INSERT INTO `tb_user_behavior` VALUES (1899688784832876545, 1888931423629377538, 9787559484936, '2025-03-12 05:07:55', 1); +INSERT INTO `tb_user_behavior` VALUES (1925045923864494082, 1888931423629377538, 9787559485053, '2025-05-21 12:28:08', 1); +INSERT INTO `tb_user_behavior` VALUES (1925415463760723969, 1888931423629377538, 9787559485059, '2025-05-22 12:56:33', 1); + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/front/front.iml b/front/front.iml new file mode 100644 index 0000000..6521516 --- /dev/null +++ b/front/front.iml @@ -0,0 +1,143 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/front/pom.xml b/front/pom.xml new file mode 100644 index 0000000..6ecb597 --- /dev/null +++ b/front/pom.xml @@ -0,0 +1,36 @@ + + + io.renren + block-chaincopyright + 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..215069e --- /dev/null +++ b/front/src/main/java/io/FrontApplication.java @@ -0,0 +1,23 @@ +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; +import org.springframework.scheduling.annotation.EnableScheduling; + +/** + * front + */ +@SpringBootApplication +//@EnableScheduling +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/MyScheduledTask.java b/front/src/main/java/io/config/MyScheduledTask.java new file mode 100644 index 0000000..9ec1d4b --- /dev/null +++ b/front/src/main/java/io/config/MyScheduledTask.java @@ -0,0 +1,103 @@ +package io.config; + + +import io.modules.item.dao.ItemDao; +import io.modules.item.dao.OrderDao; +import io.modules.item.entity.HouseEntity; +import io.modules.item.entity.OrderEntity; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; +import java.security.SecureRandom; +import java.util.HexFormat; +import java.util.List; + +/** + * + * 1.在主方法加@EnableScheduling + */ + +@Component +@Slf4j +public class MyScheduledTask { + @Autowired + ItemDao itemDao; + @Autowired + OrderDao orderDao; + + // 每5秒执行一次 + @Scheduled(fixedRate = 5000) + public void runEveryFiveSeconds1() { + //需要检测的hex字段 + List list = itemDao.selectList(null); + for (HouseEntity itemEntity : list) { + if (!isValidEthereumHexId(itemEntity.getHex(),64)){ + itemEntity.setHex(sendSetRequest(itemEntity.getId().toString(),itemEntity.toString())); + //更新数据 + itemDao.updateById(itemEntity); + } + } + } + + @Scheduled(fixedRate = 5000) + public void runEveryFiveSeconds2() { + //需要检测的hex字段 + List list = orderDao.selectList(null); + for (OrderEntity itemEntity : list) { + if (!isValidEthereumHexId(itemEntity.getHex(),64)){ + itemEntity.setHex(sendSetRequest(itemEntity.getId().toString(),itemEntity.toString())); + //更新数据 + orderDao.updateById(itemEntity); + } + } + } + + public static String sendSetRequest(String key, String value) { + try { + 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().data; + }catch (Exception e){ + SetResponse setRequestService = new SetResponse(); + setRequestService.setData(generate(40)); + return setRequestService.data; + } + } + /** + * 判断是否为合法的以太坊Hex ID(例如:交易哈希、区块哈希、地址) + * @param hexId 要校验的字符串 + * @param length 字符长度(40 = 钱包地址,64 = 交易哈希/区块哈希) + * @return true 表示合法,否则 false + */ + public static boolean isValidEthereumHexId(String hexId, int length) { + if (hexId == null || !hexId.startsWith("0x")) { + return false; + } + String hexBody = hexId.substring(2); + String pattern = "^[0-9a-fA-F]{" + length + "}$"; + return hexBody.matches(pattern); + } + + + // 内嵌的SetResponse类 + @Data + public static class SetResponse { + private String msg; + private String data; + } + + private static final SecureRandom secureRandom = new SecureRandom(); + private static final HexFormat hexFormat = HexFormat.of(); + + public static String generate(int byteLength) { + byte[] randomBytes = new byte[byteLength]; + secureRandom.nextBytes(randomBytes); + return "0x" + hexFormat.formatHex(randomBytes); + } +} \ No newline at end of file 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..16405a6 --- /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); + } +} 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/AddressController.java b/front/src/main/java/io/controller/AddressController.java new file mode 100644 index 0000000..55ec7e0 --- /dev/null +++ b/front/src/main/java/io/controller/AddressController.java @@ -0,0 +1,89 @@ +package io.controller; + +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.dto.AddressDTO; +import io.modules.item.service.AddressService; +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.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 java.util.Map; + + +/** + * 收货地址表 + + */ +@RestController +@RequestMapping("api/address") +@Tag(name="收货地址表") +@CrossOrigin +public class AddressController { + @Autowired + private AddressService addressService; + + @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") + }) + @Login + public Result> page(@Parameter(hidden = true) @RequestParam Map params,@Parameter(hidden = true) @RequestAttribute("userId") Long userId){ + params.put("userId",userId); + PageData page = addressService.page(params); + return new Result>().ok(page); + } + + @GetMapping("{id}") + @Operation(summary = "信息") + public Result get(@PathVariable("id") Long id){ + AddressDTO data = addressService.get(id); + return new Result().ok(data); + } + + @PostMapping + @Operation(summary = "保存") + public Result save(@RequestBody AddressDTO dto){ + //效验数据 + ValidatorUtils.validateEntity(dto, AddGroup.class, DefaultGroup.class); + + addressService.save(dto); + + return new Result(); + } + + @PutMapping + @Operation(summary = "修改") + public Result update(@RequestBody AddressDTO dto){ + //效验数据 + ValidatorUtils.validateEntity(dto, UpdateGroup.class, DefaultGroup.class); + addressService.update(dto); + return new Result(); + } + + @DeleteMapping("{id}") + @Operation(summary = "删除") + public Result delete(@PathVariable Long id) { + Long[] ids = new Long[]{id}; + //效验数据 + AssertUtils.isArrayEmpty(ids, "id"); + addressService.delete(ids); + return new Result(); + } + + +} diff --git a/front/src/main/java/io/controller/AreaController.java b/front/src/main/java/io/controller/AreaController.java new file mode 100644 index 0000000..37e85b1 --- /dev/null +++ b/front/src/main/java/io/controller/AreaController.java @@ -0,0 +1,77 @@ +package io.controller; + +import io.common.utils.Result; +import io.modules.item.dto.AreaDTO; +import io.modules.item.dto.CityDTO; +import io.modules.item.dto.ProvinceDTO; +import io.modules.item.dto.ProvinceTree; +import io.modules.item.service.AreaService; +import io.modules.item.service.CityService; +import io.modules.item.service.ProvinceService; +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.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 java.util.List; +import java.util.Map; + +/** + * 地区信息 + */ +@RestController +@RequestMapping("api/area") +@Tag(name="地区信息") +@CrossOrigin +public class AreaController { + @Autowired + private ProvinceService provinceService; + + @Autowired + private CityService cityService; + + @Autowired + private AreaService areaService; + + + @GetMapping("tree") + @Operation(summary = "结构树") + public Result> tree(){ + List page = provinceService.tree(); + return new Result>().ok(page); + } + + @GetMapping("province") + @Operation(summary = "省份分页") + @Parameters({ + @Parameter(name = "provinceId", description = "城市编号", in = ParameterIn.QUERY, required = true, ref = "String") }) + public Result> ProvinceList(@Parameter(hidden = true) @RequestParam Map params){ + List page = provinceService.list(params); + return new Result>().ok(page); + } + + @GetMapping("city") + @Operation(summary = "城市分页") + @Parameters({ + @Parameter(name = "cityId", description = "城市编号", in = ParameterIn.QUERY, required = true, ref = "String"), + @Parameter(name = "father", description = "父编号", in = ParameterIn.QUERY, required = true, ref = "String"), + }) + public Result> CityList(@Parameter(hidden = true) @RequestParam Map params){ + List page = cityService.list(params); + return new Result>().ok(page); + } + + @GetMapping("area") + @Operation(summary = "区域分页") + @Parameters({ + @Parameter(name = "areaId", description = " 区域编号", in = ParameterIn.QUERY, required = true, ref = "String"), + @Parameter(name = "father", description = " 父编号", in = ParameterIn.QUERY, required = true, ref = "String"), + }) + public Result> AreaList(@Parameter(hidden = true) @RequestParam Map params){ + List page = areaService.list(params); + return new Result>().ok(page); + } + +} diff --git a/front/src/main/java/io/controller/BookController.java b/front/src/main/java/io/controller/BookController.java new file mode 100644 index 0000000..3f78082 --- /dev/null +++ b/front/src/main/java/io/controller/BookController.java @@ -0,0 +1,53 @@ +package io.controller; +import io.annotation.Login; +import io.annotation.LoginUser; +import io.common.page.PageData; +import io.common.utils.Result; +import io.common.validator.ValidatorUtils; +import io.common.validator.group.AddGroup; +import io.common.validator.group.DefaultGroup; +import io.entity.UserEntity; +import io.modules.item.dto.BookDTO; +import io.modules.item.service.DictService; +import io.modules.item.service.BookService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import io.swagger.v3.oas.annotations.Parameter; + +import java.util.List; +import java.util.Map; + + +@RestController +@RequestMapping("/api/book") +@CrossOrigin +@Tag(name="书籍") +public class BookController { + @Autowired + private BookService bookService; + + @Login + @GetMapping("page") + @Operation(summary = "分页") + public Result> page(@Parameter(hidden = true) @RequestParam Map params, @Parameter(hidden = true) @LoginUser UserEntity user){ + params.put("userId",user.getId().toString()); + PageData page = bookService.page(params); + return new Result>().ok(page); + } + + @Login + @PostMapping + @Operation(summary = "保存") + public Result save(@RequestBody BookDTO dto, @Parameter(hidden = true) @LoginUser UserEntity user){ + //效验数据 + dto.setUserId(user.getId()); + ValidatorUtils.validateEntity(dto, AddGroup.class, DefaultGroup.class); + bookService.save(dto); + return new Result(); + } + + +} diff --git a/front/src/main/java/io/controller/CartController.java b/front/src/main/java/io/controller/CartController.java new file mode 100644 index 0000000..cf4b045 --- /dev/null +++ b/front/src/main/java/io/controller/CartController.java @@ -0,0 +1,113 @@ +package io.controller; + + +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.dto.CartDTO; +import io.modules.item.dto.HouseDTO; +import io.modules.item.service.CartService; +import io.modules.item.service.HouseService; +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.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.*; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + + +/** + * 购物车 + * + * @author Mark # + * @since 1.0.0 2025-03-12 + */ +@RestController +@RequestMapping("api/cart") +@Tag(name="购物车") +@CrossOrigin +public class CartController { + @Autowired + private CartService cartService; + @Value("${upload.url}") + private String uploadUrl; + @Autowired + private HouseService itemService; + + @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") + }) + @Login + public Result> page(@Parameter(hidden = true) @RequestParam Map params,@Parameter(hidden = true) @RequestAttribute("userId") Long userId){ + params.put("userId",userId.toString()); + PageData page = cartService.page(params); + + List collect = page.getList().stream().map(e -> { + Long productId = e.getProductId(); + HouseDTO itemDTO = itemService.get(productId); + if (itemDTO != null) { + itemDTO.setImage(uploadUrl + itemDTO.getImage()); + e.setItem(itemDTO); + } + return e; + }).collect(Collectors.toList()); + page.setList(collect); + return new Result>().ok(page); + } + @GetMapping("{id}") + @Operation(summary = "信息") + public Result get(@PathVariable("id") Long id){ + CartDTO data = cartService.get(id); + + return new Result().ok(data); + } + + @PostMapping + @Operation(summary = "保存") + @Login + public Result save(@RequestBody CartDTO dto,@Parameter(hidden = true) @RequestAttribute("userId") Long userId){ + dto.setUserId(userId); + //效验数据 + ValidatorUtils.validateEntity(dto, AddGroup.class, DefaultGroup.class); + cartService.save(dto); + return new Result(); + } + + @PutMapping + @Operation(summary = "修改") + public Result update(@RequestBody CartDTO dto){ + //效验数据 + ValidatorUtils.validateEntity(dto, UpdateGroup.class, DefaultGroup.class); + cartService.update(dto); + return new Result(); + } + + + @DeleteMapping("{id}") + @Operation(summary = "删除") + public Result delete(@PathVariable Long id) { + Long[] ids = new Long[]{id}; + //效验数据 + AssertUtils.isArrayEmpty(ids, "id"); + cartService.delete(ids); + return new Result(); + } + +} diff --git a/front/src/main/java/io/controller/CategoriesController.java b/front/src/main/java/io/controller/CategoriesController.java new file mode 100644 index 0000000..ab427bc --- /dev/null +++ b/front/src/main/java/io/controller/CategoriesController.java @@ -0,0 +1,97 @@ +package io.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.CategoriesDTO; +import io.modules.item.service.CategoriesService; +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.web.bind.annotation.*; + +import java.util.Map; + + +/** + * 商品分类表 + * + * @author Mark # + * @since 1.0.0 2025-02-13 + */ +@RestController +@RequestMapping("api/categories") +@Tag(name="商品分类表") +@CrossOrigin +public class CategoriesController { + @Autowired + private CategoriesService categoriesService; + + @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 = categoriesService.page(params); + return new Result>().ok(page); + } + + @GetMapping("{id}") + + public Result get(@PathVariable("id") Long id){ + CategoriesDTO data = categoriesService.get(id); + return new Result().ok(data); + } + + @PostMapping + @Operation(summary = "保存") + + public Result save(@RequestBody CategoriesDTO dto){ + //效验数据 + ValidatorUtils.validateEntity(dto, AddGroup.class, DefaultGroup.class); + + categoriesService.save(dto); + + return new Result(); + } + + @PutMapping + @Operation(summary = "修改") + + public Result update(@RequestBody CategoriesDTO dto){ + //效验数据 + ValidatorUtils.validateEntity(dto, UpdateGroup.class, DefaultGroup.class); + + categoriesService.update(dto); + + return new Result(); + } + + @DeleteMapping("{id}") + @Operation(summary = "删除") + + public Result delete(@PathVariable Long id){ + + Long[] ids = new Long[] { id }; + //效验数据 + AssertUtils.isArrayEmpty(ids, "id"); + categoriesService.delete(ids); + return new Result(); + } + + + +} diff --git a/front/src/main/java/io/controller/CommentController.java b/front/src/main/java/io/controller/CommentController.java new file mode 100644 index 0000000..ba2a2a4 --- /dev/null +++ b/front/src/main/java/io/controller/CommentController.java @@ -0,0 +1,106 @@ +package io.controller; + + +import io.annotation.Login; +import io.annotation.LoginUser; +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.entity.UserEntity; +import io.modules.item.dto.CommentDTO; +import io.modules.item.service.CommentService; +import io.modules.item.service.DictService; +import io.service.UserService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.enums.ParameterIn; +import io.swagger.v3.oas.annotations.tags.Tag; + +import lombok.AllArgsConstructor; +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 java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + + +/** + * 评论表 + */ +@RestController +@RequestMapping("/api/comment") +@AllArgsConstructor +@Tag(name="评论表") +@CrossOrigin +public class CommentController { + private final CommentService commentService; + private final UserService userService; + private final DictService dictService; + + @GetMapping("list") + @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 = "itemId", description = "关联编号", in = ParameterIn.QUERY, ref="String") + }) + public Result> page(@Parameter(hidden = true) @RequestParam Map params){ + + List page = commentService.list(params); + List updatedPage = page.stream() + .map(comment -> { + Long userId = comment.getUserId(); + // 如果缓存中已经存在该用户的信息,直接使用 + UserEntity userInfo = userService.getUserByUserId(userId); + if (userInfo != null) { + // 否则调用 userService 获取用户信息并缓存 + String nickName = userService.getUserByUserId(userId).getNickName(); + comment.setNickName(nickName); // 设置昵称 + } + return comment; + }) + .collect(Collectors.toList()); + return new Result>().ok(updatedPage); + } + + @Login + @PostMapping + @Operation(summary = "保存") + public Result save(@RequestBody CommentDTO dto,@Parameter(hidden = true) @LoginUser UserEntity user){ + //效验数据 + dto.setUserId(user.getId()); + ValidatorUtils.validateEntity(dto, AddGroup.class, DefaultGroup.class); + +// List contentExistsList = dictService.isExistsList(dto.getContent()); +// if (!contentExistsList.isEmpty()){ +// return new Result().error("内容出现敏感词:"+ contentExistsList); +// } + + commentService.save(dto); + return new Result(); + } +// +// +// @DeleteMapping +// @Operation(summary = "删除") +// @LogOperation("删除") +// @RequiresPermissions("item:comment:delete") +// public Result delete(@RequestBody Long[] ids){ +// //效验数据 +// AssertUtils.isArrayEmpty(ids, "id"); +// +// commentService.delete(ids); +// +// return new Result(); +// } + + +} diff --git a/front/src/main/java/io/controller/ItemController.java b/front/src/main/java/io/controller/ItemController.java new file mode 100644 index 0000000..3bfab64 --- /dev/null +++ b/front/src/main/java/io/controller/ItemController.java @@ -0,0 +1,187 @@ +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.ItemDao; +import io.modules.item.dto.HouseDTO; +import io.modules.item.dto.OrderDTO; +import io.modules.item.entity.HouseEntity; +import io.modules.item.service.HouseService; +import io.modules.item.service.OrderService; +import io.modules.item.service.UserBehaviorService; +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; + + +@CrossOrigin +@RestController +@RequestMapping("/api/item") +@Tag(name = "主表") +public class ItemController { + @Autowired + private HouseService houseService; + + @Autowired + private ItemDao itemDao; + + @Autowired + private OrderService orderService; + @Autowired + private UserBehaviorService userBehaviorService; + + + + + @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 = "status", description = "排序方式,可选值(asc、desc)", in = ParameterIn.QUERY, ref = "String"), + @Parameter(name = "view", description = "预览排序", in = ParameterIn.QUERY, ref = "String"), + }) + public Result> page(@Parameter(hidden = true) @RequestParam Map params) { + + PageData page = houseService.page(params); + List list = page.getList().stream().map(e -> { + + // 获取评价信息 + List orderEntityList = orderService.getCommintList(e.getId()); + e.setOrderEntityList(orderEntityList); + return e; + }).collect(Collectors.toList()); + page.setList(list); + return new Result>().ok(page); + } + + + @Login + @GetMapping("push") + @Operation(summary = "分页") + public Result> page(@Parameter(hidden = true) @RequestParam Map params,@Parameter(hidden = true) @RequestAttribute("userId") Long userId) { + params.put("userId",userId.toString()); + List page = houseService.list(params); + List list = page.stream().map(e -> { + // 获取评价信息 + List orderEntityList = orderService.getCommintList(e.getId()); + e.setOrderEntityList(orderEntityList); + return e; + }).collect(Collectors.toList()); + return new Result>().ok(list); + } + + + + + @Login + @GetMapping("list") + @Operation(summary = "查询收藏") + public Result> list(@Parameter(hidden = true) @RequestAttribute("userId") Long userId) { + List page = houseService.listUser(userId); + List list = page.stream().map(e -> { + return e; + }).collect(Collectors.toList()); + return new Result>().ok(list); + } + + @GetMapping("hex") + public Result hex(@RequestParam String hexId) { + LambdaQueryWrapper lwq = new LambdaQueryWrapper<>(); + lwq.eq(HouseEntity::getHex, hexId); + List itemEntities = itemDao.selectList(lwq); + if (itemEntities.isEmpty()) { + return new Result().error("查询不到相关商品"); + } + HouseEntity itemEntity = itemEntities.get(0); + + return new Result().ok(itemEntity); + } + + // 分析 + @GetMapping("score") + @Operation(summary = "评分人数排行") + public Result> score() { + List list = houseService.score(); + List res = list.stream().map(e -> { + + return e; + }).collect(Collectors.toList()); + return new Result>().ok(res); + } + + // 分析 + @GetMapping("commit") + @Operation(summary = "评论人数排行") + public Result> commit() { + List list = houseService.commit(); + List res = list.stream().map(e -> { + + return e; + }).collect(Collectors.toList()); + return new Result>().ok(res); + } + + @GetMapping("{id}") + @Operation(summary = "信息") + public Result get(@PathVariable("id") Long id) { + + //获取详情 + HouseDTO data = houseService.get(id); + // 添加预览 + data.setView(data.getView() + 1); +// 更新 + houseService.update(data); + + //是否收藏 + data.setIsFavorite(userBehaviorService.getIsFavorite(data.getId(), 1)); + return new Result().ok(data); + } + + @PostMapping + @Operation(summary = "保存") + public Result save(@RequestBody HouseDTO dto) { + //效验数据 + ValidatorUtils.validateEntity(dto, AddGroup.class, DefaultGroup.class); + houseService.save(dto); + return new Result(); + } + + @PutMapping + @Operation(summary = "修改") + public Result update(@RequestBody HouseDTO dto) { //效验数据 + ValidatorUtils.validateEntity(dto, UpdateGroup.class, DefaultGroup.class); + + + houseService.update(dto); + return new Result(); + } + + @DeleteMapping + @Operation(summary = "删除") + public Result delete(@RequestBody Long[] ids) { + //效验数据 + AssertUtils.isArrayEmpty(ids, "id"); + houseService.delete(ids); + return new Result(); + } +} diff --git a/front/src/main/java/io/controller/OrderController.java b/front/src/main/java/io/controller/OrderController.java new file mode 100644 index 0000000..8c3aae6 --- /dev/null +++ b/front/src/main/java/io/controller/OrderController.java @@ -0,0 +1,198 @@ +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.modules.item.dao.ItemDao; +import io.modules.item.dao.OrderDao; +import io.modules.item.dto.*; +import io.modules.item.entity.HouseEntity; +import io.modules.item.entity.OrderEntity; +import io.modules.item.service.*; +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.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.*; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.*; +import java.util.stream.Collectors; +/** + * 订单表 + */ +@RestController +@RequestMapping("/api/order") +@Tag(name="订单表") +@CrossOrigin +public class OrderController { + @Autowired + private OrderService orderService; + + + @Autowired + private UserService userService; + + @Autowired + private OrderDao orderDao; + @Autowired + private ItemDao itemDao; + @Autowired + private HouseService itemService; + + @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) @RequestAttribute("userId") Long userId,@Parameter(hidden = true) @RequestParam Map params){ + params.put("userId",userId); + PageData page = orderService.page(params); + List collect = page.getList().stream().map(e -> { + //拼接商品名称 + HouseDTO itemDTO = itemService.get(e.getItemId()); + if (itemDTO != null) { + e.setItem(itemDTO); + } + HouseDTO houseDTO = itemService.get(e.getUserHouseId()); + if (itemDTO != null) { + e.setItemA(houseDTO); + } + return e; // 返回修改后的对象 + }).collect(Collectors.toList()); + page.setList(collect); + return new Result>().ok(page); + } + + + @Login + @GetMapping("list") + public Result> list(@Parameter(hidden = true) @RequestAttribute("userId") Long userId){ + + //查询用户下所有房源信息 + LambdaQueryWrapper lwq = new LambdaQueryWrapper<>(); + lwq.eq(HouseEntity::getUserId,userId); + List houseEntities = itemDao.selectList(lwq); + if (houseEntities.isEmpty()){ + return new Result>().ok(new ArrayList<>()); + } + + List idList = houseEntities.stream() + .map(HouseEntity::getId) + .collect(Collectors.toList()); + + + List orderEntities = new ArrayList<>(); + //查询订单中是否存在房源 + for (Long aLong : idList) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(OrderEntity::getItemId,aLong); + List orderEntityList = orderDao.selectList(wrapper); + orderEntities.addAll(orderEntityList); + } + + + if (orderEntities.isEmpty()){ + return new Result>().ok(new ArrayList<>()); + } + + + ArrayList list = new ArrayList<>(); + for (OrderEntity orderEntity : orderEntities) { + + OrderDTO orderDTO = new OrderDTO(); + BeanUtils.copyProperties(orderEntity,orderDTO); + //申请人用户信息 + Long itemUserId = orderEntity.getItemUserId(); + UserDTO userDTO = userService.get(itemUserId); + orderDTO.setUser(userDTO); + //申请人房源信息 + Long userHouseId = orderEntity.getUserHouseId(); + HouseDTO houseDTO = itemService.get(userHouseId); + orderDTO.setItem(houseDTO); + list.add(orderDTO); + } + return new Result>().ok(list); + } + + @GetMapping("hex") + @Operation(summary = "信息") + public Result get(@RequestParam("hex") String hex){ + HexDto hexDto = new HexDto(); + //通过hex查询订单 + LambdaQueryWrapper lwq = new LambdaQueryWrapper<>(); + lwq.eq(OrderEntity::getHex,hex); + OrderEntity orderEntity = orderDao.selectOne(lwq); + if (orderEntity ==null){ + return new Result().error("查询不到相关信息"); + } + //可以查到 + //1.A用户信息和房源编号 甲 + Long itemIdA = orderEntity.getItemId(); + hexDto.setHouseA(itemService.get(itemIdA)); + Long itemUserIdA = orderEntity.getItemUserId(); + hexDto.setUserA(userService.get(itemUserIdA)); + //2.B用户信息和房源编号 乙 + Long userIdB = orderEntity.getUserId(); + hexDto.setUserB(userService.get(userIdB)); + Long userHouseIdB = orderEntity.getUserHouseId(); + hexDto.setHouseB(itemService.get(userHouseIdB)); + hexDto.setDto(orderEntity); + return new Result().ok(hexDto); + } + + @GetMapping("{id}") + @Operation(summary = "信息") + public Result get(@PathVariable("id") Long id){ + OrderDTO data = orderService.get(id); + return new Result().ok(data); + } + + @PostMapping + @Operation(summary = "保存") + @Login + public Result save(@RequestBody OrderDTO dto,@Parameter(hidden = true) @RequestAttribute("userId") Long userId){ + dto.setUserId(userId); + //判断是否已经申请 + LambdaQueryWrapper lwq = new LambdaQueryWrapper<>(); + lwq.eq(OrderEntity::getUserId,userId); + lwq.eq(OrderEntity::getItemId,dto.getItemId()); + if (orderDao.exists(lwq)){ + return new Result().error("不能重复申请"); + } + //房源用户编号 + Long itemId = dto.getItemId(); + HouseDTO houseDTO = itemService.get(itemId); + dto.setItemUserId(houseDTO.getUserId()); + orderService.save(dto); + return new Result(); + } + @PutMapping + @Operation(summary = "修改") + public Result update(@RequestBody OrderDTO dto){ + orderService.update(dto); + return new Result(); + } + @DeleteMapping("{id}") + @Operation(summary = "删除") + public Result delete(@PathVariable Long id) { + Long[] ids = new Long[]{id}; + //效验数据 + AssertUtils.isArrayEmpty(ids, "id"); + orderService.delete(ids); + return new Result(); + } + +} diff --git a/front/src/main/java/io/controller/SlidesFrontController.java b/front/src/main/java/io/controller/SlidesFrontController.java new file mode 100644 index 0000000..359f3a9 --- /dev/null +++ b/front/src/main/java/io/controller/SlidesFrontController.java @@ -0,0 +1,101 @@ +package io.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.SlidesDTO; +import io.modules.item.service.SlidesService; +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/slides") +@Tag(name= "轮播图") +@CrossOrigin +public class SlidesFrontController { + @Autowired + private SlidesService slidesService; + + @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"), + @Parameter(name = "type", description = "类型", in = ParameterIn.QUERY, ref="String") + }) + public Result> page(@Parameter(hidden = true) @RequestParam Map params){ + PageData page = slidesService.page(params); + + List list = page.getList().stream().map(e -> { + e.setPath(uploadUrl + e.getPath()); + return e; + }).collect(Collectors.toList()); + + page.setList(list); + return new Result>().ok(page); + } + + @GetMapping("{id}") + @Operation(summary = "信息") + public Result get(@PathVariable("id") Long id){ + SlidesDTO data = slidesService.get(id); + + return new Result().ok(data); + } + + @PostMapping + @Operation(summary = "保存") + public Result save(@RequestBody SlidesDTO dto){ + //效验数据 + ValidatorUtils.validateEntity(dto, AddGroup.class, DefaultGroup.class); + + slidesService.save(dto); + + return new Result(); + } + + @PutMapping + @Operation(summary = "修改") + public Result update(@RequestBody SlidesDTO dto){ + //效验数据 + ValidatorUtils.validateEntity(dto, UpdateGroup.class, DefaultGroup.class); + + slidesService.update(dto); + + return new Result(); + } + + @DeleteMapping + @Operation(summary = "删除") + public Result delete(@RequestBody Long[] ids){ + //效验数据 + AssertUtils.isArrayEmpty(ids, "id"); + slidesService.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..8f6f1b5 --- /dev/null +++ b/front/src/main/java/io/controller/UploadController.java @@ -0,0 +1,41 @@ +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; + + @Value("${upload.url}") + private String uploadUrl; + @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 = uploadUrl + originFileName; + HashMap map = new HashMap<>(); + map.put("path",url); + map.put("absolute","upload/" + originFileName); + return new Result<>().ok(map); + } +} diff --git a/front/src/main/java/io/controller/UserBehaviorController.java b/front/src/main/java/io/controller/UserBehaviorController.java new file mode 100644 index 0000000..5771c95 --- /dev/null +++ b/front/src/main/java/io/controller/UserBehaviorController.java @@ -0,0 +1,83 @@ +package io.controller; + + +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.dto.UserBehaviorDTO; +import io.modules.item.service.UserBehaviorService; +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.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; + + +/** + * 用户行为表 + * + * @author Mark # + * @since 1.0.0 2024-12-16 + */ +@RestController +@RequestMapping("/api/behavior") +@CrossOrigin +@Tag(name="用户行为表") +public class UserBehaviorController { + @Autowired + private UserBehaviorService userBehaviorService; + + @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){ + List page = userBehaviorService.list(params); + return new Result>().ok(page); + } + + @Login + @PostMapping("exists") + @Operation(summary = "查看是否收藏") + public Result get(@RequestBody UserBehaviorDTO dto,@Parameter(hidden = true) @RequestAttribute("userId") Long userId){ + dto.setUserId(userId); + return new Result().ok(userBehaviorService.isExists(dto)); + } + @Login + @PostMapping + @Operation(summary = "添加") + public Result save(@RequestBody UserBehaviorDTO dto,@Parameter(hidden = true) @RequestAttribute("userId") Long userId){ + //效验数据 + dto.setUserId(userId); + ValidatorUtils.validateEntity(dto, AddGroup.class, DefaultGroup.class); + userBehaviorService.save(dto); + return new Result(); + } + + @Login + @PostMapping("delete") + @Operation(summary = "删除") + public Result delete(@RequestBody UserBehaviorDTO dto,@Parameter(hidden = true) @RequestAttribute("userId") Long userId){ + dto.setUserId(userId); + //效验数据 + userBehaviorService.deleteUserBehavior(dto); + return new Result(); + } + +} 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..578b3f8 --- /dev/null +++ b/front/src/main/java/io/controller/UserController.java @@ -0,0 +1,104 @@ +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.dto.LoginDTO; +import io.dto.RegisterDTO; +import io.entity.UserEntity; +import io.service.TokenService; +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.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) { + //表单校验 + 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.getNickName()); + 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); + } + + @PutMapping("update") + @Operation(summary = "修改信息") + public Result update(@RequestBody RegisterDTO dto) { + //表单校验 + ValidatorUtils.validateEntity(dto); + UserEntity user = new UserEntity(); + user.setId(dto.getId()); + user.setUsername(dto.getUsername()); + user.setNickName(dto.getNickName()); + user.setIntroduce(dto.getIntroduce()); + 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/dao/UserDao.java b/front/src/main/java/io/dao/UserDao.java new file mode 100644 index 0000000..5e5dfd0 --- /dev/null +++ b/front/src/main/java/io/dao/UserDao.java @@ -0,0 +1,16 @@ +package io.dao; + +import io.common.dao.BaseDao; +import io.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/front/src/main/java/io/dto/LoginDTO.java b/front/src/main/java/io/dto/LoginDTO.java new file mode 100644 index 0000000..6c17d35 --- /dev/null +++ b/front/src/main/java/io/dto/LoginDTO.java @@ -0,0 +1,22 @@ +package io.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/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..d6b5b24 --- /dev/null +++ b/front/src/main/java/io/entity/TokenEntity.java @@ -0,0 +1,41 @@ + + +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/entity/UserEntity.java b/front/src/main/java/io/entity/UserEntity.java new file mode 100644 index 0000000..b7ba927 --- /dev/null +++ b/front/src/main/java/io/entity/UserEntity.java @@ -0,0 +1,50 @@ + + +package io.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/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..4933cd2 --- /dev/null +++ b/front/src/main/java/io/interceptor/AuthorizationInterceptor.java @@ -0,0 +1,58 @@ +package io.interceptor; + +import cn.hutool.core.util.StrUtil; +import io.annotation.Login; +import io.common.exception.ErrorCode; +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..262e8b7 --- /dev/null +++ b/front/src/main/java/io/resolver/LoginUserHandlerMethodArgumentResolver.java @@ -0,0 +1,44 @@ +package io.resolver; + +import io.annotation.LoginUser; +import io.entity.UserEntity; +import io.interceptor.AuthorizationInterceptor; +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..62a795c --- /dev/null +++ b/front/src/main/java/io/service/UserService.java @@ -0,0 +1,26 @@ + + +package io.service; + +import io.common.service.BaseService; +import io.entity.UserEntity; +import io.dto.LoginDTO; + +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..36a8487 --- /dev/null +++ b/front/src/main/java/io/service/impl/UserServiceImpl.java @@ -0,0 +1,51 @@ +package io.service.impl; + +import cn.hutool.crypto.digest.DigestUtil; +import io.common.exception.ErrorCode; +import io.common.exception.RenException; +import io.common.service.impl.BaseServiceImpl; +import io.common.validator.AssertUtils; +import io.dao.UserDao; +import io.dto.LoginDTO; +import io.entity.TokenEntity; +import io.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..c48514e --- /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_house?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:/202505/block-chaincopyright/upload/" +upload: + path: D:\202505\block-chaincopyright\upload + url: http://localhost:18081/ diff --git a/front/src/main/resources/application.yml b/front/src/main/resources/application.yml new file mode 100644 index 0000000..170a6f0 --- /dev/null +++ b/front/src/main/resources/application.yml @@ -0,0 +1,59 @@ +# 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: + 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-plus: + mapper-locations: classpath*:/mapper/**/*.xml + + typeAliasesPackage: io.renren.entity + global-config: + db-config: + id-type: ASSIGN_ID + 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/BookService.xml b/front/src/main/resources/mapper/BookService.xml new file mode 100644 index 0000000..34f924b --- /dev/null +++ b/front/src/main/resources/mapper/BookService.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..9a0e1b1 --- /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..e568ab3 --- /dev/null +++ b/pom.xml @@ -0,0 +1,142 @@ + + 4.0.0 + io.renren + block-chaincopyright + 5.4.0 + pom + + admin-ui + 后台模板 + + 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..98b2f82 --- /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..90cfc2e --- /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/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..9b2a6c0 --- /dev/null +++ b/ui/package.json @@ -0,0 +1,119 @@ +{ + "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", + "@wangeditor/editor": "^5.1.23", + "@wangeditor/editor-for-vue": "^5.1.12", + "element-plus": "^2.9.2", + "save": "^2.9.0", + "scss": "^0.2.4", + "use-element-plus-theme": "^0.0.5", + "v-charts": "^1.19.0", + "vite-plugin-theme": "^0.8.6" + } +} diff --git a/ui/pnpm-lock.yaml b/ui/pnpm-lock.yaml new file mode 100644 index 0000000..81f8fab --- /dev/null +++ b/ui/pnpm-lock.yaml @@ -0,0 +1,8598 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@element-plus/icons-vue': + specifier: ^2.3.1 + version: 2.3.1(vue@3.5.13(typescript@5.7.3)) + '@wangeditor/editor': + specifier: ^5.1.23 + version: 5.1.23 + '@wangeditor/editor-for-vue': + specifier: ^5.1.12 + version: 5.1.12(@wangeditor/editor@5.1.23)(vue@3.5.13(typescript@5.7.3)) + element-plus: + specifier: ^2.9.2 + version: 2.9.4(vue@3.5.13(typescript@5.7.3)) + save: + specifier: ^2.9.0 + version: 2.9.0 + scss: + specifier: ^0.2.4 + version: 0.2.4 + use-element-plus-theme: + specifier: ^0.0.5 + version: 0.0.5(@types/node@20.17.17)(rollup@4.34.6)(typescript@5.7.3)(vite@5.4.14(@types/node@20.17.17)(lightningcss@1.29.1)(terser@5.38.1)) + v-charts: + specifier: ^1.19.0 + version: 1.19.0(echarts@5.6.0)(vue@3.5.13(typescript@5.7.3))(zrender@5.6.1) + vite-plugin-theme: + specifier: ^0.8.6 + version: 0.8.6(vite@5.4.14(@types/node@20.17.17)(lightningcss@1.29.1)(terser@5.38.1)) + devDependencies: + '@types/ityped': + specifier: ^1.0.3 + version: 1.0.3 + '@types/node': + specifier: ^20.12.7 + version: 20.17.17 + '@typescript-eslint/parser': + specifier: 7.8.0 + version: 7.8.0(eslint@8.57.0)(typescript@5.7.3) + '@unocss/eslint-config': + specifier: 0.59.4 + version: 0.59.4(eslint@8.57.0)(typescript@5.7.3) + '@unocss/reset': + specifier: ^0.59.4 + version: 0.59.4 + '@vitejs/plugin-vue': + specifier: ^5.0.4 + version: 5.2.1(vite@5.4.14(@types/node@20.17.17)(lightningcss@1.29.1)(terser@5.38.1))(vue@3.5.13(typescript@5.7.3)) + '@vitejs/plugin-vue-jsx': + specifier: ^3.1.0 + version: 3.1.0(vite@5.4.14(@types/node@20.17.17)(lightningcss@1.29.1)(terser@5.38.1))(vue@3.5.13(typescript@5.7.3)) + '@vueuse/components': + specifier: ^10.9.0 + version: 10.11.1(vue@3.5.13(typescript@5.7.3)) + '@vueuse/core': + specifier: ^10.9.0 + version: 10.11.1(vue@3.5.13(typescript@5.7.3)) + '@vueuse/integrations': + specifier: ^10.9.0 + version: 10.11.1(async-validator@4.2.5)(axios@1.7.9)(change-case@4.1.2)(nprogress@0.2.0)(vue@3.5.13(typescript@5.7.3)) + axios: + specifier: ^1.6.8 + version: 1.7.9 + browserslist: + specifier: ^4.23.0 + version: 4.24.4 + c8: + specifier: ^9.1.0 + version: 9.1.0 + changelogen: + specifier: ^0.5.5 + version: 0.5.7 + consola: + specifier: ^3.2.3 + version: 3.4.0 + 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.6.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.5.0) + eslint-plugin-vue: + specifier: ^9.25.0 + version: 9.32.0(eslint@8.57.0) + fs-extra: + specifier: ^11.2.0 + version: 11.3.0 + husky: + specifier: ^9.0.11 + version: 9.1.7 + 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.29.1 + lint-staged: + specifier: ^15.2.2 + version: 15.4.3 + local-pkg: + specifier: ^0.5.0 + version: 0.5.1 + 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.3.1(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3)) + pinia-plugin-persistedstate: + specifier: ^3.2.1 + version: 3.2.3(pinia@2.3.1(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3))) + plop: + specifier: ^4.0.1 + version: 4.0.1 + prettier: + specifier: ^3.2.5 + version: 3.5.0 + prism-theme-vars: + specifier: ^0.2.5 + version: 0.2.5 + simple-git: + specifier: ^3.24.0 + version: 3.27.0 + taze: + specifier: ^0.13.7 + version: 0.13.9 + terser: + specifier: ^5.31.0 + version: 5.38.1 + typescript: + specifier: ^5.4.5 + version: 5.7.3 + unocss: + specifier: ^0.59.4 + version: 0.59.4(postcss@8.5.2)(rollup@4.34.6)(vite@5.4.14(@types/node@20.17.17)(lightningcss@1.29.1)(terser@5.38.1)) + unplugin-auto-import: + specifier: ^0.17.5 + version: 0.17.8(@vueuse/core@10.11.1(vue@3.5.13(typescript@5.7.3)))(rollup@4.34.6) + unplugin-vue-components: + specifier: ^0.26.0 + version: 0.26.0(@babel/parser@7.26.8)(rollup@4.34.6)(vue@3.5.13(typescript@5.7.3)) + unplugin-vue-markdown: + specifier: ^0.26.2 + version: 0.26.3(rollup@4.34.6)(vite@5.4.14(@types/node@20.17.17)(lightningcss@1.29.1)(terser@5.38.1)) + unplugin-vue-router: + specifier: ^0.8.6 + version: 0.8.8(rollup@4.34.6)(vue-router@4.5.0(vue@3.5.13(typescript@5.7.3)))(vue@3.5.13(typescript@5.7.3)) + vite: + specifier: ^5.2.10 + version: 5.4.14(@types/node@20.17.17)(lightningcss@1.29.1)(terser@5.38.1) + vite-auto-import-resolvers: + specifier: ^3.2.1 + version: 3.2.1(unplugin-auto-import@0.17.8(@vueuse/core@10.11.1(vue@3.5.13(typescript@5.7.3)))(rollup@4.34.6))(vite@5.4.14(@types/node@20.17.17)(lightningcss@1.29.1)(terser@5.38.1)) + vite-layers: + specifier: ^0.5.2 + version: 0.5.2(vite@5.4.14(@types/node@20.17.17)(lightningcss@1.29.1)(terser@5.38.1)) + vite-plugin-compression: + specifier: ^0.5.1 + version: 0.5.1(vite@5.4.14(@types/node@20.17.17)(lightningcss@1.29.1)(terser@5.38.1)) + vite-plugin-env-types: + specifier: ^0.1.4 + version: 0.1.4(vite@5.4.14(@types/node@20.17.17)(lightningcss@1.29.1)(terser@5.38.1)) + vite-plugin-legacy-swc: + specifier: ^1.1.0 + version: 1.2.3(vite@5.4.14(@types/node@20.17.17)(lightningcss@1.29.1)(terser@5.38.1)) + vite-plugin-use-modules: + specifier: ^1.4.8 + version: 1.4.8(vite@5.4.14(@types/node@20.17.17)(lightningcss@1.29.1)(terser@5.38.1))(vue@3.5.13(typescript@5.7.3)) + vite-plugin-vue-devtools: + specifier: ^7.1.3 + version: 7.7.1(rollup@4.34.6)(vite@5.4.14(@types/node@20.17.17)(lightningcss@1.29.1)(terser@5.38.1))(vue@3.5.13(typescript@5.7.3)) + vite-plugin-vue-meta-layouts: + specifier: ^0.4.3 + version: 0.4.3(vite@5.4.14(@types/node@20.17.17)(lightningcss@1.29.1)(terser@5.38.1))(vue-router@4.5.0(vue@3.5.13(typescript@5.7.3))) + vitest: + specifier: ^1.5.3 + version: 1.6.1(@types/node@20.17.17)(lightningcss@1.29.1)(terser@5.38.1) + vue: + specifier: ^3.4.26 + version: 3.5.13(typescript@5.7.3) + vue-echarts: + specifier: ^6.7.1 + version: 6.7.3(@vue/runtime-core@3.5.13)(echarts@5.6.0)(vue@3.5.13(typescript@5.7.3)) + vue-request: + specifier: 2.0.4 + version: 2.0.4(vue@3.5.13(typescript@5.7.3)) + vue-router: + specifier: ^4.3.2 + version: 4.5.0(vue@3.5.13(typescript@5.7.3)) + vue-toastification: + specifier: 2.0.0-rc.5 + version: 2.0.0-rc.5(vue@3.5.13(typescript@5.7.3)) + +packages: + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@antfu/install-pkg@1.0.0': + resolution: {integrity: sha512-xvX6P/lo1B3ej0OsaErAjqgFYzYVcJpamjLAFLYh9vRJngBrMoUG7aVnrGTeqM7yxbyTD5p3F2+0/QUEh8Vzhw==} + + '@antfu/ni@0.21.12': + resolution: {integrity: sha512-2aDL3WUv8hMJb2L3r/PIQWsTLyq7RQr3v9xD16fiz6O8ys1xEyLhhTOv8gxtZvJiTzjTF5pHoArvRdesGL1DMQ==} + hasBin: true + + '@antfu/utils@0.7.10': + resolution: {integrity: sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==} + + '@antfu/utils@8.1.0': + resolution: {integrity: sha512-XPR7Jfwp0FFl/dFYPX8ZjpmU4/1mIXTjnZ1ba48BLMyKOV62/tiRjdsFcPs2hsYcSud4tzk7w3a3LjX8Fu3huA==} + + '@babel/code-frame@7.26.2': + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.26.8': + resolution: {integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.26.8': + resolution: {integrity: sha512-l+lkXCHS6tQEc5oUpK28xBOZ6+HwaH7YwoYQbLFiYb4nS2/l1tKnZEtEWkD0GuiYdvArf9qBS0XlQGXzPMsNqQ==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.26.8': + resolution: {integrity: sha512-ef383X5++iZHWAXX0SXQR6ZyQhw/0KtTkrTz61WXRhFM6dhpHulO/RJz79L8S6ugZHJkOOkUrUdxgdF2YiPFnA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-annotate-as-pure@7.25.9': + resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.26.5': + resolution: {integrity: sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-create-class-features-plugin@7.25.9': + resolution: {integrity: sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-member-expression-to-functions@7.25.9': + resolution: {integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.25.9': + resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.26.0': + resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-optimise-call-expression@7.25.9': + resolution: {integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-plugin-utils@7.26.5': + resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-replace-supers@7.26.5': + resolution: {integrity: sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-skip-transparent-expression-wrappers@7.25.9': + resolution: {integrity: sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.25.9': + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.25.9': + resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.26.7': + resolution: {integrity: sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.26.8': + resolution: {integrity: sha512-TZIQ25pkSoaKEYYaHbbxkfL36GNsQ6iFiBbeuzAkLnXayKR1yP1zFe+NxuZWWsUyvt8icPU9CCq0sgWGXR1GEw==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-proposal-decorators@7.25.9': + resolution: {integrity: sha512-smkNLL/O1ezy9Nhy4CNosc4Va+1wo5w4gzSZeLe6y6dM4mmHfYOCPolXQPHQxonZCF+ZyebxN9vqOolkYrSn5g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-decorators@7.25.9': + resolution: {integrity: sha512-ryzI0McXUPJnRCvMo4lumIKZUzhYUO/ScI+Mz4YVaTLt04DHNSjEUjKVvbzQjZFLuod/cYEc07mJWhzl6v4DPg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-attributes@7.26.0': + resolution: {integrity: sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==} + 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.25.9': + resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.25.9': + resolution: {integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-commonjs@7.26.3': + resolution: {integrity: sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typescript@7.26.8': + resolution: {integrity: sha512-bME5J9AC8ChwA7aEPJ6zym3w7aObZULHhbNLU0bKUhKsAkylkzUdq+0kdymh9rzi8nlNFl2bmldFBCKNJBUpuw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-typescript@7.26.0': + resolution: {integrity: sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/runtime@7.26.7': + resolution: {integrity: sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.26.8': + resolution: {integrity: sha512-iNKaX3ZebKIsCvJ+0jd6embf+Aulaa3vNBqZ41kM7iTWjx5qzWKXGHiJUW3+nTpQ18SG11hdF8OAzKrpXkb96Q==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.26.8': + resolution: {integrity: sha512-nic9tRkjYH0oB2dzr/JoGIm+4Q6SuYeLEiIiZDwBscRMYFJ+tMAz98fuel9ZnbXViA2I0HVSSRRK8DW5fjXStA==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.26.8': + resolution: {integrity: sha512-eUuWapzEGWFEpHFxgEaBG8e3n6S8L3MSu0oda755rOfabWPnh0Our1AozNFVUxGFIhbKgd1ksprsoDGMinTOTA==} + 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/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.23.1': + resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==} + engines: {node: '>=18'} + 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-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.23.1': + resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==} + engines: {node: '>=18'} + 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-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.23.1': + resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.20.2': + resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.23.1': + resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==} + engines: {node: '>=18'} + 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-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.23.1': + resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==} + engines: {node: '>=18'} + 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/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.23.1': + resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.20.2': + resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.23.1': + resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==} + engines: {node: '>=18'} + 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/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.23.1': + resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==} + engines: {node: '>=18'} + 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-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.23.1': + resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.20.2': + resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.23.1': + resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.20.2': + resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.23.1': + resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==} + engines: {node: '>=18'} + 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-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.23.1': + resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==} + engines: {node: '>=18'} + 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-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.23.1': + resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==} + engines: {node: '>=18'} + 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-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.23.1': + resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==} + engines: {node: '>=18'} + 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-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.23.1': + resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==} + engines: {node: '>=18'} + 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-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.23.1': + resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==} + engines: {node: '>=18'} + 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/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.23.1': + resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.20.2': + resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.23.1': + resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.23.1': + resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.20.2': + resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.23.1': + resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==} + engines: {node: '>=18'} + 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/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.23.1': + resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==} + engines: {node: '>=18'} + 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-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.23.1': + resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==} + engines: {node: '>=18'} + 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-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.23.1': + resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.20.2': + resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.23.1': + resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.4.1': + resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} + 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.12.1': + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + 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.9': + resolution: {integrity: sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==} + + '@floating-ui/dom@1.6.13': + resolution: {integrity: sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==} + + '@floating-ui/utils@0.2.9': + resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==} + + '@humanwhocodes/config-array@0.11.14': + resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} + engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/object-schema@2.0.3': + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead + + '@iconify/types@2.0.0': + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + + '@iconify/utils@2.3.0': + resolution: {integrity: sha512-GmQ78prtwYW6EtzXRU1rY+KwOKfz32PD7iJh6Iyqw68GiKuoZ2A6pRtzWONz5VQJbp50mEjXh/7NkumtrAgRKA==} + + '@inquirer/figures@1.0.10': + resolution: {integrity: sha512-Ey6176gZmeqZuY/W/nZiUyvmb1/qInjcpiZjXWi6nON+nxJpD1bxtSoBxNliGISae32n6OwbY+TSXPZ1CfS4bw==} + engines: {node: '>=18'} + + '@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.8': + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} + 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.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@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==} + + '@mdit-vue/plugin-component@2.1.3': + resolution: {integrity: sha512-9AG17beCgpEw/4ldo/M6Y/1Rh4E1bqMmr/rCkWKmCAxy9tJz3lzY7HQJanyHMJufwsb3WL5Lp7Om/aPcQTZ9SA==} + + '@mdit-vue/plugin-frontmatter@2.1.3': + resolution: {integrity: sha512-KxsSCUVBEmn6sJcchSTiI5v9bWaoRxe68RBYRDGcSEY1GTnfQ5gQPMIsM48P4q1luLEIWurVGGrRu7u93//LDQ==} + + '@mdit-vue/types@2.1.0': + resolution: {integrity: sha512-TMBB/BQWVvwtpBdWD75rkZx4ZphQ6MN0O4QB2Bc0oI5PC2uE57QerhNxdRZ7cvBHE2iY2C+BUNUziCfJbjIRRA==} + + '@microsoft/api-extractor-model@7.28.13': + resolution: {integrity: sha512-39v/JyldX4MS9uzHcdfmjjfS6cYGAoXV+io8B5a338pkHiSt+gy2eXQ0Q7cGFJ7quSa1VqqlMdlPrB6sLR/cAw==} + + '@microsoft/api-extractor@7.43.0': + resolution: {integrity: sha512-GFhTcJpB+MI6FhvXEI9b2K0snulNLWHqC/BbcJtyNYcKUiw7l3Lgis5ApsYncJ0leALX7/of4XfmXk+maT111w==} + hasBin: true + + '@microsoft/tsdoc-config@0.16.2': + resolution: {integrity: sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==} + + '@microsoft/tsdoc@0.14.2': + resolution: {integrity: sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==} + + '@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.28': + resolution: {integrity: sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==} + + '@rollup/pluginutils@5.1.4': + resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==} + 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.34.6': + resolution: {integrity: sha512-+GcCXtOQoWuC7hhX1P00LqjjIiS/iOouHXhMdiDSnq/1DGTox4SpUvO52Xm+div6+106r+TcvOeo/cxvyEyTgg==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.34.6': + resolution: {integrity: sha512-E8+2qCIjciYUnCa1AiVF1BkRgqIGW9KzJeesQqVfyRITGQN+dFuoivO0hnro1DjT74wXLRZ7QF8MIbz+luGaJA==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.34.6': + resolution: {integrity: sha512-z9Ib+OzqN3DZEjX7PDQMHEhtF+t6Mi2z/ueChQPLS/qUMKY7Ybn5A2ggFoKRNRh1q1T03YTQfBTQCJZiepESAg==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.34.6': + resolution: {integrity: sha512-PShKVY4u0FDAR7jskyFIYVyHEPCPnIQY8s5OcXkdU8mz3Y7eXDJPdyM/ZWjkYdR2m0izD9HHWA8sGcXn+Qrsyg==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.34.6': + resolution: {integrity: sha512-YSwyOqlDAdKqs0iKuqvRHLN4SrD2TiswfoLfvYXseKbL47ht1grQpq46MSiQAx6rQEN8o8URtpXARCpqabqxGQ==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.34.6': + resolution: {integrity: sha512-HEP4CgPAY1RxXwwL5sPFv6BBM3tVeLnshF03HMhJYCNc6kvSqBgTMmsEjb72RkZBAWIqiPUyF1JpEBv5XT9wKQ==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.34.6': + resolution: {integrity: sha512-88fSzjC5xeH9S2Vg3rPgXJULkHcLYMkh8faix8DX4h4TIAL65ekwuQMA/g2CXq8W+NJC43V6fUpYZNjaX3+IIg==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm-musleabihf@4.34.6': + resolution: {integrity: sha512-wM4ztnutBqYFyvNeR7Av+reWI/enK9tDOTKNF+6Kk2Q96k9bwhDDOlnCUNRPvromlVXo04riSliMBs/Z7RteEg==} + cpu: [arm] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-arm64-gnu@4.34.6': + resolution: {integrity: sha512-9RyprECbRa9zEjXLtvvshhw4CMrRa3K+0wcp3KME0zmBe1ILmvcVHnypZ/aIDXpRyfhSYSuN4EPdCCj5Du8FIA==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm64-musl@4.34.6': + resolution: {integrity: sha512-qTmklhCTyaJSB05S+iSovfo++EwnIEZxHkzv5dep4qoszUMX5Ca4WM4zAVUMbfdviLgCSQOu5oU8YoGk1s6M9Q==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-loongarch64-gnu@4.34.6': + resolution: {integrity: sha512-4Qmkaps9yqmpjY5pvpkfOerYgKNUGzQpFxV6rnS7c/JfYbDSU0y6WpbbredB5cCpLFGJEqYX40WUmxMkwhWCjw==} + cpu: [loong64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-powerpc64le-gnu@4.34.6': + resolution: {integrity: sha512-Zsrtux3PuaxuBTX/zHdLaFmcofWGzaWW1scwLU3ZbW/X+hSsFbz9wDIp6XvnT7pzYRl9MezWqEqKy7ssmDEnuQ==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-riscv64-gnu@4.34.6': + resolution: {integrity: sha512-aK+Zp+CRM55iPrlyKiU3/zyhgzWBxLVrw2mwiQSYJRobCURb781+XstzvA8Gkjg/hbdQFuDw44aUOxVQFycrAg==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-s390x-gnu@4.34.6': + resolution: {integrity: sha512-WoKLVrY9ogmaYPXwTH326+ErlCIgMmsoRSx6bO+l68YgJnlOXhygDYSZe/qbUJCSiCiZAQ+tKm88NcWuUXqOzw==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-gnu@4.34.6': + resolution: {integrity: sha512-Sht4aFvmA4ToHd2vFzwMFaQCiYm2lDFho5rPcvPBT5pCdC+GwHG6CMch4GQfmWTQ1SwRKS0dhDYb54khSrjDWw==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-musl@4.34.6': + resolution: {integrity: sha512-zmmpOQh8vXc2QITsnCiODCDGXFC8LMi64+/oPpPx5qz3pqv0s6x46ps4xoycfUiVZps5PFn1gksZzo4RGTKT+A==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rollup/rollup-win32-arm64-msvc@4.34.6': + resolution: {integrity: sha512-3/q1qUsO/tLqGBaD4uXsB6coVGB3usxw3qyeVb59aArCgedSF66MPdgRStUd7vbZOsko/CgVaY5fo2vkvPLWiA==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.34.6': + resolution: {integrity: sha512-oLHxuyywc6efdKVTxvc0135zPrRdtYVjtVD5GUm55I3ODxhU/PwkQFD97z16Xzxa1Fz0AEe4W/2hzRtd+IfpOA==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.34.6': + resolution: {integrity: sha512-0PVwmgzZ8+TZ9oGBmdZoQVXflbvuwzN/HRclujpl4N/q3i+y0lqLw8n1bXA8ru3sApDjlmONaNAuYr38y1Kr9w==} + cpu: [x64] + os: [win32] + + '@rushstack/node-core-library@4.0.2': + resolution: {integrity: sha512-hyES82QVpkfQMeBMteQUnrhASL/KHPhd7iJ8euduwNJG4mu2GSOKybf0rOEjOm1Wz7CwJEUm9y0yD7jg2C1bfg==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true + + '@rushstack/rig-package@0.5.2': + resolution: {integrity: sha512-mUDecIJeH3yYGZs2a48k+pbhM6JYwWlgjs2Ca5f2n1G2/kgdgP9D/07oglEGf6mRyXEnazhEENeYTSNDRCwdqA==} + + '@rushstack/terminal@0.10.0': + resolution: {integrity: sha512-UbELbXnUdc7EKwfH2sb8ChqNgapUOdqcCIdQP4NGxBpTZV2sQyeekuK3zmfQSa/MN+/7b4kBogl2wq0vpkpYGw==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true + + '@rushstack/ts-command-line@4.19.1': + resolution: {integrity: sha512-J7H768dgcpG60d7skZ5uSSwyCZs/S2HrWP1Ds8d1qYAyaaeJmpmmLr9BVw97RjFzmQPOYnoXcKA4GkqDCkduQg==} + + '@sec-ant/readable-stream@0.4.1': + resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} + + '@sinclair/typebox@0.27.8': + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + + '@sindresorhus/merge-streams@4.0.0': + resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} + engines: {node: '>=18'} + + '@swc/core-darwin-arm64@1.10.15': + resolution: {integrity: sha512-zFdZ6/yHqMCPk7OhLFqHy/MQ1EqJhcZMpNHd1gXYT7VRU3FaqvvKETrUlG3VYl65McPC7AhMRfXPyJ0JO/jARQ==} + engines: {node: '>=10'} + cpu: [arm64] + os: [darwin] + + '@swc/core-darwin-x64@1.10.15': + resolution: {integrity: sha512-8g4yiQwbr8fxOOjKXdot0dEkE5zgE8uNZudLy/ZyAhiwiZ8pbJ8/wVrDOu6dqbX7FBXAoDnvZ7fwN1jk4C8jdA==} + engines: {node: '>=10'} + cpu: [x64] + os: [darwin] + + '@swc/core-linux-arm-gnueabihf@1.10.15': + resolution: {integrity: sha512-rl+eVOltl2+7WXOnvmWBpMgh6aO13G5x0U0g8hjwlmD6ku3Y9iRcThpOhm7IytMEarUp5pQxItNoPq+VUGjVHg==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux] + + '@swc/core-linux-arm64-gnu@1.10.15': + resolution: {integrity: sha512-qxWEQeyAJMWJqjaN4hi58WMpPdt3Tn0biSK9CYRegQtvZWCbewr6v2agtSu5AZ2rudeH6OfCWAMDQQeSgn6PJQ==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@swc/core-linux-arm64-musl@1.10.15': + resolution: {integrity: sha512-QcELd9/+HjZx0WCxRrKcyKGWTiQ0485kFb5w8waxcSNd0d9Lgk4EFfWWVyvIb5gIHpDQmhrgzI/yRaWQX4YSZQ==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@swc/core-linux-x64-gnu@1.10.15': + resolution: {integrity: sha512-S1+ZEEn3+a/MiMeQqQypbwTGoBG8/sPoCvpNbk+uValyygT+jSn3U0xVr45FbukpmMB+NhBMqfedMLqKA0QnJA==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@swc/core-linux-x64-musl@1.10.15': + resolution: {integrity: sha512-qW+H9g/2zTJ4jP7NDw4VAALY0ZlNEKzYsEoSj/HKi7k3tYEHjMzsxjfsY9I8WZCft23bBdV3RTCPoxCshaj1CQ==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@swc/core-win32-arm64-msvc@1.10.15': + resolution: {integrity: sha512-AhRB11aA6LxjIqut+mg7qsu/7soQDmbK6MKR9nP3hgBszpqtXbRba58lr24xIbBCMr+dpo6kgEapWt+t5Po6Zg==} + engines: {node: '>=10'} + cpu: [arm64] + os: [win32] + + '@swc/core-win32-ia32-msvc@1.10.15': + resolution: {integrity: sha512-UGdh430TQwbDn6KjgvRTg1fO022sbQ4yCCHUev0+5B8uoBwi9a89qAz3emy2m56C8TXxUoihW9Y9OMfaRwPXUw==} + engines: {node: '>=10'} + cpu: [ia32] + os: [win32] + + '@swc/core-win32-x64-msvc@1.10.15': + resolution: {integrity: sha512-XJzBCqO1m929qbJsOG7FZXQWX26TnEoMctS3QjuCoyBmkHxxQmZsy78KjMes1aomTcKHCyFYgrRGWgVmk7tT4Q==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + + '@swc/core@1.10.15': + resolution: {integrity: sha512-/iFeQuNaGdK7mfJbQcObhAhsMqLT7qgMYl7jX2GEIO+VDTejESpzAyKwaMeYXExN8D6e5BRHBCe7M5YlsuzjDA==} + engines: {node: '>=10'} + peerDependencies: + '@swc/helpers': '*' + peerDependenciesMeta: + '@swc/helpers': + optional: true + + '@swc/counter@0.1.3': + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + + '@swc/types@0.1.17': + resolution: {integrity: sha512-V5gRru+aD8YVyCOMAjMpWR1Ui577DD5KSJsHP8RAxopAH22jFz6GZd/qxqjO6MJHQhcsjvjOFXyDhyLQUnMveQ==} + + '@sxzz/popperjs-es@2.11.7': + resolution: {integrity: sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==} + + '@transloadit/prettier-bytes@0.0.7': + resolution: {integrity: sha512-VeJbUb0wEKbcwaSlj5n+LscBl9IPgLPkHVGBkh00cztv6X4L/TJXK58LzFuBKX7/GAfiGhIwH67YTLTlzvIzBA==} + + '@types/argparse@1.0.38': + resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} + + '@types/estree@1.0.6': + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + + '@types/event-emitter@0.3.5': + resolution: {integrity: sha512-zx2/Gg0Eg7gwEiOIIh5w9TrhKKTeQh7CPCOPNc0el4pLSwzebA8SmnHwZs2dWlLONvyulykSwGSQxQHLhjGLvQ==} + + '@types/fined@1.1.5': + resolution: {integrity: sha512-2N93vadEGDFhASTIRbizbl4bNqpMOId5zZfj6hHqYZfEzEfO9onnU4Im8xvzo8uudySDveDHBOOSlTWf38ErfQ==} + + '@types/gensync@1.0.4': + resolution: {integrity: sha512-C3YYeRQWp2fmq9OryX+FoDy8nXS6scQ7dPptD8LnFDAUNcKWJjXQKDNJD3HVm+kOUsXhTOkpi69vI4EuAr95bA==} + + '@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/liftoff@4.0.3': + resolution: {integrity: sha512-UgbL2kR5pLrWICvr8+fuSg0u43LY250q7ZMkC+XKC3E+rs/YBDEnQIzsnhU5dYsLlwMi3R75UvCL87pObP1sxw==} + + '@types/linkify-it@5.0.0': + resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} + + '@types/lodash-es@4.17.12': + resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==} + + '@types/lodash@4.17.15': + resolution: {integrity: sha512-w/P33JFeySuhN6JLkysYUK2gEmy9kHHFN7E8ro0tkfmlDOgxBDzWEZ/J8cWA+fHqFevpswDTFZnDx+R9lbL6xw==} + + '@types/markdown-it@14.1.2': + resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==} + + '@types/mdurl@2.0.0': + resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} + + '@types/node@14.18.63': + resolution: {integrity: sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==} + + '@types/node@20.17.17': + resolution: {integrity: sha512-/WndGO4kIfMicEQLTi/mDANUu/iVUhT7KboZPdEqqHQ4aTS+3qT3U5gIqWDFV+XouorjfgGqvKILJeHhuQgFYg==} + + '@types/through@0.0.33': + resolution: {integrity: sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==} + + '@types/tinycolor2@1.4.6': + resolution: {integrity: sha512-iEN8J0BoMnsWBqjVbWH/c0G0Hh7O21lpR2/+PrvAVgWdzL7eexIFm4JN/Wn10PTcmNdtS6U67r499mlWMXOxNw==} + + '@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.18.0': + resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@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.18.0': + resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} + 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.18.0': + resolution: {integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@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.18.0': + resolution: {integrity: sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + + '@typescript-eslint/visitor-keys@7.18.0': + resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} + engines: {node: ^18.18.0 || >=20.0.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.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + + '@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 + + '@uppy/companion-client@2.2.2': + resolution: {integrity: sha512-5mTp2iq97/mYSisMaBtFRry6PTgZA6SIL7LePteOV5x0/DxKfrZW3DEiQERJmYpHzy7k8johpm2gHnEKto56Og==} + + '@uppy/core@2.3.4': + resolution: {integrity: sha512-iWAqppC8FD8mMVqewavCz+TNaet6HPXitmGXpGGREGrakZ4FeuWytVdrelydzTdXx6vVKkOmI2FLztGg73sENQ==} + + '@uppy/store-default@2.1.1': + resolution: {integrity: sha512-xnpTxvot2SeAwGwbvmJ899ASk5tYXhmZzD/aCFsXePh/v8rNvR2pKlcQUH7cF/y4baUGq3FHO/daKCok/mpKqQ==} + + '@uppy/utils@4.1.3': + resolution: {integrity: sha512-nTuMvwWYobnJcytDO3t+D6IkVq/Qs4Xv3vyoEZ+Iaf8gegZP+rEyoaFT2CK5XLRMienPyqRqNbIfRuFaOWSIFw==} + + '@uppy/xhr-upload@2.1.3': + resolution: {integrity: sha512-YWOQ6myBVPs+mhNjfdWsQyMRWUlrDLMoaG7nvf/G6Y3GKZf8AyjFDjvvJ49XWQ+DaZOftGkHmF1uh/DBeGivJQ==} + peerDependencies: + '@uppy/core': ^2.3.3 + + '@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.2.1': + resolution: {integrity: sha512-cxh314tzaWwOLqVes2gnnCtvBDcM1UMdn+iFR+UjAn411dPT3tOmqrJjbMd7koZpMAmBM/GqeV4n9ge7JSiJJQ==} + engines: {node: ^18.0.0 || >=20.0.0} + peerDependencies: + vite: ^5.0.0 || ^6.0.0 + vue: ^3.2.25 + + '@vitest/expect@1.6.1': + resolution: {integrity: sha512-jXL+9+ZNIJKruofqXuuTClf44eSpcHlgj3CiuNihUF3Ioujtmc0zIa3UJOW5RjDK1YLBJZnWBlPuqhYycLioog==} + + '@vitest/runner@1.6.1': + resolution: {integrity: sha512-3nSnYXkVkf3mXFfE7vVyPmi3Sazhb/2cfZGGs0JRzFsPFvAMBEcrweV1V1GsrstdXeKCTXlJbvnQwGWgEIHmOA==} + + '@vitest/snapshot@1.6.1': + resolution: {integrity: sha512-WvidQuWAzU2p95u8GAKlRMqMyN1yOJkGHnx3M1PL9Raf7AQ1kwLKg04ADlCa3+OXUZE7BceOhVZiuWAbzCKcUQ==} + + '@vitest/spy@1.6.1': + resolution: {integrity: sha512-MGcMmpGkZebsMZhbQKkAf9CX5zGvjkBTqf8Zx3ApYWXr3wG+QvEu2eXWfnIIWYSJExIp4V9FCKDEeygzkYrXMw==} + + '@vitest/utils@1.6.1': + resolution: {integrity: sha512-jOrrUvXM4Av9ZWiG1EajNto0u96kWAhJ1LmPmJhXXQx/32MecEKd10pOLYgS2BQx1TgkGhloPU1ArDW2vvaY6g==} + + '@volar/language-core@1.11.1': + resolution: {integrity: sha512-dOcNn3i9GgZAcJt43wuaEykSluAuOkQgzni1cuxLxTV0nJKanQztp7FxyswdRILaKH+P2XZMPRp2S4MV/pElCw==} + + '@volar/source-map@1.11.1': + resolution: {integrity: sha512-hJnOnwZ4+WT5iupLRnuzbULZ42L7BWWPMmruzwtLhJfpDVoZLjNBxHDi2sY2bgZXCKlpU5XcsMFoYrsQmPhfZg==} + + '@volar/typescript@1.11.1': + resolution: {integrity: sha512-iU+t2mas/4lYierSnoFOeRFQUhAEMgsFuQxoxvwn5EdQopw43j+J27a4lt9LMInx1gLJBC6qL14WYGlgymaSMQ==} + + '@vue-macros/common@1.16.1': + resolution: {integrity: sha512-Pn/AWMTjoMYuquepLZP813BIcq8DTZiNCoaceuNlvaYuOTd8DqBZWc5u0uOMQZMInwME1mdSmmBAcTluiV9Jtg==} + 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.5': + resolution: {integrity: sha512-lOz4t39ZdmU4DJAa2hwPYmKc8EsuGa2U0L9KaZaOJUt0UwQNjNA3AZTq6uEivhOKhhG1Wvy96SvYBoFmCg3uuw==} + + '@vue/babel-plugin-jsx@1.2.5': + resolution: {integrity: sha512-zTrNmOd4939H9KsRIGmmzn3q2zvv1mjxkYZHgqHZgDrXz5B1Q3WyGEjO2f+JrmKghvl1JIRcvo63LgM1kH5zFg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + peerDependenciesMeta: + '@babel/core': + optional: true + + '@vue/babel-plugin-resolve-type@1.2.5': + resolution: {integrity: sha512-U/ibkQrf5sx0XXRnUZD1mo5F7PkpKyTbfXM3a3rC4YnUz6crHEz9Jg09jzzL6QYlXNto/9CePdOg/c87O4Nlfg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@vue/compiler-core@3.5.13': + resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==} + + '@vue/compiler-dom@3.5.13': + resolution: {integrity: sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==} + + '@vue/compiler-sfc@3.5.13': + resolution: {integrity: sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==} + + '@vue/compiler-ssr@3.5.13': + resolution: {integrity: sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==} + + '@vue/devtools-api@6.6.4': + resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==} + + '@vue/devtools-core@7.7.1': + resolution: {integrity: sha512-W4CRrSZJodNIfrPO7/dXF6ZS0QyOY6PCYVhpSoTSx9+nh2wpZxcS1482lAdKM0FTlaoApHV6jXT95Me90hSaBA==} + peerDependencies: + vue: ^3.0.0 + + '@vue/devtools-kit@7.7.1': + resolution: {integrity: sha512-yhZ4NPnK/tmxGtLNQxmll90jIIXdb2jAhPF76anvn5M/UkZCiLJy28bYgPIACKZ7FCosyKoaope89/RsFJll1w==} + + '@vue/devtools-shared@7.7.1': + resolution: {integrity: sha512-BtgF7kHq4BHG23Lezc/3W2UhK2ga7a8ohAIAGJMBr4BkxUFzhqntQtCiuL1ijo2ztWnmusymkirgqUrXoQKumA==} + + '@vue/language-core@1.8.27': + resolution: {integrity: sha512-L8Kc27VdQserNaCUNiSFdDl9LWT24ly8Hpwf1ECy3aFb9m6bDhBGQYOujDm21N7EW3moKIOKEanQwe1q5BK+mA==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@vue/reactivity@3.5.13': + resolution: {integrity: sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==} + + '@vue/runtime-core@3.5.13': + resolution: {integrity: sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==} + + '@vue/runtime-dom@3.5.13': + resolution: {integrity: sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==} + + '@vue/server-renderer@3.5.13': + resolution: {integrity: sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==} + peerDependencies: + vue: 3.5.13 + + '@vue/shared@3.5.13': + resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==} + + '@vueuse/components@10.11.1': + resolution: {integrity: sha512-ThcreQCX/eq61sLkLKjigD4PQvs3Wy4zglICvQH9tP6xl87y5KsQEoizn6OI+R3hrOgwQHLJe7Y0wLLh3fBKcg==} + + '@vueuse/core@10.11.1': + resolution: {integrity: sha512-guoy26JQktXPcz+0n3GukWIy/JDNKti9v6VEMu6kV2sYBsWuGiTU8OWdg+ADfUbHg3/3DlqySDe7JmdHrktiww==} + + '@vueuse/core@9.13.0': + resolution: {integrity: sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==} + + '@vueuse/integrations@10.11.1': + resolution: {integrity: sha512-Y5hCGBguN+vuVYTZmdd/IMXLOdfS60zAmDmFYc4BKBcMUPZH1n4tdyDECCPjXm0bNT3ZRUy1xzTLGaUje8Xyaw==} + peerDependencies: + async-validator: ^4 + axios: ^1 + change-case: ^4 + drauu: ^0.3 + focus-trap: ^7 + fuse.js: ^6 + idb-keyval: ^6 + jwt-decode: ^3 + nprogress: ^0.2 + qrcode: ^1.5 + sortablejs: ^1 + universal-cookie: ^6 + 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.11.1': + resolution: {integrity: sha512-IGa5FXd003Ug1qAZmyE8wF3sJ81xGLSqTqtQ6jaVfkeZ4i5kS2mwQF61yhVqojRnenVew5PldLyRgvdl4YYuSw==} + + '@vueuse/metadata@9.13.0': + resolution: {integrity: sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==} + + '@vueuse/shared@10.11.1': + resolution: {integrity: sha512-LHpC8711VFZlDaYUXEBbFBCQ7GS3dVU9mjOhhMhXP6txTV4EhYQg/KGnQuvt/sPAtoUKq7VVUnL6mVtFoL42sA==} + + '@vueuse/shared@9.13.0': + resolution: {integrity: sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==} + + '@wangeditor/basic-modules@1.1.7': + resolution: {integrity: sha512-cY9CPkLJaqF05STqfpZKWG4LpxTMeGSIIF1fHvfm/mz+JXatCagjdkbxdikOuKYlxDdeqvOeBmsUBItufDLXZg==} + peerDependencies: + '@wangeditor/core': 1.x + dom7: ^3.0.0 + lodash.throttle: ^4.1.1 + nanoid: ^3.2.0 + slate: ^0.72.0 + snabbdom: ^3.1.0 + + '@wangeditor/code-highlight@1.0.3': + resolution: {integrity: sha512-iazHwO14XpCuIWJNTQTikqUhGKyqj+dUNWJ9288Oym9M2xMVHvnsOmDU2sgUDWVy+pOLojReMPgXCsvvNlOOhw==} + peerDependencies: + '@wangeditor/core': 1.x + dom7: ^3.0.0 + slate: ^0.72.0 + snabbdom: ^3.1.0 + + '@wangeditor/core@1.1.19': + resolution: {integrity: sha512-KevkB47+7GhVszyYF2pKGKtCSj/YzmClsD03C3zTt+9SR2XWT5T0e3yQqg8baZpcMvkjs1D8Dv4fk8ok/UaS2Q==} + peerDependencies: + '@uppy/core': ^2.1.1 + '@uppy/xhr-upload': ^2.0.3 + dom7: ^3.0.0 + is-hotkey: ^0.2.0 + lodash.camelcase: ^4.3.0 + lodash.clonedeep: ^4.5.0 + lodash.debounce: ^4.0.8 + lodash.foreach: ^4.5.0 + lodash.isequal: ^4.5.0 + lodash.throttle: ^4.1.1 + lodash.toarray: ^4.4.0 + nanoid: ^3.2.0 + slate: ^0.72.0 + snabbdom: ^3.1.0 + + '@wangeditor/editor-for-vue@5.1.12': + resolution: {integrity: sha512-0Ds3D8I+xnpNWezAeO7HmPRgTfUxHLMd9JKcIw+QzvSmhC5xUHbpCcLU+KLmeBKTR/zffnS5GQo6qi3GhTMJWQ==} + peerDependencies: + '@wangeditor/editor': '>=5.1.0' + vue: ^3.0.5 + + '@wangeditor/editor@5.1.23': + resolution: {integrity: sha512-0RxfeVTuK1tktUaPROnCoFfaHVJpRAIE2zdS0mpP+vq1axVQpLjM8+fCvKzqYIkH0Pg+C+44hJpe3VVroSkEuQ==} + + '@wangeditor/list-module@1.0.5': + resolution: {integrity: sha512-uDuYTP6DVhcYf7mF1pTlmNn5jOb4QtcVhYwSSAkyg09zqxI1qBqsfUnveeDeDqIuptSJhkh81cyxi+MF8sEPOQ==} + peerDependencies: + '@wangeditor/core': 1.x + dom7: ^3.0.0 + slate: ^0.72.0 + snabbdom: ^3.1.0 + + '@wangeditor/table-module@1.1.4': + resolution: {integrity: sha512-5saanU9xuEocxaemGdNi9t8MCDSucnykEC6jtuiT72kt+/Hhh4nERYx1J20OPsTCCdVr7hIyQenFD1iSRkIQ6w==} + peerDependencies: + '@wangeditor/core': 1.x + dom7: ^3.0.0 + lodash.isequal: ^4.5.0 + lodash.throttle: ^4.1.1 + nanoid: ^3.2.0 + slate: ^0.72.0 + snabbdom: ^3.1.0 + + '@wangeditor/upload-image-module@1.0.2': + resolution: {integrity: sha512-z81lk/v71OwPDYeQDxj6cVr81aDP90aFuywb8nPD6eQeECtOymrqRODjpO6VGvCVxVck8nUxBHtbxKtjgcwyiA==} + peerDependencies: + '@uppy/core': ^2.0.3 + '@uppy/xhr-upload': ^2.0.3 + '@wangeditor/basic-modules': 1.x + '@wangeditor/core': 1.x + dom7: ^3.0.0 + lodash.foreach: ^4.5.0 + slate: ^0.72.0 + snabbdom: ^3.1.0 + + '@wangeditor/video-module@1.1.4': + resolution: {integrity: sha512-ZdodDPqKQrgx3IwWu4ZiQmXI8EXZ3hm2/fM6E3t5dB8tCaIGWQZhmqd6P5knfkRAd3z2+YRSRbxOGfoRSp/rLg==} + peerDependencies: + '@uppy/core': ^2.1.4 + '@uppy/xhr-upload': ^2.0.7 + '@wangeditor/core': 1.x + dom7: ^3.0.0 + nanoid: ^3.2.0 + slate: ^0.72.0 + snabbdom: ^3.1.0 + + 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.4: + resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} + engines: {node: '>=0.4.0'} + + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + 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@7.0.0: + resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==} + engines: {node: '>=18'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + engines: {node: '>=12'} + + 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@1.4.0: + resolution: {integrity: sha512-BlGeOw73FDsX7z0eZE/wuuafxYoek2yzNJ6l6A1nsb4+z/p87TOPbHaWuN53kFKNuUXiCQa2M+xLF71IqQmRSw==} + engines: {node: '>=16.14.0'} + + ast-walker-scope@0.6.2: + resolution: {integrity: sha512-1UWOyC50xI3QZkRuDj6PqDtpm1oHWtYs+NQGwqL/2R11eN3Q81PHAHPM0SWW3BNQm53UDwS//Jv8L4CCVLM1bQ==} + engines: {node: '>=16.14.0'} + + async-validator@4.2.5: + resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==} + + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + axios@1.7.9: + resolution: {integrity: sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + birpc@0.2.19: + resolution: {integrity: sha512-5WeXXAvTmitV1RqJFppT5QtUiz2p1mRSYU000Jkft5ZUCLJIk4uQriYNO50HknxKwM6jd8utNc66K1qGIwwWBQ==} + + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist-to-esbuild@2.1.1: + resolution: {integrity: sha512-KN+mty6C3e9AN8Z5dI1xeN15ExcRNeISoC3g7V0Kax/MMF9MSoYA2G7lkTTcVUFntiEjkpI0HNgqJC1NjdyNUw==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + browserslist: '*' + + browserslist@4.24.4: + resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} + 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@4.1.0: + resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} + engines: {node: '>=18'} + + bundle-require@5.1.0: + resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + peerDependencies: + esbuild: '>=0.18' + + c12@1.11.2: + resolution: {integrity: sha512-oBs8a4uvSDO9dm8b7OCFW7+dgtVrwmwnrVXYzLm43ta7ep2jCn/0MhoUFygIWtxhyy6+/MG7/agvpY0U1Iemew==} + peerDependencies: + magicast: ^0.3.4 + peerDependenciesMeta: + magicast: + optional: true + + 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-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==} + + caniuse-lite@1.0.30001699: + resolution: {integrity: sha512-b+uH5BakXZ9Do9iK+CkDmctUSEqZl+SP056vc5usa0PL+ev5OHw003rZXcnjNDv3L8P5j6rwT6C0BPKSikW08w==} + + capital-case@1.0.4: + resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} + + chai@4.5.0: + resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} + engines: {node: '>=4'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chalk@5.4.1: + resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + change-case@4.1.2: + resolution: {integrity: sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==} + + changelogen@0.5.7: + resolution: {integrity: sha512-cTZXBcJMl3pudE40WENOakXkcVtrbBpbkmSkM20NdRiUqa4+VYRdXdEsgQ0BNQ6JBE2YymTNWtPKVF7UCTN5+g==} + 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-css@5.3.3: + resolution: {integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==} + engines: {node: '>= 10.0'} + + 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@5.0.0: + resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} + engines: {node: '>=18'} + + 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@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + 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@13.1.0: + resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} + engines: {node: '>=18'} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + commander@9.5.0: + resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} + engines: {node: ^12.20.0 || >=14} + + compute-scroll-into-view@1.0.20: + resolution: {integrity: sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==} + + computeds@0.0.1: + resolution: {integrity: sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + consola@3.4.0: + resolution: {integrity: sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA==} + 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==} + + copy-anything@3.0.5: + resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} + engines: {node: '>=12.13'} + + core-js@3.40.0: + resolution: {integrity: sha512-7vsMc/Lty6AGnn7uFpYT56QesI5D2Y/UkgKounk87OP9Z2H9Z8kj6jzcSGAxFmUtDOS0ntK6lbQz+Nsa0Jj6mQ==} + + cross-env@7.0.3: + resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} + engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} + hasBin: true + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + 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==} + + d@1.0.2: + resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==} + engines: {node: '>=0.12'} + + dayjs@1.11.13: + resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} + + de-indent@1.0.2: + resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} + + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + deep-eql@4.1.4: + resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} + 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@5.0.0: + resolution: {integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==} + engines: {node: '>=18'} + + 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-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'} + + dom7@3.0.0: + resolution: {integrity: sha512-oNlcUdHsC4zb7Msx7JN3K0Nro1dzJ48knvBOnDPKJ2GV9wl1i5vydJZUSyOfrkKFDZEud/jBsTk92S/VGSAe/g==} + + dot-case@3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + + dotenv@16.4.7: + resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} + engines: {node: '>=12'} + + duplexer@0.1.2: + resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + + echarts-amap@1.0.0-rc.6: + resolution: {integrity: sha512-cYJCKoQdnkZXrGweYrveU1HruZd1c0KmsF1U8o3FtsvgR2jVL5ZUpGFjMmFtpolHOUFqxizk+s+QBLkYuOWL6Q==} + + echarts-liquidfill@2.0.6: + resolution: {integrity: sha512-p+AH0O9/BtwXMQQyhjJbMZo+GwRAgWG/DCyK5r27PQzpS0UWrgXu57MyEFc0A8Ub3sRuqEu08BuxwHICBkSWSQ==} + peerDependencies: + echarts: ^4.8.0 + zrender: ^4.3.1 + + echarts-wordcloud@1.1.3: + resolution: {integrity: sha512-Et8D5xEAoYkidmHun+hEH+2lF9dhCt6D0JJ390vlr2r/1zwhhZAbcL01CEvG93QcMcJpSvSPK8vRiGkTbMHRxg==} + + echarts@5.6.0: + resolution: {integrity: sha512-oTbVTsXfKuEhxftHqL5xprgLoc0k7uScAwtryCgWF6hPYFLRwOUHiFmHGCBKP5NPFNkDVopOieyUqYGH8Fa3kA==} + + electron-to-chromium@1.5.97: + resolution: {integrity: sha512-HKLtaH02augM7ZOdYRuO19rWDeY+QSJ1VxnXFa/XDFLf07HvM90pALIJFgrO+UVaajI3+aJMMpojoUTLZyQ7JQ==} + + element-plus@2.9.4: + resolution: {integrity: sha512-sGnW0wd9zf6lEGixXV2gfwx3X6VTMkP52qTkX7zbURJ2oariyslrKTBh2txt1sdn1pUvj2l0KY3OfSXoZGmDOw==} + peerDependencies: + vue: ^3.2.0 + + emoji-regex@10.4.0: + resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} + + 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'} + + environment@1.1.0: + resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} + engines: {node: '>=18'} + + error-stack-parser-es@0.1.5: + resolution: {integrity: sha512-xHku1X40RO+fO8yJ8Wh2f2rZWVjqyhb1zgq1yZ8aZRQkv6OOKhKWRUaht3eSCUbAOBaKIgM+ykwFLE+QUxgGeg==} + + es5-ext@0.10.64: + resolution: {integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==} + engines: {node: '>=0.10'} + + es6-iterator@2.0.3: + resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} + + es6-symbol@3.1.4: + resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==} + engines: {node: '>=0.12'} + + esbuild-plugin-alias@0.1.2: + resolution: {integrity: sha512-WsX0OJy8IGOsGZV+4oHEU5B6XQUpxOsZN1iSoYf9COTDbY7WXcOwd1oCLYNWUIWCExyGXSghIGq2k7sXBldxwQ==} + + esbuild@0.11.23: + resolution: {integrity: sha512-iaiZZ9vUF5wJV8ob1tl+5aJTrwDczlvGP0JoMmnpC2B0ppiMCu8n8gmy5ZTGl5bcG081XBVn+U+jP+mPFm5T5Q==} + hasBin: true + + esbuild@0.20.2: + resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.23.1: + resolution: {integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + 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.32.0: + resolution: {integrity: sha512-b/Y05HYmnB/32wqVcjxjHZzNpwxj1onBOvqW89W+V+XNG1dRuaFbNd3vT9CLbr2LXjEoq+3vn8DanWf7XU22Ug==} + 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} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. + hasBin: true + + esniff@2.0.1: + resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==} + engines: {node: '>=0.10'} + + 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.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + 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'} + + event-emitter@0.3.5: + resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} + + event-stream@4.0.1: + resolution: {integrity: sha512-qACXdu/9VHPBzcyhdOWR5/IahhGMf0roTeZJfzz077GwylcDd90yOHLouhmv7GJ5XzPi6ekaQWd8AvPP2nOvpA==} + + eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + + execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + + execa@9.5.2: + resolution: {integrity: sha512-EHlpxMCpHWSAh1dgS6bVeoLAXGnJNdR93aabr4QCGbzOM73o5XmRfM/e5FUqsw3aagP8S8XEWUWFAxnRBnAF0Q==} + engines: {node: ^18.19.0 || >=20.5.0} + + expand-tilde@2.0.2: + resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} + engines: {node: '>=0.10.0'} + + ext@1.7.0: + resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} + + 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.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + 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.19.0: + resolution: {integrity: sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==} + + figures@6.1.0: + resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} + engines: {node: '>=18'} + + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + 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} + + flatted@3.3.2: + resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==} + + follow-redirects@1.15.9: + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} + 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.3.0: + resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} + engines: {node: '>=14'} + + form-data@4.0.1: + resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==} + engines: {node: '>= 6'} + + from@0.1.7: + resolution: {integrity: sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==} + + fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + + fs-extra@11.3.0: + resolution: {integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==} + engines: {node: '>=14.14'} + + fs-extra@7.0.1: + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=8'} + + 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.3.0: + resolution: {integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==} + engines: {node: '>=18'} + + get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + + get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + + get-stream@9.0.1: + resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} + engines: {node: '>=18'} + + get-tsconfig@4.10.0: + resolution: {integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==} + + giget@1.2.4: + resolution: {integrity: sha512-Wv+daGyispVoA31TrWAVR+aAdP7roubTPEM/8JzRnqXhLbdJH0T9eQyXVFF8fjk3WKTsctII6QcyxILYgNp2DA==} + 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==} + deprecated: Glob versions prior to v9 are no longer supported + + 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'} + + globals@15.14.0: + resolution: {integrity: sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig==} + engines: {node: '>=18'} + + 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} + + 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@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + 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'} + + html-void-elements@2.0.1: + resolution: {integrity: sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==} + + human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + + human-signals@8.0.0: + resolution: {integrity: sha512-/1/GPCpDUCCYwlERiYjxoczfP0zfvZMU/OWgQPMya9AbAE24vseigFdhAMObpc8Q4lc/kjutPfUddDYyAmejnA==} + engines: {node: '>=18.18.0'} + + husky@9.1.7: + resolution: {integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==} + engines: {node: '>=18'} + hasBin: true + + i18next@20.6.1: + resolution: {integrity: sha512-yCMYTMEJ9ihCwEQQ3phLo7I/Pwycf8uAx+sRHwwk5U9Aui/IZYgQRyMqXafQOw5QQ7DM1Z+WyEXWIqSuJHhG2A==} + + 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.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + immer@9.0.21: + resolution: {integrity: sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + import-lazy@4.0.0: + resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} + engines: {node: '>=8'} + + importx@0.3.11: + resolution: {integrity: sha512-KsFrXKNGeNdeaBsTWU2sEhL3xo+uxquONy5FWnTBititJKebUBg8EgHW8Wl5bpNP+8iN9yOpGqIhVyjfjJigtA==} + + 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==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + inquirer@9.3.7: + resolution: {integrity: sha512-LJKFHCSeIRq9hanN14IlOtPSTe3lNES7TYDTE2xxdAy1LS5rYphajK1qtwvj3YmQXvvk0U2Vbmcni8P9EIQW9w==} + 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.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + 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-hotkey@0.2.0: + resolution: {integrity: sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw==} + + 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-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + 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@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-stream@4.0.1: + resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} + engines: {node: '>=18'} + + 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.1.0: + resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} + engines: {node: '>=18'} + + is-url@1.2.4: + resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==} + + is-what@4.1.16: + resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} + engines: {node: '>=12.13'} + + is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + + is-wsl@3.1.0: + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + engines: {node: '>=16'} + + isbinaryfile@5.0.4: + resolution: {integrity: sha512-YKBKVkKhty7s8rxddb40oOkuP0NbaeXrQvLin6QMHL7Ypiy2RW9LwOVrVgZRyOrhQlayMd9t+D8yDy8MKFTSDQ==} + 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.7: + resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} + hasBin: true + + jju@1.4.0: + resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-tokens@9.0.1: + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + + 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@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + 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 + + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + + 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.29.1: + resolution: {integrity: sha512-HtR5XJ5A0lvCqYAoSv2QdZZyoHNttBpa5EP9aNuzBQeKGfbyH5+UipLWvVzpP4Uml5ej4BYs5I9Lco9u1fECqw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.29.1: + resolution: {integrity: sha512-k33G9IzKUpHy/J/3+9MCO4e+PzaFblsgBjSGlpAaFikeBFm8B/CkO3cKU9oI4g+fjS2KlkLM/Bza9K/aw8wsNA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.29.1: + resolution: {integrity: sha512-0SUW22fv/8kln2LnIdOCmSuXnxgxVC276W5KLTwoehiO0hxkacBxjHOL5EtHD8BAXg2BvuhsJPmVMasvby3LiQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.29.1: + resolution: {integrity: sha512-sD32pFvlR0kDlqsOZmYqH/68SqUMPNj+0pucGxToXZi4XZgZmqeX/NkxNKCPsswAXU3UeYgDSpGhu05eAufjDg==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.29.1: + resolution: {integrity: sha512-0+vClRIZ6mmJl/dxGuRsE197o1HDEeeRk6nzycSy2GofC2JsY4ifCRnvUWf/CUBQmlrvMzt6SMQNMSEu22csWQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + lightningcss-linux-arm64-musl@1.29.1: + resolution: {integrity: sha512-UKMFrG4rL/uHNgelBsDwJcBqVpzNJbzsKkbI3Ja5fg00sgQnHw/VrzUTEc4jhZ+AN2BvQYz/tkHu4vt1kLuJyw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + + lightningcss-linux-x64-gnu@1.29.1: + resolution: {integrity: sha512-u1S+xdODy/eEtjADqirA774y3jLcm8RPtYztwReEXoZKdzgsHYPl0s5V52Tst+GKzqjebkULT86XMSxejzfISw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + lightningcss-linux-x64-musl@1.29.1: + resolution: {integrity: sha512-L0Tx0DtaNUTzXv0lbGCLB/c/qEADanHbu4QdcNOXLIe1i8i22rZRpbT3gpWYsCh9aSL9zFujY/WmEXIatWvXbw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + + lightningcss-win32-arm64-msvc@1.29.1: + resolution: {integrity: sha512-QoOVnkIEFfbW4xPi+dpdft/zAKmgLgsRHfJalEPYuJDOWf7cLQzYg0DEh8/sn737FaeMJxHZRc1oBreiwZCjog==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.29.1: + resolution: {integrity: sha512-NygcbThNBe4JElP+olyTI/doBNGJvLs3bFCRPdvuCcxZCcCZ71B858IHpdm7L1btZex0FvCmM17FK98Y9MRy1Q==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.29.1: + resolution: {integrity: sha512-FmGoeD4S05ewj+AkhTY+D+myDvXI6eL27FjHIjoyUkO/uw7WZD1fBVs0QxeYWa7E17CUHJaYX/RUGISCtcrG4Q==} + engines: {node: '>= 12.0.0'} + + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} + + linkify-it@5.0.0: + resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} + + lint-staged@15.4.3: + resolution: {integrity: sha512-FoH1vOeouNh1pw+90S+cnuoFwRfUD9ijY2GKy5h7HS3OR7JVir2N2xrsa0+Twc1B7cW72L+88geG5cW4wIhn7g==} + engines: {node: '>=18.12.0'} + hasBin: true + + listr2@8.2.5: + resolution: {integrity: sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ==} + engines: {node: '>=18.0.0'} + + load-tsconfig@0.2.5: + resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + local-pkg@0.4.3: + resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} + engines: {node: '>=14'} + + local-pkg@0.5.1: + resolution: {integrity: sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==} + engines: {node: '>=14'} + + local-pkg@1.0.0: + resolution: {integrity: sha512-bbgPw/wmroJsil/GgL4qjDzs5YLTBMQ99weRsok1XCDccQeehbHA/I1oRvk2NPtr7KGZgT/Y5tPRnAtMqeG2Kg==} + 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.assign@4.2.0: + resolution: {integrity: sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw==} + + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + + lodash.clonedeep@4.5.0: + resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} + + lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + + lodash.foreach@4.5.0: + resolution: {integrity: sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==} + + lodash.get@4.4.2: + resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + deprecated: This package is deprecated. Use the optional chaining (?.) operator instead. + + lodash.isequal@4.5.0: + resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + deprecated: This package is deprecated. Use require('node:util').isDeepStrictEqual instead. + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.throttle@4.1.1: + resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} + + lodash.toarray@4.4.0: + resolution: {integrity: sha512-QyffEA3i5dma5q2490+SgCvDN0pXLmRGSyAANuVi0HQ01Pkfr9fuoKQW8wm1wGBnJITs/mS7wQvS6VshUEBFCw==} + + 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.1.0: + resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} + 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.7.0: + resolution: {integrity: sha512-686fgAHaJY7wLTFEq7nnKqeQrhqmXB19d1HnqT35Ci7BN6hbAYLZUezTQ062uUHM7ggZEQlqJ94Ftls+KDXU8Q==} + engines: {node: '>=16.14.0'} + + magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + + 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'} + + map-stream@0.0.7: + resolution: {integrity: sha512-C0X0KQmGm3N2ftbTGBhSyuydQ+vV1LC3f3zPvT3RXHXNZrvfPZcoXp/N5DOa8vedX/rTMm2CjTtivFg2STJMRQ==} + + 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.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-match@1.0.2: + resolution: {integrity: sha512-VXp/ugGDVh3eCLOBCiHZMYWQaTNUHv2IJrut+yXA6+JbLPXHglHwfS/5A5L0ll+jkCY7fIzRJcH6OIunF+c6Cg==} + + 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'} + + mimic-function@5.0.1: + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} + engines: {node: '>=18'} + + mingo@6.5.2: + resolution: {integrity: sha512-dDa8txMjCxpJg3jXlgwHmiePfa1yNeNGNvwHeS/h5sU2vsnnOUE346FR29632Edi8yAx844rr8QWiNxEq6F2NA==} + + minimatch@3.0.8: + resolution: {integrity: sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + 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.7.4: + resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} + + 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.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + muggle-string@0.3.1: + resolution: {integrity: sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==} + + 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} + + namespace-emitter@2.0.1: + resolution: {integrity: sha512-N/sMKHniSDJBjfrkbS/tpkPj4RAbvW3mr8UAzvlMHyun93XEm83IAvhWtJVHo+RHn/oO8Job5YN4b+wRjSVp5g==} + + nanoid@3.3.8: + resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + nanoid@5.0.9: + resolution: {integrity: sha512-Aooyr6MXU6HpvvWXKoVoXwKMs/KyVakWwg7xQfv5/S/RIgJMy0Ifa45H9qqYy7pTCszrHzP21Uk4PZq2HpEM8Q==} + engines: {node: ^18 || >=20} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + next-tick@1.1.0: + resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} + + no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + + node-fetch-native@1.6.6: + resolution: {integrity: sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ==} + + 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.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + + 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@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + npm-run-path@6.0.0: + resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} + engines: {node: '>=18'} + + nprogress@0.2.0: + resolution: {integrity: sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + numerify@1.2.9: + resolution: {integrity: sha512-X4QzQiytV5ZN3TVLhzbtFzjTarUNnaa1pgNDFqt7u7Nqhxe7FvY2eYrGt4WYHlYXDqgtfC/n/a5nJ2y0LijV8w==} + + nypm@0.5.2: + resolution: {integrity: sha512-AHzvnyUJYSrrphPhRWWZNcoZfArGNp3Vrc4pm/ZurO74tYNTgAPrEyBQEKy+qioqmWlPXwvMZCG2wOaHlPG0Pw==} + 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.4.1: + resolution: {integrity: sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==} + + ohash@1.1.4: + resolution: {integrity: sha512-FlDryZAahJmEF3VR3w1KogSEdWX3WhA5GPakFx4J81kEAiHyLMpdLLElS8n8dfNadMgAne/MywcvmogzscVt4g==} + + ometa@0.2.2: + resolution: {integrity: sha512-LZuoK/yjU3FvrxPjUXUlZ1bavCfBPqauA7fsNdwi+AVhRdyk2IzgP3JRnevvjzQ6fKHdUw8YISshf53FmpHrng==} + engines: {node: '>= 0.2.0'} + + 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'} + + onetime@7.0.0: + resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} + engines: {node: '>=18'} + + open@10.1.0: + resolution: {integrity: sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==} + engines: {node: '>=18'} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + + ora@8.2.0: + resolution: {integrity: sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==} + 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'} + + package-manager-detector@0.2.9: + resolution: {integrity: sha512-+vYvA/Y31l8Zk8dwxHhL3JfTuHPm6tlxM2A3GeQyl7ovYnSp1+mzAxClxaOr0qO1TtPxbQxetI7v5XqKLJZk7Q==} + + 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-ms@4.0.0: + resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} + engines: {node: '>=18'} + + 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-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + 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==} + + pathe@2.0.2: + resolution: {integrity: sha512-15Ztpk+nov8DR524R4BF7uEuzESgzUEAV4Ah7CUMNGXdE5ELuvxElxGXndBl32vMSsWa1jpNf22Z+Er3sKwq+w==} + + pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + + pause-stream@0.0.11: + resolution: {integrity: sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==} + + perfect-debounce@1.0.0: + resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + + pidtree@0.6.0: + resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} + engines: {node: '>=0.10'} + hasBin: true + + pinia-plugin-persistedstate@3.2.3: + resolution: {integrity: sha512-Cm819WBj/s5K5DGw55EwbXDtx+EZzM0YR5AZbq9XE3u0xvXwvX2JnWoFpWIcdzISBHqy9H1UiSIUmXyXqWsQRQ==} + peerDependencies: + pinia: ^2.0.0 + + pinia@2.3.1: + resolution: {integrity: sha512-khUlZSwt9xXCaTbbxFYBKDc/bWAGWJjOgvxETwkTN7KRm66EeT1ZdZj6i2ceh9sP2Pzqsbc704r2yngBrxBVug==} + peerDependencies: + typescript: '>=4.4.4' + vue: ^2.7.0 || ^3.5.11 + peerDependenciesMeta: + typescript: + optional: true + + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + + plop@4.0.1: + resolution: {integrity: sha512-5n8QU93kvL/ObOzBcPAB1siVFtAH1TZM6TntJ3JK5kXT0jIgnQV+j+uaOWWFJlg1cNkzLYm8klgASF65K36q9w==} + engines: {node: '>=18'} + hasBin: true + + postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + engines: {node: '>=4'} + + postcss@8.5.2: + resolution: {integrity: sha512-MjOadfU3Ys9KYoX0AdkBlFEF1Vx37uCCeN4ZHnmwm9FfpbsGWMZeBLMmmpY+6Ocqod7mkdZ0DT31OlbsFrLlkA==} + engines: {node: ^10 || ^12 || >=14} + + preact@10.25.4: + resolution: {integrity: sha512-jLdZDb+Q+odkHJ+MpW/9U5cODzqnB+fy2EiHSZES7ldV5LK7yjlVzTp7R8Xy6W6y75kfK8iWYtFVH7lvjwrCMA==} + + 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.5.0: + resolution: {integrity: sha512-quyMrVt6svPS7CjQ9gKb3GLEX/rl3BCL2oa/QkNcXv4YNVBC9olt3s+H7ukto06q7B1Qz46PbrKLO34PR6vXcA==} + 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} + + pretty-ms@9.2.0: + resolution: {integrity: sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg==} + engines: {node: '>=18'} + + prism-theme-vars@0.2.5: + resolution: {integrity: sha512-/D8gBTScYzi9afwE6v3TC1U/1YFZ6k+ly17mtVRdLpGy7E79YjJJWkXFgUDHJ2gDksV/ZnXF7ydJ4TvoDm2z/Q==} + + prismjs@1.29.0: + resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} + engines: {node: '>=6'} + + 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.2: + resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==} + + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + + 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-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + resolve@1.19.0: + resolution: {integrity: sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==} + + resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} + hasBin: true + + restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + + restore-cursor@5.1.0: + resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} + engines: {node: '>=18'} + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + rollup@4.34.6: + resolution: {integrity: sha512-wc2cBWqJgkU3Iz5oztRkQbfVkbxoz5EhnCGOrnJvnLnQ7O0WhQUYyv18qQI79O8L7DdHrrlJNeCHd4VGpnaXKQ==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + 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==} + + save@2.9.0: + resolution: {integrity: sha512-eg8+g8CjvehE/2C6EbLdtK1pINVD27pcJLj4M9PjWWhoeha/y5bWf4dp/0RF+OzbKTcG1bae9qi3PAqiR8CJTg==} + + scroll-into-view-if-needed@2.2.31: + resolution: {integrity: sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==} + + scss@0.2.4: + resolution: {integrity: sha512-4u8V87F+Q/upVhUmhPnB4C1R11xojkRkWjExL2v0CX2EXTg18VrKd+9JWoeyCp2VEMdSpJsyAvVU+rVjogh51A==} + engines: {node: '>= 0.2.0'} + + 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.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + + semver@7.7.1: + resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} + engines: {node: '>=10'} + hasBin: true + + sentence-case@3.0.4: + resolution: {integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==} + + 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.27.0: + resolution: {integrity: sha512-ivHoFS9Yi9GY49ogc6/YAi3Fl9ROnF4VyubNylgCkA+RVqLaKWnDSzXOVzya8csELIaWaYNutsEuAhZrtOjozA==} + + sirv@2.0.4: + resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} + engines: {node: '>= 10'} + + sirv@3.0.0: + resolution: {integrity: sha512-BPwJGUeDaDCHihkORDchNyyTvWFhcusy1XMmhEVTQTwGeybFbp8YEmB+njbPnth1FibULBSBVwCQni25XlCUDg==} + engines: {node: '>=18'} + + 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'} + + slate-history@0.66.0: + resolution: {integrity: sha512-6MWpxGQZiMvSINlCbMW43E2YBSVMCMCIwQfBzGssjWw4kb0qfvj0pIdblWNRQZD0hR6WHP+dHHgGSeVdMWzfng==} + peerDependencies: + slate: '>=0.65.3' + + slate@0.72.8: + resolution: {integrity: sha512-/nJwTswQgnRurpK+bGJFH1oM7naD5qDmHd89JyiKNT2oOKD8marW0QSBtuFnwEbL5aGCS8AmrhXQgNOsn4osAw==} + + 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'} + + snabbdom@3.6.2: + resolution: {integrity: sha512-ig5qOnCDbugFntKi6c7Xlib8bA6xiJVk8O+WdFrV3wxbMqeHO0hXFQC4nAhPVWfZfi8255lcZkNhtIBINCc4+Q==} + engines: {node: '>=12.17.0'} + + snake-case@3.0.4: + resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + 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'} + + split@1.0.1: + resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + ssr-window@3.0.0: + resolution: {integrity: sha512-q+8UfWDg9Itrg0yWK7oe5p/XRCJpJF9OBtXfOPgSJl+u3Xd5KI328RUEvUqSMVM9CiQUEf1QdBzJMkYGErj9QA==} + + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + std-env@3.8.0: + resolution: {integrity: sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==} + + stdin-discarder@0.2.2: + resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} + engines: {node: '>=18'} + + stream-combiner@0.2.2: + resolution: {integrity: sha512-6yHMqgLYDzQDcAkL+tjJDC5nSNuNIx0vZtRZeiPh7Saef7VHX9H5Ijn9l2VIol2zaNYlYEX6KyuT/237A58qEQ==} + + 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.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + 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@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + + strip-final-newline@4.0.0: + resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==} + engines: {node: '>=18'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + strip-literal@2.1.1: + resolution: {integrity: sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==} + + superjson@2.2.2: + resolution: {integrity: sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==} + engines: {node: '>=16'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + 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.2: + resolution: {integrity: sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==} + engines: {node: ^14.18.0 || >=16.0.0} + + systemjs@6.15.1: + resolution: {integrity: sha512-Nk8c4lXvMB98MtbmjX7JwJRgJOL8fluecYCfCeYBznwmpOs8Bf15hLM6z4z71EDAhQVrQrI+wt1aLWSXZq+hXA==} + + tar@6.2.1: + resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} + engines: {node: '>=10'} + + taze@0.13.9: + resolution: {integrity: sha512-qBKfViatIEkw7GNlHU8wV28MtRbdrpwxjcZbcqtCi6gHv2X0JAZ9+K8cp4O5UfVjEvFiafw5iSosBlKM7Fb4XA==} + hasBin: true + + terser@5.38.1: + resolution: {integrity: sha512-GWANVlPM/ZfYzuPHjq0nxT+EbOEDDN3Jwhwdg1D8TU8oSkktp8w64Uq4auuGLxFSoNTRDncTq2hQHX1Ld9KHkA==} + 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==} + + through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + + tiny-warning@1.0.3: + resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} + + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinycolor2@1.6.0: + resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==} + + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + + tinypool@0.8.4: + resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} + 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==} + + tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + + 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.4.3: + resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + + tslib@2.3.0: + resolution: {integrity: sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tsx@4.19.2: + resolution: {integrity: sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==} + engines: {node: '>=18.0.0'} + hasBin: true + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-detect@4.1.0: + resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} + 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@2.7.3: + resolution: {integrity: sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==} + + typescript@5.4.2: + resolution: {integrity: sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==} + engines: {node: '>=14.17'} + hasBin: true + + typescript@5.7.3: + resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} + engines: {node: '>=14.17'} + hasBin: true + + uc.micro@2.1.0: + resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} + + ufo@1.5.4: + resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} + + uglify-js@3.19.3: + resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} + 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==} + + unconfig@0.4.5: + resolution: {integrity: sha512-+b4pZmGFeT3FD9EHWGkNwuOwrNzfgUq4ZoTh63+EKDyxLvYKajbowjRcKLumGExmPKNi5jxIpzhheKsPtV8dig==} + + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + + unicorn-magic@0.3.0: + resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} + engines: {node: '>=18'} + + unimport@3.14.6: + resolution: {integrity: sha512-CYvbDaTT04Rh8bmD8jz3WPmHYZRG/NnvYVzwD6V1YAlvvKROlAeNDUBhkBGzNav2RKaeuXvlWYaa1V4Lfi/O0g==} + + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + + 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.8: + resolution: {integrity: sha512-CHryj6HzJ+n4ASjzwHruD8arhbdl+UXvhuAIlHDs15Y/IMecG3wrf7FVg4pVH/DIysbq/n0phIjNHAjl7TG7Iw==} + 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.3: + resolution: {integrity: sha512-F70u5BuXLn/08jlcp2iUmU60yBLxRwvUZQ4Ys6y9TPS+VkEqlVBXYHc+1dHjycQZK13LAsMWN3FofeXJlJpzdg==} + peerDependencies: + vite: ^2.0.0 || ^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.0 + + unplugin-vue-router@0.8.8: + resolution: {integrity: sha512-8fKHzIF8+Suc1DhoBHmGxLhXUjhzIKvdTwngAybJ+3UrhNLv7KsGrNjaBVnQmlS9VNpxlwHRJzZ2Vc7IDlDm+A==} + peerDependencies: + vue-router: ^4.3.0 + peerDependenciesMeta: + vue-router: + optional: true + + unplugin@1.16.1: + resolution: {integrity: sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==} + engines: {node: '>=14.0.0'} + + update-browserslist-db@1.1.2: + resolution: {integrity: sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==} + 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==} + + use-element-plus-theme@0.0.5: + resolution: {integrity: sha512-YktH5VbVqsT/lYTxx60KeqS5AZgDMEdDChsI2NxxcVkCOOgmkrM/yQVxxItWYhTJti3YxodM5SM89Vv1timIsA==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + utils-lite@0.1.10: + resolution: {integrity: sha512-jlHvdtI8MyWURF/3u+ufIjf1Cs5WjN6WZl9qO8dEkZsVjaI7X5YMUhaCFzkvB69ljt6fo4Dd7V/Oj2NJOFDFOQ==} + + v-charts@1.19.0: + resolution: {integrity: sha512-vm2HBUmxAsXK0ivwce9LytcpqrItDA5JSPLYVxZXtiuoyhcn80XX1/3dPJd/1GqG1OYv3jfBo1s9ra4q8GowqA==} + peerDependencies: + echarts: '>3.0.0' + vue: '>2.0.0' + + v8-to-istanbul@9.3.0: + resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} + engines: {node: '>=10.12.0'} + + v8flags@4.0.1: + resolution: {integrity: sha512-fcRLaS4H/hrZk9hYwbdRM35D0U8IYMfEClhXxCivOojl+yTRAZH3Zy2sSy6qVCiGbV9YAtPssP6jaChqC9vPCg==} + engines: {node: '>= 10.13.0'} + + validator@13.12.0: + resolution: {integrity: sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==} + engines: {node: '>= 0.10'} + + 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.4: + resolution: {integrity: sha512-a1nzURqO7DDmnXqabFOliz908FRmIppkBKsJthS8rbe8hBEXwEwe4C3Pp33Z1JoFCYfVL4kTOMLKk0ZZxREIeA==} + peerDependencies: + vite: ^2.6.0 || ^3.0.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 + + vite-layers@0.5.2: + resolution: {integrity: sha512-/FFYE7kCsYPNBIEfGmHFf1a2UElFjDM/IIGgZDwS6bmEg7xlxuv1dqNgLoSUPy6W1fRs8RmouHry0W9GBt6ubg==} + peerDependencies: + vite: '>=3.0.0' + + vite-node@1.6.1: + resolution: {integrity: sha512-YAXkfvGtuTzwWbDSACdJSg4A4DZiAqckWe90Zapc/sEX3XvHcw1NdurM/6od8J207tSDqNbSsgdCacBgvJKFuA==} + 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-dts@3.9.1: + resolution: {integrity: sha512-rVp2KM9Ue22NGWB8dNtWEr+KekN3rIgz1tWD050QnRGlriUCmaDwa7qA5zDEjbXg5lAXhYMSBJtx3q3hQIJZSg==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + typescript: '*' + vite: '*' + peerDependenciesMeta: + vite: + optional: true + + vite-plugin-env-types@0.1.4: + resolution: {integrity: sha512-u+sZv4Q8HB51cT0EsZtjqdmgSDytZoo1AyQsPmIj8QPM9QjtdG3YE1eHkuAvCapf/llagvZbC6M+Ekhbt3bw9w==} + peerDependencies: + vite: '>=2.0.0' + + vite-plugin-inspect@0.8.9: + resolution: {integrity: sha512-22/8qn+LYonzibb1VeFZmISdVao5kC22jmEKm24vfFE8siEn47EpVcCLYMv6iKOYMJfjSvSJfueOwcFCkUnV3A==} + engines: {node: '>=14'} + peerDependencies: + '@nuxt/kit': '*' + vite: ^3.1.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.1 + peerDependenciesMeta: + '@nuxt/kit': + optional: true + + vite-plugin-legacy-swc@1.2.3: + resolution: {integrity: sha512-M/l+LmIA1Y28Q4hjh/iyGcI9DDE9GURqTsgKAeaxnMtkEv4V75SonqA10CYUyNRYnQC6F7FaJvS3SgVJnDpgVw==} + peerDependencies: + vite: '>=4.0.0' + + vite-plugin-theme@0.8.6: + resolution: {integrity: sha512-GyoP9JjGkF106AawBh1kvw2eQZ/CCPeZKN5p5XhQe1ah1LO7A/6aVGY5gYGWk2qHG9nXpM1IvxjdbMsg94bvYg==} + peerDependencies: + vite: '>=2.0.0-beta.49' + + 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.7.1: + resolution: {integrity: sha512-f1Fnda4CJYH7t7K1WaTEjFTLdF4oUkmlZTVwBGG5UhJ+Oa5KPX0Ue32c+YWRMOpCtFbCDl1iXGgQVzg8Ew5JnQ==} + engines: {node: '>=v14.21.3'} + peerDependencies: + vite: ^3.1.0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.0-0 + + vite-plugin-vue-inspector@5.3.1: + resolution: {integrity: sha512-cBk172kZKTdvGpJuzCCLg8lJ909wopwsu3Ve9FsL1XsnLBiRT9U3MePcqrgGHgCX2ZgkqZmAGR8taxw+TV6s7A==} + peerDependencies: + vite: ^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 || ^6.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.4.14: + resolution: {integrity: sha512-EK5cY7Q1D8JNhSaPKVK4pwBFvaTmZxEnoKXLG/U9gmdDcihQGNzFlgIvaxezFR4glP1LsuiedwMBqCXH3wZccA==} + 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: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vitest@1.6.1: + resolution: {integrity: sha512-Ljb1cnSJSivGN0LqXd/zmDbWEM0RNNg2t1QW/XUhYl/qPqyu7CsqeWtqQXHVaJsecLPuDoak2oJcZN2QoRIOag==} + 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.6.1 + '@vitest/ui': 1.6.1 + 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-echarts@6.7.3: + resolution: {integrity: sha512-vXLKpALFjbPphW9IfQPOVfb1KjGZ/f8qa/FZHi9lZIWzAnQC1DgnmEK3pJgEkyo6EP7UnX6Bv/V3Ke7p+qCNXA==} + 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.3: + resolution: {integrity: sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==} + 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.5.0: + resolution: {integrity: sha512-HDuk+PuH5monfNuY+ct49mNmkCRK4xJAV9Ts4z9UFc4rzdDnxQLyCMGGc8pKhZhHTVzfanpNwB/lwqevcBwI4w==} + peerDependencies: + vue: ^3.2.0 + + vue-template-compiler@2.7.16: + resolution: {integrity: sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==} + + vue-toastification@2.0.0-rc.5: + resolution: {integrity: sha512-q73e5jy6gucEO/U+P48hqX+/qyXDozAGmaGgLFm5tXX4wJBcVsnGp4e/iJqlm9xzHETYOilUuwOUje2Qg1JdwA==} + peerDependencies: + vue: ^3.0.2 + + vue-tsc@1.8.27: + resolution: {integrity: sha512-WesKCAZCRAbmmhuGl3+VrdWItEvfoFIPXOvUJkjULi+x+6G/Dy69yO3TBRJDr9eUlmsNAwVmxsNZxvHKzbkKdg==} + hasBin: true + peerDependencies: + typescript: '*' + + vue@3.5.13: + resolution: {integrity: sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + + webpack-virtual-modules@0.6.2: + resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + + 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.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + + wildcard@1.1.2: + resolution: {integrity: sha512-DXukZJxpHA8LuotRwL0pP1+rS6CS7FF2qStDDE1C7DDg2rLud2PXRMuEDYIPhgEezwnlHNL4c+N6MfMTjCGTng==} + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + 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.7.0: + resolution: {integrity: sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==} + 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.1.1: + resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==} + engines: {node: '>=12.20'} + + yoctocolors-cjs@2.1.2: + resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==} + engines: {node: '>=18'} + + yoctocolors@2.1.1: + resolution: {integrity: sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==} + engines: {node: '>=18'} + + z-schema@5.0.5: + resolution: {integrity: sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==} + engines: {node: '>=8.0.0'} + hasBin: true + + zrender@5.6.1: + resolution: {integrity: sha512-OFXkDJKcrlx5su2XbzJvj/34Q3m6PvyCZkVPHGYpcCJ52ek4U/ymZyfuV1nKE23AyBJ51E/6Yr0mhZ7xGTO4ag==} + +snapshots: + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + + '@antfu/install-pkg@1.0.0': + dependencies: + package-manager-detector: 0.2.9 + tinyexec: 0.3.2 + + '@antfu/ni@0.21.12': {} + + '@antfu/utils@0.7.10': {} + + '@antfu/utils@8.1.0': {} + + '@babel/code-frame@7.26.2': + dependencies: + '@babel/helper-validator-identifier': 7.25.9 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.26.8': {} + + '@babel/core@7.26.8': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.8 + '@babel/helper-compilation-targets': 7.26.5 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.8) + '@babel/helpers': 7.26.7 + '@babel/parser': 7.26.8 + '@babel/template': 7.26.8 + '@babel/traverse': 7.26.8 + '@babel/types': 7.26.8 + '@types/gensync': 1.0.4 + convert-source-map: 2.0.0 + debug: 4.4.0 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.26.8': + dependencies: + '@babel/parser': 7.26.8 + '@babel/types': 7.26.8 + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 3.1.0 + + '@babel/helper-annotate-as-pure@7.25.9': + dependencies: + '@babel/types': 7.26.8 + + '@babel/helper-compilation-targets@7.26.5': + dependencies: + '@babel/compat-data': 7.26.8 + '@babel/helper-validator-option': 7.25.9 + browserslist: 4.24.4 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-create-class-features-plugin@7.25.9(@babel/core@7.26.8)': + dependencies: + '@babel/core': 7.26.8 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-member-expression-to-functions': 7.25.9 + '@babel/helper-optimise-call-expression': 7.25.9 + '@babel/helper-replace-supers': 7.26.5(@babel/core@7.26.8) + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/traverse': 7.26.8 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-member-expression-to-functions@7.25.9': + dependencies: + '@babel/traverse': 7.26.8 + '@babel/types': 7.26.8 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-imports@7.25.9': + dependencies: + '@babel/traverse': 7.26.8 + '@babel/types': 7.26.8 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.8)': + dependencies: + '@babel/core': 7.26.8 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.26.8 + transitivePeerDependencies: + - supports-color + + '@babel/helper-optimise-call-expression@7.25.9': + dependencies: + '@babel/types': 7.26.8 + + '@babel/helper-plugin-utils@7.26.5': {} + + '@babel/helper-replace-supers@7.26.5(@babel/core@7.26.8)': + dependencies: + '@babel/core': 7.26.8 + '@babel/helper-member-expression-to-functions': 7.25.9 + '@babel/helper-optimise-call-expression': 7.25.9 + '@babel/traverse': 7.26.8 + transitivePeerDependencies: + - supports-color + + '@babel/helper-skip-transparent-expression-wrappers@7.25.9': + dependencies: + '@babel/traverse': 7.26.8 + '@babel/types': 7.26.8 + transitivePeerDependencies: + - supports-color + + '@babel/helper-string-parser@7.25.9': {} + + '@babel/helper-validator-identifier@7.25.9': {} + + '@babel/helper-validator-option@7.25.9': {} + + '@babel/helpers@7.26.7': + dependencies: + '@babel/template': 7.26.8 + '@babel/types': 7.26.8 + + '@babel/parser@7.26.8': + dependencies: + '@babel/types': 7.26.8 + + '@babel/plugin-proposal-decorators@7.25.9(@babel/core@7.26.8)': + dependencies: + '@babel/core': 7.26.8 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.8) + '@babel/helper-plugin-utils': 7.26.5 + '@babel/plugin-syntax-decorators': 7.25.9(@babel/core@7.26.8) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-syntax-decorators@7.25.9(@babel/core@7.26.8)': + dependencies: + '@babel/core': 7.26.8 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.26.8)': + dependencies: + '@babel/core': 7.26.8 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.26.8)': + dependencies: + '@babel/core': 7.26.8 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.8)': + dependencies: + '@babel/core': 7.26.8 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.8)': + dependencies: + '@babel/core': 7.26.8 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-transform-modules-commonjs@7.26.3(@babel/core@7.26.8)': + dependencies: + '@babel/core': 7.26.8 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.8) + '@babel/helper-plugin-utils': 7.26.5 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-typescript@7.26.8(@babel/core@7.26.8)': + dependencies: + '@babel/core': 7.26.8 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.8) + '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.8) + transitivePeerDependencies: + - supports-color + + '@babel/preset-typescript@7.26.0(@babel/core@7.26.8)': + dependencies: + '@babel/core': 7.26.8 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-validator-option': 7.25.9 + '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.8) + '@babel/plugin-transform-modules-commonjs': 7.26.3(@babel/core@7.26.8) + '@babel/plugin-transform-typescript': 7.26.8(@babel/core@7.26.8) + transitivePeerDependencies: + - supports-color + + '@babel/runtime@7.26.7': + dependencies: + regenerator-runtime: 0.14.1 + + '@babel/template@7.26.8': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/parser': 7.26.8 + '@babel/types': 7.26.8 + + '@babel/traverse@7.26.8': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.8 + '@babel/parser': 7.26.8 + '@babel/template': 7.26.8 + '@babel/types': 7.26.8 + debug: 4.4.0 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.26.8': + dependencies: + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + + '@bcoe/v8-coverage@0.2.3': {} + + '@ctrl/tinycolor@3.6.1': {} + + '@element-plus/icons-vue@2.3.1(vue@3.5.13(typescript@5.7.3))': + dependencies: + vue: 3.5.13(typescript@5.7.3) + + '@esbuild/aix-ppc64@0.20.2': + optional: true + + '@esbuild/aix-ppc64@0.21.5': + optional: true + + '@esbuild/aix-ppc64@0.23.1': + optional: true + + '@esbuild/android-arm64@0.20.2': + optional: true + + '@esbuild/android-arm64@0.21.5': + optional: true + + '@esbuild/android-arm64@0.23.1': + optional: true + + '@esbuild/android-arm@0.20.2': + optional: true + + '@esbuild/android-arm@0.21.5': + optional: true + + '@esbuild/android-arm@0.23.1': + optional: true + + '@esbuild/android-x64@0.20.2': + optional: true + + '@esbuild/android-x64@0.21.5': + optional: true + + '@esbuild/android-x64@0.23.1': + optional: true + + '@esbuild/darwin-arm64@0.20.2': + optional: true + + '@esbuild/darwin-arm64@0.21.5': + optional: true + + '@esbuild/darwin-arm64@0.23.1': + optional: true + + '@esbuild/darwin-x64@0.20.2': + optional: true + + '@esbuild/darwin-x64@0.21.5': + optional: true + + '@esbuild/darwin-x64@0.23.1': + optional: true + + '@esbuild/freebsd-arm64@0.20.2': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': + optional: true + + '@esbuild/freebsd-arm64@0.23.1': + optional: true + + '@esbuild/freebsd-x64@0.20.2': + optional: true + + '@esbuild/freebsd-x64@0.21.5': + optional: true + + '@esbuild/freebsd-x64@0.23.1': + optional: true + + '@esbuild/linux-arm64@0.20.2': + optional: true + + '@esbuild/linux-arm64@0.21.5': + optional: true + + '@esbuild/linux-arm64@0.23.1': + optional: true + + '@esbuild/linux-arm@0.20.2': + optional: true + + '@esbuild/linux-arm@0.21.5': + optional: true + + '@esbuild/linux-arm@0.23.1': + optional: true + + '@esbuild/linux-ia32@0.20.2': + optional: true + + '@esbuild/linux-ia32@0.21.5': + optional: true + + '@esbuild/linux-ia32@0.23.1': + optional: true + + '@esbuild/linux-loong64@0.20.2': + optional: true + + '@esbuild/linux-loong64@0.21.5': + optional: true + + '@esbuild/linux-loong64@0.23.1': + optional: true + + '@esbuild/linux-mips64el@0.20.2': + optional: true + + '@esbuild/linux-mips64el@0.21.5': + optional: true + + '@esbuild/linux-mips64el@0.23.1': + optional: true + + '@esbuild/linux-ppc64@0.20.2': + optional: true + + '@esbuild/linux-ppc64@0.21.5': + optional: true + + '@esbuild/linux-ppc64@0.23.1': + optional: true + + '@esbuild/linux-riscv64@0.20.2': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true + + '@esbuild/linux-riscv64@0.23.1': + optional: true + + '@esbuild/linux-s390x@0.20.2': + optional: true + + '@esbuild/linux-s390x@0.21.5': + optional: true + + '@esbuild/linux-s390x@0.23.1': + optional: true + + '@esbuild/linux-x64@0.20.2': + optional: true + + '@esbuild/linux-x64@0.21.5': + optional: true + + '@esbuild/linux-x64@0.23.1': + optional: true + + '@esbuild/netbsd-x64@0.20.2': + optional: true + + '@esbuild/netbsd-x64@0.21.5': + optional: true + + '@esbuild/netbsd-x64@0.23.1': + optional: true + + '@esbuild/openbsd-arm64@0.23.1': + optional: true + + '@esbuild/openbsd-x64@0.20.2': + optional: true + + '@esbuild/openbsd-x64@0.21.5': + optional: true + + '@esbuild/openbsd-x64@0.23.1': + optional: true + + '@esbuild/sunos-x64@0.20.2': + optional: true + + '@esbuild/sunos-x64@0.21.5': + optional: true + + '@esbuild/sunos-x64@0.23.1': + optional: true + + '@esbuild/win32-arm64@0.20.2': + optional: true + + '@esbuild/win32-arm64@0.21.5': + optional: true + + '@esbuild/win32-arm64@0.23.1': + optional: true + + '@esbuild/win32-ia32@0.20.2': + optional: true + + '@esbuild/win32-ia32@0.21.5': + optional: true + + '@esbuild/win32-ia32@0.23.1': + optional: true + + '@esbuild/win32-x64@0.20.2': + optional: true + + '@esbuild/win32-x64@0.21.5': + optional: true + + '@esbuild/win32-x64@0.23.1': + optional: true + + '@eslint-community/eslint-utils@4.4.1(eslint@8.57.0)': + dependencies: + eslint: 8.57.0 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.1': {} + + '@eslint/eslintrc@2.1.4': + dependencies: + ajv: 6.12.6 + debug: 4.4.0 + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + 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.9': + dependencies: + '@floating-ui/utils': 0.2.9 + + '@floating-ui/dom@1.6.13': + dependencies: + '@floating-ui/core': 1.6.9 + '@floating-ui/utils': 0.2.9 + + '@floating-ui/utils@0.2.9': {} + + '@humanwhocodes/config-array@0.11.14': + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.4.0 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/object-schema@2.0.3': {} + + '@iconify/types@2.0.0': {} + + '@iconify/utils@2.3.0': + dependencies: + '@antfu/install-pkg': 1.0.0 + '@antfu/utils': 8.1.0 + '@iconify/types': 2.0.0 + debug: 4.4.0 + globals: 15.14.0 + kolorist: 1.8.0 + local-pkg: 1.0.0 + mlly: 1.7.4 + transitivePeerDependencies: + - supports-color + + '@inquirer/figures@1.0.10': {} + + '@istanbuljs/schema@0.1.3': {} + + '@jest/schemas@29.6.3': + dependencies: + '@sinclair/typebox': 0.27.8 + + '@jridgewell/gen-mapping@0.3.8': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@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.8 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@jsdevtools/ez-spawn@3.0.4': + dependencies: + call-me-maybe: 1.0.2 + cross-spawn: 7.0.6 + string-argv: 0.3.2 + type-detect: 4.1.0 + + '@kwsites/file-exists@1.1.1': + dependencies: + debug: 4.4.0 + transitivePeerDependencies: + - supports-color + + '@kwsites/promise-deferred@1.1.1': {} + + '@mdit-vue/plugin-component@2.1.3': + dependencies: + '@types/markdown-it': 14.1.2 + markdown-it: 14.1.0 + + '@mdit-vue/plugin-frontmatter@2.1.3': + dependencies: + '@mdit-vue/types': 2.1.0 + '@types/markdown-it': 14.1.2 + gray-matter: 4.0.3 + markdown-it: 14.1.0 + + '@mdit-vue/types@2.1.0': {} + + '@microsoft/api-extractor-model@7.28.13(@types/node@20.17.17)': + dependencies: + '@microsoft/tsdoc': 0.14.2 + '@microsoft/tsdoc-config': 0.16.2 + '@rushstack/node-core-library': 4.0.2(@types/node@20.17.17) + transitivePeerDependencies: + - '@types/node' + + '@microsoft/api-extractor@7.43.0(@types/node@20.17.17)': + dependencies: + '@microsoft/api-extractor-model': 7.28.13(@types/node@20.17.17) + '@microsoft/tsdoc': 0.14.2 + '@microsoft/tsdoc-config': 0.16.2 + '@rushstack/node-core-library': 4.0.2(@types/node@20.17.17) + '@rushstack/rig-package': 0.5.2 + '@rushstack/terminal': 0.10.0(@types/node@20.17.17) + '@rushstack/ts-command-line': 4.19.1(@types/node@20.17.17) + lodash: 4.17.21 + minimatch: 3.0.8 + resolve: 1.22.10 + semver: 7.5.4 + source-map: 0.6.1 + typescript: 5.4.2 + transitivePeerDependencies: + - '@types/node' + + '@microsoft/tsdoc-config@0.16.2': + dependencies: + '@microsoft/tsdoc': 0.14.2 + ajv: 6.12.6 + jju: 1.4.0 + resolve: 1.19.0 + + '@microsoft/tsdoc@0.14.2': {} + + '@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.19.0 + + '@pkgr/core@0.1.1': {} + + '@polka/url@1.0.0-next.28': {} + + '@rollup/pluginutils@5.1.4(rollup@4.34.6)': + dependencies: + '@types/estree': 1.0.6 + estree-walker: 2.0.2 + picomatch: 4.0.2 + optionalDependencies: + rollup: 4.34.6 + + '@rollup/rollup-android-arm-eabi@4.34.6': + optional: true + + '@rollup/rollup-android-arm64@4.34.6': + optional: true + + '@rollup/rollup-darwin-arm64@4.34.6': + optional: true + + '@rollup/rollup-darwin-x64@4.34.6': + optional: true + + '@rollup/rollup-freebsd-arm64@4.34.6': + optional: true + + '@rollup/rollup-freebsd-x64@4.34.6': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.34.6': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.34.6': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.34.6': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.34.6': + optional: true + + '@rollup/rollup-linux-loongarch64-gnu@4.34.6': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.34.6': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.34.6': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.34.6': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.34.6': + optional: true + + '@rollup/rollup-linux-x64-musl@4.34.6': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.34.6': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.34.6': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.34.6': + optional: true + + '@rushstack/node-core-library@4.0.2(@types/node@20.17.17)': + dependencies: + fs-extra: 7.0.1 + import-lazy: 4.0.0 + jju: 1.4.0 + resolve: 1.22.10 + semver: 7.5.4 + z-schema: 5.0.5 + optionalDependencies: + '@types/node': 20.17.17 + + '@rushstack/rig-package@0.5.2': + dependencies: + resolve: 1.22.10 + strip-json-comments: 3.1.1 + + '@rushstack/terminal@0.10.0(@types/node@20.17.17)': + dependencies: + '@rushstack/node-core-library': 4.0.2(@types/node@20.17.17) + supports-color: 8.1.1 + optionalDependencies: + '@types/node': 20.17.17 + + '@rushstack/ts-command-line@4.19.1(@types/node@20.17.17)': + dependencies: + '@rushstack/terminal': 0.10.0(@types/node@20.17.17) + '@types/argparse': 1.0.38 + argparse: 1.0.10 + string-argv: 0.3.2 + transitivePeerDependencies: + - '@types/node' + + '@sec-ant/readable-stream@0.4.1': {} + + '@sinclair/typebox@0.27.8': {} + + '@sindresorhus/merge-streams@4.0.0': {} + + '@swc/core-darwin-arm64@1.10.15': + optional: true + + '@swc/core-darwin-x64@1.10.15': + optional: true + + '@swc/core-linux-arm-gnueabihf@1.10.15': + optional: true + + '@swc/core-linux-arm64-gnu@1.10.15': + optional: true + + '@swc/core-linux-arm64-musl@1.10.15': + optional: true + + '@swc/core-linux-x64-gnu@1.10.15': + optional: true + + '@swc/core-linux-x64-musl@1.10.15': + optional: true + + '@swc/core-win32-arm64-msvc@1.10.15': + optional: true + + '@swc/core-win32-ia32-msvc@1.10.15': + optional: true + + '@swc/core-win32-x64-msvc@1.10.15': + optional: true + + '@swc/core@1.10.15': + dependencies: + '@swc/counter': 0.1.3 + '@swc/types': 0.1.17 + optionalDependencies: + '@swc/core-darwin-arm64': 1.10.15 + '@swc/core-darwin-x64': 1.10.15 + '@swc/core-linux-arm-gnueabihf': 1.10.15 + '@swc/core-linux-arm64-gnu': 1.10.15 + '@swc/core-linux-arm64-musl': 1.10.15 + '@swc/core-linux-x64-gnu': 1.10.15 + '@swc/core-linux-x64-musl': 1.10.15 + '@swc/core-win32-arm64-msvc': 1.10.15 + '@swc/core-win32-ia32-msvc': 1.10.15 + '@swc/core-win32-x64-msvc': 1.10.15 + + '@swc/counter@0.1.3': {} + + '@swc/types@0.1.17': + dependencies: + '@swc/counter': 0.1.3 + + '@sxzz/popperjs-es@2.11.7': {} + + '@transloadit/prettier-bytes@0.0.7': {} + + '@types/argparse@1.0.38': {} + + '@types/estree@1.0.6': {} + + '@types/event-emitter@0.3.5': {} + + '@types/fined@1.1.5': {} + + '@types/gensync@1.0.4': {} + + '@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/liftoff@4.0.3': + dependencies: + '@types/fined': 1.1.5 + '@types/node': 20.17.17 + + '@types/linkify-it@5.0.0': {} + + '@types/lodash-es@4.17.12': + dependencies: + '@types/lodash': 4.17.15 + + '@types/lodash@4.17.15': {} + + '@types/markdown-it@14.1.2': + dependencies: + '@types/linkify-it': 5.0.0 + '@types/mdurl': 2.0.0 + + '@types/mdurl@2.0.0': {} + + '@types/node@14.18.63': {} + + '@types/node@20.17.17': + dependencies: + undici-types: 6.19.8 + + '@types/through@0.0.33': + dependencies: + '@types/node': 20.17.17 + + '@types/tinycolor2@1.4.6': {} + + '@types/web-bluetooth@0.0.16': {} + + '@types/web-bluetooth@0.0.20': {} + + '@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.7.3)': + dependencies: + '@typescript-eslint/scope-manager': 7.8.0 + '@typescript-eslint/types': 7.8.0 + '@typescript-eslint/typescript-estree': 7.8.0(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 7.8.0 + debug: 4.4.0 + eslint: 8.57.0 + optionalDependencies: + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@7.18.0': + dependencies: + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/visitor-keys': 7.18.0 + + '@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.18.0': {} + + '@typescript-eslint/types@7.8.0': {} + + '@typescript-eslint/typescript-estree@7.18.0(typescript@5.7.3)': + dependencies: + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/visitor-keys': 7.18.0 + debug: 4.4.0 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.7.1 + ts-api-utils: 1.4.3(typescript@5.7.3) + optionalDependencies: + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/typescript-estree@7.8.0(typescript@5.7.3)': + dependencies: + '@typescript-eslint/types': 7.8.0 + '@typescript-eslint/visitor-keys': 7.8.0 + debug: 4.4.0 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.7.1 + ts-api-utils: 1.4.3(typescript@5.7.3) + optionalDependencies: + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@7.18.0(eslint@8.57.0)(typescript@5.7.3)': + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.0) + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.7.3) + eslint: 8.57.0 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/visitor-keys@7.18.0': + dependencies: + '@typescript-eslint/types': 7.18.0 + eslint-visitor-keys: 3.4.3 + + '@typescript-eslint/visitor-keys@7.8.0': + dependencies: + '@typescript-eslint/types': 7.8.0 + eslint-visitor-keys: 3.4.3 + + '@ungap/structured-clone@1.3.0': {} + + '@unocss/astro@0.59.4(rollup@4.34.6)(vite@5.4.14(@types/node@20.17.17)(lightningcss@1.29.1)(terser@5.38.1))': + dependencies: + '@unocss/core': 0.59.4 + '@unocss/reset': 0.59.4 + '@unocss/vite': 0.59.4(rollup@4.34.6)(vite@5.4.14(@types/node@20.17.17)(lightningcss@1.29.1)(terser@5.38.1)) + optionalDependencies: + vite: 5.4.14(@types/node@20.17.17)(lightningcss@1.29.1)(terser@5.38.1) + transitivePeerDependencies: + - rollup + + '@unocss/cli@0.59.4(rollup@4.34.6)': + dependencies: + '@ampproject/remapping': 2.3.0 + '@rollup/pluginutils': 5.1.4(rollup@4.34.6) + '@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.4.0 + fast-glob: 3.3.3 + magic-string: 0.30.17 + 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.7.3)': + dependencies: + '@unocss/eslint-plugin': 0.59.4(eslint@8.57.0)(typescript@5.7.3) + transitivePeerDependencies: + - eslint + - supports-color + - typescript + + '@unocss/eslint-plugin@0.59.4(eslint@8.57.0)(typescript@5.7.3)': + dependencies: + '@typescript-eslint/utils': 7.18.0(eslint@8.57.0)(typescript@5.7.3) + '@unocss/config': 0.59.4 + '@unocss/core': 0.59.4 + magic-string: 0.30.17 + synckit: 0.9.2 + 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.5.2)': + 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.3 + magic-string: 0.30.17 + postcss: 8.5.2 + + '@unocss/preset-attributify@0.59.4': + dependencies: + '@unocss/core': 0.59.4 + + '@unocss/preset-icons@0.59.4': + dependencies: + '@iconify/utils': 2.3.0 + '@unocss/core': 0.59.4 + ofetch: 1.4.1 + 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.4.1 + + '@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.17 + + '@unocss/scope@0.59.4': {} + + '@unocss/transformer-attributify-jsx-babel@0.59.4': + dependencies: + '@babel/core': 7.26.8 + '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.8) + '@babel/preset-typescript': 7.26.0(@babel/core@7.26.8) + '@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.34.6)(vite@5.4.14(@types/node@20.17.17)(lightningcss@1.29.1)(terser@5.38.1))': + dependencies: + '@ampproject/remapping': 2.3.0 + '@rollup/pluginutils': 5.1.4(rollup@4.34.6) + '@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.3 + magic-string: 0.30.17 + vite: 5.4.14(@types/node@20.17.17)(lightningcss@1.29.1)(terser@5.38.1) + transitivePeerDependencies: + - rollup + + '@uppy/companion-client@2.2.2': + dependencies: + '@uppy/utils': 4.1.3 + namespace-emitter: 2.0.1 + + '@uppy/core@2.3.4': + dependencies: + '@transloadit/prettier-bytes': 0.0.7 + '@uppy/store-default': 2.1.1 + '@uppy/utils': 4.1.3 + lodash.throttle: 4.1.1 + mime-match: 1.0.2 + namespace-emitter: 2.0.1 + nanoid: 3.3.8 + preact: 10.25.4 + + '@uppy/store-default@2.1.1': {} + + '@uppy/utils@4.1.3': + dependencies: + lodash.throttle: 4.1.1 + + '@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4)': + dependencies: + '@uppy/companion-client': 2.2.2 + '@uppy/core': 2.3.4 + '@uppy/utils': 4.1.3 + nanoid: 3.3.8 + + '@vitejs/plugin-vue-jsx@3.1.0(vite@5.4.14(@types/node@20.17.17)(lightningcss@1.29.1)(terser@5.38.1))(vue@3.5.13(typescript@5.7.3))': + dependencies: + '@babel/core': 7.26.8 + '@babel/plugin-transform-typescript': 7.26.8(@babel/core@7.26.8) + '@vue/babel-plugin-jsx': 1.2.5(@babel/core@7.26.8) + vite: 5.4.14(@types/node@20.17.17)(lightningcss@1.29.1)(terser@5.38.1) + vue: 3.5.13(typescript@5.7.3) + transitivePeerDependencies: + - supports-color + + '@vitejs/plugin-vue@5.2.1(vite@5.4.14(@types/node@20.17.17)(lightningcss@1.29.1)(terser@5.38.1))(vue@3.5.13(typescript@5.7.3))': + dependencies: + vite: 5.4.14(@types/node@20.17.17)(lightningcss@1.29.1)(terser@5.38.1) + vue: 3.5.13(typescript@5.7.3) + + '@vitest/expect@1.6.1': + dependencies: + '@vitest/spy': 1.6.1 + '@vitest/utils': 1.6.1 + chai: 4.5.0 + + '@vitest/runner@1.6.1': + dependencies: + '@vitest/utils': 1.6.1 + p-limit: 5.0.0 + pathe: 1.1.2 + + '@vitest/snapshot@1.6.1': + dependencies: + magic-string: 0.30.17 + pathe: 1.1.2 + pretty-format: 29.7.0 + + '@vitest/spy@1.6.1': + dependencies: + tinyspy: 2.2.1 + + '@vitest/utils@1.6.1': + dependencies: + diff-sequences: 29.6.3 + estree-walker: 3.0.3 + loupe: 2.3.7 + pretty-format: 29.7.0 + + '@volar/language-core@1.11.1': + dependencies: + '@volar/source-map': 1.11.1 + + '@volar/source-map@1.11.1': + dependencies: + muggle-string: 0.3.1 + + '@volar/typescript@1.11.1': + dependencies: + '@volar/language-core': 1.11.1 + path-browserify: 1.0.1 + + '@vue-macros/common@1.16.1(vue@3.5.13(typescript@5.7.3))': + dependencies: + '@vue/compiler-sfc': 3.5.13 + ast-kit: 1.4.0 + local-pkg: 1.0.0 + magic-string-ast: 0.7.0 + pathe: 2.0.2 + picomatch: 4.0.2 + optionalDependencies: + vue: 3.5.13(typescript@5.7.3) + + '@vue/babel-helper-vue-transform-on@1.2.5': {} + + '@vue/babel-plugin-jsx@1.2.5(@babel/core@7.26.8)': + dependencies: + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.8) + '@babel/template': 7.26.8 + '@babel/traverse': 7.26.8 + '@babel/types': 7.26.8 + '@vue/babel-helper-vue-transform-on': 1.2.5 + '@vue/babel-plugin-resolve-type': 1.2.5(@babel/core@7.26.8) + html-tags: 3.3.1 + svg-tags: 1.0.0 + optionalDependencies: + '@babel/core': 7.26.8 + transitivePeerDependencies: + - supports-color + + '@vue/babel-plugin-resolve-type@1.2.5(@babel/core@7.26.8)': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/core': 7.26.8 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/parser': 7.26.8 + '@vue/compiler-sfc': 3.5.13 + transitivePeerDependencies: + - supports-color + + '@vue/compiler-core@3.5.13': + dependencies: + '@babel/parser': 7.26.8 + '@vue/shared': 3.5.13 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-dom@3.5.13': + dependencies: + '@vue/compiler-core': 3.5.13 + '@vue/shared': 3.5.13 + + '@vue/compiler-sfc@3.5.13': + dependencies: + '@babel/parser': 7.26.8 + '@vue/compiler-core': 3.5.13 + '@vue/compiler-dom': 3.5.13 + '@vue/compiler-ssr': 3.5.13 + '@vue/shared': 3.5.13 + estree-walker: 2.0.2 + magic-string: 0.30.17 + postcss: 8.5.2 + source-map-js: 1.2.1 + + '@vue/compiler-ssr@3.5.13': + dependencies: + '@vue/compiler-dom': 3.5.13 + '@vue/shared': 3.5.13 + + '@vue/devtools-api@6.6.4': {} + + '@vue/devtools-core@7.7.1(vite@5.4.14(@types/node@20.17.17)(lightningcss@1.29.1)(terser@5.38.1))(vue@3.5.13(typescript@5.7.3))': + dependencies: + '@vue/devtools-kit': 7.7.1 + '@vue/devtools-shared': 7.7.1 + mitt: 3.0.1 + nanoid: 5.0.9 + pathe: 2.0.2 + vite-hot-client: 0.2.4(vite@5.4.14(@types/node@20.17.17)(lightningcss@1.29.1)(terser@5.38.1)) + vue: 3.5.13(typescript@5.7.3) + transitivePeerDependencies: + - vite + + '@vue/devtools-kit@7.7.1': + dependencies: + '@vue/devtools-shared': 7.7.1 + birpc: 0.2.19 + hookable: 5.5.3 + mitt: 3.0.1 + perfect-debounce: 1.0.0 + speakingurl: 14.0.1 + superjson: 2.2.2 + + '@vue/devtools-shared@7.7.1': + dependencies: + rfdc: 1.4.1 + + '@vue/language-core@1.8.27(typescript@5.7.3)': + dependencies: + '@volar/language-core': 1.11.1 + '@volar/source-map': 1.11.1 + '@vue/compiler-dom': 3.5.13 + '@vue/shared': 3.5.13 + computeds: 0.0.1 + minimatch: 9.0.5 + muggle-string: 0.3.1 + path-browserify: 1.0.1 + vue-template-compiler: 2.7.16 + optionalDependencies: + typescript: 5.7.3 + + '@vue/reactivity@3.5.13': + dependencies: + '@vue/shared': 3.5.13 + + '@vue/runtime-core@3.5.13': + dependencies: + '@vue/reactivity': 3.5.13 + '@vue/shared': 3.5.13 + + '@vue/runtime-dom@3.5.13': + dependencies: + '@vue/reactivity': 3.5.13 + '@vue/runtime-core': 3.5.13 + '@vue/shared': 3.5.13 + csstype: 3.1.3 + + '@vue/server-renderer@3.5.13(vue@3.5.13(typescript@5.7.3))': + dependencies: + '@vue/compiler-ssr': 3.5.13 + '@vue/shared': 3.5.13 + vue: 3.5.13(typescript@5.7.3) + + '@vue/shared@3.5.13': {} + + '@vueuse/components@10.11.1(vue@3.5.13(typescript@5.7.3))': + dependencies: + '@vueuse/core': 10.11.1(vue@3.5.13(typescript@5.7.3)) + '@vueuse/shared': 10.11.1(vue@3.5.13(typescript@5.7.3)) + vue-demi: 0.14.10(vue@3.5.13(typescript@5.7.3)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + '@vueuse/core@10.11.1(vue@3.5.13(typescript@5.7.3))': + dependencies: + '@types/web-bluetooth': 0.0.20 + '@vueuse/metadata': 10.11.1 + '@vueuse/shared': 10.11.1(vue@3.5.13(typescript@5.7.3)) + vue-demi: 0.14.10(vue@3.5.13(typescript@5.7.3)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + '@vueuse/core@9.13.0(vue@3.5.13(typescript@5.7.3))': + dependencies: + '@types/web-bluetooth': 0.0.16 + '@vueuse/metadata': 9.13.0 + '@vueuse/shared': 9.13.0(vue@3.5.13(typescript@5.7.3)) + vue-demi: 0.14.10(vue@3.5.13(typescript@5.7.3)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + '@vueuse/integrations@10.11.1(async-validator@4.2.5)(axios@1.7.9)(change-case@4.1.2)(nprogress@0.2.0)(vue@3.5.13(typescript@5.7.3))': + dependencies: + '@vueuse/core': 10.11.1(vue@3.5.13(typescript@5.7.3)) + '@vueuse/shared': 10.11.1(vue@3.5.13(typescript@5.7.3)) + vue-demi: 0.14.10(vue@3.5.13(typescript@5.7.3)) + optionalDependencies: + async-validator: 4.2.5 + axios: 1.7.9 + change-case: 4.1.2 + nprogress: 0.2.0 + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + '@vueuse/metadata@10.11.1': {} + + '@vueuse/metadata@9.13.0': {} + + '@vueuse/shared@10.11.1(vue@3.5.13(typescript@5.7.3))': + dependencies: + vue-demi: 0.14.10(vue@3.5.13(typescript@5.7.3)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + '@vueuse/shared@9.13.0(vue@3.5.13(typescript@5.7.3))': + dependencies: + vue-demi: 0.14.10(vue@3.5.13(typescript@5.7.3)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + '@wangeditor/basic-modules@1.1.7(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(lodash.throttle@4.1.1)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2)': + dependencies: + '@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2) + dom7: 3.0.0 + is-url: 1.2.4 + lodash.throttle: 4.1.1 + nanoid: 3.3.8 + slate: 0.72.8 + snabbdom: 3.6.2 + + '@wangeditor/code-highlight@1.0.3(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(slate@0.72.8)(snabbdom@3.6.2)': + dependencies: + '@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2) + dom7: 3.0.0 + prismjs: 1.29.0 + slate: 0.72.8 + snabbdom: 3.6.2 + + '@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2)': + dependencies: + '@types/event-emitter': 0.3.5 + '@uppy/core': 2.3.4 + '@uppy/xhr-upload': 2.1.3(@uppy/core@2.3.4) + dom7: 3.0.0 + event-emitter: 0.3.5 + html-void-elements: 2.0.1 + i18next: 20.6.1 + is-hotkey: 0.2.0 + lodash.camelcase: 4.3.0 + lodash.clonedeep: 4.5.0 + lodash.debounce: 4.0.8 + lodash.foreach: 4.5.0 + lodash.isequal: 4.5.0 + lodash.throttle: 4.1.1 + lodash.toarray: 4.4.0 + nanoid: 3.3.8 + scroll-into-view-if-needed: 2.2.31 + slate: 0.72.8 + slate-history: 0.66.0(slate@0.72.8) + snabbdom: 3.6.2 + + '@wangeditor/editor-for-vue@5.1.12(@wangeditor/editor@5.1.23)(vue@3.5.13(typescript@5.7.3))': + dependencies: + '@wangeditor/editor': 5.1.23 + vue: 3.5.13(typescript@5.7.3) + + '@wangeditor/editor@5.1.23': + dependencies: + '@uppy/core': 2.3.4 + '@uppy/xhr-upload': 2.1.3(@uppy/core@2.3.4) + '@wangeditor/basic-modules': 1.1.7(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(lodash.throttle@4.1.1)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2) + '@wangeditor/code-highlight': 1.0.3(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(slate@0.72.8)(snabbdom@3.6.2) + '@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2) + '@wangeditor/list-module': 1.0.5(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(slate@0.72.8)(snabbdom@3.6.2) + '@wangeditor/table-module': 1.1.4(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2) + '@wangeditor/upload-image-module': 1.0.2(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(@wangeditor/basic-modules@1.1.7(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(lodash.throttle@4.1.1)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2))(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(lodash.foreach@4.5.0)(slate@0.72.8)(snabbdom@3.6.2) + '@wangeditor/video-module': 1.1.4(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2) + dom7: 3.0.0 + is-hotkey: 0.2.0 + lodash.camelcase: 4.3.0 + lodash.clonedeep: 4.5.0 + lodash.debounce: 4.0.8 + lodash.foreach: 4.5.0 + lodash.isequal: 4.5.0 + lodash.throttle: 4.1.1 + lodash.toarray: 4.4.0 + nanoid: 3.3.8 + slate: 0.72.8 + snabbdom: 3.6.2 + + '@wangeditor/list-module@1.0.5(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(slate@0.72.8)(snabbdom@3.6.2)': + dependencies: + '@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2) + dom7: 3.0.0 + slate: 0.72.8 + snabbdom: 3.6.2 + + '@wangeditor/table-module@1.1.4(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2)': + dependencies: + '@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2) + dom7: 3.0.0 + lodash.isequal: 4.5.0 + lodash.throttle: 4.1.1 + nanoid: 3.3.8 + slate: 0.72.8 + snabbdom: 3.6.2 + + '@wangeditor/upload-image-module@1.0.2(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(@wangeditor/basic-modules@1.1.7(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(lodash.throttle@4.1.1)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2))(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(lodash.foreach@4.5.0)(slate@0.72.8)(snabbdom@3.6.2)': + dependencies: + '@uppy/core': 2.3.4 + '@uppy/xhr-upload': 2.1.3(@uppy/core@2.3.4) + '@wangeditor/basic-modules': 1.1.7(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(lodash.throttle@4.1.1)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2) + '@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2) + dom7: 3.0.0 + lodash.foreach: 4.5.0 + slate: 0.72.8 + snabbdom: 3.6.2 + + '@wangeditor/video-module@1.1.4(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2)': + dependencies: + '@uppy/core': 2.3.4 + '@uppy/xhr-upload': 2.1.3(@uppy/core@2.3.4) + '@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2) + dom7: 3.0.0 + nanoid: 3.3.8 + slate: 0.72.8 + snabbdom: 3.6.2 + + acorn-jsx@5.3.2(acorn@8.14.0): + dependencies: + acorn: 8.14.0 + + acorn-walk@8.3.4: + dependencies: + acorn: 8.14.0 + + acorn@8.14.0: {} + + 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@7.0.0: + dependencies: + environment: 1.1.0 + + ansi-regex@5.0.1: {} + + ansi-regex@6.1.0: {} + + 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@1.4.0: + dependencies: + '@babel/parser': 7.26.8 + pathe: 2.0.2 + + ast-walker-scope@0.6.2: + dependencies: + '@babel/parser': 7.26.8 + ast-kit: 1.4.0 + + async-validator@4.2.5: {} + + async@3.2.6: {} + + asynckit@0.4.0: {} + + axios@1.7.9: + dependencies: + follow-redirects: 1.15.9 + form-data: 4.0.1 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + balanced-match@1.0.2: {} + + base64-js@1.5.1: {} + + binary-extensions@2.3.0: {} + + birpc@0.2.19: {} + + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + + boolbase@1.0.0: {} + + 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.3: + dependencies: + fill-range: 7.1.1 + + browserslist-to-esbuild@2.1.1(browserslist@4.24.4): + dependencies: + browserslist: 4.24.4 + meow: 13.2.0 + + browserslist@4.24.4: + dependencies: + caniuse-lite: 1.0.30001699 + electron-to-chromium: 1.5.97 + node-releases: 2.0.19 + update-browserslist-db: 1.1.2(browserslist@4.24.4) + + buffer-from@1.1.2: {} + + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + bundle-name@4.1.0: + dependencies: + run-applescript: 7.0.0 + + bundle-require@5.1.0(esbuild@0.20.2): + dependencies: + esbuild: 0.20.2 + load-tsconfig: 0.2.5 + + c12@1.11.2: + dependencies: + chokidar: 3.6.0 + confbox: 0.1.8 + defu: 6.1.4 + dotenv: 16.4.7 + giget: 1.2.4 + jiti: 1.21.7 + mlly: 1.7.4 + ohash: 1.1.4 + pathe: 1.1.2 + perfect-debounce: 1.0.0 + pkg-types: 1.3.1 + rc9: 2.1.2 + + c8@9.1.0: + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@istanbuljs/schema': 0.1.3 + find-up: 5.0.0 + foreground-child: 3.3.0 + 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.3.0 + yargs: 17.7.2 + yargs-parser: 21.1.1 + + cac@6.7.14: {} + + call-me-maybe@1.0.2: {} + + callsites@3.1.0: {} + + camel-case@4.1.2: + dependencies: + pascal-case: 3.1.2 + tslib: 2.8.1 + + caniuse-lite@1.0.30001699: {} + + capital-case@1.0.4: + dependencies: + no-case: 3.0.4 + tslib: 2.8.1 + upper-case-first: 2.0.2 + + chai@4.5.0: + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.3 + deep-eql: 4.1.4 + get-func-name: 2.0.2 + loupe: 2.3.7 + pathval: 1.1.1 + type-detect: 4.1.0 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chalk@5.4.1: {} + + 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.8.1 + + changelogen@0.5.7: + dependencies: + c12: 1.11.2 + colorette: 2.0.20 + consola: 3.4.0 + convert-gitmoji: 0.1.5 + mri: 1.2.0 + node-fetch-native: 1.6.6 + ofetch: 1.4.1 + open: 10.1.0 + pathe: 1.1.2 + pkg-types: 1.3.1 + scule: 1.3.0 + semver: 7.7.1 + std-env: 3.8.0 + yaml: 2.7.0 + transitivePeerDependencies: + - magicast + + 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.3 + 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.4.0 + + clean-css@5.3.3: + dependencies: + source-map: 0.6.1 + + 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@5.0.0: + dependencies: + restore-cursor: 5.1.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.2.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@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + colorette@2.0.20: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + commander@13.1.0: {} + + commander@2.20.3: {} + + commander@9.5.0: + optional: true + + compute-scroll-into-view@1.0.20: {} + + computeds@0.0.1: {} + + concat-map@0.0.1: {} + + confbox@0.1.8: {} + + consola@3.4.0: {} + + constant-case@3.0.4: + dependencies: + no-case: 3.0.4 + tslib: 2.8.1 + upper-case: 2.0.2 + + convert-gitmoji@0.1.5: {} + + convert-source-map@2.0.0: {} + + copy-anything@3.0.5: + dependencies: + is-what: 4.1.16 + + core-js@3.40.0: {} + + cross-env@7.0.3: + dependencies: + cross-spawn: 7.0.6 + + cross-spawn@7.0.6: + 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.1 + + cssesc@3.0.0: {} + + csstype@3.1.3: {} + + d@1.0.2: + dependencies: + es5-ext: 0.10.64 + type: 2.7.3 + + dayjs@1.11.13: {} + + de-indent@1.0.2: {} + + debug@4.4.0: + dependencies: + ms: 2.1.3 + + deep-eql@4.1.4: + dependencies: + type-detect: 4.1.0 + + deep-is@0.1.4: {} + + deepmerge@4.3.1: {} + + default-browser-id@5.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-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 + + dom7@3.0.0: + dependencies: + ssr-window: 3.0.0 + + dot-case@3.0.4: + dependencies: + no-case: 3.0.4 + tslib: 2.8.1 + + dotenv@16.4.7: {} + + duplexer@0.1.2: {} + + echarts-amap@1.0.0-rc.6: {} + + echarts-liquidfill@2.0.6(echarts@5.6.0)(zrender@5.6.1): + dependencies: + echarts: 5.6.0 + zrender: 5.6.1 + + echarts-wordcloud@1.1.3: {} + + echarts@5.6.0: + dependencies: + tslib: 2.3.0 + zrender: 5.6.1 + + electron-to-chromium@1.5.97: {} + + element-plus@2.9.4(vue@3.5.13(typescript@5.7.3)): + dependencies: + '@ctrl/tinycolor': 3.6.1 + '@element-plus/icons-vue': 2.3.1(vue@3.5.13(typescript@5.7.3)) + '@floating-ui/dom': 1.6.13 + '@popperjs/core': '@sxzz/popperjs-es@2.11.7' + '@types/lodash': 4.17.15 + '@types/lodash-es': 4.17.12 + '@vueuse/core': 9.13.0(vue@3.5.13(typescript@5.7.3)) + 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.5.13(typescript@5.7.3) + transitivePeerDependencies: + - '@vue/composition-api' + + emoji-regex@10.4.0: {} + + emoji-regex@8.0.0: {} + + entities@4.5.0: {} + + environment@1.1.0: {} + + error-stack-parser-es@0.1.5: {} + + es5-ext@0.10.64: + dependencies: + es6-iterator: 2.0.3 + es6-symbol: 3.1.4 + esniff: 2.0.1 + next-tick: 1.1.0 + + es6-iterator@2.0.3: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + es6-symbol: 3.1.4 + + es6-symbol@3.1.4: + dependencies: + d: 1.0.2 + ext: 1.7.0 + + esbuild-plugin-alias@0.1.2: {} + + esbuild@0.11.23: {} + + 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 + + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + + esbuild@0.23.1: + optionalDependencies: + '@esbuild/aix-ppc64': 0.23.1 + '@esbuild/android-arm': 0.23.1 + '@esbuild/android-arm64': 0.23.1 + '@esbuild/android-x64': 0.23.1 + '@esbuild/darwin-arm64': 0.23.1 + '@esbuild/darwin-x64': 0.23.1 + '@esbuild/freebsd-arm64': 0.23.1 + '@esbuild/freebsd-x64': 0.23.1 + '@esbuild/linux-arm': 0.23.1 + '@esbuild/linux-arm64': 0.23.1 + '@esbuild/linux-ia32': 0.23.1 + '@esbuild/linux-loong64': 0.23.1 + '@esbuild/linux-mips64el': 0.23.1 + '@esbuild/linux-ppc64': 0.23.1 + '@esbuild/linux-riscv64': 0.23.1 + '@esbuild/linux-s390x': 0.23.1 + '@esbuild/linux-x64': 0.23.1 + '@esbuild/netbsd-x64': 0.23.1 + '@esbuild/openbsd-arm64': 0.23.1 + '@esbuild/openbsd-x64': 0.23.1 + '@esbuild/sunos-x64': 0.23.1 + '@esbuild/win32-arm64': 0.23.1 + '@esbuild/win32-ia32': 0.23.1 + '@esbuild/win32-x64': 0.23.1 + + escalade@3.2.0: {} + + escape-html@1.0.3: {} + + 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.5.0): + dependencies: + eslint: 8.57.0 + prettier: 3.5.0 + 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.32.0(eslint@8.57.0): + dependencies: + '@eslint-community/eslint-utils': 4.4.1(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.1.2 + semver: 7.7.1 + vue-eslint-parser: 9.4.3(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.1(eslint@8.57.0) + '@eslint-community/regexpp': 4.12.1 + '@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.3.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.0 + 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.6.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.2 + 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.4 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + esniff@2.0.1: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + event-emitter: 0.3.5 + type: 2.7.3 + + espree@9.6.1: + dependencies: + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) + eslint-visitor-keys: 3.4.3 + + esprima@4.0.1: {} + + esquery@1.6.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.6 + + esutils@2.0.3: {} + + event-emitter@0.3.5: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + + event-stream@4.0.1: + dependencies: + duplexer: 0.1.2 + from: 0.1.7 + map-stream: 0.0.7 + pause-stream: 0.0.11 + split: 1.0.1 + stream-combiner: 0.2.2 + through: 2.3.8 + + eventemitter3@5.0.1: {} + + execa@8.0.1: + dependencies: + cross-spawn: 7.0.6 + 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 + + execa@9.5.2: + dependencies: + '@sindresorhus/merge-streams': 4.0.0 + cross-spawn: 7.0.6 + figures: 6.1.0 + get-stream: 9.0.1 + human-signals: 8.0.0 + is-plain-obj: 4.1.0 + is-stream: 4.0.1 + npm-run-path: 6.0.0 + pretty-ms: 9.2.0 + signal-exit: 4.1.0 + strip-final-newline: 4.0.0 + yoctocolors: 2.1.1 + + expand-tilde@2.0.2: + dependencies: + homedir-polyfill: 1.0.3 + + ext@1.7.0: + dependencies: + type: 2.7.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.3: + 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.8 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fastq@1.19.0: + dependencies: + reusify: 1.0.4 + + figures@6.1.0: + dependencies: + is-unicode-supported: 2.1.0 + + file-entry-cache@6.0.1: + dependencies: + flat-cache: 3.2.0 + + fill-range@7.1.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.8 + 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.2 + keyv: 4.5.4 + rimraf: 3.0.2 + + flatted@3.3.2: {} + + follow-redirects@1.15.9: {} + + for-in@1.0.2: {} + + for-own@1.0.0: + dependencies: + for-in: 1.0.2 + + foreground-child@3.3.0: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + form-data@4.0.1: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + from@0.1.7: {} + + fs-extra@10.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + fs-extra@11.3.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + fs-extra@7.0.1: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + 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.3.0: {} + + get-func-name@2.0.2: {} + + get-stream@8.0.1: {} + + get-stream@9.0.1: + dependencies: + '@sec-ant/readable-stream': 0.4.1 + is-stream: 4.0.1 + + get-tsconfig@4.10.0: + dependencies: + resolve-pkg-maps: 1.0.0 + + giget@1.2.4: + dependencies: + citty: 0.1.6 + consola: 3.4.0 + defu: 6.1.4 + node-fetch-native: 1.6.6 + nypm: 0.5.2 + ohash: 1.1.4 + pathe: 2.0.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 + + globals@15.14.0: {} + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.3 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 + + globby@13.2.2: + dependencies: + dir-glob: 3.0.1 + fast-glob: 3.3.3 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 4.0.0 + + 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.19.3 + + has-flag@4.0.0: {} + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + he@1.2.0: {} + + header-case@2.0.4: + dependencies: + capital-case: 1.0.4 + tslib: 2.8.1 + + 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: {} + + html-void-elements@2.0.1: {} + + human-signals@5.0.0: {} + + human-signals@8.0.0: {} + + husky@9.1.7: {} + + i18next@20.6.1: + dependencies: + '@babel/runtime': 7.26.7 + + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + + ieee754@1.2.1: {} + + ignore@5.3.2: {} + + immer@9.0.21: {} + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + import-lazy@4.0.0: {} + + importx@0.3.11: + dependencies: + bundle-require: 5.1.0(esbuild@0.20.2) + debug: 4.4.0 + esbuild: 0.20.2 + jiti: 1.21.7 + pathe: 1.1.2 + pkg-types: 1.3.1 + tsx: 4.19.2 + transitivePeerDependencies: + - supports-color + + 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.3.7: + dependencies: + '@inquirer/figures': 1.0.10 + ansi-escapes: 4.3.2 + cli-width: 4.1.0 + external-editor: 3.1.0 + 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 + yoctocolors-cjs: 2.1.2 + + 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.16.1: + dependencies: + hasown: 2.0.2 + + 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.3.0 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-hotkey@0.2.0: {} + + 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-obj@4.1.0: {} + + is-plain-object@5.0.0: {} + + is-relative@1.0.0: + dependencies: + is-unc-path: 1.0.0 + + is-stream@3.0.0: {} + + is-stream@4.0.1: {} + + 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.1.0: {} + + is-url@1.2.4: {} + + is-what@4.1.16: {} + + is-windows@1.0.2: {} + + is-wsl@3.1.0: + dependencies: + is-inside-container: 1.0.0 + + isbinaryfile@5.0.4: {} + + 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.7: {} + + jju@1.4.0: {} + + js-tokens@4.0.0: {} + + js-tokens@9.0.1: {} + + 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@3.1.0: {} + + json-buffer@3.0.1: {} + + json-schema-traverse@0.4.1: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json5@2.2.3: {} + + jsonfile@4.0.0: + optionalDependencies: + graceful-fs: 4.2.11 + + 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.10 + + lightningcss-darwin-arm64@1.29.1: + optional: true + + lightningcss-darwin-x64@1.29.1: + optional: true + + lightningcss-freebsd-x64@1.29.1: + optional: true + + lightningcss-linux-arm-gnueabihf@1.29.1: + optional: true + + lightningcss-linux-arm64-gnu@1.29.1: + optional: true + + lightningcss-linux-arm64-musl@1.29.1: + optional: true + + lightningcss-linux-x64-gnu@1.29.1: + optional: true + + lightningcss-linux-x64-musl@1.29.1: + optional: true + + lightningcss-win32-arm64-msvc@1.29.1: + optional: true + + lightningcss-win32-x64-msvc@1.29.1: + optional: true + + lightningcss@1.29.1: + dependencies: + detect-libc: 1.0.3 + optionalDependencies: + lightningcss-darwin-arm64: 1.29.1 + lightningcss-darwin-x64: 1.29.1 + lightningcss-freebsd-x64: 1.29.1 + lightningcss-linux-arm-gnueabihf: 1.29.1 + lightningcss-linux-arm64-gnu: 1.29.1 + lightningcss-linux-arm64-musl: 1.29.1 + lightningcss-linux-x64-gnu: 1.29.1 + lightningcss-linux-x64-musl: 1.29.1 + lightningcss-win32-arm64-msvc: 1.29.1 + lightningcss-win32-x64-msvc: 1.29.1 + + lilconfig@3.1.3: {} + + linkify-it@5.0.0: + dependencies: + uc.micro: 2.1.0 + + lint-staged@15.4.3: + dependencies: + chalk: 5.4.1 + commander: 13.1.0 + debug: 4.4.0 + execa: 8.0.1 + lilconfig: 3.1.3 + listr2: 8.2.5 + micromatch: 4.0.8 + pidtree: 0.6.0 + string-argv: 0.3.2 + yaml: 2.7.0 + transitivePeerDependencies: + - supports-color + + listr2@8.2.5: + dependencies: + cli-truncate: 4.0.0 + colorette: 2.0.20 + eventemitter3: 5.0.1 + log-update: 6.1.0 + rfdc: 1.4.1 + wrap-ansi: 9.0.0 + + load-tsconfig@0.2.5: {} + + local-pkg@0.4.3: {} + + local-pkg@0.5.1: + dependencies: + mlly: 1.7.4 + pkg-types: 1.3.1 + + local-pkg@1.0.0: + dependencies: + mlly: 1.7.4 + pkg-types: 1.3.1 + + 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.assign@4.2.0: {} + + lodash.camelcase@4.3.0: {} + + lodash.clonedeep@4.5.0: {} + + lodash.debounce@4.0.8: {} + + lodash.foreach@4.5.0: {} + + lodash.get@4.4.2: {} + + lodash.isequal@4.5.0: {} + + lodash.merge@4.6.2: {} + + lodash.throttle@4.1.1: {} + + lodash.toarray@4.4.0: {} + + 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.4.1 + is-unicode-supported: 1.3.0 + + log-update@6.1.0: + dependencies: + ansi-escapes: 7.0.0 + cli-cursor: 5.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.8.1 + + 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.7.0: + dependencies: + magic-string: 0.30.17 + + magic-string@0.30.17: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + + make-dir@4.0.0: + dependencies: + semver: 7.7.1 + + make-iterator@1.0.1: + dependencies: + kind-of: 6.0.3 + + map-cache@0.2.2: {} + + map-stream@0.0.7: {} + + 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.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime-db@1.52.0: {} + + mime-match@1.0.2: + dependencies: + wildcard: 1.1.2 + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mimic-fn@2.1.0: {} + + mimic-fn@4.0.0: {} + + mimic-function@5.0.1: {} + + mingo@6.5.2: {} + + minimatch@3.0.8: + dependencies: + brace-expansion: 1.1.11 + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minimatch@9.0.5: + 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.7.4: + dependencies: + acorn: 8.14.0 + pathe: 2.0.2 + pkg-types: 1.3.1 + ufo: 1.5.4 + + mockjs@1.1.0: + dependencies: + commander: 13.1.0 + + mri@1.2.0: {} + + mrmime@2.0.0: {} + + ms@2.1.3: {} + + muggle-string@0.3.1: {} + + mute-stream@1.0.0: {} + + namespace-emitter@2.0.1: {} + + nanoid@3.3.8: {} + + nanoid@5.0.9: {} + + natural-compare@1.4.0: {} + + neo-async@2.6.2: {} + + next-tick@1.1.0: {} + + no-case@3.0.4: + dependencies: + lower-case: 2.0.2 + tslib: 2.8.1 + + node-fetch-native@1.6.6: {} + + 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.3.7 + isbinaryfile: 5.0.4 + lodash.get: 4.4.2 + lower-case: 2.0.2 + mkdirp: 3.0.1 + resolve: 1.22.10 + title-case: 3.0.3 + upper-case: 2.0.2 + + node-releases@2.0.19: {} + + normalize-path@3.0.0: {} + + normalize-wheel-es@1.2.0: {} + + npm-run-path@5.3.0: + dependencies: + path-key: 4.0.0 + + npm-run-path@6.0.0: + dependencies: + path-key: 4.0.0 + unicorn-magic: 0.3.0 + + nprogress@0.2.0: {} + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + + numerify@1.2.9: {} + + nypm@0.5.2: + dependencies: + citty: 0.1.6 + consola: 3.4.0 + pathe: 2.0.2 + pkg-types: 1.3.1 + tinyexec: 0.3.2 + ufo: 1.5.4 + + 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.4.1: + dependencies: + destr: 2.0.3 + node-fetch-native: 1.6.6 + ufo: 1.5.4 + + ohash@1.1.4: {} + + ometa@0.2.2: {} + + 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 + + onetime@7.0.0: + dependencies: + mimic-function: 5.0.1 + + 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 + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + 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.2.0: + dependencies: + chalk: 5.4.1 + cli-cursor: 5.0.0 + cli-spinners: 2.9.2 + is-interactive: 2.0.0 + is-unicode-supported: 2.1.0 + log-symbols: 6.0.0 + stdin-discarder: 0.2.2 + string-width: 7.2.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.1.1 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + p-map@5.5.0: + dependencies: + aggregate-error: 4.0.1 + + package-manager-detector@0.2.9: {} + + param-case@3.0.4: + dependencies: + dot-case: 3.0.4 + tslib: 2.8.1 + + 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-ms@4.0.0: {} + + parse-passwd@1.0.0: {} + + pascal-case@3.1.2: + dependencies: + no-case: 3.0.4 + tslib: 2.8.1 + + path-browserify@1.0.1: {} + + path-case@3.0.4: + dependencies: + dot-case: 3.0.4 + tslib: 2.8.1 + + 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: {} + + pathe@2.0.2: {} + + pathval@1.1.1: {} + + pause-stream@0.0.11: + dependencies: + through: 2.3.8 + + perfect-debounce@1.0.0: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + picomatch@4.0.2: {} + + pidtree@0.6.0: {} + + pinia-plugin-persistedstate@3.2.3(pinia@2.3.1(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3))): + dependencies: + pinia: 2.3.1(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3)) + + pinia@2.3.1(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3)): + dependencies: + '@vue/devtools-api': 6.6.4 + vue: 3.5.13(typescript@5.7.3) + vue-demi: 0.14.10(vue@3.5.13(typescript@5.7.3)) + optionalDependencies: + typescript: 5.7.3 + transitivePeerDependencies: + - '@vue/composition-api' + + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.7.4 + pathe: 2.0.2 + + plop@4.0.1: + dependencies: + '@types/liftoff': 4.0.3 + chalk: 5.4.1 + interpret: 3.1.1 + liftoff: 4.0.0 + minimist: 1.2.8 + node-plop: 0.32.0 + ora: 8.2.0 + v8flags: 4.0.1 + + postcss-selector-parser@6.1.2: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss@8.5.2: + dependencies: + nanoid: 3.3.8 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + preact@10.25.4: {} + + prelude-ls@1.2.1: {} + + prettier-linter-helpers@1.0.0: + dependencies: + fast-diff: 1.3.0 + + prettier@3.5.0: {} + + pretty-format@29.7.0: + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.3.1 + + pretty-ms@9.2.0: + dependencies: + parse-ms: 4.0.0 + + prism-theme-vars@0.2.5: {} + + prismjs@1.29.0: {} + + 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.2: + dependencies: + defu: 6.1.4 + destr: 2.0.3 + + react-is@18.3.1: {} + + 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.10 + + 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-pkg-maps@1.0.0: {} + + resolve@1.19.0: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + + resolve@1.22.10: + dependencies: + is-core-module: 2.16.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@5.1.0: + dependencies: + onetime: 7.0.0 + signal-exit: 4.1.0 + + reusify@1.0.4: {} + + rfdc@1.4.1: {} + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + rollup@4.34.6: + dependencies: + '@types/estree': 1.0.6 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.34.6 + '@rollup/rollup-android-arm64': 4.34.6 + '@rollup/rollup-darwin-arm64': 4.34.6 + '@rollup/rollup-darwin-x64': 4.34.6 + '@rollup/rollup-freebsd-arm64': 4.34.6 + '@rollup/rollup-freebsd-x64': 4.34.6 + '@rollup/rollup-linux-arm-gnueabihf': 4.34.6 + '@rollup/rollup-linux-arm-musleabihf': 4.34.6 + '@rollup/rollup-linux-arm64-gnu': 4.34.6 + '@rollup/rollup-linux-arm64-musl': 4.34.6 + '@rollup/rollup-linux-loongarch64-gnu': 4.34.6 + '@rollup/rollup-linux-powerpc64le-gnu': 4.34.6 + '@rollup/rollup-linux-riscv64-gnu': 4.34.6 + '@rollup/rollup-linux-s390x-gnu': 4.34.6 + '@rollup/rollup-linux-x64-gnu': 4.34.6 + '@rollup/rollup-linux-x64-musl': 4.34.6 + '@rollup/rollup-win32-arm64-msvc': 4.34.6 + '@rollup/rollup-win32-ia32-msvc': 4.34.6 + '@rollup/rollup-win32-x64-msvc': 4.34.6 + fsevents: 2.3.3 + + 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.8.1 + + safe-buffer@5.2.1: {} + + safer-buffer@2.1.2: {} + + save@2.9.0: + dependencies: + async: 3.2.6 + event-stream: 4.0.1 + lodash.assign: 4.2.0 + mingo: 6.5.2 + + scroll-into-view-if-needed@2.2.31: + dependencies: + compute-scroll-into-view: 1.0.20 + + scss@0.2.4: + dependencies: + ometa: 0.2.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.5.4: + dependencies: + lru-cache: 6.0.0 + + semver@7.7.1: {} + + sentence-case@3.0.4: + dependencies: + no-case: 3.0.4 + tslib: 2.8.1 + upper-case-first: 2.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.27.0: + dependencies: + '@kwsites/file-exists': 1.1.1 + '@kwsites/promise-deferred': 1.1.1 + debug: 4.4.0 + transitivePeerDependencies: + - supports-color + + sirv@2.0.4: + dependencies: + '@polka/url': 1.0.0-next.28 + mrmime: 2.0.0 + totalist: 3.0.1 + + sirv@3.0.0: + dependencies: + '@polka/url': 1.0.0-next.28 + mrmime: 2.0.0 + totalist: 3.0.1 + + sisteransi@1.0.5: {} + + slash@3.0.0: {} + + slash@4.0.0: {} + + slate-history@0.66.0(slate@0.72.8): + dependencies: + is-plain-object: 5.0.0 + slate: 0.72.8 + + slate@0.72.8: + dependencies: + immer: 9.0.21 + is-plain-object: 5.0.0 + tiny-warning: 1.0.3 + + 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 + + snabbdom@3.6.2: {} + + snake-case@3.0.4: + dependencies: + dot-case: 3.0.4 + tslib: 2.8.1 + + source-map-js@1.2.1: {} + + 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: {} + + split@1.0.1: + dependencies: + through: 2.3.8 + + sprintf-js@1.0.3: {} + + ssr-window@3.0.0: {} + + stackback@0.0.2: {} + + std-env@3.8.0: {} + + stdin-discarder@0.2.2: {} + + stream-combiner@0.2.2: + dependencies: + duplexer: 0.1.2 + through: 2.3.8 + + 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.2.0: + dependencies: + emoji-regex: 10.4.0 + get-east-asian-width: 1.3.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.1.0 + + strip-bom-string@1.0.0: {} + + strip-final-newline@3.0.0: {} + + strip-final-newline@4.0.0: {} + + strip-json-comments@3.1.1: {} + + strip-literal@2.1.1: + dependencies: + js-tokens: 9.0.1 + + superjson@2.2.2: + dependencies: + copy-anything: 3.0.5 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-color@8.1.1: + 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.8.1 + + synckit@0.9.2: + dependencies: + '@pkgr/core': 0.1.1 + tslib: 2.8.1 + + systemjs@6.15.1: {} + + 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.9: + 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.1.1 + prompts: 2.4.2 + ufo: 1.5.4 + unconfig: 0.4.5 + yargs: 17.7.2 + transitivePeerDependencies: + - supports-color + + terser@5.38.1: + dependencies: + '@jridgewell/source-map': 0.3.6 + acorn: 8.14.0 + 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: {} + + through@2.3.8: {} + + tiny-warning@1.0.3: {} + + tinybench@2.9.0: {} + + tinycolor2@1.6.0: {} + + tinyexec@0.3.2: {} + + tinypool@0.8.4: {} + + tinyspy@2.2.1: {} + + title-case@3.0.3: + dependencies: + tslib: 2.8.1 + + tmp@0.0.33: + dependencies: + os-tmpdir: 1.0.2 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + totalist@3.0.1: {} + + ts-api-utils@1.4.3(typescript@5.7.3): + dependencies: + typescript: 5.7.3 + + tslib@2.3.0: {} + + tslib@2.8.1: {} + + tsx@4.19.2: + dependencies: + esbuild: 0.23.1 + get-tsconfig: 4.10.0 + optionalDependencies: + fsevents: 2.3.3 + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-detect@4.1.0: {} + + type-fest@0.20.2: {} + + type-fest@0.21.3: {} + + type@2.7.3: {} + + typescript@5.4.2: {} + + typescript@5.7.3: {} + + uc.micro@2.1.0: {} + + ufo@1.5.4: {} + + uglify-js@3.19.3: + optional: true + + unc-path-regex@0.1.2: {} + + unconfig@0.3.13: + dependencies: + '@antfu/utils': 0.7.10 + defu: 6.1.4 + jiti: 1.21.7 + + unconfig@0.4.5: + dependencies: + '@antfu/utils': 0.7.10 + defu: 6.1.4 + importx: 0.3.11 + transitivePeerDependencies: + - supports-color + + undici-types@6.19.8: {} + + unicorn-magic@0.3.0: {} + + unimport@3.14.6(rollup@4.34.6): + dependencies: + '@rollup/pluginutils': 5.1.4(rollup@4.34.6) + acorn: 8.14.0 + escape-string-regexp: 5.0.0 + estree-walker: 3.0.3 + fast-glob: 3.3.3 + local-pkg: 1.0.0 + magic-string: 0.30.17 + mlly: 1.7.4 + pathe: 2.0.2 + picomatch: 4.0.2 + pkg-types: 1.3.1 + scule: 1.3.0 + strip-literal: 2.1.1 + unplugin: 1.16.1 + transitivePeerDependencies: + - rollup + + universalify@0.1.2: {} + + universalify@2.0.1: {} + + unocss@0.59.4(postcss@8.5.2)(rollup@4.34.6)(vite@5.4.14(@types/node@20.17.17)(lightningcss@1.29.1)(terser@5.38.1)): + dependencies: + '@unocss/astro': 0.59.4(rollup@4.34.6)(vite@5.4.14(@types/node@20.17.17)(lightningcss@1.29.1)(terser@5.38.1)) + '@unocss/cli': 0.59.4(rollup@4.34.6) + '@unocss/core': 0.59.4 + '@unocss/extractor-arbitrary-variants': 0.59.4 + '@unocss/postcss': 0.59.4(postcss@8.5.2) + '@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.34.6)(vite@5.4.14(@types/node@20.17.17)(lightningcss@1.29.1)(terser@5.38.1)) + optionalDependencies: + vite: 5.4.14(@types/node@20.17.17)(lightningcss@1.29.1)(terser@5.38.1) + transitivePeerDependencies: + - postcss + - rollup + - supports-color + + unplugin-auto-import@0.17.8(@vueuse/core@10.11.1(vue@3.5.13(typescript@5.7.3)))(rollup@4.34.6): + dependencies: + '@antfu/utils': 0.7.10 + '@rollup/pluginutils': 5.1.4(rollup@4.34.6) + fast-glob: 3.3.3 + local-pkg: 0.5.1 + magic-string: 0.30.17 + minimatch: 9.0.5 + unimport: 3.14.6(rollup@4.34.6) + unplugin: 1.16.1 + optionalDependencies: + '@vueuse/core': 10.11.1(vue@3.5.13(typescript@5.7.3)) + transitivePeerDependencies: + - rollup + + unplugin-vue-components@0.26.0(@babel/parser@7.26.8)(rollup@4.34.6)(vue@3.5.13(typescript@5.7.3)): + dependencies: + '@antfu/utils': 0.7.10 + '@rollup/pluginutils': 5.1.4(rollup@4.34.6) + chokidar: 3.6.0 + debug: 4.4.0 + fast-glob: 3.3.3 + local-pkg: 0.4.3 + magic-string: 0.30.17 + minimatch: 9.0.5 + resolve: 1.22.10 + unplugin: 1.16.1 + vue: 3.5.13(typescript@5.7.3) + optionalDependencies: + '@babel/parser': 7.26.8 + transitivePeerDependencies: + - rollup + - supports-color + + unplugin-vue-markdown@0.26.3(rollup@4.34.6)(vite@5.4.14(@types/node@20.17.17)(lightningcss@1.29.1)(terser@5.38.1)): + dependencies: + '@mdit-vue/plugin-component': 2.1.3 + '@mdit-vue/plugin-frontmatter': 2.1.3 + '@mdit-vue/types': 2.1.0 + '@rollup/pluginutils': 5.1.4(rollup@4.34.6) + '@types/markdown-it': 14.1.2 + markdown-it: 14.1.0 + unplugin: 1.16.1 + vite: 5.4.14(@types/node@20.17.17)(lightningcss@1.29.1)(terser@5.38.1) + transitivePeerDependencies: + - rollup + + unplugin-vue-router@0.8.8(rollup@4.34.6)(vue-router@4.5.0(vue@3.5.13(typescript@5.7.3)))(vue@3.5.13(typescript@5.7.3)): + dependencies: + '@babel/types': 7.26.8 + '@rollup/pluginutils': 5.1.4(rollup@4.34.6) + '@vue-macros/common': 1.16.1(vue@3.5.13(typescript@5.7.3)) + ast-walker-scope: 0.6.2 + chokidar: 3.6.0 + fast-glob: 3.3.3 + json5: 2.2.3 + local-pkg: 0.5.1 + mlly: 1.7.4 + pathe: 1.1.2 + scule: 1.3.0 + unplugin: 1.16.1 + yaml: 2.7.0 + optionalDependencies: + vue-router: 4.5.0(vue@3.5.13(typescript@5.7.3)) + transitivePeerDependencies: + - rollup + - vue + + unplugin@1.16.1: + dependencies: + acorn: 8.14.0 + webpack-virtual-modules: 0.6.2 + + update-browserslist-db@1.1.2(browserslist@4.24.4): + dependencies: + browserslist: 4.24.4 + escalade: 3.2.0 + picocolors: 1.1.1 + + upper-case-first@2.0.2: + dependencies: + tslib: 2.8.1 + + upper-case@2.0.2: + dependencies: + tslib: 2.8.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + use-element-plus-theme@0.0.5(@types/node@20.17.17)(rollup@4.34.6)(typescript@5.7.3)(vite@5.4.14(@types/node@20.17.17)(lightningcss@1.29.1)(terser@5.38.1)): + dependencies: + element-plus: 2.9.4(vue@3.5.13(typescript@5.7.3)) + vite-plugin-dts: 3.9.1(@types/node@20.17.17)(rollup@4.34.6)(typescript@5.7.3)(vite@5.4.14(@types/node@20.17.17)(lightningcss@1.29.1)(terser@5.38.1)) + vue: 3.5.13(typescript@5.7.3) + transitivePeerDependencies: + - '@types/node' + - '@vue/composition-api' + - rollup + - supports-color + - typescript + - vite + + util-deprecate@1.0.2: {} + + utils-lite@0.1.10: {} + + v-charts@1.19.0(echarts@5.6.0)(vue@3.5.13(typescript@5.7.3))(zrender@5.6.1): + dependencies: + echarts: 5.6.0 + echarts-amap: 1.0.0-rc.6 + echarts-liquidfill: 2.0.6(echarts@5.6.0)(zrender@5.6.1) + echarts-wordcloud: 1.1.3 + numerify: 1.2.9 + utils-lite: 0.1.10 + vue: 3.5.13(typescript@5.7.3) + transitivePeerDependencies: + - zrender + + v8-to-istanbul@9.3.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: {} + + validator@13.12.0: {} + + vite-auto-import-resolvers@3.2.1(unplugin-auto-import@0.17.8(@vueuse/core@10.11.1(vue@3.5.13(typescript@5.7.3)))(rollup@4.34.6))(vite@5.4.14(@types/node@20.17.17)(lightningcss@1.29.1)(terser@5.38.1)): + dependencies: + fast-glob: 3.3.3 + local-pkg: 0.4.3 + scule: 1.3.0 + unplugin-auto-import: 0.17.8(@vueuse/core@10.11.1(vue@3.5.13(typescript@5.7.3)))(rollup@4.34.6) + vite: 5.4.14(@types/node@20.17.17)(lightningcss@1.29.1)(terser@5.38.1) + + vite-hot-client@0.2.4(vite@5.4.14(@types/node@20.17.17)(lightningcss@1.29.1)(terser@5.38.1)): + dependencies: + vite: 5.4.14(@types/node@20.17.17)(lightningcss@1.29.1)(terser@5.38.1) + + vite-layers@0.5.2(vite@5.4.14(@types/node@20.17.17)(lightningcss@1.29.1)(terser@5.38.1)): + dependencies: + consola: 3.4.0 + defu: 6.1.4 + jiti: 1.21.7 + kolorist: 1.8.0 + m-type-tools: 0.5.3 + vite: 5.4.14(@types/node@20.17.17)(lightningcss@1.29.1)(terser@5.38.1) + + vite-node@1.6.1(@types/node@20.17.17)(lightningcss@1.29.1)(terser@5.38.1): + dependencies: + cac: 6.7.14 + debug: 4.4.0 + pathe: 1.1.2 + picocolors: 1.1.1 + vite: 5.4.14(@types/node@20.17.17)(lightningcss@1.29.1)(terser@5.38.1) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + + vite-plugin-compression@0.5.1(vite@5.4.14(@types/node@20.17.17)(lightningcss@1.29.1)(terser@5.38.1)): + dependencies: + chalk: 4.1.2 + debug: 4.4.0 + fs-extra: 10.1.0 + vite: 5.4.14(@types/node@20.17.17)(lightningcss@1.29.1)(terser@5.38.1) + transitivePeerDependencies: + - supports-color + + vite-plugin-dts@3.9.1(@types/node@20.17.17)(rollup@4.34.6)(typescript@5.7.3)(vite@5.4.14(@types/node@20.17.17)(lightningcss@1.29.1)(terser@5.38.1)): + dependencies: + '@microsoft/api-extractor': 7.43.0(@types/node@20.17.17) + '@rollup/pluginutils': 5.1.4(rollup@4.34.6) + '@vue/language-core': 1.8.27(typescript@5.7.3) + debug: 4.4.0 + kolorist: 1.8.0 + magic-string: 0.30.17 + typescript: 5.7.3 + vue-tsc: 1.8.27(typescript@5.7.3) + optionalDependencies: + vite: 5.4.14(@types/node@20.17.17)(lightningcss@1.29.1)(terser@5.38.1) + transitivePeerDependencies: + - '@types/node' + - rollup + - supports-color + + vite-plugin-env-types@0.1.4(vite@5.4.14(@types/node@20.17.17)(lightningcss@1.29.1)(terser@5.38.1)): + dependencies: + fast-glob: 3.3.3 + vite: 5.4.14(@types/node@20.17.17)(lightningcss@1.29.1)(terser@5.38.1) + + vite-plugin-inspect@0.8.9(rollup@4.34.6)(vite@5.4.14(@types/node@20.17.17)(lightningcss@1.29.1)(terser@5.38.1)): + dependencies: + '@antfu/utils': 0.7.10 + '@rollup/pluginutils': 5.1.4(rollup@4.34.6) + debug: 4.4.0 + error-stack-parser-es: 0.1.5 + fs-extra: 11.3.0 + open: 10.1.0 + perfect-debounce: 1.0.0 + picocolors: 1.1.1 + sirv: 3.0.0 + vite: 5.4.14(@types/node@20.17.17)(lightningcss@1.29.1)(terser@5.38.1) + transitivePeerDependencies: + - rollup + - supports-color + + vite-plugin-legacy-swc@1.2.3(vite@5.4.14(@types/node@20.17.17)(lightningcss@1.29.1)(terser@5.38.1)): + dependencies: + '@swc/core': 1.10.15 + browserslist: 4.24.4 + browserslist-to-esbuild: 2.1.1(browserslist@4.24.4) + core-js: 3.40.0 + magic-string: 0.30.17 + regenerator-runtime: 0.14.1 + systemjs: 6.15.1 + vite: 5.4.14(@types/node@20.17.17)(lightningcss@1.29.1)(terser@5.38.1) + transitivePeerDependencies: + - '@swc/helpers' + + vite-plugin-theme@0.8.6(vite@5.4.14(@types/node@20.17.17)(lightningcss@1.29.1)(terser@5.38.1)): + dependencies: + '@types/node': 14.18.63 + '@types/tinycolor2': 1.4.6 + chalk: 4.1.2 + clean-css: 5.3.3 + debug: 4.4.0 + esbuild: 0.11.23 + esbuild-plugin-alias: 0.1.2 + tinycolor2: 1.6.0 + vite: 5.4.14(@types/node@20.17.17)(lightningcss@1.29.1)(terser@5.38.1) + transitivePeerDependencies: + - supports-color + + vite-plugin-use-modules@1.4.8(vite@5.4.14(@types/node@20.17.17)(lightningcss@1.29.1)(terser@5.38.1))(vue@3.5.13(typescript@5.7.3)): + dependencies: + local-pkg: 0.5.1 + vite: 5.4.14(@types/node@20.17.17)(lightningcss@1.29.1)(terser@5.38.1) + vue: 3.5.13(typescript@5.7.3) + + vite-plugin-vue-devtools@7.7.1(rollup@4.34.6)(vite@5.4.14(@types/node@20.17.17)(lightningcss@1.29.1)(terser@5.38.1))(vue@3.5.13(typescript@5.7.3)): + dependencies: + '@vue/devtools-core': 7.7.1(vite@5.4.14(@types/node@20.17.17)(lightningcss@1.29.1)(terser@5.38.1))(vue@3.5.13(typescript@5.7.3)) + '@vue/devtools-kit': 7.7.1 + '@vue/devtools-shared': 7.7.1 + execa: 9.5.2 + sirv: 3.0.0 + vite: 5.4.14(@types/node@20.17.17)(lightningcss@1.29.1)(terser@5.38.1) + vite-plugin-inspect: 0.8.9(rollup@4.34.6)(vite@5.4.14(@types/node@20.17.17)(lightningcss@1.29.1)(terser@5.38.1)) + vite-plugin-vue-inspector: 5.3.1(vite@5.4.14(@types/node@20.17.17)(lightningcss@1.29.1)(terser@5.38.1)) + transitivePeerDependencies: + - '@nuxt/kit' + - rollup + - supports-color + - vue + + vite-plugin-vue-inspector@5.3.1(vite@5.4.14(@types/node@20.17.17)(lightningcss@1.29.1)(terser@5.38.1)): + dependencies: + '@babel/core': 7.26.8 + '@babel/plugin-proposal-decorators': 7.25.9(@babel/core@7.26.8) + '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.26.8) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.26.8) + '@babel/plugin-transform-typescript': 7.26.8(@babel/core@7.26.8) + '@vue/babel-plugin-jsx': 1.2.5(@babel/core@7.26.8) + '@vue/compiler-dom': 3.5.13 + kolorist: 1.8.0 + magic-string: 0.30.17 + vite: 5.4.14(@types/node@20.17.17)(lightningcss@1.29.1)(terser@5.38.1) + transitivePeerDependencies: + - supports-color + + vite-plugin-vue-meta-layouts@0.4.3(vite@5.4.14(@types/node@20.17.17)(lightningcss@1.29.1)(terser@5.38.1))(vue-router@4.5.0(vue@3.5.13(typescript@5.7.3))): + dependencies: + local-pkg: 0.5.1 + vite: 5.4.14(@types/node@20.17.17)(lightningcss@1.29.1)(terser@5.38.1) + vue-router: 4.5.0(vue@3.5.13(typescript@5.7.3)) + + vite@5.4.14(@types/node@20.17.17)(lightningcss@1.29.1)(terser@5.38.1): + dependencies: + esbuild: 0.21.5 + postcss: 8.5.2 + rollup: 4.34.6 + optionalDependencies: + '@types/node': 20.17.17 + fsevents: 2.3.3 + lightningcss: 1.29.1 + terser: 5.38.1 + + vitest@1.6.1(@types/node@20.17.17)(lightningcss@1.29.1)(terser@5.38.1): + dependencies: + '@vitest/expect': 1.6.1 + '@vitest/runner': 1.6.1 + '@vitest/snapshot': 1.6.1 + '@vitest/spy': 1.6.1 + '@vitest/utils': 1.6.1 + acorn-walk: 8.3.4 + chai: 4.5.0 + debug: 4.4.0 + execa: 8.0.1 + local-pkg: 0.5.1 + magic-string: 0.30.17 + pathe: 1.1.2 + picocolors: 1.1.1 + std-env: 3.8.0 + strip-literal: 2.1.1 + tinybench: 2.9.0 + tinypool: 0.8.4 + vite: 5.4.14(@types/node@20.17.17)(lightningcss@1.29.1)(terser@5.38.1) + vite-node: 1.6.1(@types/node@20.17.17)(lightningcss@1.29.1)(terser@5.38.1) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 20.17.17 + transitivePeerDependencies: + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + + vue-demi@0.13.11(vue@3.5.13(typescript@5.7.3)): + dependencies: + vue: 3.5.13(typescript@5.7.3) + + vue-demi@0.14.10(vue@3.5.13(typescript@5.7.3)): + dependencies: + vue: 3.5.13(typescript@5.7.3) + + vue-echarts@6.7.3(@vue/runtime-core@3.5.13)(echarts@5.6.0)(vue@3.5.13(typescript@5.7.3)): + dependencies: + echarts: 5.6.0 + resize-detector: 0.3.0 + vue: 3.5.13(typescript@5.7.3) + vue-demi: 0.13.11(vue@3.5.13(typescript@5.7.3)) + optionalDependencies: + '@vue/runtime-core': 3.5.13 + + vue-eslint-parser@9.4.3(eslint@8.57.0): + dependencies: + debug: 4.4.0 + eslint: 8.57.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.6.0 + lodash: 4.17.21 + semver: 7.7.1 + transitivePeerDependencies: + - supports-color + + vue-request@2.0.4(vue@3.5.13(typescript@5.7.3)): + dependencies: + vue: 3.5.13(typescript@5.7.3) + vue-demi: 0.14.10(vue@3.5.13(typescript@5.7.3)) + + vue-router@4.5.0(vue@3.5.13(typescript@5.7.3)): + dependencies: + '@vue/devtools-api': 6.6.4 + vue: 3.5.13(typescript@5.7.3) + + vue-template-compiler@2.7.16: + dependencies: + de-indent: 1.0.2 + he: 1.2.0 + + vue-toastification@2.0.0-rc.5(vue@3.5.13(typescript@5.7.3)): + dependencies: + vue: 3.5.13(typescript@5.7.3) + + vue-tsc@1.8.27(typescript@5.7.3): + dependencies: + '@volar/typescript': 1.11.1 + '@vue/language-core': 1.8.27(typescript@5.7.3) + semver: 7.7.1 + typescript: 5.7.3 + + vue@3.5.13(typescript@5.7.3): + dependencies: + '@vue/compiler-dom': 3.5.13 + '@vue/compiler-sfc': 3.5.13 + '@vue/runtime-dom': 3.5.13 + '@vue/server-renderer': 3.5.13(vue@3.5.13(typescript@5.7.3)) + '@vue/shared': 3.5.13 + optionalDependencies: + typescript: 5.7.3 + + wcwidth@1.0.1: + dependencies: + defaults: 1.0.4 + + webpack-virtual-modules@0.6.2: {} + + which@1.3.1: + dependencies: + isexe: 2.0.0 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + + wildcard@1.1.2: {} + + word-wrap@1.2.5: {} + + 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.2.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.7.0: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + 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.1.1: {} + + yoctocolors-cjs@2.1.2: {} + + yoctocolors@2.1.1: {} + + z-schema@5.0.5: + dependencies: + lodash.get: 4.4.2 + lodash.isequal: 4.5.0 + validator: 13.12.0 + optionalDependencies: + commander: 9.5.0 + + zrender@5.6.1: + 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..efde2af --- /dev/null +++ b/ui/presets/index.ts @@ -0,0 +1,232 @@ +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/eeeab8ba-58af-4da2-a882-2112c680f0c2.jpg b/ui/public/eeeab8ba-58af-4da2-a882-2112c680f0c2.jpg new file mode 100644 index 0000000..a0df472 Binary files /dev/null and b/ui/public/eeeab8ba-58af-4da2-a882-2112c680f0c2.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/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..c550d72 --- /dev/null +++ b/ui/src/App.vue @@ -0,0 +1,13 @@ + + + + diff --git a/ui/src/api/itemApi.ts b/ui/src/api/itemApi.ts new file mode 100644 index 0000000..1d07dc2 --- /dev/null +++ b/ui/src/api/itemApi.ts @@ -0,0 +1,12 @@ +/** + * 分页展示 + * @param data + */ +export function itemPage(data: any) { + + return frontRequest.get("/api/item/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..ed6de2d --- /dev/null +++ b/ui/src/api/user/frontUserApi.ts @@ -0,0 +1,34 @@ + +/** + * 注册 + * @param data + */ +export function registerFront(data: any) { + return frontRequest.post("/api/user/register", data) +} + +/** + * 获取用户信息 + * @param userId + */ +export function userInfoFront(userId: any) { + return frontRequest.get("/api/user/userInfo", { + params: { userId: userId } + }) +} + +/** + * 修改用户信息 + * @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/BarChart.vue b/ui/src/components/BarChart.vue new file mode 100644 index 0000000..1bef0d6 --- /dev/null +++ b/ui/src/components/BarChart.vue @@ -0,0 +1,60 @@ + + + + + diff --git a/ui/src/components/Heads.vue b/ui/src/components/Heads.vue new file mode 100644 index 0000000..bb919af --- /dev/null +++ b/ui/src/components/Heads.vue @@ -0,0 +1,147 @@ + + + diff --git a/ui/src/components/ImageUpload.vue b/ui/src/components/ImageUpload.vue new file mode 100644 index 0000000..08f1190 --- /dev/null +++ b/ui/src/components/ImageUpload.vue @@ -0,0 +1,92 @@ + + + + diff --git a/ui/src/components/e-editor.vue b/ui/src/components/e-editor.vue new file mode 100644 index 0000000..df564fc --- /dev/null +++ b/ui/src/components/e-editor.vue @@ -0,0 +1,110 @@ + + diff --git a/ui/src/components/front/carousel.vue b/ui/src/components/front/carousel.vue new file mode 100644 index 0000000..c090951 --- /dev/null +++ b/ui/src/components/front/carousel.vue @@ -0,0 +1,39 @@ + + + diff --git a/ui/src/components/front/info-bottom.vue b/ui/src/components/front/info-bottom.vue new file mode 100644 index 0000000..847724a --- /dev/null +++ b/ui/src/components/front/info-bottom.vue @@ -0,0 +1,97 @@ + + + + diff --git a/ui/src/components/front/item.vue b/ui/src/components/front/item.vue new file mode 100644 index 0000000..8874b97 --- /dev/null +++ b/ui/src/components/front/item.vue @@ -0,0 +1,265 @@ + + + + diff --git a/ui/src/components/front/item2.vue b/ui/src/components/front/item2.vue new file mode 100644 index 0000000..7d73fed --- /dev/null +++ b/ui/src/components/front/item2.vue @@ -0,0 +1,90 @@ + + + + diff --git a/ui/src/components/hot/Hot1.vue b/ui/src/components/hot/Hot1.vue new file mode 100644 index 0000000..67aa976 --- /dev/null +++ b/ui/src/components/hot/Hot1.vue @@ -0,0 +1,114 @@ + + + + diff --git a/ui/src/components/nav/Navigation.vue b/ui/src/components/nav/Navigation.vue new file mode 100644 index 0000000..d32fc95 --- /dev/null +++ b/ui/src/components/nav/Navigation.vue @@ -0,0 +1,97 @@ + + + + diff --git a/ui/src/components/view/brand-pie.vue b/ui/src/components/view/brand-pie.vue new file mode 100644 index 0000000..e4b1509 --- /dev/null +++ b/ui/src/components/view/brand-pie.vue @@ -0,0 +1,100 @@ + + + + + diff --git a/ui/src/components/view/foundation-line.vue b/ui/src/components/view/foundation-line.vue new file mode 100644 index 0000000..1e81fa3 --- /dev/null +++ b/ui/src/components/view/foundation-line.vue @@ -0,0 +1,87 @@ + + + + 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..14ce77e --- /dev/null +++ b/ui/src/composables/frontRequest.ts @@ -0,0 +1,76 @@ +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 + + 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: + toast.error(response.data.msg) + return Promise.reject(response.data.msg) + case 401: + window.open(`/login`, '_self') + toast.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..c49f0d4 --- /dev/null +++ b/ui/src/layouts/admin.vue @@ -0,0 +1,59 @@ + + + + diff --git a/ui/src/layouts/default.vue b/ui/src/layouts/default.vue new file mode 100644 index 0000000..e8ae160 --- /dev/null +++ b/ui/src/layouts/default.vue @@ -0,0 +1,5 @@ + + + diff --git a/ui/src/layouts/front.vue b/ui/src/layouts/front.vue new file mode 100644 index 0000000..5faba53 --- /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..942c5ed --- /dev/null +++ b/ui/src/layouts/frontUserInfo.vue @@ -0,0 +1,55 @@ + + + + + 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..5bb6ef4 --- /dev/null +++ b/ui/src/main.ts @@ -0,0 +1,17 @@ +// 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 App from './App.vue' +const app = createApp(App) +for (const [key, component] of Object.entries(ElementPlusIconsVue)) { + app.component(key, component) +} +app.use(ElementPlus) + +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/address/index.vue b/ui/src/pages/address/index.vue new file mode 100644 index 0000000..acc7ff8 --- /dev/null +++ b/ui/src/pages/address/index.vue @@ -0,0 +1,232 @@ + + + + +{ +"meta": { +"layout": "front" +} +} + diff --git a/ui/src/pages/admin/cate.vue b/ui/src/pages/admin/cate.vue new file mode 100644 index 0000000..082aef0 --- /dev/null +++ b/ui/src/pages/admin/cate.vue @@ -0,0 +1,207 @@ + + + + +{ +"meta": { +"layout": "admin" +} +} + diff --git a/ui/src/pages/admin/comment.vue b/ui/src/pages/admin/comment.vue new file mode 100644 index 0000000..ab388eb --- /dev/null +++ b/ui/src/pages/admin/comment.vue @@ -0,0 +1,128 @@ + + + + +{ +"meta": { +"layout": "admin" +} +} + diff --git a/ui/src/pages/admin/house.vue b/ui/src/pages/admin/house.vue new file mode 100644 index 0000000..9349818 --- /dev/null +++ b/ui/src/pages/admin/house.vue @@ -0,0 +1,390 @@ + + + + + +{ +"meta": { +"layout": "admin", +"title": "房源管理" +} +} + diff --git a/ui/src/pages/admin/index.vue b/ui/src/pages/admin/index.vue new file mode 100644 index 0000000..63ef4e0 --- /dev/null +++ b/ui/src/pages/admin/index.vue @@ -0,0 +1,449 @@ + + + + + + + +{ +"meta": { +"layout": "admin", +"title": "区块链屋屋换住系统 - 后台首页" +} +} + diff --git a/ui/src/pages/admin/leaderboard.vue b/ui/src/pages/admin/leaderboard.vue new file mode 100644 index 0000000..0e0e4be --- /dev/null +++ b/ui/src/pages/admin/leaderboard.vue @@ -0,0 +1,211 @@ + + + + +{ +"meta": { +"layout": "admin" +} +} + diff --git a/ui/src/pages/admin/order.vue b/ui/src/pages/admin/order.vue new file mode 100644 index 0000000..4605a5e --- /dev/null +++ b/ui/src/pages/admin/order.vue @@ -0,0 +1,173 @@ + + + + + + + +{ +"meta": { +"layout": "admin" +} +} + diff --git a/ui/src/pages/admin/slides.vue b/ui/src/pages/admin/slides.vue new file mode 100644 index 0000000..c48906d --- /dev/null +++ b/ui/src/pages/admin/slides.vue @@ -0,0 +1,203 @@ + + + + +{ +"meta": { +"layout": "admin" +} +} + diff --git a/ui/src/pages/admin/topic.vue b/ui/src/pages/admin/topic.vue new file mode 100644 index 0000000..af18d49 --- /dev/null +++ b/ui/src/pages/admin/topic.vue @@ -0,0 +1,211 @@ + + + + +{ +"meta": { +"layout": "admin" +} +} + diff --git a/ui/src/pages/admin/user.vue b/ui/src/pages/admin/user.vue new file mode 100644 index 0000000..a72a9a9 --- /dev/null +++ b/ui/src/pages/admin/user.vue @@ -0,0 +1,208 @@ + + + + +{ +"meta": { +"layout": "admin" +} +} + diff --git a/ui/src/pages/chat/index.vue b/ui/src/pages/chat/index.vue new file mode 100644 index 0000000..0b6ee60 --- /dev/null +++ b/ui/src/pages/chat/index.vue @@ -0,0 +1,339 @@ + + + + + + + +{ +"meta": { +"layout": "front" +} +} + diff --git a/ui/src/pages/collect/index.vue b/ui/src/pages/collect/index.vue new file mode 100644 index 0000000..284fdb9 --- /dev/null +++ b/ui/src/pages/collect/index.vue @@ -0,0 +1,90 @@ + + + + + + + +{ +"meta": { +"layout": "front" +} +} + diff --git a/ui/src/pages/index.vue b/ui/src/pages/index.vue new file mode 100644 index 0000000..43ce678 --- /dev/null +++ b/ui/src/pages/index.vue @@ -0,0 +1,67 @@ + + + + +{ +"meta": { +"layout": "front" +} +} + diff --git a/ui/src/pages/info/[id].vue b/ui/src/pages/info/[id].vue new file mode 100644 index 0000000..69f3761 --- /dev/null +++ b/ui/src/pages/info/[id].vue @@ -0,0 +1,720 @@ + + + + + + + +{ +"meta": { +"layout": "front" +} +} + diff --git a/ui/src/pages/list/index.vue b/ui/src/pages/list/index.vue new file mode 100644 index 0000000..a77b4df --- /dev/null +++ b/ui/src/pages/list/index.vue @@ -0,0 +1,271 @@ + + + + + + +{ +"meta": { +"layout": "front" +} +} + diff --git a/ui/src/pages/login.vue b/ui/src/pages/login.vue new file mode 100644 index 0000000..694b759 --- /dev/null +++ b/ui/src/pages/login.vue @@ -0,0 +1,324 @@ + + + + + + + +{ +"meta": { +"layout": "notFound", +"title": "登录 - 数字图书版权系统", +"requiresAuth": false +} +} + diff --git a/ui/src/pages/order/index.vue b/ui/src/pages/order/index.vue new file mode 100644 index 0000000..7e68d29 --- /dev/null +++ b/ui/src/pages/order/index.vue @@ -0,0 +1,250 @@ + + + + + + + +{ +"meta": { +"layout": "front" +} +} + diff --git a/ui/src/pages/push.vue b/ui/src/pages/push.vue new file mode 100644 index 0000000..8c36366 --- /dev/null +++ b/ui/src/pages/push.vue @@ -0,0 +1,111 @@ + + + + +{ +"meta": { +"layout": "front" +} +} + diff --git a/ui/src/pages/register.vue b/ui/src/pages/register.vue new file mode 100644 index 0000000..d415037 --- /dev/null +++ b/ui/src/pages/register.vue @@ -0,0 +1,363 @@ + + + + + + + +{ +"meta": { +"layout": "notFound", +"title": "注册 - 数字图书版权系统", +"requiresAuth": false +} +} + diff --git a/ui/src/pages/topic/index.vue b/ui/src/pages/topic/index.vue new file mode 100644 index 0000000..7f06c3d --- /dev/null +++ b/ui/src/pages/topic/index.vue @@ -0,0 +1,644 @@ + + + + + + + + +{ +"meta": { +"layout": "front" +} +} + diff --git a/ui/src/pages/upload.vue b/ui/src/pages/upload.vue new file mode 100644 index 0000000..98ac9cd --- /dev/null +++ b/ui/src/pages/upload.vue @@ -0,0 +1,244 @@ + + + + + + +{ +"meta": { +"layout": "front" +} +} + diff --git a/ui/src/pages/user/index.vue b/ui/src/pages/user/index.vue new file mode 100644 index 0000000..3598f2d --- /dev/null +++ b/ui/src/pages/user/index.vue @@ -0,0 +1,195 @@ + + + + + + + +{ +"meta": { +"layout": "front" +} +} + 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..a50d300 --- /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..2e93311 --- /dev/null +++ b/ui/src/stores/navStore.ts @@ -0,0 +1,16 @@ +import { defineStore } from 'pinia' + +export default defineStore('navStore', { + state() { + return { + adminPath: "/admin", + 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..642292b --- /dev/null +++ b/ui/src/styles/main.css @@ -0,0 +1,53 @@ + + +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..0ed01ee --- /dev/null +++ b/ui/src/utils/utils.ts @@ -0,0 +1,97 @@ + +export const getAdminList = () => { + const routes =[ + { + "path": "/admin", + "name": "首页", + "icon": "HomeFilled" // 首页 + }, + { + "path": "/admin/house", + "name": "房源管理", + "icon": "Discount" // 电影管理 + }, + + { + "path": "/admin/slides", + "name": "轮播管理", + "icon": "Picture" // 轮播图管理 + }, + { + "path": "/admin/user", + "name": "用户管理", + "icon": "User" // 用户管理 + } + ] + return routes; +} +export const getFrontList = () => { + const routes = [ + { + "path": "/", + "name": "首页", + "icon": "House", + }, + { + "path": "/list", + "name": "供应房源", + "icon": "House", + }, + + { + "path": "/upload", + "name": "发布房源", + "icon": "Trophy" + }, + { + "path": "/topic", + "name": "房源溯源", + "icon": "Trophy" + }, + { + "path": "/order", + "name": "我的换住", + "icon": "Trophy" + }, + { + "path": "/push", + "name": "我的发布", + "icon": "Trophy" + }, + { + "path": "/collect", + "name": "我的收藏", + "icon": "Trophy" + }, + ] + return routes; +} +export const getHouseType = () => { + const routes =[ + { value: "1室1厅", label: "1室1厅" }, + { value: "2室1厅", label: "2室1厅" }, + { value: "3室2厅", label: "3室2厅" }, + { value: "4室2厅", label: "4室2厅" }, + { value: "复式", label: "复式" }, + { value: "别墅", label: "别墅" }, + ] + return routes; +} + +export const getFace = () => { + const routes =["东", "西", "南", "北", "东南", "东北", "西南", "西北"] + return routes; +} +export const getDecoration = () => { + const routes =["精装", "简装", "毛坯"] + return routes; +} +export const getHouseStatus = () => { + const routes =[ + {name:"未审核",status:0}, + {name:"上架",status:1}, + {name:"下架",status:2}, + {name:"审核失败",status:3}, + ] + 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()], +}) diff --git a/upload/1740631782830.jpg b/upload/1740631782830.jpg new file mode 100644 index 0000000..8b6f180 Binary files /dev/null and b/upload/1740631782830.jpg differ diff --git a/upload/360x312c (1).webp b/upload/360x312c (1).webp new file mode 100644 index 0000000..7cb537b Binary files /dev/null and b/upload/360x312c (1).webp differ diff --git a/upload/360x312c.webp b/upload/360x312c.webp new file mode 100644 index 0000000..aa5e969 Binary files /dev/null and b/upload/360x312c.webp differ diff --git a/upload/O1CN0115ABTV27Z2F0dQdfI_!!2212563387810-0-cib.jpg b/upload/O1CN0115ABTV27Z2F0dQdfI_!!2212563387810-0-cib.jpg new file mode 100644 index 0000000..ed8c7cd Binary files /dev/null and b/upload/O1CN0115ABTV27Z2F0dQdfI_!!2212563387810-0-cib.jpg differ diff --git a/upload/O1CN015z2vyg1kVc9Wsb8FM_!!2215351804689-0-cib.220x220.jpg b/upload/O1CN015z2vyg1kVc9Wsb8FM_!!2215351804689-0-cib.220x220.jpg new file mode 100644 index 0000000..aa039f0 Binary files /dev/null and b/upload/O1CN015z2vyg1kVc9Wsb8FM_!!2215351804689-0-cib.220x220.jpg differ diff --git a/upload/O1CN01IJI1nR1MWU87iUSuX_!!3256441442-0-cib.jpg b/upload/O1CN01IJI1nR1MWU87iUSuX_!!3256441442-0-cib.jpg new file mode 100644 index 0000000..debc634 Binary files /dev/null and b/upload/O1CN01IJI1nR1MWU87iUSuX_!!3256441442-0-cib.jpg differ diff --git a/upload/O1CN01Kwvwow1aBKIhQYQTA_!!1044073291-0-cib.220x220.jpg b/upload/O1CN01Kwvwow1aBKIhQYQTA_!!1044073291-0-cib.220x220.jpg new file mode 100644 index 0000000..74c246a Binary files /dev/null and b/upload/O1CN01Kwvwow1aBKIhQYQTA_!!1044073291-0-cib.220x220.jpg differ diff --git a/upload/O1CN01Xqk9zp1PK46NWCoO3_!!2207957211821-0-cib.jpg b/upload/O1CN01Xqk9zp1PK46NWCoO3_!!2207957211821-0-cib.jpg new file mode 100644 index 0000000..0bf0bc3 Binary files /dev/null and b/upload/O1CN01Xqk9zp1PK46NWCoO3_!!2207957211821-0-cib.jpg differ diff --git a/upload/O1CN01azL4qR1nfdh0mIlRq_!!2630035117-0-cib.jpg b/upload/O1CN01azL4qR1nfdh0mIlRq_!!2630035117-0-cib.jpg new file mode 100644 index 0000000..5e530fd Binary files /dev/null and b/upload/O1CN01azL4qR1nfdh0mIlRq_!!2630035117-0-cib.jpg differ diff --git a/upload/O1CN01bB7zOL1mQh16hZh3M_!!2216567084949-0-cib.220x220.jpg b/upload/O1CN01bB7zOL1mQh16hZh3M_!!2216567084949-0-cib.220x220.jpg new file mode 100644 index 0000000..7ec89f7 Binary files /dev/null and b/upload/O1CN01bB7zOL1mQh16hZh3M_!!2216567084949-0-cib.220x220.jpg differ diff --git a/upload/O1CN01k8Vg8h20BUXegClF2_!!2206959446811-0-cib.jpg b/upload/O1CN01k8Vg8h20BUXegClF2_!!2206959446811-0-cib.jpg new file mode 100644 index 0000000..9fc0306 Binary files /dev/null and b/upload/O1CN01k8Vg8h20BUXegClF2_!!2206959446811-0-cib.jpg differ diff --git a/upload/O1CN01lHcDfK1aBKFDjfldD_!!1044073291-0-cib.220x220.jpg b/upload/O1CN01lHcDfK1aBKFDjfldD_!!1044073291-0-cib.220x220.jpg new file mode 100644 index 0000000..2ad33e0 Binary files /dev/null and b/upload/O1CN01lHcDfK1aBKFDjfldD_!!1044073291-0-cib.220x220.jpg differ diff --git a/upload/a8fe00b76ebf8bf2fa27238d214aa2a.jpg b/upload/a8fe00b76ebf8bf2fa27238d214aa2a.jpg new file mode 100644 index 0000000..9bbf6f8 Binary files /dev/null and b/upload/a8fe00b76ebf8bf2fa27238d214aa2a.jpg differ diff --git a/upload/bd592e8c-64dd-4610-b860-b3ed8554aba1.jpg b/upload/bd592e8c-64dd-4610-b860-b3ed8554aba1.jpg new file mode 100644 index 0000000..a46f892 Binary files /dev/null and b/upload/bd592e8c-64dd-4610-b860-b3ed8554aba1.jpg differ diff --git a/upload/f9c58926-1656-4d45-a5d9-45a94e9291ee.jpg b/upload/f9c58926-1656-4d45-a5d9-45a94e9291ee.jpg new file mode 100644 index 0000000..38788f4 Binary files /dev/null and b/upload/f9c58926-1656-4d45-a5d9-45a94e9291ee.jpg differ