diff --git a/auto-solution-admin/src/main/java/com/solution/web/controller/algo/AlgorithmController.java b/auto-solution-admin/src/main/java/com/solution/web/controller/algo/AlgorithmController.java new file mode 100644 index 0000000..0971b69 --- /dev/null +++ b/auto-solution-admin/src/main/java/com/solution/web/controller/algo/AlgorithmController.java @@ -0,0 +1,107 @@ +package com.solution.web.controller.algo; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.solution.common.annotation.Log; +import com.solution.common.core.controller.BaseController; +import com.solution.common.core.domain.AjaxResult; +import com.solution.common.enums.BusinessType; +import com.solution.algo.domain.Algorithm; +import com.solution.algo.service.IAlgorithmService; +import com.solution.common.utils.poi.ExcelUtil; +import com.solution.common.core.page.TableDataInfo; + +/** + * 规则Controller + * + * @author zouju + * @date 2026-02-06 + */ +@RestController +@Api("规则模块") +@RequestMapping("/algo/algorithm") +public class AlgorithmController extends BaseController { + @Autowired + private IAlgorithmService algorithmService; + + /** + * 查询规则列表 + */ + @ApiOperation("查询规则列表") + @PreAuthorize("@ss.hasPermi('algo:algorithm:list')") + @GetMapping("/list") + public TableDataInfo list(Algorithm algorithm) { + startPage(); + List list = algorithmService.selectAlgorithmList(algorithm); + return getDataTable(list); + } + + /** + * 导出规则列表 + */ + @ApiOperation("导出规则列表") + @PreAuthorize("@ss.hasPermi('algo:algorithm:export')") + @Log(title = "规则", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, Algorithm algorithm) { + List list = algorithmService.selectAlgorithmList(algorithm); + ExcelUtil util = new ExcelUtil(Algorithm.class); + util.exportExcel(response, list, "规则数据"); + } + + /** + * 获取规则详细信息 + */ + @ApiOperation("获取规则详细信息") + @PreAuthorize("@ss.hasPermi('algo:algorithm:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) { + return success(algorithmService.selectAlgorithmById(id)); + } + + /** + * 新增规则 + */ + @ApiOperation("新增规则") + @PreAuthorize("@ss.hasPermi('algo:algorithm:add')") + @Log(title = "规则", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody Algorithm algorithm) { + return toAjax(algorithmService.insertAlgorithm(algorithm)); + } + + /** + * 修改规则 + */ + @ApiOperation("修改规则") + @PreAuthorize("@ss.hasPermi('algo:algorithm:edit')") + @Log(title = "规则", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody Algorithm algorithm) { + return toAjax(algorithmService.updateAlgorithm(algorithm)); + } + + /** + * 删除规则 + */ + @ApiOperation("删除规则") + @PreAuthorize("@ss.hasPermi('algo:algorithm:remove')") + @Log(title = "规则", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) { + return toAjax(algorithmService.deleteAlgorithmByIds(ids)); + } +} diff --git a/auto-solution-admin/src/main/java/com/solution/web/controller/algo/SysAlgoConfigController.java b/auto-solution-admin/src/main/java/com/solution/web/controller/algo/SysAlgoConfigController.java deleted file mode 100644 index 8f6bf83..0000000 --- a/auto-solution-admin/src/main/java/com/solution/web/controller/algo/SysAlgoConfigController.java +++ /dev/null @@ -1,104 +0,0 @@ -package com.solution.web.controller.algo; - -import java.util.List; -import javax.servlet.http.HttpServletResponse; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import com.solution.common.annotation.Log; -import com.solution.common.core.controller.BaseController; -import com.solution.common.core.domain.AjaxResult; -import com.solution.common.enums.BusinessType; -import com.solution.algo.domain.SysAlgoConfig; -import com.solution.algo.service.ISysAlgoConfigService; -import com.solution.common.utils.poi.ExcelUtil; -import com.solution.common.core.page.TableDataInfo; - -/** - * 动态规则配置Controller - * - * @author zouju - * @date 2026-02-05 - */ -@RestController -@RequestMapping("/algo/algo") -public class SysAlgoConfigController extends BaseController -{ - @Autowired - private ISysAlgoConfigService sysAlgoConfigService; - - /** - * 查询动态规则配置列表 - */ - @PreAuthorize("@ss.hasPermi('algo:algo:list')") - @GetMapping("/list") - public TableDataInfo list(SysAlgoConfig sysAlgoConfig) - { - startPage(); - List list = sysAlgoConfigService.selectSysAlgoConfigList(sysAlgoConfig); - return getDataTable(list); - } - - /** - * 导出动态规则配置列表 - */ - @PreAuthorize("@ss.hasPermi('algo:algo:export')") - @Log(title = "动态规则配置", businessType = BusinessType.EXPORT) - @PostMapping("/export") - public void export(HttpServletResponse response, SysAlgoConfig sysAlgoConfig) - { - List list = sysAlgoConfigService.selectSysAlgoConfigList(sysAlgoConfig); - ExcelUtil util = new ExcelUtil(SysAlgoConfig.class); - util.exportExcel(response, list, "动态规则配置数据"); - } - - /** - * 获取动态规则配置详细信息 - */ - @PreAuthorize("@ss.hasPermi('algo:algo:query')") - @GetMapping(value = "/{id}") - public AjaxResult getInfo(@PathVariable("id") Long id) - { - return success(sysAlgoConfigService.selectSysAlgoConfigById(id)); - } - - /** - * 新增动态规则配置 - */ - @PreAuthorize("@ss.hasPermi('algo:algo:add')") - @Log(title = "动态规则配置", businessType = BusinessType.INSERT) - @PostMapping - public AjaxResult add(@RequestBody SysAlgoConfig sysAlgoConfig) - { - return toAjax(sysAlgoConfigService.insertSysAlgoConfig(sysAlgoConfig)); - } - - /** - * 修改动态规则配置 - */ - @PreAuthorize("@ss.hasPermi('algo:algo:edit')") - @Log(title = "动态规则配置", businessType = BusinessType.UPDATE) - @PutMapping - public AjaxResult edit(@RequestBody SysAlgoConfig sysAlgoConfig) - { - return toAjax(sysAlgoConfigService.updateSysAlgoConfig(sysAlgoConfig)); - } - - /** - * 删除动态规则配置 - */ - @PreAuthorize("@ss.hasPermi('algo:algo:remove')") - @Log(title = "动态规则配置", businessType = BusinessType.DELETE) - @DeleteMapping("/{ids}") - public AjaxResult remove(@PathVariable Long[] ids) - { - return toAjax(sysAlgoConfigService.deleteSysAlgoConfigByIds(ids)); - } -} diff --git a/auto-solution-algo/src/main/java/com/solution/algo/domain/Algorithm.java b/auto-solution-algo/src/main/java/com/solution/algo/domain/Algorithm.java new file mode 100644 index 0000000..07d2755 --- /dev/null +++ b/auto-solution-algo/src/main/java/com/solution/algo/domain/Algorithm.java @@ -0,0 +1,111 @@ +package com.solution.algo.domain; + +import java.util.List; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.solution.common.annotation.Excel; +import com.solution.common.core.domain.BaseEntity; + +/** + * 规则对象 algorithm + * + * @author ruoyi + * @date 2026-02-06 + */ +public class Algorithm +{ + + /** */ + private Long id; + + /** 算法名称 */ + @Excel(name = "算法名称") + private String name; + + /** 业务类型 */ + @Excel(name = "业务类型") + private String type; + + /** 算法文件路径 */ + @Excel(name = "算法文件路径") + private String codePath; + + /** 算法描述 */ + @Excel(name = "算法描述") + private String description; + + /** 算法参数定义信息 */ + private List algorithmParamList; + + public void setId(Long id) + { + this.id = id; + } + + public Long getId() + { + return id; + } + + public void setName(String name) + { + this.name = name; + } + + public String getName() + { + return name; + } + + public void setType(String type) + { + this.type = type; + } + + public String getType() + { + return type; + } + + public void setCodePath(String codePath) + { + this.codePath = codePath; + } + + public String getCodePath() + { + return codePath; + } + + public void setDescription(String description) + { + this.description = description; + } + + public String getDescription() + { + return description; + } + + public List getAlgorithmParamList() + { + return algorithmParamList; + } + + public void setAlgorithmParamList(List algorithmParamList) + { + this.algorithmParamList = algorithmParamList; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("name", getName()) + .append("type", getType()) + .append("codePath", getCodePath()) + .append("description", getDescription()) + .append("algorithmParamList", getAlgorithmParamList()) + .toString(); + } +} diff --git a/auto-solution-algo/src/main/java/com/solution/algo/domain/AlgorithmParam.java b/auto-solution-algo/src/main/java/com/solution/algo/domain/AlgorithmParam.java new file mode 100644 index 0000000..eaeb6b3 --- /dev/null +++ b/auto-solution-algo/src/main/java/com/solution/algo/domain/AlgorithmParam.java @@ -0,0 +1,92 @@ +package com.solution.algo.domain; + +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.solution.common.annotation.Excel; +import com.solution.common.core.domain.BaseEntity; + +/** + * 算法参数定义对象 algorithm_param + * + * @author ruoyi + * @date 2026-02-06 + */ +public class AlgorithmParam +{ + + /** $column.columnComment */ + private Long id; + + /** 算法ID */ + @Excel(name = "算法ID") + private Long algorithmId; + + /** 参数名 */ + @Excel(name = "参数名") + private String paramName; + + /** 默认值 */ + @Excel(name = "默认值") + private String defaultValue; + + /** 描述 */ + @Excel(name = "描述") + private String description; + + public void setId(Long id) + { + this.id = id; + } + + public Long getId() + { + return id; + } + public void setAlgorithmId(Long algorithmId) + { + this.algorithmId = algorithmId; + } + + public Long getAlgorithmId() + { + return algorithmId; + } + public void setParamName(String paramName) + { + this.paramName = paramName; + } + + public String getParamName() + { + return paramName; + } + public void setDefaultValue(String defaultValue) + { + this.defaultValue = defaultValue; + } + + public String getDefaultValue() + { + return defaultValue; + } + public void setDescription(String description) + { + this.description = description; + } + + public String getDescription() + { + return description; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("algorithmId", getAlgorithmId()) + .append("paramName", getParamName()) + .append("defaultValue", getDefaultValue()) + .append("description", getDescription()) + .toString(); + } +} diff --git a/auto-solution-algo/src/main/java/com/solution/algo/domain/SysAlgoConfig.java b/auto-solution-algo/src/main/java/com/solution/algo/domain/SysAlgoConfig.java deleted file mode 100644 index 8a9a774..0000000 --- a/auto-solution-algo/src/main/java/com/solution/algo/domain/SysAlgoConfig.java +++ /dev/null @@ -1,176 +0,0 @@ -package com.solution.algo.domain; - -import java.util.Date; -import com.fasterxml.jackson.annotation.JsonFormat; -import org.apache.commons.lang3.builder.ToStringBuilder; -import org.apache.commons.lang3.builder.ToStringStyle; -import com.solution.common.annotation.Excel; -import com.solution.common.core.domain.BaseEntity; - -/** - * 动态规则配置对象 sys_algo_config - * - * @author zouju - * @date 2026-02-05 - */ -public class SysAlgoConfig extends BaseEntity -{ - private static final long serialVersionUID = 1L; - - /** 主键ID */ - private Long id; - - /** 算法唯一标识(Type),用于接口路由 */ - @Excel(name = "算法唯一标识(Type),用于接口路由") - private String algoType; - - /** 算法名称,后台展示用 */ - @Excel(name = "算法名称,后台展示用") - private String algoName; - - /** 执行引擎类型: GROOVY, PYTHON, JS, LUA等 */ - @Excel(name = "执行引擎类型: GROOVY, PYTHON, JS, LUA等") - private String engineType; - - /** 参数定义模型(JSON Schema),用于自动校验入参 */ - @Excel(name = "参数定义模型(JSON Schema),用于自动校验入参") - private String inputSchema; - - /** 算法脚本代码或规则表达式 */ - @Excel(name = "算法脚本代码或规则表达式") - private String scriptContent; - - /** 算法描述 */ - @Excel(name = "算法描述") - private String description; - - /** 状态: 1-启用, 0-禁用 */ - @Excel(name = "状态: 1-启用, 0-禁用") - private Long status; - - /** 创建时间 */ - @JsonFormat(pattern = "yyyy-MM-dd") - @Excel(name = "创建时间", width = 30, dateFormat = "yyyy-MM-dd") - private Date createdAt; - - /** 更新时间 */ - @JsonFormat(pattern = "yyyy-MM-dd") - @Excel(name = "更新时间", width = 30, dateFormat = "yyyy-MM-dd") - private Date updatedAt; - - public void setId(Long id) - { - this.id = id; - } - - public Long getId() - { - return id; - } - - public void setAlgoType(String algoType) - { - this.algoType = algoType; - } - - public String getAlgoType() - { - return algoType; - } - - public void setAlgoName(String algoName) - { - this.algoName = algoName; - } - - public String getAlgoName() - { - return algoName; - } - - public void setEngineType(String engineType) - { - this.engineType = engineType; - } - - public String getEngineType() - { - return engineType; - } - - public void setInputSchema(String inputSchema) - { - this.inputSchema = inputSchema; - } - - public String getInputSchema() - { - return inputSchema; - } - - public void setScriptContent(String scriptContent) - { - this.scriptContent = scriptContent; - } - - public String getScriptContent() - { - return scriptContent; - } - - public void setDescription(String description) - { - this.description = description; - } - - public String getDescription() - { - return description; - } - - public void setStatus(Long status) - { - this.status = status; - } - - public Long getStatus() - { - return status; - } - - public void setCreatedAt(Date createdAt) - { - this.createdAt = createdAt; - } - - public Date getCreatedAt() - { - return createdAt; - } - - public void setUpdatedAt(Date updatedAt) - { - this.updatedAt = updatedAt; - } - - public Date getUpdatedAt() - { - return updatedAt; - } - - @Override - public String toString() { - return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) - .append("id", getId()) - .append("algoType", getAlgoType()) - .append("algoName", getAlgoName()) - .append("engineType", getEngineType()) - .append("inputSchema", getInputSchema()) - .append("scriptContent", getScriptContent()) - .append("description", getDescription()) - .append("status", getStatus()) - .append("createdAt", getCreatedAt()) - .append("updatedAt", getUpdatedAt()) - .toString(); - } -} diff --git a/auto-solution-algo/src/main/java/com/solution/algo/mapper/AlgorithmMapper.java b/auto-solution-algo/src/main/java/com/solution/algo/mapper/AlgorithmMapper.java new file mode 100644 index 0000000..ac25071 --- /dev/null +++ b/auto-solution-algo/src/main/java/com/solution/algo/mapper/AlgorithmMapper.java @@ -0,0 +1,87 @@ +package com.solution.algo.mapper; + +import java.util.List; +import com.solution.algo.domain.Algorithm; +import com.solution.algo.domain.AlgorithmParam; + +/** + * 规则Mapper接口 + * + * @author ruoyi + * @date 2026-02-06 + */ +public interface AlgorithmMapper +{ + /** + * 查询规则 + * + * @param id 规则主键 + * @return 规则 + */ + public Algorithm selectAlgorithmById(Long id); + + /** + * 查询规则列表 + * + * @param algorithm 规则 + * @return 规则集合 + */ + public List selectAlgorithmList(Algorithm algorithm); + + /** + * 新增规则 + * + * @param algorithm 规则 + * @return 结果 + */ + public int insertAlgorithm(Algorithm algorithm); + + /** + * 修改规则 + * + * @param algorithm 规则 + * @return 结果 + */ + public int updateAlgorithm(Algorithm algorithm); + + /** + * 删除规则 + * + * @param id 规则主键 + * @return 结果 + */ + public int deleteAlgorithmById(Long id); + + /** + * 批量删除规则 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteAlgorithmByIds(Long[] ids); + + /** + * 批量删除算法参数定义 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteAlgorithmParamByAlgorithmIds(Long[] ids); + + /** + * 批量新增算法参数定义 + * + * @param algorithmParamList 算法参数定义列表 + * @return 结果 + */ + public int batchAlgorithmParam(List algorithmParamList); + + + /** + * 通过规则主键删除算法参数定义信息 + * + * @param id 规则ID + * @return 结果 + */ + public int deleteAlgorithmParamByAlgorithmId(Long id); +} diff --git a/auto-solution-algo/src/main/java/com/solution/algo/mapper/SysAlgoConfigMapper.java b/auto-solution-algo/src/main/java/com/solution/algo/mapper/SysAlgoConfigMapper.java deleted file mode 100644 index e4b36f5..0000000 --- a/auto-solution-algo/src/main/java/com/solution/algo/mapper/SysAlgoConfigMapper.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.solution.algo.mapper; - -import java.util.List; -import com.solution.algo.domain.SysAlgoConfig; - -/** - * 动态规则配置Mapper接口 - * - * @author zouju - * @date 2026-02-05 - */ -public interface SysAlgoConfigMapper -{ - /** - * 查询动态规则配置 - * - * @param id 动态规则配置主键 - * @return 动态规则配置 - */ - public SysAlgoConfig selectSysAlgoConfigById(Long id); - - /** - * 查询动态规则配置列表 - * - * @param sysAlgoConfig 动态规则配置 - * @return 动态规则配置集合 - */ - public List selectSysAlgoConfigList(SysAlgoConfig sysAlgoConfig); - - /** - * 新增动态规则配置 - * - * @param sysAlgoConfig 动态规则配置 - * @return 结果 - */ - public int insertSysAlgoConfig(SysAlgoConfig sysAlgoConfig); - - /** - * 修改动态规则配置 - * - * @param sysAlgoConfig 动态规则配置 - * @return 结果 - */ - public int updateSysAlgoConfig(SysAlgoConfig sysAlgoConfig); - - /** - * 删除动态规则配置 - * - * @param id 动态规则配置主键 - * @return 结果 - */ - public int deleteSysAlgoConfigById(Long id); - - /** - * 批量删除动态规则配置 - * - * @param ids 需要删除的数据主键集合 - * @return 结果 - */ - public int deleteSysAlgoConfigByIds(Long[] ids); -} diff --git a/auto-solution-algo/src/main/java/com/solution/algo/service/IAlgorithmService.java b/auto-solution-algo/src/main/java/com/solution/algo/service/IAlgorithmService.java new file mode 100644 index 0000000..a2d72e7 --- /dev/null +++ b/auto-solution-algo/src/main/java/com/solution/algo/service/IAlgorithmService.java @@ -0,0 +1,61 @@ +package com.solution.algo.service; + +import java.util.List; +import com.solution.algo.domain.Algorithm; + +/** + * 规则Service接口 + * + * @author ruoyi + * @date 2026-02-06 + */ +public interface IAlgorithmService +{ + /** + * 查询规则 + * + * @param id 规则主键 + * @return 规则 + */ + public Algorithm selectAlgorithmById(Long id); + + /** + * 查询规则列表 + * + * @param algorithm 规则 + * @return 规则集合 + */ + public List selectAlgorithmList(Algorithm algorithm); + + /** + * 新增规则 + * + * @param algorithm 规则 + * @return 结果 + */ + public int insertAlgorithm(Algorithm algorithm); + + /** + * 修改规则 + * + * @param algorithm 规则 + * @return 结果 + */ + public int updateAlgorithm(Algorithm algorithm); + + /** + * 批量删除规则 + * + * @param ids 需要删除的规则主键集合 + * @return 结果 + */ + public int deleteAlgorithmByIds(Long[] ids); + + /** + * 删除规则信息 + * + * @param id 规则主键 + * @return 结果 + */ + public int deleteAlgorithmById(Long id); +} diff --git a/auto-solution-algo/src/main/java/com/solution/algo/service/ISysAlgoConfigService.java b/auto-solution-algo/src/main/java/com/solution/algo/service/ISysAlgoConfigService.java deleted file mode 100644 index 563e61e..0000000 --- a/auto-solution-algo/src/main/java/com/solution/algo/service/ISysAlgoConfigService.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.solution.algo.service; - -import java.util.List; -import com.solution.algo.domain.SysAlgoConfig; - -/** - * 动态规则配置Service接口 - * - * @author zouju - * @date 2026-02-05 - */ -public interface ISysAlgoConfigService -{ - /** - * 查询动态规则配置 - * - * @param id 动态规则配置主键 - * @return 动态规则配置 - */ - public SysAlgoConfig selectSysAlgoConfigById(Long id); - - /** - * 查询动态规则配置列表 - * - * @param sysAlgoConfig 动态规则配置 - * @return 动态规则配置集合 - */ - public List selectSysAlgoConfigList(SysAlgoConfig sysAlgoConfig); - - /** - * 新增动态规则配置 - * - * @param sysAlgoConfig 动态规则配置 - * @return 结果 - */ - public int insertSysAlgoConfig(SysAlgoConfig sysAlgoConfig); - - /** - * 修改动态规则配置 - * - * @param sysAlgoConfig 动态规则配置 - * @return 结果 - */ - public int updateSysAlgoConfig(SysAlgoConfig sysAlgoConfig); - - /** - * 批量删除动态规则配置 - * - * @param ids 需要删除的动态规则配置主键集合 - * @return 结果 - */ - public int deleteSysAlgoConfigByIds(Long[] ids); - - /** - * 删除动态规则配置信息 - * - * @param id 动态规则配置主键 - * @return 结果 - */ - public int deleteSysAlgoConfigById(Long id); -} diff --git a/auto-solution-algo/src/main/java/com/solution/algo/service/impl/AlgorithmServiceImpl.java b/auto-solution-algo/src/main/java/com/solution/algo/service/impl/AlgorithmServiceImpl.java new file mode 100644 index 0000000..dca8ae6 --- /dev/null +++ b/auto-solution-algo/src/main/java/com/solution/algo/service/impl/AlgorithmServiceImpl.java @@ -0,0 +1,131 @@ +package com.solution.algo.service.impl; + +import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import java.util.ArrayList; +import com.solution.common.utils.StringUtils; +import org.springframework.transaction.annotation.Transactional; +import com.solution.algo.domain.AlgorithmParam; +import com.solution.algo.mapper.AlgorithmMapper; +import com.solution.algo.domain.Algorithm; +import com.solution.algo.service.IAlgorithmService; + +/** + * 规则Service业务层处理 + * + * @author ruoyi + * @date 2026-02-06 + */ +@Service +public class AlgorithmServiceImpl implements IAlgorithmService +{ + @Autowired + private AlgorithmMapper algorithmMapper; + + /** + * 查询规则 + * + * @param id 规则主键 + * @return 规则 + */ + @Override + public Algorithm selectAlgorithmById(Long id) + { + return algorithmMapper.selectAlgorithmById(id); + } + + /** + * 查询规则列表 + * + * @param algorithm 规则 + * @return 规则 + */ + @Override + public List selectAlgorithmList(Algorithm algorithm) + { + return algorithmMapper.selectAlgorithmList(algorithm); + } + + /** + * 新增规则 + * + * @param algorithm 规则 + * @return 结果 + */ + @Transactional + @Override + public int insertAlgorithm(Algorithm algorithm) + { + int rows = algorithmMapper.insertAlgorithm(algorithm); + insertAlgorithmParam(algorithm); + return rows; + } + + /** + * 修改规则 + * + * @param algorithm 规则 + * @return 结果 + */ + @Transactional + @Override + public int updateAlgorithm(Algorithm algorithm) + { + algorithmMapper.deleteAlgorithmParamByAlgorithmId(algorithm.getId()); + insertAlgorithmParam(algorithm); + return algorithmMapper.updateAlgorithm(algorithm); + } + + /** + * 批量删除规则 + * + * @param ids 需要删除的规则主键 + * @return 结果 + */ + @Transactional + @Override + public int deleteAlgorithmByIds(Long[] ids) + { + algorithmMapper.deleteAlgorithmParamByAlgorithmIds(ids); + return algorithmMapper.deleteAlgorithmByIds(ids); + } + + /** + * 删除规则信息 + * + * @param id 规则主键 + * @return 结果 + */ + @Transactional + @Override + public int deleteAlgorithmById(Long id) + { + algorithmMapper.deleteAlgorithmParamByAlgorithmId(id); + return algorithmMapper.deleteAlgorithmById(id); + } + + /** + * 新增算法参数定义信息 + * + * @param algorithm 规则对象 + */ + public void insertAlgorithmParam(Algorithm algorithm) + { + List algorithmParamList = algorithm.getAlgorithmParamList(); + Long id = algorithm.getId(); + if (StringUtils.isNotNull(algorithmParamList)) + { + List list = new ArrayList(); + for (AlgorithmParam algorithmParam : algorithmParamList) + { + algorithmParam.setAlgorithmId(id); + list.add(algorithmParam); + } + if (list.size() > 0) + { + algorithmMapper.batchAlgorithmParam(list); + } + } + } +} diff --git a/auto-solution-algo/src/main/java/com/solution/algo/service/impl/SysAlgoConfigServiceImpl.java b/auto-solution-algo/src/main/java/com/solution/algo/service/impl/SysAlgoConfigServiceImpl.java deleted file mode 100644 index 0a4a318..0000000 --- a/auto-solution-algo/src/main/java/com/solution/algo/service/impl/SysAlgoConfigServiceImpl.java +++ /dev/null @@ -1,93 +0,0 @@ -package com.solution.algo.service.impl; - -import java.util.List; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import com.solution.algo.mapper.SysAlgoConfigMapper; -import com.solution.algo.domain.SysAlgoConfig; -import com.solution.algo.service.ISysAlgoConfigService; - -/** - * 动态规则配置Service业务层处理 - * - * @author zouju - * @date 2026-02-05 - */ -@Service -public class SysAlgoConfigServiceImpl implements ISysAlgoConfigService -{ - @Autowired - private SysAlgoConfigMapper sysAlgoConfigMapper; - - /** - * 查询动态规则配置 - * - * @param id 动态规则配置主键 - * @return 动态规则配置 - */ - @Override - public SysAlgoConfig selectSysAlgoConfigById(Long id) - { - return sysAlgoConfigMapper.selectSysAlgoConfigById(id); - } - - /** - * 查询动态规则配置列表 - * - * @param sysAlgoConfig 动态规则配置 - * @return 动态规则配置 - */ - @Override - public List selectSysAlgoConfigList(SysAlgoConfig sysAlgoConfig) - { - return sysAlgoConfigMapper.selectSysAlgoConfigList(sysAlgoConfig); - } - - /** - * 新增动态规则配置 - * - * @param sysAlgoConfig 动态规则配置 - * @return 结果 - */ - @Override - public int insertSysAlgoConfig(SysAlgoConfig sysAlgoConfig) - { - return sysAlgoConfigMapper.insertSysAlgoConfig(sysAlgoConfig); - } - - /** - * 修改动态规则配置 - * - * @param sysAlgoConfig 动态规则配置 - * @return 结果 - */ - @Override - public int updateSysAlgoConfig(SysAlgoConfig sysAlgoConfig) - { - return sysAlgoConfigMapper.updateSysAlgoConfig(sysAlgoConfig); - } - - /** - * 批量删除动态规则配置 - * - * @param ids 需要删除的动态规则配置主键 - * @return 结果 - */ - @Override - public int deleteSysAlgoConfigByIds(Long[] ids) - { - return sysAlgoConfigMapper.deleteSysAlgoConfigByIds(ids); - } - - /** - * 删除动态规则配置信息 - * - * @param id 动态规则配置主键 - * @return 结果 - */ - @Override - public int deleteSysAlgoConfigById(Long id) - { - return sysAlgoConfigMapper.deleteSysAlgoConfigById(id); - } -} diff --git a/auto-solution-algo/src/main/resources/mapper/algo/AlgorithmMapper.xml b/auto-solution-algo/src/main/resources/mapper/algo/AlgorithmMapper.xml new file mode 100644 index 0000000..4d1afdb --- /dev/null +++ b/auto-solution-algo/src/main/resources/mapper/algo/AlgorithmMapper.xml @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + select id, name, type, code_path, description from algorithm + + + + + + + + + + insert into algorithm + + name, + type, + code_path, + description, + + + #{name}, + #{type}, + #{codePath}, + #{description}, + + + + + update algorithm + + name = #{name}, + type = #{type}, + code_path = #{codePath}, + description = #{description}, + + where id = #{id} + + + + delete from algorithm where id = #{id} + + + + delete from algorithm where id in + + #{id} + + + + + delete from algorithm_param where algorithm_id in + + #{algorithmId} + + + + + delete from algorithm_param where algorithm_id = #{algorithmId} + + + + insert into algorithm_param( id, algorithm_id, param_name, default_value, description) values + + ( #{item.id}, #{item.algorithmId}, #{item.paramName}, #{item.defaultValue}, #{item.description}) + + + \ No newline at end of file diff --git a/auto-solution-algo/src/main/resources/mapper/algo/SysAlgoConfigMapper.xml b/auto-solution-algo/src/main/resources/mapper/algo/SysAlgoConfigMapper.xml deleted file mode 100644 index ae07dd8..0000000 --- a/auto-solution-algo/src/main/resources/mapper/algo/SysAlgoConfigMapper.xml +++ /dev/null @@ -1,96 +0,0 @@ - - - - - - - - - - - - - - - - - - - select id, algo_type, algo_name, engine_type, input_schema, script_content, description, status, created_at, updated_at from sys_algo_config - - - - - - - - insert into sys_algo_config - - algo_type, - algo_name, - engine_type, - input_schema, - script_content, - description, - status, - created_at, - updated_at, - - - #{algoType}, - #{algoName}, - #{engineType}, - #{inputSchema}, - #{scriptContent}, - #{description}, - #{status}, - #{createdAt}, - #{updatedAt}, - - - - - update sys_algo_config - - algo_type = #{algoType}, - algo_name = #{algoName}, - engine_type = #{engineType}, - input_schema = #{inputSchema}, - script_content = #{scriptContent}, - description = #{description}, - status = #{status}, - created_at = #{createdAt}, - updated_at = #{updatedAt}, - - where id = #{id} - - - - delete from sys_algo_config where id = #{id} - - - - delete from sys_algo_config where id in - - #{id} - - - \ No newline at end of file diff --git a/auto-solution-framework/src/main/java/com/solution/framework/web/service/SysLoginService.java b/auto-solution-framework/src/main/java/com/solution/framework/web/service/SysLoginService.java index d748057..57c41f7 100644 --- a/auto-solution-framework/src/main/java/com/solution/framework/web/service/SysLoginService.java +++ b/auto-solution-framework/src/main/java/com/solution/framework/web/service/SysLoginService.java @@ -63,7 +63,7 @@ public class SysLoginService public String login(String username, String password, String code, String uuid) { // 验证码校验 - validateCaptcha(username, code, uuid); +// validateCaptcha(username, code, uuid); // 登录前置校验 loginPreCheck(username, password); // 用户验证 diff --git a/modeler/.editorconfig b/modeler/.editorconfig new file mode 100644 index 0000000..1fd38e5 --- /dev/null +++ b/modeler/.editorconfig @@ -0,0 +1,1184 @@ +[*] +charset = utf-8 +end_of_line = lf +indent_size = 2 +indent_style = space +insert_final_newline = false +max_line_length = 300 +tab_width = 2 +ij_continuation_indent_size = 2 +ij_formatter_off_tag = @formatter:off +ij_formatter_on_tag = @formatter:on +ij_formatter_tags_enabled = true +ij_smart_tabs = false +ij_wrap_on_typing = false + +[*.css] +ij_css_align_closing_brace_with_properties = false +ij_css_blank_lines_around_nested_selector = 1 +ij_css_blank_lines_between_blocks = 1 +ij_css_brace_placement = end_of_line +ij_css_enforce_quotes_on_format = false +ij_css_hex_color_long_format = false +ij_css_hex_color_lower_case = false +ij_css_hex_color_short_format = false +ij_css_hex_color_upper_case = false +ij_css_keep_blank_lines_in_code = 2 +ij_css_keep_indents_on_empty_lines = false +ij_css_keep_single_line_blocks = false +ij_css_properties_order = font, font-family, font-size, font-weight, font-style, font-variant, font-size-adjust, font-stretch, line-height, position, z-index, top, right, bottom, left, display, visibility, float, clear, overflow, overflow-x, overflow-y, clip, zoom, align-content, align-items, align-self, flex, flex-flow, flex-basis, flex-direction, flex-grow, flex-shrink, flex-wrap, justify-content, order, box-sizing, width, min-width, max-width, height, min-height, max-height, margin, margin-top, margin-right, margin-bottom, margin-left, padding, padding-top, padding-right, padding-bottom, padding-left, table-layout, empty-cells, caption-side, border-spacing, border-collapse, list-style, list-style-position, list-style-type, list-style-image, content, quotes, counter-reset, counter-increment, resize, cursor, user-select, nav-index, nav-up, nav-right, nav-down, nav-left, transition, transition-delay, transition-timing-function, transition-duration, transition-property, transform, transform-origin, animation, animation-name, animation-duration, animation-play-state, animation-timing-function, animation-delay, animation-iteration-count, animation-direction, text-align, text-align-last, vertical-align, white-space, text-decoration, text-emphasis, text-emphasis-color, text-emphasis-style, text-emphasis-position, text-indent, text-justify, letter-spacing, word-spacing, text-outline, text-transform, text-wrap, text-overflow, text-overflow-ellipsis, text-overflow-mode, word-wrap, word-break, tab-size, hyphens, pointer-events, opacity, color, border, border-width, border-style, border-color, border-top, border-top-width, border-top-style, border-top-color, border-right, border-right-width, border-right-style, border-right-color, border-bottom, border-bottom-width, border-bottom-style, border-bottom-color, border-left, border-left-width, border-left-style, border-left-color, border-radius, border-top-left-radius, border-top-right-radius, border-bottom-right-radius, border-bottom-left-radius, border-image, border-image-source, border-image-slice, border-image-width, border-image-outset, border-image-repeat, outline, outline-width, outline-style, outline-color, outline-offset, background, background-color, background-image, background-repeat, background-attachment, background-position, background-position-x, background-position-y, background-clip, background-origin, background-size, box-decoration-break, box-shadow, text-shadow +ij_css_space_after_colon = true +ij_css_space_before_opening_brace = true +ij_css_use_double_quotes = true +ij_css_value_alignment = do_not_align + +[*.dart] +max_line_length = 80 + +[*.feature] +indent_size = 2 +ij_gherkin_keep_indents_on_empty_lines = false + +[*.gsp] +ij_gsp_keep_indents_on_empty_lines = false + +[*.haml] +indent_size = 2 +ij_haml_keep_indents_on_empty_lines = false + +[*.java] +ij_java_align_consecutive_assignments = false +ij_java_align_consecutive_variable_declarations = false +ij_java_align_group_field_declarations = false +ij_java_align_multiline_annotation_parameters = false +ij_java_align_multiline_array_initializer_expression = false +ij_java_align_multiline_assignment = false +ij_java_align_multiline_binary_operation = false +ij_java_align_multiline_chained_methods = false +ij_java_align_multiline_extends_list = false +ij_java_align_multiline_for = true +ij_java_align_multiline_method_parentheses = false +ij_java_align_multiline_parameters = true +ij_java_align_multiline_parameters_in_calls = false +ij_java_align_multiline_parenthesized_expression = false +ij_java_align_multiline_records = true +ij_java_align_multiline_resources = true +ij_java_align_multiline_ternary_operation = false +ij_java_align_multiline_text_blocks = false +ij_java_align_multiline_throws_list = false +ij_java_align_subsequent_simple_methods = false +ij_java_align_throws_keyword = false +ij_java_annotation_parameter_wrap = off +ij_java_array_initializer_new_line_after_left_brace = false +ij_java_array_initializer_right_brace_on_new_line = false +ij_java_array_initializer_wrap = off +ij_java_assert_statement_colon_on_next_line = false +ij_java_assert_statement_wrap = off +ij_java_assignment_wrap = off +ij_java_binary_operation_sign_on_next_line = false +ij_java_binary_operation_wrap = off +ij_java_blank_lines_after_anonymous_class_header = 0 +ij_java_blank_lines_after_class_header = 1 +ij_java_blank_lines_after_imports = 1 +ij_java_blank_lines_after_package = 1 +ij_java_blank_lines_around_class = 1 +ij_java_blank_lines_around_field = 1 +ij_java_blank_lines_around_field_in_interface = 1 +ij_java_blank_lines_around_initializer = 1 +ij_java_blank_lines_around_method = 1 +ij_java_blank_lines_around_method_in_interface = 1 +ij_java_blank_lines_before_class_end = 0 +ij_java_blank_lines_before_imports = 1 +ij_java_blank_lines_before_method_body = 0 +ij_java_blank_lines_before_package = 0 +ij_java_block_brace_style = end_of_line +ij_java_block_comment_at_first_column = true +ij_java_call_parameters_new_line_after_left_paren = false +ij_java_call_parameters_right_paren_on_new_line = false +ij_java_call_parameters_wrap = off +ij_java_case_statement_on_separate_line = true +ij_java_catch_on_new_line = false +ij_java_class_annotation_wrap = split_into_lines +ij_java_class_brace_style = end_of_line +ij_java_class_count_to_use_import_on_demand = 5 +ij_java_class_names_in_javadoc = 1 +ij_java_do_not_indent_top_level_class_members = false +ij_java_do_not_wrap_after_single_annotation = false +ij_java_do_while_brace_force = never +ij_java_doc_add_blank_line_after_description = true +ij_java_doc_add_blank_line_after_param_comments = false +ij_java_doc_add_blank_line_after_return = false +ij_java_doc_add_p_tag_on_empty_lines = true +ij_java_doc_align_exception_comments = true +ij_java_doc_align_param_comments = true +ij_java_doc_do_not_wrap_if_one_line = false +ij_java_doc_enable_formatting = true +ij_java_doc_enable_leading_asterisks = true +ij_java_doc_indent_on_continuation = false +ij_java_doc_keep_empty_lines = true +ij_java_doc_keep_empty_parameter_tag = true +ij_java_doc_keep_empty_return_tag = true +ij_java_doc_keep_empty_throws_tag = true +ij_java_doc_keep_invalid_tags = true +ij_java_doc_param_description_on_new_line = false +ij_java_doc_preserve_line_breaks = false +ij_java_doc_use_throws_not_exception_tag = true +ij_java_else_on_new_line = false +ij_java_entity_dd_suffix = EJB +ij_java_entity_eb_suffix = Bean +ij_java_entity_hi_suffix = Home +ij_java_entity_lhi_prefix = Local +ij_java_entity_lhi_suffix = Home +ij_java_entity_li_prefix = Local +ij_java_entity_pk_class = java.lang.String +ij_java_entity_vo_suffix = VO +ij_java_enum_constants_wrap = off +ij_java_extends_keyword_wrap = off +ij_java_extends_list_wrap = off +ij_java_field_annotation_wrap = split_into_lines +ij_java_finally_on_new_line = false +ij_java_for_brace_force = never +ij_java_for_statement_new_line_after_left_paren = false +ij_java_for_statement_right_paren_on_new_line = false +ij_java_for_statement_wrap = off +ij_java_generate_final_locals = false +ij_java_generate_final_parameters = false +ij_java_if_brace_force = never +ij_java_imports_layout = *, |, javax.**, java.**, |, $* +ij_java_indent_case_from_switch = true +ij_java_insert_inner_class_imports = false +ij_java_insert_override_annotation = true +ij_java_keep_blank_lines_before_right_brace = 2 +ij_java_keep_blank_lines_between_package_declaration_and_header = 2 +ij_java_keep_blank_lines_in_code = 2 +ij_java_keep_blank_lines_in_declarations = 2 +ij_java_keep_control_statement_in_one_line = true +ij_java_keep_first_column_comment = true +ij_java_keep_indents_on_empty_lines = false +ij_java_keep_line_breaks = true +ij_java_keep_multiple_expressions_in_one_line = false +ij_java_keep_simple_blocks_in_one_line = false +ij_java_keep_simple_classes_in_one_line = false +ij_java_keep_simple_lambdas_in_one_line = false +ij_java_keep_simple_methods_in_one_line = false +ij_java_label_indent_absolute = false +ij_java_label_indent_size = 0 +ij_java_lambda_brace_style = end_of_line +ij_java_layout_static_imports_separately = true +ij_java_line_comment_add_space = false +ij_java_line_comment_at_first_column = true +ij_java_message_dd_suffix = EJB +ij_java_message_eb_suffix = Bean +ij_java_method_annotation_wrap = split_into_lines +ij_java_method_brace_style = end_of_line +ij_java_method_call_chain_wrap = off +ij_java_method_parameters_new_line_after_left_paren = false +ij_java_method_parameters_right_paren_on_new_line = false +ij_java_method_parameters_wrap = off +ij_java_modifier_list_wrap = false +ij_java_names_count_to_use_import_on_demand = 3 +ij_java_new_line_after_lparen_in_record_header = false +ij_java_packages_to_use_import_on_demand = java.awt.*, javax.swing.* +ij_java_parameter_annotation_wrap = off +ij_java_parentheses_expression_new_line_after_left_paren = false +ij_java_parentheses_expression_right_paren_on_new_line = false +ij_java_place_assignment_sign_on_next_line = false +ij_java_prefer_longer_names = true +ij_java_prefer_parameters_wrap = false +ij_java_record_components_wrap = normal +ij_java_repeat_synchronized = true +ij_java_replace_instanceof_and_cast = false +ij_java_replace_null_check = true +ij_java_replace_sum_lambda_with_method_ref = true +ij_java_resource_list_new_line_after_left_paren = false +ij_java_resource_list_right_paren_on_new_line = false +ij_java_resource_list_wrap = off +ij_java_rparen_on_new_line_in_record_header = false +ij_java_session_dd_suffix = EJB +ij_java_session_eb_suffix = Bean +ij_java_session_hi_suffix = Home +ij_java_session_lhi_prefix = Local +ij_java_session_lhi_suffix = Home +ij_java_session_li_prefix = Local +ij_java_session_si_suffix = Service +ij_java_space_after_closing_angle_bracket_in_type_argument = false +ij_java_space_after_colon = true +ij_java_space_after_comma = true +ij_java_space_after_comma_in_type_arguments = true +ij_java_space_after_for_semicolon = true +ij_java_space_after_quest = true +ij_java_space_after_type_cast = true +ij_java_space_before_annotation_array_initializer_left_brace = false +ij_java_space_before_annotation_parameter_list = false +ij_java_space_before_array_initializer_left_brace = false +ij_java_space_before_catch_keyword = true +ij_java_space_before_catch_left_brace = true +ij_java_space_before_catch_parentheses = true +ij_java_space_before_class_left_brace = true +ij_java_space_before_colon = true +ij_java_space_before_colon_in_foreach = true +ij_java_space_before_comma = false +ij_java_space_before_do_left_brace = true +ij_java_space_before_else_keyword = true +ij_java_space_before_else_left_brace = true +ij_java_space_before_finally_keyword = true +ij_java_space_before_finally_left_brace = true +ij_java_space_before_for_left_brace = true +ij_java_space_before_for_parentheses = true +ij_java_space_before_for_semicolon = false +ij_java_space_before_if_left_brace = true +ij_java_space_before_if_parentheses = true +ij_java_space_before_method_call_parentheses = false +ij_java_space_before_method_left_brace = true +ij_java_space_before_method_parentheses = false +ij_java_space_before_opening_angle_bracket_in_type_parameter = false +ij_java_space_before_quest = true +ij_java_space_before_switch_left_brace = true +ij_java_space_before_switch_parentheses = true +ij_java_space_before_synchronized_left_brace = true +ij_java_space_before_synchronized_parentheses = true +ij_java_space_before_try_left_brace = true +ij_java_space_before_try_parentheses = true +ij_java_space_before_type_parameter_list = false +ij_java_space_before_while_keyword = true +ij_java_space_before_while_left_brace = true +ij_java_space_before_while_parentheses = true +ij_java_space_inside_one_line_enum_braces = false +ij_java_space_within_empty_array_initializer_braces = false +ij_java_space_within_empty_method_call_parentheses = false +ij_java_space_within_empty_method_parentheses = false +ij_java_spaces_around_additive_operators = true +ij_java_spaces_around_assignment_operators = true +ij_java_spaces_around_bitwise_operators = true +ij_java_spaces_around_equality_operators = true +ij_java_spaces_around_lambda_arrow = true +ij_java_spaces_around_logical_operators = true +ij_java_spaces_around_method_ref_dbl_colon = false +ij_java_spaces_around_multiplicative_operators = true +ij_java_spaces_around_relational_operators = true +ij_java_spaces_around_shift_operators = true +ij_java_spaces_around_type_bounds_in_type_parameters = true +ij_java_spaces_around_unary_operator = false +ij_java_spaces_within_angle_brackets = false +ij_java_spaces_within_annotation_parentheses = false +ij_java_spaces_within_array_initializer_braces = false +ij_java_spaces_within_braces = false +ij_java_spaces_within_brackets = false +ij_java_spaces_within_cast_parentheses = false +ij_java_spaces_within_catch_parentheses = false +ij_java_spaces_within_for_parentheses = false +ij_java_spaces_within_if_parentheses = false +ij_java_spaces_within_method_call_parentheses = false +ij_java_spaces_within_method_parentheses = false +ij_java_spaces_within_parentheses = false +ij_java_spaces_within_switch_parentheses = false +ij_java_spaces_within_synchronized_parentheses = false +ij_java_spaces_within_try_parentheses = false +ij_java_spaces_within_while_parentheses = false +ij_java_special_else_if_treatment = true +ij_java_subclass_name_suffix = Impl +ij_java_ternary_operation_signs_on_next_line = false +ij_java_ternary_operation_wrap = off +ij_java_test_name_suffix = Test +ij_java_throws_keyword_wrap = off +ij_java_throws_list_wrap = off +ij_java_use_external_annotations = false +ij_java_use_fq_class_names = false +ij_java_use_relative_indents = false +ij_java_use_single_class_imports = true +ij_java_variable_annotation_wrap = off +ij_java_visibility = public +ij_java_while_brace_force = never +ij_java_while_on_new_line = false +ij_java_wrap_comments = false +ij_java_wrap_first_method_in_call_chain = false +ij_java_wrap_long_lines = false + +[*.less] +indent_size = 2 +ij_less_align_closing_brace_with_properties = false +ij_less_blank_lines_around_nested_selector = 1 +ij_less_blank_lines_between_blocks = 1 +ij_less_brace_placement = 0 +ij_less_enforce_quotes_on_format = false +ij_less_hex_color_long_format = false +ij_less_hex_color_lower_case = false +ij_less_hex_color_short_format = false +ij_less_hex_color_upper_case = false +ij_less_keep_blank_lines_in_code = 2 +ij_less_keep_indents_on_empty_lines = false +ij_less_keep_single_line_blocks = false +ij_less_properties_order = font, font-family, font-size, font-weight, font-style, font-variant, font-size-adjust, font-stretch, line-height, position, z-index, top, right, bottom, left, display, visibility, float, clear, overflow, overflow-x, overflow-y, clip, zoom, align-content, align-items, align-self, flex, flex-flow, flex-basis, flex-direction, flex-grow, flex-shrink, flex-wrap, justify-content, order, box-sizing, width, min-width, max-width, height, min-height, max-height, margin, margin-top, margin-right, margin-bottom, margin-left, padding, padding-top, padding-right, padding-bottom, padding-left, table-layout, empty-cells, caption-side, border-spacing, border-collapse, list-style, list-style-position, list-style-type, list-style-image, content, quotes, counter-reset, counter-increment, resize, cursor, user-select, nav-index, nav-up, nav-right, nav-down, nav-left, transition, transition-delay, transition-timing-function, transition-duration, transition-property, transform, transform-origin, animation, animation-name, animation-duration, animation-play-state, animation-timing-function, animation-delay, animation-iteration-count, animation-direction, text-align, text-align-last, vertical-align, white-space, text-decoration, text-emphasis, text-emphasis-color, text-emphasis-style, text-emphasis-position, text-indent, text-justify, letter-spacing, word-spacing, text-outline, text-transform, text-wrap, text-overflow, text-overflow-ellipsis, text-overflow-mode, word-wrap, word-break, tab-size, hyphens, pointer-events, opacity, color, border, border-width, border-style, border-color, border-top, border-top-width, border-top-style, border-top-color, border-right, border-right-width, border-right-style, border-right-color, border-bottom, border-bottom-width, border-bottom-style, border-bottom-color, border-left, border-left-width, border-left-style, border-left-color, border-radius, border-top-left-radius, border-top-right-radius, border-bottom-right-radius, border-bottom-left-radius, border-image, border-image-source, border-image-slice, border-image-width, border-image-outset, border-image-repeat, outline, outline-width, outline-style, outline-color, outline-offset, background, background-color, background-image, background-repeat, background-attachment, background-position, background-position-x, background-position-y, background-clip, background-origin, background-size, box-decoration-break, box-shadow, text-shadow +ij_less_space_after_colon = true +ij_less_space_before_opening_brace = true +ij_less_use_double_quotes = true +ij_less_value_alignment = 0 + +[*.sass] +indent_size = 2 +ij_sass_align_closing_brace_with_properties = false +ij_sass_blank_lines_around_nested_selector = 1 +ij_sass_blank_lines_between_blocks = 1 +ij_sass_brace_placement = 0 +ij_sass_enforce_quotes_on_format = false +ij_sass_hex_color_long_format = false +ij_sass_hex_color_lower_case = false +ij_sass_hex_color_short_format = false +ij_sass_hex_color_upper_case = false +ij_sass_keep_blank_lines_in_code = 2 +ij_sass_keep_indents_on_empty_lines = false +ij_sass_keep_single_line_blocks = false +ij_sass_properties_order = font, font-family, font-size, font-weight, font-style, font-variant, font-size-adjust, font-stretch, line-height, position, z-index, top, right, bottom, left, display, visibility, float, clear, overflow, overflow-x, overflow-y, clip, zoom, align-content, align-items, align-self, flex, flex-flow, flex-basis, flex-direction, flex-grow, flex-shrink, flex-wrap, justify-content, order, box-sizing, width, min-width, max-width, height, min-height, max-height, margin, margin-top, margin-right, margin-bottom, margin-left, padding, padding-top, padding-right, padding-bottom, padding-left, table-layout, empty-cells, caption-side, border-spacing, border-collapse, list-style, list-style-position, list-style-type, list-style-image, content, quotes, counter-reset, counter-increment, resize, cursor, user-select, nav-index, nav-up, nav-right, nav-down, nav-left, transition, transition-delay, transition-timing-function, transition-duration, transition-property, transform, transform-origin, animation, animation-name, animation-duration, animation-play-state, animation-timing-function, animation-delay, animation-iteration-count, animation-direction, text-align, text-align-last, vertical-align, white-space, text-decoration, text-emphasis, text-emphasis-color, text-emphasis-style, text-emphasis-position, text-indent, text-justify, letter-spacing, word-spacing, text-outline, text-transform, text-wrap, text-overflow, text-overflow-ellipsis, text-overflow-mode, word-wrap, word-break, tab-size, hyphens, pointer-events, opacity, color, border, border-width, border-style, border-color, border-top, border-top-width, border-top-style, border-top-color, border-right, border-right-width, border-right-style, border-right-color, border-bottom, border-bottom-width, border-bottom-style, border-bottom-color, border-left, border-left-width, border-left-style, border-left-color, border-radius, border-top-left-radius, border-top-right-radius, border-bottom-right-radius, border-bottom-left-radius, border-image, border-image-source, border-image-slice, border-image-width, border-image-outset, border-image-repeat, outline, outline-width, outline-style, outline-color, outline-offset, background, background-color, background-image, background-repeat, background-attachment, background-position, background-position-x, background-position-y, background-clip, background-origin, background-size, box-decoration-break, box-shadow, text-shadow +ij_sass_space_after_colon = true +ij_sass_space_before_opening_brace = true +ij_sass_use_double_quotes = true +ij_sass_value_alignment = 0 + +[*.scss] +indent_size = 2 +ij_scss_align_closing_brace_with_properties = false +ij_scss_blank_lines_around_nested_selector = 1 +ij_scss_blank_lines_between_blocks = 1 +ij_scss_brace_placement = 0 +ij_scss_enforce_quotes_on_format = false +ij_scss_hex_color_long_format = false +ij_scss_hex_color_lower_case = false +ij_scss_hex_color_short_format = false +ij_scss_hex_color_upper_case = false +ij_scss_keep_blank_lines_in_code = 2 +ij_scss_keep_indents_on_empty_lines = false +ij_scss_keep_single_line_blocks = false +ij_scss_properties_order = font, font-family, font-size, font-weight, font-style, font-variant, font-size-adjust, font-stretch, line-height, position, z-index, top, right, bottom, left, display, visibility, float, clear, overflow, overflow-x, overflow-y, clip, zoom, align-content, align-items, align-self, flex, flex-flow, flex-basis, flex-direction, flex-grow, flex-shrink, flex-wrap, justify-content, order, box-sizing, width, min-width, max-width, height, min-height, max-height, margin, margin-top, margin-right, margin-bottom, margin-left, padding, padding-top, padding-right, padding-bottom, padding-left, table-layout, empty-cells, caption-side, border-spacing, border-collapse, list-style, list-style-position, list-style-type, list-style-image, content, quotes, counter-reset, counter-increment, resize, cursor, user-select, nav-index, nav-up, nav-right, nav-down, nav-left, transition, transition-delay, transition-timing-function, transition-duration, transition-property, transform, transform-origin, animation, animation-name, animation-duration, animation-play-state, animation-timing-function, animation-delay, animation-iteration-count, animation-direction, text-align, text-align-last, vertical-align, white-space, text-decoration, text-emphasis, text-emphasis-color, text-emphasis-style, text-emphasis-position, text-indent, text-justify, letter-spacing, word-spacing, text-outline, text-transform, text-wrap, text-overflow, text-overflow-ellipsis, text-overflow-mode, word-wrap, word-break, tab-size, hyphens, pointer-events, opacity, color, border, border-width, border-style, border-color, border-top, border-top-width, border-top-style, border-top-color, border-right, border-right-width, border-right-style, border-right-color, border-bottom, border-bottom-width, border-bottom-style, border-bottom-color, border-left, border-left-width, border-left-style, border-left-color, border-radius, border-top-left-radius, border-top-right-radius, border-bottom-right-radius, border-bottom-left-radius, border-image, border-image-source, border-image-slice, border-image-width, border-image-outset, border-image-repeat, outline, outline-width, outline-style, outline-color, outline-offset, background, background-color, background-image, background-repeat, background-attachment, background-position, background-position-x, background-position-y, background-clip, background-origin, background-size, box-decoration-break, box-shadow, text-shadow +ij_scss_space_after_colon = true +ij_scss_space_before_opening_brace = true +ij_scss_use_double_quotes = true +ij_scss_value_alignment = 0 + +[*.styl] +indent_size = 2 +ij_stylus_align_closing_brace_with_properties = false +ij_stylus_blank_lines_around_nested_selector = 1 +ij_stylus_blank_lines_between_blocks = 1 +ij_stylus_brace_placement = 0 +ij_stylus_enforce_quotes_on_format = false +ij_stylus_hex_color_long_format = false +ij_stylus_hex_color_lower_case = false +ij_stylus_hex_color_short_format = false +ij_stylus_hex_color_upper_case = false +ij_stylus_keep_blank_lines_in_code = 2 +ij_stylus_keep_indents_on_empty_lines = false +ij_stylus_keep_single_line_blocks = false +ij_stylus_properties_order = font, font-family, font-size, font-weight, font-style, font-variant, font-size-adjust, font-stretch, line-height, position, z-index, top, right, bottom, left, display, visibility, float, clear, overflow, overflow-x, overflow-y, clip, zoom, align-content, align-items, align-self, flex, flex-flow, flex-basis, flex-direction, flex-grow, flex-shrink, flex-wrap, justify-content, order, box-sizing, width, min-width, max-width, height, min-height, max-height, margin, margin-top, margin-right, margin-bottom, margin-left, padding, padding-top, padding-right, padding-bottom, padding-left, table-layout, empty-cells, caption-side, border-spacing, border-collapse, list-style, list-style-position, list-style-type, list-style-image, content, quotes, counter-reset, counter-increment, resize, cursor, user-select, nav-index, nav-up, nav-right, nav-down, nav-left, transition, transition-delay, transition-timing-function, transition-duration, transition-property, transform, transform-origin, animation, animation-name, animation-duration, animation-play-state, animation-timing-function, animation-delay, animation-iteration-count, animation-direction, text-align, text-align-last, vertical-align, white-space, text-decoration, text-emphasis, text-emphasis-color, text-emphasis-style, text-emphasis-position, text-indent, text-justify, letter-spacing, word-spacing, text-outline, text-transform, text-wrap, text-overflow, text-overflow-ellipsis, text-overflow-mode, word-wrap, word-break, tab-size, hyphens, pointer-events, opacity, color, border, border-width, border-style, border-color, border-top, border-top-width, border-top-style, border-top-color, border-right, border-right-width, border-right-style, border-right-color, border-bottom, border-bottom-width, border-bottom-style, border-bottom-color, border-left, border-left-width, border-left-style, border-left-color, border-radius, border-top-left-radius, border-top-right-radius, border-bottom-right-radius, border-bottom-left-radius, border-image, border-image-source, border-image-slice, border-image-width, border-image-outset, border-image-repeat, outline, outline-width, outline-style, outline-color, outline-offset, background, background-color, background-image, background-repeat, background-attachment, background-position, background-position-x, background-position-y, background-clip, background-origin, background-size, box-decoration-break, box-shadow, text-shadow +ij_stylus_space_after_colon = true +ij_stylus_space_before_opening_brace = true +ij_stylus_use_double_quotes = true +ij_stylus_value_alignment = 0 + +[*.vue] +indent_size = 2 +tab_width = 2 +ij_continuation_indent_size = 2 +ij_vue_indent_children_of_top_level = template +ij_vue_interpolation_new_line_after_start_delimiter = true +ij_vue_interpolation_new_line_before_end_delimiter = true +ij_vue_interpolation_wrap = off +ij_vue_keep_indents_on_empty_lines = false +ij_vue_spaces_within_interpolation_expressions = true +ij_vue_uniform_indent = true + +[.editorconfig] +ij_editorconfig_align_group_field_declarations = false +ij_editorconfig_space_after_colon = false +ij_editorconfig_space_after_comma = true +ij_editorconfig_space_before_colon = false +ij_editorconfig_space_before_comma = false +ij_editorconfig_spaces_around_assignment_operators = true + +[{*.ant, *.bpmn, *.fxml, *.jhm, *.jnlp, *.jrxml, *.pom, *.rng, *.tld, *.wadl, *.wsdd, *.wsdl, *.xjb, *.xml, *.xsd, *.xsl, *.xslt, *.xul}] +ij_xml_align_attributes = true +ij_xml_align_text = false +ij_xml_attribute_wrap = normal +ij_xml_block_comment_at_first_column = true +ij_xml_keep_blank_lines = 2 +ij_xml_keep_indents_on_empty_lines = false +ij_xml_keep_line_breaks = true +ij_xml_keep_line_breaks_in_text = true +ij_xml_keep_whitespaces = false +ij_xml_keep_whitespaces_around_cdata = preserve +ij_xml_keep_whitespaces_inside_cdata = false +ij_xml_line_comment_at_first_column = true +ij_xml_space_after_tag_name = false +ij_xml_space_around_equals_in_attribute = false +ij_xml_space_inside_empty_tag = false +ij_xml_text_wrap = normal +ij_xml_use_custom_settings = false + +[{*.ats, *.ts}] +ij_continuation_indent_size = 2 +ij_typescript_align_imports = false +ij_typescript_align_multiline_array_initializer_expression = false +ij_typescript_align_multiline_binary_operation = false +ij_typescript_align_multiline_chained_methods = false +ij_typescript_align_multiline_extends_list = false +ij_typescript_align_multiline_for = true +ij_typescript_align_multiline_parameters = true +ij_typescript_align_multiline_parameters_in_calls = false +ij_typescript_align_multiline_ternary_operation = false +ij_typescript_align_object_properties = 0 +ij_typescript_align_union_types = false +ij_typescript_align_var_statements = 0 +ij_typescript_array_initializer_new_line_after_left_brace = false +ij_typescript_array_initializer_right_brace_on_new_line = false +ij_typescript_array_initializer_wrap = off +ij_typescript_assignment_wrap = off +ij_typescript_binary_operation_sign_on_next_line = false +ij_typescript_binary_operation_wrap = off +ij_typescript_blacklist_imports = rxjs/Rx, node_modules/**, **/node_modules/**, @angular/material, @angular/material/typings/** +ij_typescript_blank_lines_after_imports = 1 +ij_typescript_blank_lines_around_class = 1 +ij_typescript_blank_lines_around_field = 0 +ij_typescript_blank_lines_around_field_in_interface = 0 +ij_typescript_blank_lines_around_function = 1 +ij_typescript_blank_lines_around_method = 1 +ij_typescript_blank_lines_around_method_in_interface = 1 +ij_typescript_block_brace_style = end_of_line +ij_typescript_call_parameters_new_line_after_left_paren = false +ij_typescript_call_parameters_right_paren_on_new_line = false +ij_typescript_call_parameters_wrap = off +ij_typescript_catch_on_new_line = false +ij_typescript_chained_call_dot_on_new_line = true +ij_typescript_class_brace_style = end_of_line +ij_typescript_comma_on_new_line = false +ij_typescript_do_while_brace_force = never +ij_typescript_else_on_new_line = false +ij_typescript_enforce_trailing_comma = keep +ij_typescript_extends_keyword_wrap = off +ij_typescript_extends_list_wrap = off +ij_typescript_field_prefix = _ +ij_typescript_file_name_style = relaxed +ij_typescript_finally_on_new_line = false +ij_typescript_for_brace_force = never +ij_typescript_for_statement_new_line_after_left_paren = false +ij_typescript_for_statement_right_paren_on_new_line = false +ij_typescript_for_statement_wrap = off +ij_typescript_force_quote_style = false +ij_typescript_force_semicolon_style = false +ij_typescript_function_expression_brace_style = end_of_line +ij_typescript_if_brace_force = never +ij_typescript_import_merge_members = global +ij_typescript_import_prefer_absolute_path = global +ij_typescript_import_sort_members = true +ij_typescript_import_sort_module_name = false +ij_typescript_import_use_node_resolution = true +ij_typescript_imports_wrap = on_every_item +ij_typescript_indent_case_from_switch = true +ij_typescript_indent_chained_calls = true +ij_typescript_indent_package_children = 0 +ij_typescript_jsdoc_include_types = false +ij_typescript_jsx_attribute_value = braces +ij_typescript_keep_blank_lines_in_code = 2 +ij_typescript_keep_first_column_comment = true +ij_typescript_keep_indents_on_empty_lines = false +ij_typescript_keep_line_breaks = true +ij_typescript_keep_simple_blocks_in_one_line = false +ij_typescript_keep_simple_methods_in_one_line = false +ij_typescript_line_comment_add_space = true +ij_typescript_line_comment_at_first_column = false +ij_typescript_method_brace_style = end_of_line +ij_typescript_method_call_chain_wrap = off +ij_typescript_method_parameters_new_line_after_left_paren = false +ij_typescript_method_parameters_right_paren_on_new_line = false +ij_typescript_method_parameters_wrap = off +ij_typescript_object_literal_wrap = on_every_item +ij_typescript_parentheses_expression_new_line_after_left_paren = false +ij_typescript_parentheses_expression_right_paren_on_new_line = false +ij_typescript_place_assignment_sign_on_next_line = false +ij_typescript_prefer_as_type_cast = false +ij_typescript_prefer_explicit_types_function_expression_returns = false +ij_typescript_prefer_explicit_types_function_returns = false +ij_typescript_prefer_explicit_types_vars_fields = false +ij_typescript_prefer_parameters_wrap = false +ij_typescript_reformat_c_style_comments = false +ij_typescript_space_after_colon = true +ij_typescript_space_after_comma = true +ij_typescript_space_after_dots_in_rest_parameter = false +ij_typescript_space_after_generator_mult = true +ij_typescript_space_after_property_colon = true +ij_typescript_space_after_quest = true +ij_typescript_space_after_type_colon = true +ij_typescript_space_after_unary_not = false +ij_typescript_space_before_async_arrow_lparen = true +ij_typescript_space_before_catch_keyword = true +ij_typescript_space_before_catch_left_brace = true +ij_typescript_space_before_catch_parentheses = true +ij_typescript_space_before_class_lbrace = true +ij_typescript_space_before_class_left_brace = true +ij_typescript_space_before_colon = true +ij_typescript_space_before_comma = false +ij_typescript_space_before_do_left_brace = true +ij_typescript_space_before_else_keyword = true +ij_typescript_space_before_else_left_brace = true +ij_typescript_space_before_finally_keyword = true +ij_typescript_space_before_finally_left_brace = true +ij_typescript_space_before_for_left_brace = true +ij_typescript_space_before_for_parentheses = true +ij_typescript_space_before_for_semicolon = false +ij_typescript_space_before_function_left_parenth = true +ij_typescript_space_before_generator_mult = false +ij_typescript_space_before_if_left_brace = true +ij_typescript_space_before_if_parentheses = true +ij_typescript_space_before_method_call_parentheses = false +ij_typescript_space_before_method_left_brace = true +ij_typescript_space_before_method_parentheses = false +ij_typescript_space_before_property_colon = false +ij_typescript_space_before_quest = true +ij_typescript_space_before_switch_left_brace = true +ij_typescript_space_before_switch_parentheses = true +ij_typescript_space_before_try_left_brace = true +ij_typescript_space_before_type_colon = false +ij_typescript_space_before_unary_not = false +ij_typescript_space_before_while_keyword = true +ij_typescript_space_before_while_left_brace = true +ij_typescript_space_before_while_parentheses = true +ij_typescript_spaces_around_additive_operators = true +ij_typescript_spaces_around_arrow_function_operator = true +ij_typescript_spaces_around_assignment_operators = true +ij_typescript_spaces_around_bitwise_operators = true +ij_typescript_spaces_around_equality_operators = true +ij_typescript_spaces_around_logical_operators = true +ij_typescript_spaces_around_multiplicative_operators = true +ij_typescript_spaces_around_relational_operators = true +ij_typescript_spaces_around_shift_operators = true +ij_typescript_spaces_around_unary_operator = false +ij_typescript_spaces_within_array_initializer_brackets = false +ij_typescript_spaces_within_brackets = false +ij_typescript_spaces_within_catch_parentheses = false +ij_typescript_spaces_within_for_parentheses = false +ij_typescript_spaces_within_if_parentheses = false +ij_typescript_spaces_within_imports = false +ij_typescript_spaces_within_interpolation_expressions = false +ij_typescript_spaces_within_method_call_parentheses = false +ij_typescript_spaces_within_method_parentheses = false +ij_typescript_spaces_within_object_literal_braces = false +ij_typescript_spaces_within_object_type_braces = true +ij_typescript_spaces_within_parentheses = false +ij_typescript_spaces_within_switch_parentheses = false +ij_typescript_spaces_within_type_assertion = false +ij_typescript_spaces_within_union_types = true +ij_typescript_spaces_within_while_parentheses = false +ij_typescript_special_else_if_treatment = true +ij_typescript_ternary_operation_signs_on_next_line = false +ij_typescript_ternary_operation_wrap = off +ij_typescript_union_types_wrap = on_every_item +ij_typescript_use_chained_calls_group_indents = false +ij_typescript_use_double_quotes = true +ij_typescript_use_path_mapping = always +ij_typescript_use_public_modifier = false +ij_typescript_use_semicolon_after_statement = true +ij_typescript_var_declaration_wrap = normal +ij_typescript_while_brace_force = never +ij_typescript_while_on_new_line = false +ij_typescript_wrap_comments = false + +[{*.bash, *.sh, *.zsh}] +indent_size = 2 +tab_width = 2 +ij_shell_binary_ops_start_line = false +ij_shell_keep_column_alignment_padding = false +ij_shell_minify_program = false +ij_shell_redirect_followed_by_space = false +ij_shell_switch_cases_indented = false + +[{*.cjs, *.js}] +ij_continuation_indent_size = 2 +ij_javascript_align_imports = false +ij_javascript_align_multiline_array_initializer_expression = false +ij_javascript_align_multiline_binary_operation = false +ij_javascript_align_multiline_chained_methods = false +ij_javascript_align_multiline_extends_list = false +ij_javascript_align_multiline_for = true +ij_javascript_align_multiline_parameters = true +ij_javascript_align_multiline_parameters_in_calls = false +ij_javascript_align_multiline_ternary_operation = false +ij_javascript_align_object_properties = 0 +ij_javascript_align_union_types = false +ij_javascript_align_var_statements = 0 +ij_javascript_array_initializer_new_line_after_left_brace = false +ij_javascript_array_initializer_right_brace_on_new_line = false +ij_javascript_array_initializer_wrap = off +ij_javascript_assignment_wrap = off +ij_javascript_binary_operation_sign_on_next_line = false +ij_javascript_binary_operation_wrap = off +ij_javascript_blacklist_imports = rxjs/Rx, node_modules/**, **/node_modules/**, @angular/material, @angular/material/typings/** +ij_javascript_blank_lines_after_imports = 1 +ij_javascript_blank_lines_around_class = 1 +ij_javascript_blank_lines_around_field = 0 +ij_javascript_blank_lines_around_function = 1 +ij_javascript_blank_lines_around_method = 1 +ij_javascript_block_brace_style = end_of_line +ij_javascript_call_parameters_new_line_after_left_paren = false +ij_javascript_call_parameters_right_paren_on_new_line = false +ij_javascript_call_parameters_wrap = off +ij_javascript_catch_on_new_line = false +ij_javascript_chained_call_dot_on_new_line = true +ij_javascript_class_brace_style = end_of_line +ij_javascript_comma_on_new_line = false +ij_javascript_do_while_brace_force = never +ij_javascript_else_on_new_line = false +ij_javascript_enforce_trailing_comma = keep +ij_javascript_extends_keyword_wrap = off +ij_javascript_extends_list_wrap = off +ij_javascript_field_prefix = _ +ij_javascript_file_name_style = relaxed +ij_javascript_finally_on_new_line = false +ij_javascript_for_brace_force = never +ij_javascript_for_statement_new_line_after_left_paren = false +ij_javascript_for_statement_right_paren_on_new_line = false +ij_javascript_for_statement_wrap = off +ij_javascript_force_quote_style = false +ij_javascript_force_semicolon_style = false +ij_javascript_function_expression_brace_style = end_of_line +ij_javascript_if_brace_force = never +ij_javascript_import_merge_members = global +ij_javascript_import_prefer_absolute_path = global +ij_javascript_import_sort_members = true +ij_javascript_import_sort_module_name = false +ij_javascript_import_use_node_resolution = true +ij_javascript_imports_wrap = on_every_item +ij_javascript_indent_case_from_switch = true +ij_javascript_indent_chained_calls = true +ij_javascript_indent_package_children = 0 +ij_javascript_jsx_attribute_value = braces +ij_javascript_keep_blank_lines_in_code = 2 +ij_javascript_keep_first_column_comment = true +ij_javascript_keep_indents_on_empty_lines = false +ij_javascript_keep_line_breaks = true +ij_javascript_keep_simple_blocks_in_one_line = false +ij_javascript_keep_simple_methods_in_one_line = false +ij_javascript_line_comment_add_space = true +ij_javascript_line_comment_at_first_column = false +ij_javascript_method_brace_style = end_of_line +ij_javascript_method_call_chain_wrap = off +ij_javascript_method_parameters_new_line_after_left_paren = false +ij_javascript_method_parameters_right_paren_on_new_line = false +ij_javascript_method_parameters_wrap = off +ij_javascript_object_literal_wrap = on_every_item +ij_javascript_parentheses_expression_new_line_after_left_paren = false +ij_javascript_parentheses_expression_right_paren_on_new_line = false +ij_javascript_place_assignment_sign_on_next_line = false +ij_javascript_prefer_as_type_cast = false +ij_javascript_prefer_explicit_types_function_expression_returns = false +ij_javascript_prefer_explicit_types_function_returns = false +ij_javascript_prefer_explicit_types_vars_fields = false +ij_javascript_prefer_parameters_wrap = false +ij_javascript_reformat_c_style_comments = false +ij_javascript_space_after_colon = true +ij_javascript_space_after_comma = true +ij_javascript_space_after_dots_in_rest_parameter = false +ij_javascript_space_after_generator_mult = true +ij_javascript_space_after_property_colon = true +ij_javascript_space_after_quest = true +ij_javascript_space_after_type_colon = true +ij_javascript_space_after_unary_not = false +ij_javascript_space_before_async_arrow_lparen = true +ij_javascript_space_before_catch_keyword = true +ij_javascript_space_before_catch_left_brace = true +ij_javascript_space_before_catch_parentheses = true +ij_javascript_space_before_class_lbrace = true +ij_javascript_space_before_class_left_brace = true +ij_javascript_space_before_colon = true +ij_javascript_space_before_comma = false +ij_javascript_space_before_do_left_brace = true +ij_javascript_space_before_else_keyword = true +ij_javascript_space_before_else_left_brace = true +ij_javascript_space_before_finally_keyword = true +ij_javascript_space_before_finally_left_brace = true +ij_javascript_space_before_for_left_brace = true +ij_javascript_space_before_for_parentheses = true +ij_javascript_space_before_for_semicolon = false +ij_javascript_space_before_function_left_parenth = true +ij_javascript_space_before_generator_mult = false +ij_javascript_space_before_if_left_brace = true +ij_javascript_space_before_if_parentheses = true +ij_javascript_space_before_method_call_parentheses = false +ij_javascript_space_before_method_left_brace = true +ij_javascript_space_before_method_parentheses = false +ij_javascript_space_before_property_colon = false +ij_javascript_space_before_quest = true +ij_javascript_space_before_switch_left_brace = true +ij_javascript_space_before_switch_parentheses = true +ij_javascript_space_before_try_left_brace = true +ij_javascript_space_before_type_colon = false +ij_javascript_space_before_unary_not = false +ij_javascript_space_before_while_keyword = true +ij_javascript_space_before_while_left_brace = true +ij_javascript_space_before_while_parentheses = true +ij_javascript_spaces_around_additive_operators = true +ij_javascript_spaces_around_arrow_function_operator = true +ij_javascript_spaces_around_assignment_operators = true +ij_javascript_spaces_around_bitwise_operators = true +ij_javascript_spaces_around_equality_operators = true +ij_javascript_spaces_around_logical_operators = true +ij_javascript_spaces_around_multiplicative_operators = true +ij_javascript_spaces_around_relational_operators = true +ij_javascript_spaces_around_shift_operators = true +ij_javascript_spaces_around_unary_operator = false +ij_javascript_spaces_within_array_initializer_brackets = false +ij_javascript_spaces_within_brackets = false +ij_javascript_spaces_within_catch_parentheses = false +ij_javascript_spaces_within_for_parentheses = false +ij_javascript_spaces_within_if_parentheses = false +ij_javascript_spaces_within_imports = false +ij_javascript_spaces_within_interpolation_expressions = false +ij_javascript_spaces_within_method_call_parentheses = false +ij_javascript_spaces_within_method_parentheses = false +ij_javascript_spaces_within_object_literal_braces = false +ij_javascript_spaces_within_object_type_braces = true +ij_javascript_spaces_within_parentheses = false +ij_javascript_spaces_within_switch_parentheses = false +ij_javascript_spaces_within_type_assertion = false +ij_javascript_spaces_within_union_types = true +ij_javascript_spaces_within_while_parentheses = false +ij_javascript_special_else_if_treatment = true +ij_javascript_ternary_operation_signs_on_next_line = false +ij_javascript_ternary_operation_wrap = off +ij_javascript_union_types_wrap = on_every_item +ij_javascript_use_chained_calls_group_indents = false +ij_javascript_use_double_quotes = true +ij_javascript_use_path_mapping = always +ij_javascript_use_public_modifier = false +ij_javascript_use_semicolon_after_statement = true +ij_javascript_var_declaration_wrap = normal +ij_javascript_while_brace_force = never +ij_javascript_while_on_new_line = false +ij_javascript_wrap_comments = false + +[{*.cjsx, *.coffee}] +indent_size = 2 +tab_width = 2 +ij_continuation_indent_size = 2 +ij_coffeescript_align_function_body = false +ij_coffeescript_align_imports = false +ij_coffeescript_align_multiline_array_initializer_expression = true +ij_coffeescript_align_multiline_parameters = true +ij_coffeescript_align_multiline_parameters_in_calls = false +ij_coffeescript_align_object_properties = 0 +ij_coffeescript_align_union_types = false +ij_coffeescript_align_var_statements = 0 +ij_coffeescript_array_initializer_new_line_after_left_brace = false +ij_coffeescript_array_initializer_right_brace_on_new_line = false +ij_coffeescript_array_initializer_wrap = normal +ij_coffeescript_blacklist_imports = rxjs/Rx, node_modules/**, **/node_modules/**, @angular/material, @angular/material/typings/** +ij_coffeescript_blank_lines_around_function = 1 +ij_coffeescript_call_parameters_new_line_after_left_paren = false +ij_coffeescript_call_parameters_right_paren_on_new_line = false +ij_coffeescript_call_parameters_wrap = normal +ij_coffeescript_chained_call_dot_on_new_line = true +ij_coffeescript_comma_on_new_line = false +ij_coffeescript_enforce_trailing_comma = keep +ij_coffeescript_field_prefix = _ +ij_coffeescript_file_name_style = relaxed +ij_coffeescript_force_quote_style = false +ij_coffeescript_force_semicolon_style = false +ij_coffeescript_function_expression_brace_style = end_of_line +ij_coffeescript_import_merge_members = global +ij_coffeescript_import_prefer_absolute_path = global +ij_coffeescript_import_sort_members = true +ij_coffeescript_import_sort_module_name = false +ij_coffeescript_import_use_node_resolution = true +ij_coffeescript_imports_wrap = on_every_item +ij_coffeescript_indent_chained_calls = true +ij_coffeescript_indent_package_children = 0 +ij_coffeescript_jsx_attribute_value = braces +ij_coffeescript_keep_blank_lines_in_code = 2 +ij_coffeescript_keep_first_column_comment = true +ij_coffeescript_keep_indents_on_empty_lines = false +ij_coffeescript_keep_line_breaks = true +ij_coffeescript_keep_simple_methods_in_one_line = false +ij_coffeescript_method_parameters_new_line_after_left_paren = false +ij_coffeescript_method_parameters_right_paren_on_new_line = false +ij_coffeescript_method_parameters_wrap = off +ij_coffeescript_object_literal_wrap = on_every_item +ij_coffeescript_prefer_as_type_cast = false +ij_coffeescript_prefer_explicit_types_function_expression_returns = false +ij_coffeescript_prefer_explicit_types_function_returns = false +ij_coffeescript_prefer_explicit_types_vars_fields = false +ij_coffeescript_reformat_c_style_comments = false +ij_coffeescript_space_after_comma = true +ij_coffeescript_space_after_dots_in_rest_parameter = false +ij_coffeescript_space_after_generator_mult = true +ij_coffeescript_space_after_property_colon = true +ij_coffeescript_space_after_type_colon = true +ij_coffeescript_space_after_unary_not = false +ij_coffeescript_space_before_async_arrow_lparen = true +ij_coffeescript_space_before_class_lbrace = true +ij_coffeescript_space_before_comma = false +ij_coffeescript_space_before_function_left_parenth = true +ij_coffeescript_space_before_generator_mult = false +ij_coffeescript_space_before_property_colon = false +ij_coffeescript_space_before_type_colon = false +ij_coffeescript_space_before_unary_not = false +ij_coffeescript_spaces_around_additive_operators = true +ij_coffeescript_spaces_around_arrow_function_operator = true +ij_coffeescript_spaces_around_assignment_operators = true +ij_coffeescript_spaces_around_bitwise_operators = true +ij_coffeescript_spaces_around_equality_operators = true +ij_coffeescript_spaces_around_logical_operators = true +ij_coffeescript_spaces_around_multiplicative_operators = true +ij_coffeescript_spaces_around_relational_operators = true +ij_coffeescript_spaces_around_shift_operators = true +ij_coffeescript_spaces_around_unary_operator = false +ij_coffeescript_spaces_within_array_initializer_braces = false +ij_coffeescript_spaces_within_array_initializer_brackets = false +ij_coffeescript_spaces_within_imports = false +ij_coffeescript_spaces_within_index_brackets = false +ij_coffeescript_spaces_within_interpolation_expressions = false +ij_coffeescript_spaces_within_method_call_parentheses = false +ij_coffeescript_spaces_within_method_parentheses = false +ij_coffeescript_spaces_within_object_braces = false +ij_coffeescript_spaces_within_object_literal_braces = false +ij_coffeescript_spaces_within_object_type_braces = true +ij_coffeescript_spaces_within_range_brackets = false +ij_coffeescript_spaces_within_type_assertion = false +ij_coffeescript_spaces_within_union_types = true +ij_coffeescript_union_types_wrap = on_every_item +ij_coffeescript_use_chained_calls_group_indents = false +ij_coffeescript_use_double_quotes = true +ij_coffeescript_use_explicit_js_extension = global +ij_coffeescript_use_path_mapping = always +ij_coffeescript_use_public_modifier = false +ij_coffeescript_use_semicolon_after_statement = false +ij_coffeescript_var_declaration_wrap = normal + +[{*.ft, *.vm, *.vsl}] +ij_vtl_keep_indents_on_empty_lines = false + +[{*.gant, *.gradle, *.groovy, *.gson, *.gy}] +ij_groovy_align_group_field_declarations = false +ij_groovy_align_multiline_array_initializer_expression = false +ij_groovy_align_multiline_assignment = false +ij_groovy_align_multiline_binary_operation = false +ij_groovy_align_multiline_chained_methods = false +ij_groovy_align_multiline_extends_list = false +ij_groovy_align_multiline_for = true +ij_groovy_align_multiline_list_or_map = true +ij_groovy_align_multiline_method_parentheses = false +ij_groovy_align_multiline_parameters = true +ij_groovy_align_multiline_parameters_in_calls = false +ij_groovy_align_multiline_resources = true +ij_groovy_align_multiline_ternary_operation = false +ij_groovy_align_multiline_throws_list = false +ij_groovy_align_named_args_in_map = true +ij_groovy_align_throws_keyword = false +ij_groovy_array_initializer_new_line_after_left_brace = false +ij_groovy_array_initializer_right_brace_on_new_line = false +ij_groovy_array_initializer_wrap = off +ij_groovy_assert_statement_wrap = off +ij_groovy_assignment_wrap = off +ij_groovy_binary_operation_wrap = off +ij_groovy_blank_lines_after_class_header = 0 +ij_groovy_blank_lines_after_imports = 1 +ij_groovy_blank_lines_after_package = 1 +ij_groovy_blank_lines_around_class = 1 +ij_groovy_blank_lines_around_field = 0 +ij_groovy_blank_lines_around_field_in_interface = 0 +ij_groovy_blank_lines_around_method = 1 +ij_groovy_blank_lines_around_method_in_interface = 1 +ij_groovy_blank_lines_before_imports = 1 +ij_groovy_blank_lines_before_method_body = 0 +ij_groovy_blank_lines_before_package = 0 +ij_groovy_block_brace_style = end_of_line +ij_groovy_block_comment_at_first_column = true +ij_groovy_call_parameters_new_line_after_left_paren = false +ij_groovy_call_parameters_right_paren_on_new_line = false +ij_groovy_call_parameters_wrap = off +ij_groovy_catch_on_new_line = false +ij_groovy_class_annotation_wrap = split_into_lines +ij_groovy_class_brace_style = end_of_line +ij_groovy_class_count_to_use_import_on_demand = 5 +ij_groovy_do_while_brace_force = never +ij_groovy_else_on_new_line = false +ij_groovy_enum_constants_wrap = off +ij_groovy_extends_keyword_wrap = off +ij_groovy_extends_list_wrap = off +ij_groovy_field_annotation_wrap = split_into_lines +ij_groovy_finally_on_new_line = false +ij_groovy_for_brace_force = never +ij_groovy_for_statement_new_line_after_left_paren = false +ij_groovy_for_statement_right_paren_on_new_line = false +ij_groovy_for_statement_wrap = off +ij_groovy_if_brace_force = never +ij_groovy_import_annotation_wrap = 2 +ij_groovy_imports_layout = *, |, javax.**, java.**, |, $* +ij_groovy_indent_case_from_switch = true +ij_groovy_indent_label_blocks = true +ij_groovy_insert_inner_class_imports = false +ij_groovy_keep_blank_lines_before_right_brace = 2 +ij_groovy_keep_blank_lines_in_code = 2 +ij_groovy_keep_blank_lines_in_declarations = 2 +ij_groovy_keep_control_statement_in_one_line = true +ij_groovy_keep_first_column_comment = true +ij_groovy_keep_indents_on_empty_lines = false +ij_groovy_keep_line_breaks = true +ij_groovy_keep_multiple_expressions_in_one_line = false +ij_groovy_keep_simple_blocks_in_one_line = false +ij_groovy_keep_simple_classes_in_one_line = true +ij_groovy_keep_simple_lambdas_in_one_line = true +ij_groovy_keep_simple_methods_in_one_line = true +ij_groovy_label_indent_absolute = false +ij_groovy_label_indent_size = 0 +ij_groovy_lambda_brace_style = end_of_line +ij_groovy_layout_static_imports_separately = true +ij_groovy_line_comment_add_space = false +ij_groovy_line_comment_at_first_column = true +ij_groovy_method_annotation_wrap = split_into_lines +ij_groovy_method_brace_style = end_of_line +ij_groovy_method_call_chain_wrap = off +ij_groovy_method_parameters_new_line_after_left_paren = false +ij_groovy_method_parameters_right_paren_on_new_line = false +ij_groovy_method_parameters_wrap = off +ij_groovy_modifier_list_wrap = false +ij_groovy_names_count_to_use_import_on_demand = 3 +ij_groovy_parameter_annotation_wrap = off +ij_groovy_parentheses_expression_new_line_after_left_paren = false +ij_groovy_parentheses_expression_right_paren_on_new_line = false +ij_groovy_prefer_parameters_wrap = false +ij_groovy_resource_list_new_line_after_left_paren = false +ij_groovy_resource_list_right_paren_on_new_line = false +ij_groovy_resource_list_wrap = off +ij_groovy_space_after_assert_separator = true +ij_groovy_space_after_colon = true +ij_groovy_space_after_comma = true +ij_groovy_space_after_comma_in_type_arguments = true +ij_groovy_space_after_for_semicolon = true +ij_groovy_space_after_quest = true +ij_groovy_space_after_type_cast = true +ij_groovy_space_before_annotation_parameter_list = false +ij_groovy_space_before_array_initializer_left_brace = false +ij_groovy_space_before_assert_separator = false +ij_groovy_space_before_catch_keyword = true +ij_groovy_space_before_catch_left_brace = true +ij_groovy_space_before_catch_parentheses = true +ij_groovy_space_before_class_left_brace = true +ij_groovy_space_before_closure_left_brace = true +ij_groovy_space_before_colon = true +ij_groovy_space_before_comma = false +ij_groovy_space_before_do_left_brace = true +ij_groovy_space_before_else_keyword = true +ij_groovy_space_before_else_left_brace = true +ij_groovy_space_before_finally_keyword = true +ij_groovy_space_before_finally_left_brace = true +ij_groovy_space_before_for_left_brace = true +ij_groovy_space_before_for_parentheses = true +ij_groovy_space_before_for_semicolon = false +ij_groovy_space_before_if_left_brace = true +ij_groovy_space_before_if_parentheses = true +ij_groovy_space_before_method_call_parentheses = false +ij_groovy_space_before_method_left_brace = true +ij_groovy_space_before_method_parentheses = false +ij_groovy_space_before_quest = true +ij_groovy_space_before_switch_left_brace = true +ij_groovy_space_before_switch_parentheses = true +ij_groovy_space_before_synchronized_left_brace = true +ij_groovy_space_before_synchronized_parentheses = true +ij_groovy_space_before_try_left_brace = true +ij_groovy_space_before_try_parentheses = true +ij_groovy_space_before_while_keyword = true +ij_groovy_space_before_while_left_brace = true +ij_groovy_space_before_while_parentheses = true +ij_groovy_space_in_named_argument = true +ij_groovy_space_in_named_argument_before_colon = false +ij_groovy_space_within_empty_array_initializer_braces = false +ij_groovy_space_within_empty_method_call_parentheses = false +ij_groovy_spaces_around_additive_operators = true +ij_groovy_spaces_around_assignment_operators = true +ij_groovy_spaces_around_bitwise_operators = true +ij_groovy_spaces_around_equality_operators = true +ij_groovy_spaces_around_lambda_arrow = true +ij_groovy_spaces_around_logical_operators = true +ij_groovy_spaces_around_multiplicative_operators = true +ij_groovy_spaces_around_regex_operators = true +ij_groovy_spaces_around_relational_operators = true +ij_groovy_spaces_around_shift_operators = true +ij_groovy_spaces_within_annotation_parentheses = false +ij_groovy_spaces_within_array_initializer_braces = false +ij_groovy_spaces_within_braces = true +ij_groovy_spaces_within_brackets = false +ij_groovy_spaces_within_cast_parentheses = false +ij_groovy_spaces_within_catch_parentheses = false +ij_groovy_spaces_within_for_parentheses = false +ij_groovy_spaces_within_gstring_injection_braces = false +ij_groovy_spaces_within_if_parentheses = false +ij_groovy_spaces_within_list_or_map = false +ij_groovy_spaces_within_method_call_parentheses = false +ij_groovy_spaces_within_method_parentheses = false +ij_groovy_spaces_within_parentheses = false +ij_groovy_spaces_within_switch_parentheses = false +ij_groovy_spaces_within_synchronized_parentheses = false +ij_groovy_spaces_within_try_parentheses = false +ij_groovy_spaces_within_tuple_expression = false +ij_groovy_spaces_within_while_parentheses = false +ij_groovy_special_else_if_treatment = true +ij_groovy_ternary_operation_wrap = off +ij_groovy_throws_keyword_wrap = off +ij_groovy_throws_list_wrap = off +ij_groovy_use_flying_geese_braces = false +ij_groovy_use_fq_class_names = false +ij_groovy_use_fq_class_names_in_javadoc = true +ij_groovy_use_relative_indents = false +ij_groovy_use_single_class_imports = true +ij_groovy_variable_annotation_wrap = off +ij_groovy_while_brace_force = never +ij_groovy_while_on_new_line = false +ij_groovy_wrap_long_lines = false + +[{*.har, *.jsb2, *.jsb3, *.json, .babelrc, .eslintrc, .stylelintrc, bowerrc, jest.config}] +indent_size = 2 +ij_json_keep_blank_lines_in_code = 0 +ij_json_keep_indents_on_empty_lines = false +ij_json_keep_line_breaks = true +ij_json_space_after_colon = true +ij_json_space_after_comma = true +ij_json_space_before_colon = true +ij_json_space_before_comma = false +ij_json_spaces_within_braces = false +ij_json_spaces_within_brackets = false +ij_json_wrap_long_lines = false + +[{*.htm, *.html, *.ng, *.sht, *.shtm, *.shtml}] +ij_html_add_new_line_before_tags = body, div, p, form, h1, h2, h3 +ij_html_align_attributes = true +ij_html_align_text = false +ij_html_attribute_wrap = normal +ij_html_block_comment_at_first_column = true +ij_html_do_not_align_children_of_min_lines = 0 +ij_html_do_not_break_if_inline_tags = title, h1, h2, h3, h4, h5, h6, p +ij_html_do_not_indent_children_of_tags = html, body, thead, tbody, tfoot +ij_html_enforce_quotes = false +ij_html_inline_tags = a, abbr, acronym, b, basefont, bdo, big, br, cite, cite, code, dfn, em, font, i, img, input, kbd, label, q, s, samp, select, small, span, strike, strong, sub, sup, textarea, tt, u, var +ij_html_keep_blank_lines = 2 +ij_html_keep_indents_on_empty_lines = false +ij_html_keep_line_breaks = true +ij_html_keep_line_breaks_in_text = true +ij_html_keep_whitespaces = false +ij_html_keep_whitespaces_inside = span, pre, textarea +ij_html_line_comment_at_first_column = true +ij_html_new_line_after_last_attribute = never +ij_html_new_line_before_first_attribute = never +ij_html_quote_style = double +ij_html_remove_new_line_before_tags = br +ij_html_space_after_tag_name = false +ij_html_space_around_equality_in_attribute = false +ij_html_space_inside_empty_tag = false +ij_html_text_wrap = normal +ij_html_uniform_ident = false + +[{*.jsf, *.jsp, *.jspf, *.tag, *.tagf, *.xjsp}] +ij_jsp_jsp_prefer_comma_separated_import_list = false +ij_jsp_keep_indents_on_empty_lines = false + +[{*.jspx, *.tagx}] +ij_jspx_keep_indents_on_empty_lines = false + +[{*.kt, *.kts}] +ij_kotlin_align_in_columns_case_branch = false +ij_kotlin_align_multiline_binary_operation = false +ij_kotlin_align_multiline_extends_list = false +ij_kotlin_align_multiline_method_parentheses = false +ij_kotlin_align_multiline_parameters = true +ij_kotlin_align_multiline_parameters_in_calls = false +ij_kotlin_assignment_wrap = off +ij_kotlin_blank_lines_after_class_header = 0 +ij_kotlin_blank_lines_around_block_when_branches = 0 +ij_kotlin_block_comment_at_first_column = true +ij_kotlin_call_parameters_new_line_after_left_paren = false +ij_kotlin_call_parameters_right_paren_on_new_line = false +ij_kotlin_call_parameters_wrap = off +ij_kotlin_catch_on_new_line = false +ij_kotlin_class_annotation_wrap = split_into_lines +ij_kotlin_continuation_indent_for_chained_calls = true +ij_kotlin_continuation_indent_for_expression_bodies = true +ij_kotlin_continuation_indent_in_argument_lists = true +ij_kotlin_continuation_indent_in_elvis = true +ij_kotlin_continuation_indent_in_if_conditions = true +ij_kotlin_continuation_indent_in_parameter_lists = true +ij_kotlin_continuation_indent_in_supertype_lists = true +ij_kotlin_else_on_new_line = false +ij_kotlin_enum_constants_wrap = off +ij_kotlin_extends_list_wrap = off +ij_kotlin_field_annotation_wrap = split_into_lines +ij_kotlin_finally_on_new_line = false +ij_kotlin_if_rparen_on_new_line = false +ij_kotlin_import_nested_classes = false +ij_kotlin_insert_whitespaces_in_simple_one_line_method = true +ij_kotlin_keep_blank_lines_before_right_brace = 2 +ij_kotlin_keep_blank_lines_in_code = 2 +ij_kotlin_keep_blank_lines_in_declarations = 2 +ij_kotlin_keep_first_column_comment = true +ij_kotlin_keep_indents_on_empty_lines = false +ij_kotlin_keep_line_breaks = true +ij_kotlin_lbrace_on_next_line = false +ij_kotlin_line_comment_add_space = false +ij_kotlin_line_comment_at_first_column = true +ij_kotlin_method_annotation_wrap = split_into_lines +ij_kotlin_method_call_chain_wrap = off +ij_kotlin_method_parameters_new_line_after_left_paren = false +ij_kotlin_method_parameters_right_paren_on_new_line = false +ij_kotlin_method_parameters_wrap = off +ij_kotlin_name_count_to_use_star_import = 5 +ij_kotlin_name_count_to_use_star_import_for_members = 3 +ij_kotlin_parameter_annotation_wrap = off +ij_kotlin_space_after_comma = true +ij_kotlin_space_after_extend_colon = true +ij_kotlin_space_after_type_colon = true +ij_kotlin_space_before_catch_parentheses = true +ij_kotlin_space_before_comma = false +ij_kotlin_space_before_extend_colon = true +ij_kotlin_space_before_for_parentheses = true +ij_kotlin_space_before_if_parentheses = true +ij_kotlin_space_before_lambda_arrow = true +ij_kotlin_space_before_type_colon = false +ij_kotlin_space_before_when_parentheses = true +ij_kotlin_space_before_while_parentheses = true +ij_kotlin_spaces_around_additive_operators = true +ij_kotlin_spaces_around_assignment_operators = true +ij_kotlin_spaces_around_equality_operators = true +ij_kotlin_spaces_around_function_type_arrow = true +ij_kotlin_spaces_around_logical_operators = true +ij_kotlin_spaces_around_multiplicative_operators = true +ij_kotlin_spaces_around_range = false +ij_kotlin_spaces_around_relational_operators = true +ij_kotlin_spaces_around_unary_operator = false +ij_kotlin_spaces_around_when_arrow = true +ij_kotlin_variable_annotation_wrap = off +ij_kotlin_while_on_new_line = false +ij_kotlin_wrap_elvis_expressions = 1 +ij_kotlin_wrap_expression_body_functions = 0 +ij_kotlin_wrap_first_method_in_call_chain = false + +[{*.properties, spring.handlers, spring.schemas}] +ij_properties_align_group_field_declarations = false +ij_properties_keep_blank_lines = false +ij_properties_key_value_delimiter = equals +ij_properties_spaces_around_key_value_delimiter = false + +[{*.yaml, *.yml, .analysis_options}] +indent_size = 2 +ij_yaml_keep_indents_on_empty_lines = false +ij_yaml_keep_line_breaks = true +ij_yaml_space_before_colon = true +ij_yaml_spaces_within_braces = true +ij_yaml_spaces_within_brackets = true + +[*.tsx] +charset = utf-8 +end_of_line = lf +indent_style = space +indent_size = 2 +tab_width = 2 +continuation_indent_size = 2 + +# 其他可选配置 +insert_final_newline = true +trim_trailing_whitespace = true +max_line_length = 120 \ No newline at end of file diff --git a/modeler/.env b/modeler/.env new file mode 100644 index 0000000..e69de29 diff --git a/modeler/.env.development b/modeler/.env.development new file mode 100644 index 0000000..27eb66c --- /dev/null +++ b/modeler/.env.development @@ -0,0 +1,17 @@ +# +# This file is part of the kernelstudio package. +# +# (c) 2014-2025 zlin +# +# For the full copyright and license information, please view the LICENSE file +# that was distributed with this source code. +# +NODE_ENV=development +APP_BASE_URL=/ +APP_API_URL=/api/v1 +APP_API_TIMEOUT=60000 +APP_PORT=9999 +APP_PROXY_HOST=http://127.0.0.1 +APP_PROXY_PORT=12000 +APP_ASSETS_HOST=http://127.0.0.1:9999 +APP_DIST_DIR=assets/web \ No newline at end of file diff --git a/modeler/.env.production b/modeler/.env.production new file mode 100644 index 0000000..d6f4922 --- /dev/null +++ b/modeler/.env.production @@ -0,0 +1,16 @@ +# +# This file is part of the kernelstudio package. +# +# (c) 2014-2025 zlin +# +# For the full copyright and license information, please view the LICENSE file +# that was distributed with this source code. +# +APP_BASE_URL=/ +APP_API_URL=/api/v1 +APP_API_TIMEOUT=60000 +APP_PORT=9999 +APP_PROXY_HOST=http://127.0.0.1 +APP_PROXY_PORT=12000 +APP_ASSETS_HOST=http://app.kernelstudio.com +APP_DIST_DIR=assets/web \ No newline at end of file diff --git a/modeler/.eslintrc-auto-import.json b/modeler/.eslintrc-auto-import.json new file mode 100644 index 0000000..7519a11 --- /dev/null +++ b/modeler/.eslintrc-auto-import.json @@ -0,0 +1,98 @@ +{ + "globals": { + "Component": true, + "ComponentPublicInstance": true, + "ComputedRef": true, + "DirectiveBinding": true, + "EffectScope": true, + "ExtractDefaultPropTypes": true, + "ExtractPropTypes": true, + "ExtractPublicPropTypes": true, + "InjectionKey": true, + "MaybeRef": true, + "MaybeRefOrGetter": true, + "PropType": true, + "Ref": true, + "ShallowRef": true, + "Slot": true, + "Slots": true, + "VNode": true, + "WritableComputedRef": true, + "acceptHMRUpdate": true, + "computed": true, + "createApp": true, + "createPinia": true, + "customRef": true, + "defineAsyncComponent": true, + "defineComponent": true, + "defineStore": true, + "effectScope": true, + "getActivePinia": true, + "getCurrentInstance": true, + "getCurrentScope": true, + "getCurrentWatcher": true, + "inject": true, + "isProxy": true, + "isReactive": true, + "isReadonly": true, + "isRef": true, + "isShallow": true, + "mapActions": true, + "mapGetters": true, + "mapState": true, + "mapStores": true, + "mapWritableState": true, + "markRaw": true, + "nextTick": true, + "onActivated": true, + "onBeforeMount": true, + "onBeforeRouteLeave": true, + "onBeforeRouteUpdate": true, + "onBeforeUnmount": true, + "onBeforeUpdate": true, + "onDeactivated": true, + "onErrorCaptured": true, + "onMounted": true, + "onRenderTracked": true, + "onRenderTriggered": true, + "onScopeDispose": true, + "onServerPrefetch": true, + "onUnmounted": true, + "onUpdated": true, + "onWatcherCleanup": true, + "provide": true, + "reactive": true, + "readonly": true, + "ref": true, + "resolveComponent": true, + "setActivePinia": true, + "setMapStoreSuffix": true, + "shallowReactive": true, + "shallowReadonly": true, + "shallowRef": true, + "storeToRefs": true, + "toRaw": true, + "toRef": true, + "toRefs": true, + "toValue": true, + "triggerRef": true, + "unref": true, + "useAttrs": true, + "useClipboard": true, + "useCssModule": true, + "useCssVars": true, + "useDebounceFn": true, + "useId": true, + "useLink": true, + "useLocalStorage": true, + "useModel": true, + "useRoute": true, + "useRouter": true, + "useSlots": true, + "useTemplateRef": true, + "watch": true, + "watchEffect": true, + "watchPostEffect": true, + "watchSyncEffect": true + } +} diff --git a/modeler/.gitattributes b/modeler/.gitattributes new file mode 100644 index 0000000..ab6a51b --- /dev/null +++ b/modeler/.gitattributes @@ -0,0 +1,15 @@ +# .gitattributes +* text=auto eol=lf +*.html text eol=lf +*.css text eol=lf +*.js text eol=lf +*.scss text eol=lf +*.hbs text eol=lf +*.sh text eol=lf +*.md text eol=lf +*.json text eol=lf +*.yml text eol=lf +.browserslistrc text eol=lf +.gitignore text eol=lf +*.js linguist-detectable=true +*.vue linguist-detectable=true diff --git a/modeler/.prettierignore b/modeler/.prettierignore new file mode 100644 index 0000000..5a13050 --- /dev/null +++ b/modeler/.prettierignore @@ -0,0 +1,13 @@ +/dist/* +/docs/* +.local +.output.js +auto-imports.d.ts +/node_modules/** + +**/*.svg +**/*.sh + +/public/* +/tmp/* + diff --git a/modeler/.prettierrc b/modeler/.prettierrc new file mode 100644 index 0000000..b145fd0 --- /dev/null +++ b/modeler/.prettierrc @@ -0,0 +1,19 @@ +{ + "printWidth": 200, + "tabWidth": 2, + "useTabs": false, + "semi": true, + "vueIndentScriptAndStyle": true, + "singleQuote": true, + "quoteProps": "as-needed", + "bracketSpacing": true, + "trailingComma": "es5", + "jsxBracketSameLine": true, + "jsxSingleQuote": false, + "arrowParens": "always", + "insertPragma": false, + "requirePragma": false, + "proseWrap": "preserve", + "htmlWhitespaceSensitivity": "strict", + "endOfLine": "lf" +} diff --git a/modeler/.stylelintignore b/modeler/.stylelintignore new file mode 100644 index 0000000..2675aa0 --- /dev/null +++ b/modeler/.stylelintignore @@ -0,0 +1,6 @@ +/dist/* +/public/* +/docs/* +/tmp/* +/bin/* +/config/* \ No newline at end of file diff --git a/modeler/.vercelignore b/modeler/.vercelignore new file mode 100644 index 0000000..199563b --- /dev/null +++ b/modeler/.vercelignore @@ -0,0 +1,7 @@ +node_modules +.git +*.log +.DS_Store +dist +.vscode +.idea \ No newline at end of file diff --git a/modeler/.vscode/extensions.json b/modeler/.vscode/extensions.json new file mode 100644 index 0000000..a7cea0b --- /dev/null +++ b/modeler/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["Vue.volar"] +} diff --git a/modeler/README.md b/modeler/README.md new file mode 100644 index 0000000..33895ab --- /dev/null +++ b/modeler/README.md @@ -0,0 +1,5 @@ +# Vue 3 + TypeScript + Vite + +This template should help get you started developing with Vue 3 and TypeScript in Vite. The template uses Vue 3 ` + + + + + + + + + + + +
+
+
+ +
+
+
+
+

If you're seeing this Grafana has failed to load its application files

+
    +
  1. This could be caused by your reverse proxy settings.
  2. +
  3. If you host grafana under a subpath make sure your grafana.ini root_url setting + includes subpath. If not using a reverse proxy make sure to set serve_from_sub_path to true.
  4. +
  5. If you have a local dev build make sure you build frontend using: yarn start, or + yarn build.
  6. +
  7. Sometimes restarting grafana-server can help.
  8. +
  9. Check if you are using a non-supported browser. For more information, refer to the list of + + supported browsers .
  10. +
+
+
+ +
+ +
+ + + +[[if .GoogleTagManagerId]] + + + + + +[[end]] + +[[if .Settings.FeatureToggles.assetSriChecks ]] +[[range $asset := .Assets.JSFiles]] + +[[end]] +[[else]] +[[range $asset := .Assets.JSFiles]] + +[[end]] +[[end]] + + + + \ No newline at end of file diff --git a/modeler/config/grafana/views/swagger.html b/modeler/config/grafana/views/swagger.html new file mode 100644 index 0000000..9687f75 --- /dev/null +++ b/modeler/config/grafana/views/swagger.html @@ -0,0 +1,39 @@ + + + + [[ if and .CSPEnabled .IsDevelopmentEnv ]] + + + [[ end ]] + + + + + + Grafana API Reference + + [[range $asset := .Assets.SwaggerCSSFiles]] + + [[end]] + + + + + + + + + + + +
+[[range $asset := .Assets.Swagger]] + +[[end]] + + + \ No newline at end of file diff --git a/modeler/config/nginx.conf b/modeler/config/nginx.conf new file mode 100644 index 0000000..62430b1 --- /dev/null +++ b/modeler/config/nginx.conf @@ -0,0 +1,98 @@ +server { + listen 80; + server_name monitor.kernelstudio.com; + include server/error.conf; + access_log /var/log/nginx/monitor.kernelstudio.com.access.log access; + error_log /var/log/nginx/monitor.kernelstudio.com.error.log debug; # 临时开启debug,排查WS错误 + + # 核心:屏蔽后端 X-Frame-Options + 统一设置 + proxy_hide_header X-Frame-Options; + add_header X-Frame-Options "sameorigin" always; + + # 全局跨域头(开发环境) + add_header Access-Control-Allow-Origin "*" always; + add_header Access-Control-Allow-Methods "GET,POST,PUT,DELETE,OPTIONS" always; + add_header Access-Control-Allow-Headers "Content-Type,Authorization,X-Grafana-Org-Id,Upgrade,Connection" always; + # 允许跨域预检请求(OPTIONS) + if ($request_method = OPTIONS) { + return 204; + } + + # 全局 proxy 基础配置 + proxy_http_version 1.1; + proxy_connect_timeout 60s; + proxy_set_header X-Host $host; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Port $server_port; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + + # ========== 最高优先级:Grafana Live WS(覆盖所有带参数的WS请求) ========== + # 正则匹配 /api/live/ws 及后续所有参数/路径 + location ~ ^/api/live/ws { + # WebSocket 必须的头部 + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + + # 保持其他头部传递 + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + + # WebSocket 超时设置 + proxy_read_timeout 86400; + proxy_connect_timeout 86400; + proxy_send_timeout 86400; + + # 禁用缓冲 + proxy_buffering off; + proxy_cache off; + + proxy_pass http://192.168.1.200:3000; + } + + # ========== 次优先级:Grafana 其他 API/页面路径 ========== + # 1. 匹配 /apis/(带s)开头的所有路径 + location ~ ^/apis/ { + proxy_next_upstream http_500 http_502 http_504 error timeout invalid_header; + proxy_read_timeout 300s; + proxy_pass http://192.168.1.200:3000; + } + + # 2. 匹配 /api/ 下的 Grafana 核心 API(排除 live/ws,已单独匹配) + location ~ ^/api/(user|frontend-metrics|datasources|ds|dashboards|prometheus|plugins|features\.grafana\.ap|public)($|/) { + proxy_next_upstream http_500 http_502 http_504 error timeout invalid_header; + proxy_read_timeout 300s; + proxy_pass http://192.168.1.200:3000; + } + + # 3. 匹配 Grafana 页面路径 + location ~ ^/(d|login|public|avatar)($|/) { + proxy_next_upstream http_500 http_502 http_504 error timeout invalid_header; + proxy_read_timeout 300s; + proxy_pass http://192.168.1.200:3000; + } + + # ========== Vite 相关路径(最后匹配) ========== + # 1. Vite HMR 的 WebSocket 路径 + location /ws { + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_read_timeout 86400s; + proxy_pass http://192.168.1.200:8888; + } + + # 2. Vite 开发环境兜底 + location / { + include custom/api.access.conf; + proxy_next_upstream http_500 http_502 http_504 error timeout invalid_header; + # 禁用缓存 + add_header Cache-Control "no-cache, no-store, must-revalidate" always; + add_header Pragma "no-cache" always; + add_header Expires "0" always; + proxy_pass http://192.168.1.200:8888; + } +} \ No newline at end of file diff --git a/modeler/docs/ui/001-工程管理-tab1-工程列表.jpg b/modeler/docs/ui/001-工程管理-tab1-工程列表.jpg new file mode 100644 index 0000000..4625a9b Binary files /dev/null and b/modeler/docs/ui/001-工程管理-tab1-工程列表.jpg differ diff --git a/modeler/docs/ui/001-工程管理-tab2-自定义模版-create.jpg b/modeler/docs/ui/001-工程管理-tab2-自定义模版-create.jpg new file mode 100644 index 0000000..f0107d3 Binary files /dev/null and b/modeler/docs/ui/001-工程管理-tab2-自定义模版-create.jpg differ diff --git a/modeler/docs/ui/001-工程管理-tab2-自定义模版.jpg b/modeler/docs/ui/001-工程管理-tab2-自定义模版.jpg new file mode 100644 index 0000000..e67bbba Binary files /dev/null and b/modeler/docs/ui/001-工程管理-tab2-自定义模版.jpg differ diff --git a/modeler/docs/ui/001-工程管理-工程详情.jpg b/modeler/docs/ui/001-工程管理-工程详情.jpg new file mode 100644 index 0000000..af31c10 Binary files /dev/null and b/modeler/docs/ui/001-工程管理-工程详情.jpg differ diff --git a/modeler/docs/ui/001-工程管理-工程详情2.jpg b/modeler/docs/ui/001-工程管理-工程详情2.jpg new file mode 100644 index 0000000..34f2e08 Binary files /dev/null and b/modeler/docs/ui/001-工程管理-工程详情2.jpg differ diff --git a/modeler/docs/ui/001-工程管理-新建-step1.jpg b/modeler/docs/ui/001-工程管理-新建-step1.jpg new file mode 100644 index 0000000..0b7022f Binary files /dev/null and b/modeler/docs/ui/001-工程管理-新建-step1.jpg differ diff --git a/modeler/docs/ui/001-工程管理-新建-step2.jpg b/modeler/docs/ui/001-工程管理-新建-step2.jpg new file mode 100644 index 0000000..65963ad Binary files /dev/null and b/modeler/docs/ui/001-工程管理-新建-step2.jpg differ diff --git a/modeler/docs/ui/001-工程管理-新建-step3.jpg b/modeler/docs/ui/001-工程管理-新建-step3.jpg new file mode 100644 index 0000000..9251921 Binary files /dev/null and b/modeler/docs/ui/001-工程管理-新建-step3.jpg differ diff --git a/modeler/docs/ui/002-模型构建-002-模型组件设置-tab1.jpg b/modeler/docs/ui/002-模型构建-002-模型组件设置-tab1.jpg new file mode 100644 index 0000000..0c69a97 Binary files /dev/null and b/modeler/docs/ui/002-模型构建-002-模型组件设置-tab1.jpg differ diff --git a/modeler/docs/ui/002-模型构建-002-模型组件设置-tab2.jpg b/modeler/docs/ui/002-模型构建-002-模型组件设置-tab2.jpg new file mode 100644 index 0000000..2f947e9 Binary files /dev/null and b/modeler/docs/ui/002-模型构建-002-模型组件设置-tab2.jpg differ diff --git a/modeler/docs/ui/002-模型构建-002-模型组件设置-tab3.jpg b/modeler/docs/ui/002-模型构建-002-模型组件设置-tab3.jpg new file mode 100644 index 0000000..5626814 Binary files /dev/null and b/modeler/docs/ui/002-模型构建-002-模型组件设置-tab3.jpg differ diff --git a/modeler/docs/ui/003-模型训练-训练任务配置-step0.jpg b/modeler/docs/ui/003-模型训练-训练任务配置-step0.jpg new file mode 100644 index 0000000..f2b1632 Binary files /dev/null and b/modeler/docs/ui/003-模型训练-训练任务配置-step0.jpg differ diff --git a/modeler/docs/ui/003-模型训练-训练任务配置-step1.jpg b/modeler/docs/ui/003-模型训练-训练任务配置-step1.jpg new file mode 100644 index 0000000..12f525d Binary files /dev/null and b/modeler/docs/ui/003-模型训练-训练任务配置-step1.jpg differ diff --git a/modeler/docs/ui/003-模型训练-训练任务配置-step2.jpg b/modeler/docs/ui/003-模型训练-训练任务配置-step2.jpg new file mode 100644 index 0000000..73ee765 Binary files /dev/null and b/modeler/docs/ui/003-模型训练-训练任务配置-step2.jpg differ diff --git a/modeler/docs/ui/003-模型训练-训练任务配置-step3.jpg b/modeler/docs/ui/003-模型训练-训练任务配置-step3.jpg new file mode 100644 index 0000000..afac40d Binary files /dev/null and b/modeler/docs/ui/003-模型训练-训练任务配置-step3.jpg differ diff --git a/modeler/docs/ui/004-模型应用-模型部署与推理.jpg b/modeler/docs/ui/004-模型应用-模型部署与推理.jpg new file mode 100644 index 0000000..9a08c70 Binary files /dev/null and b/modeler/docs/ui/004-模型应用-模型部署与推理.jpg differ diff --git a/modeler/docs/ui/005-模型构建.jpg b/modeler/docs/ui/005-模型构建.jpg new file mode 100644 index 0000000..86c50f2 Binary files /dev/null and b/modeler/docs/ui/005-模型构建.jpg differ diff --git a/modeler/index.html b/modeler/index.html new file mode 100644 index 0000000..8e91f79 --- /dev/null +++ b/modeler/index.html @@ -0,0 +1,13 @@ + + + + + + + 博弈竞赛环境 + + +
+ + + diff --git a/modeler/jsconfig.json b/modeler/jsconfig.json new file mode 100644 index 0000000..dee262d --- /dev/null +++ b/modeler/jsconfig.json @@ -0,0 +1,46 @@ +{ + "compilerOptions": { + "target": "es6", + "baseUrl": ".", + "paths": { + "@/*": [ + "src/*" + ], + "@/views/*": [ + "src/views/*" + ], + "@/components/*": [ + "src/components/*" + ], + "@/assets/*": [ + "src/assets/*" + ], + "@/config/*": [ + "src/config/*" + ], + "@/core/*": [ + "src/core/*" + ], + "@/api/*": [ + "src/api/*" + ], + "@/stores/*": [ + "src/stores/*" + ], + "@/utils/*": [ + "src/utils/*" + ] + } + }, + "exclude": [ + "node_modules", + "dist", + "docs", + "tmp", + "config", + "public" + ], + "include": [ + "src/**/*" + ] +} diff --git a/modeler/mock/behavior.ts b/modeler/mock/behavior.ts new file mode 100644 index 0000000..e3e0ea3 --- /dev/null +++ b/modeler/mock/behavior.ts @@ -0,0 +1,179 @@ +/* + * This file is part of the kernelstudio package. + * + * (c) 2014-2025 zlin + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ +import {MockMethod} from 'vite-plugin-mock'; +import {createResponse} from './core'; + +const statusOption = { + type: 'select', + defaults: 0, + name: 'status', + tips: '状态', + options: [ + { + name: '默认', + value: 'default', + }, + { + name: '运行中', + value: 'running', + color: 'blue', + }, + { + name: '已完成', + value: 'finished', + color: 'teal' + }, + { + name: '错误', + value: 'error', + color: 'red', + }, + ] +} + +const behaviors = [ + { + id: 'behavior_001', + name: '行为树1', + desc: '行为树1说明', + status: null, + options: {}, + // data: [ + // { + // id: '5a0c4b08-0b02-44f3-8918-79c6f9ab22fa', + // type: 'startEvent', + // name: '开始', + // description: '', + // width: 160, + // height: 40, + // position: { + // x: 460, + // y: 120, + // }, + // data: { + // status: 'default', + // } + // }, + // { + // id: 'ec8741db-9580-44ab-8a58-8c731bf1faad', + // type: 'sequenceFlow', + // name: null, + // description: null, + // source: '5a0c4b08-0b02-44f3-8918-79c6f9ab22fa', + // target: '7422aefc-7781-457a-b910-783f73ac0ac5', + // data: { + // status: 'default', + // } + // }, + // { + // id: '7422aefc-7781-457a-b910-783f73ac0ac5', + // type: 'task', + // name: '任务', + // description: '', + // width: 160, + // height: 40, + // position: { + // x: 460, + // y: 120, + // }, + // data: { + // status: 'default', + // } + // }, + // ] + } +] + + +const definitions = [ + { + type: 'sequenceFlow', + label: null, + options: [ + { + type: 'input', + defaults: null, + name: 'label', + } + ] + }, + { + type: 'startEvent', + label: '开始', + desc: '行为树的开始节点,每个行为树仅允许一个开始节点', + options: [ + statusOption + ] + }, + { + type: 'task', + label: '任务节点', + desc: '执行特定任务', + options: [ + statusOption, + { + type: 'number', + defaults: 0, + name: 'counter', + tips: '统计数量' + } + ] + }, + { + type: 'parallelGateway', + label: '并行网关', + desc: '并行执行子节点', + options: [ + statusOption, + { + type: 'number', + defaults: 0, + name: 'counter', + tips: '统计数量' + } + ] + }, + { + type: 'exclusiveGateway', + label: '排他网关', + desc: '选择满足条件的一个子节点执行', + options: [ + statusOption, + { + type: 'number', + defaults: 0, + name: 'counter', + tips: '统计数量' + } + ] + } +] + +export default [ + { + url: '/api/behavior/trees', + method: 'get', + response: () => { + return createResponse(behaviors) + }, + }, + { + url: '/api/behavior/trees', + method: 'post', + response: ({body}) => { + let value = behaviors.filter((b) => b.id == body?.id) + if (value && value.length > 0) { + value[0] = Object.assign(value[0], body) + } else { + behaviors.push(body) + } + return createResponse(behaviors) + }, + }, +] as MockMethod[]; \ No newline at end of file diff --git a/modeler/mock/core.ts b/modeler/mock/core.ts new file mode 100644 index 0000000..0287912 --- /dev/null +++ b/modeler/mock/core.ts @@ -0,0 +1,16 @@ +/* + * This file is part of the kernelstudio package. + * + * (c) 2014-2025 zlin + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +export const createResponse = (result: any,success: boolean = true, message: String = null)=> { + return { + success: success, + message: message, + result: result, + } +} diff --git a/modeler/mock/files.ts b/modeler/mock/files.ts new file mode 100644 index 0000000..e416a8a --- /dev/null +++ b/modeler/mock/files.ts @@ -0,0 +1,61 @@ +/* + * This file is part of the kernelstudio package. + * + * (c) 2014-2025 zlin + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ +import {MockMethod} from 'vite-plugin-mock'; +import {createResponse} from './core'; + +export default [ + { + url: '/api/finder/browser', + method: 'post', + response: () => { + return { + success: true, + message: null, + data: [ + { + name: 'home', + directory: true, + path: '/home', + children: [ + { + name: 'users', + directory: true, + path: '/users', + }, + ] + }, + { + name: 'usr', + directory: true, + path: '/usr', + children: [ + { + name: 'opt', + directory: true, + path: '/opt', + }, + ] + }, + { + name: 'var', + directory: true, + path: '/var', + children: [ + { + name: 'lib', + directory: true, + path: '/lib', + }, + ] + } + ], + } + } + }, +] as MockMethod[]; \ No newline at end of file diff --git a/modeler/mock/samples.ts b/modeler/mock/samples.ts new file mode 100644 index 0000000..32e03ca --- /dev/null +++ b/modeler/mock/samples.ts @@ -0,0 +1,22 @@ +/* + * This file is part of the kernelstudio package. + * + * (c) 2014-2025 zlin + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ +import {MockMethod} from 'vite-plugin-mock'; +import {createResponse} from './core'; + +export default [ + { + url: '/api/samples', + method: 'get', + response: () => { + return createResponse( { + name: 'vben', + }) + }, + }, +] as MockMethod[]; \ No newline at end of file diff --git a/modeler/package-lock.json b/modeler/package-lock.json new file mode 100644 index 0000000..5087bd2 --- /dev/null +++ b/modeler/package-lock.json @@ -0,0 +1,6315 @@ +{ + "name": "modeler", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "modeler", + "version": "0.0.0", + "dependencies": { + "@antv/x6": "^3.1.2", + "@antv/x6-vue-shape": "^3.0.2", + "ant-design-vue": "^4.2.6", + "axios": "^1.13.2", + "echarts": "^6.0.0", + "js-cookie": "^3.0.5", + "pinia": "^3.0.4", + "vue": "^3.5.24", + "vue-draggable-next": "^2.3.0", + "vue-router": "^4.6.4", + "vuedraggable": "^2.24.3" + }, + "devDependencies": { + "@originjs/vite-plugin-commonjs": "^1.0.3", + "@tailwindcss/postcss": "^4.1.18", + "@tailwindcss/vite": "^4.1.18", + "@types/js-cookie": "^3.0.6", + "@types/node": "^24.10.1", + "@vitejs/plugin-vue": "^6.0.3", + "@vitejs/plugin-vue-jsx": "^5.1.2", + "@vue/tsconfig": "^0.8.1", + "autoprefixer": "^10.4.22", + "less": "^4.4.2", + "mockjs": "^1.1.0", + "postcss-selector-parser": "^7.1.1", + "tailwindcss": "^4.1.18", + "typescript": "~5.9.3", + "unplugin-auto-import": "^20.3.0", + "unplugin-vue-components": "^30.0.0", + "vite": "^7.2.4", + "vite-plugin-dts": "^4.5.4", + "vite-plugin-mock": "^3.0.2", + "vitest": "^4.0.15", + "vue-tsc": "^3.1.4" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ant-design/colors": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-6.0.0.tgz", + "integrity": "sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ==", + "license": "MIT", + "dependencies": { + "@ctrl/tinycolor": "^3.4.0" + } + }, + "node_modules/@ant-design/icons-svg": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.4.2.tgz", + "integrity": "sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==", + "license": "MIT" + }, + "node_modules/@ant-design/icons-vue": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@ant-design/icons-vue/-/icons-vue-7.0.1.tgz", + "integrity": "sha512-eCqY2unfZK6Fe02AwFlDHLfoyEFreP6rBwAZMIJ1LugmfMiVgwWDYlp1YsRugaPtICYOabV1iWxXdP12u9U43Q==", + "license": "MIT", + "dependencies": { + "@ant-design/colors": "^6.0.0", + "@ant-design/icons-svg": "^4.2.1" + }, + "peerDependencies": { + "vue": ">=3.0.3" + } + }, + "node_modules/@antv/x6": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@antv/x6/-/x6-3.1.2.tgz", + "integrity": "sha512-EC04kqwrf1AKpP9e5MAMcBErUdrk593zUvJNQHUeOkgQXHa7AEMDd+R4vO48psdrtMn6LC6ojvLfHUZ72yjMkA==", + "license": "MIT", + "dependencies": { + "dom-align": "^1.12.4", + "lodash-es": "^4.17.15", + "mousetrap": "^1.6.5", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@antv/x6-vue-shape": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@antv/x6-vue-shape/-/x6-vue-shape-3.0.2.tgz", + "integrity": "sha512-HWnYFvLCaUD9ernINxTn9vCRj66eG/nXKErSSq0hfI4U1HOitC/1oUrzDdwL/BT80HKAQeSsmy7gpDA/79jYlw==", + "license": "MIT", + "dependencies": { + "vue-demi": "latest" + }, + "peerDependencies": { + "@antv/x6": "^3.x", + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^2.0.0 || >=3.0.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/@antv/x6-vue-shape/node_modules/vue-demi": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", + "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", + "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", + "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", + "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.5.tgz", + "integrity": "sha512-q3WC4JfdODypvxArsJQROfupPBq9+lMwjKq7C33GhbFYJsufD0yd/ziwD+hJucLeWsnFPWZjsU2DNFqBPE7jwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-member-expression-to-functions": "^7.28.5", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.28.5", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz", + "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", + "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.5" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", + "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", + "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.5.tgz", + "integrity": "sha512-x2Qa+v/CuEoX7Dr31iAfr0IhInrVOWZU/2vJMJ00FOR/2nM0BcBEclpaf9sWCDc+v5e9dMrhSH8/atq/kX7+bA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", + "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", + "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.5", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@ctrl/tinycolor": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", + "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", + "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==", + "license": "MIT" + }, + "node_modules/@emotion/unitless": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==", + "license": "MIT" + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@isaacs/balanced-match": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", + "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@isaacs/brace-expansion": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", + "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@isaacs/balanced-match": "^4.0.1" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@microsoft/api-extractor": { + "version": "7.55.2", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.55.2.tgz", + "integrity": "sha512-1jlWO4qmgqYoVUcyh+oXYRztZde/pAi7cSVzBz/rc+S7CoVzDasy8QE13dx6sLG4VRo8SfkkLbFORR6tBw4uGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@microsoft/api-extractor-model": "7.32.2", + "@microsoft/tsdoc": "~0.16.0", + "@microsoft/tsdoc-config": "~0.18.0", + "@rushstack/node-core-library": "5.19.1", + "@rushstack/rig-package": "0.6.0", + "@rushstack/terminal": "0.19.5", + "@rushstack/ts-command-line": "5.1.5", + "diff": "~8.0.2", + "lodash": "~4.17.15", + "minimatch": "10.0.3", + "resolve": "~1.22.1", + "semver": "~7.5.4", + "source-map": "~0.6.1", + "typescript": "5.8.2" + }, + "bin": { + "api-extractor": "bin/api-extractor" + } + }, + "node_modules/@microsoft/api-extractor-model": { + "version": "7.32.2", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.32.2.tgz", + "integrity": "sha512-Ussc25rAalc+4JJs9HNQE7TuO9y6jpYQX9nWD1DhqUzYPBr3Lr7O9intf+ZY8kD5HnIqeIRJX7ccCT0QyBy2Ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@microsoft/tsdoc": "~0.16.0", + "@microsoft/tsdoc-config": "~0.18.0", + "@rushstack/node-core-library": "5.19.1" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/typescript": { + "version": "5.8.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", + "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/@microsoft/tsdoc": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.16.0.tgz", + "integrity": "sha512-xgAyonlVVS+q7Vc7qLW0UrJU7rSFcETRWsqdXZtjzRU8dF+6CkozTK4V4y1LwOX7j8r/vHphjDeMeGI4tNGeGA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@microsoft/tsdoc-config": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.18.0.tgz", + "integrity": "sha512-8N/vClYyfOH+l4fLkkr9+myAoR6M7akc8ntBJ4DJdWH2b09uVfr71+LTMpNyG19fNqWDg8KEDZhx5wxuqHyGjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@microsoft/tsdoc": "0.16.0", + "ajv": "~8.12.0", + "jju": "~1.4.0", + "resolve": "~1.22.2" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@originjs/vite-plugin-commonjs": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@originjs/vite-plugin-commonjs/-/vite-plugin-commonjs-1.0.3.tgz", + "integrity": "sha512-KuEXeGPptM2lyxdIEJ4R11+5ztipHoE7hy8ClZt3PYaOVQ/pyngd2alaSrPnwyFeOW1UagRBaQ752aA1dTMdOQ==", + "dev": true, + "license": "MulanPSL2", + "dependencies": { + "esbuild": "^0.14.14" + } + }, + "node_modules/@originjs/vite-plugin-commonjs/node_modules/@esbuild/linux-loong64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz", + "integrity": "sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@originjs/vite-plugin-commonjs/node_modules/esbuild": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.54.tgz", + "integrity": "sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/linux-loong64": "0.14.54", + "esbuild-android-64": "0.14.54", + "esbuild-android-arm64": "0.14.54", + "esbuild-darwin-64": "0.14.54", + "esbuild-darwin-arm64": "0.14.54", + "esbuild-freebsd-64": "0.14.54", + "esbuild-freebsd-arm64": "0.14.54", + "esbuild-linux-32": "0.14.54", + "esbuild-linux-64": "0.14.54", + "esbuild-linux-arm": "0.14.54", + "esbuild-linux-arm64": "0.14.54", + "esbuild-linux-mips64le": "0.14.54", + "esbuild-linux-ppc64le": "0.14.54", + "esbuild-linux-riscv64": "0.14.54", + "esbuild-linux-s390x": "0.14.54", + "esbuild-netbsd-64": "0.14.54", + "esbuild-openbsd-64": "0.14.54", + "esbuild-sunos-64": "0.14.54", + "esbuild-windows-32": "0.14.54", + "esbuild-windows-64": "0.14.54", + "esbuild-windows-arm64": "0.14.54" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.53", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.53.tgz", + "integrity": "sha512-vENRlFU4YbrwVqNDZ7fLvy+JR1CRkyr01jhSiDpE1u6py3OMzQfztQU2jxykW3ALNxO4kSlqIDeYyD0Y9RcQeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/pluginutils": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", + "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.53.3.tgz", + "integrity": "sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.53.3.tgz", + "integrity": "sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.53.3.tgz", + "integrity": "sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.53.3.tgz", + "integrity": "sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.53.3.tgz", + "integrity": "sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.53.3.tgz", + "integrity": "sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.53.3.tgz", + "integrity": "sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.53.3.tgz", + "integrity": "sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.53.3.tgz", + "integrity": "sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.53.3.tgz", + "integrity": "sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.53.3.tgz", + "integrity": "sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.53.3.tgz", + "integrity": "sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.53.3.tgz", + "integrity": "sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.53.3.tgz", + "integrity": "sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.53.3.tgz", + "integrity": "sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.53.3.tgz", + "integrity": "sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.53.3.tgz", + "integrity": "sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.53.3.tgz", + "integrity": "sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.53.3.tgz", + "integrity": "sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.53.3.tgz", + "integrity": "sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.53.3.tgz", + "integrity": "sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.53.3.tgz", + "integrity": "sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rushstack/node-core-library": { + "version": "5.19.1", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-5.19.1.tgz", + "integrity": "sha512-ESpb2Tajlatgbmzzukg6zyAhH+sICqJR2CNXNhXcEbz6UGCQfrKCtkxOpJTftWc8RGouroHG0Nud1SJAszvpmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "~8.13.0", + "ajv-draft-04": "~1.0.0", + "ajv-formats": "~3.0.1", + "fs-extra": "~11.3.0", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.22.1", + "semver": "~7.5.4" + }, + "peerDependencies": { + "@types/node": "*" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@rushstack/node-core-library/node_modules/ajv": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", + "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.4.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@rushstack/node-core-library/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@rushstack/node-core-library/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@rushstack/node-core-library/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/@rushstack/problem-matcher": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@rushstack/problem-matcher/-/problem-matcher-0.1.1.tgz", + "integrity": "sha512-Fm5XtS7+G8HLcJHCWpES5VmeMyjAKaWeyZU5qPzZC+22mPlJzAsOxymHiWIfuirtPckX3aptWws+K2d0BzniJA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/node": "*" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@rushstack/rig-package": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.6.0.tgz", + "integrity": "sha512-ZQmfzsLE2+Y91GF15c65L/slMRVhF6Hycq04D4TwtdGaUAbIXXg9c5pKA5KFU7M4QMaihoobp9JJYpYcaY3zOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve": "~1.22.1", + "strip-json-comments": "~3.1.1" + } + }, + "node_modules/@rushstack/terminal": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.19.5.tgz", + "integrity": "sha512-6k5tpdB88G0K7QrH/3yfKO84HK9ggftfUZ51p7fePyCE7+RLLHkWZbID9OFWbXuna+eeCFE7AkKnRMHMxNbz7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rushstack/node-core-library": "5.19.1", + "@rushstack/problem-matcher": "0.1.1", + "supports-color": "~8.1.1" + }, + "peerDependencies": { + "@types/node": "*" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@rushstack/ts-command-line": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-5.1.5.tgz", + "integrity": "sha512-YmrFTFUdHXblYSa+Xc9OO9FsL/XFcckZy0ycQ6q7VSBsVs5P0uD9vcges5Q9vctGlVdu27w+Ct6IuJ458V0cTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rushstack/terminal": "0.19.5", + "@types/argparse": "1.0.38", + "argparse": "~1.0.9", + "string-argv": "~0.3.1" + } + }, + "node_modules/@simonwep/pickr": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@simonwep/pickr/-/pickr-1.8.2.tgz", + "integrity": "sha512-/l5w8BIkrpP6n1xsetx9MWPWlU6OblN5YgZZphxan0Tq4BByTCETL6lyIeY8lagalS2Nbt4F2W034KHLIiunKA==", + "license": "MIT", + "dependencies": { + "core-js": "^3.15.1", + "nanopop": "^2.1.0" + } + }, + "node_modules/@standard-schema/spec": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz", + "integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tailwindcss/node": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.18.tgz", + "integrity": "sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.4", + "enhanced-resolve": "^5.18.3", + "jiti": "^2.6.1", + "lightningcss": "1.30.2", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.1.18" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.18.tgz", + "integrity": "sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.1.18", + "@tailwindcss/oxide-darwin-arm64": "4.1.18", + "@tailwindcss/oxide-darwin-x64": "4.1.18", + "@tailwindcss/oxide-freebsd-x64": "4.1.18", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.18", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.18", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.18", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.18", + "@tailwindcss/oxide-linux-x64-musl": "4.1.18", + "@tailwindcss/oxide-wasm32-wasi": "4.1.18", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.18", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.18" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.18.tgz", + "integrity": "sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.18.tgz", + "integrity": "sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.18.tgz", + "integrity": "sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.18.tgz", + "integrity": "sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.18.tgz", + "integrity": "sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.18.tgz", + "integrity": "sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.18.tgz", + "integrity": "sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.18.tgz", + "integrity": "sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.18.tgz", + "integrity": "sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.18.tgz", + "integrity": "sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.1.0", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.18.tgz", + "integrity": "sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.18.tgz", + "integrity": "sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/postcss": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.18.tgz", + "integrity": "sha512-Ce0GFnzAOuPyfV5SxjXGn0CubwGcuDB0zcdaPuCSzAa/2vII24JTkH+I6jcbXLb1ctjZMZZI6OjDaLPJQL1S0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "@tailwindcss/node": "4.1.18", + "@tailwindcss/oxide": "4.1.18", + "postcss": "^8.4.41", + "tailwindcss": "4.1.18" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.1.18.tgz", + "integrity": "sha512-jVA+/UpKL1vRLg6Hkao5jldawNmRo7mQYrZtNHMIVpLfLhDml5nMRUo/8MwoX2vNXvnaXNNMedrMfMugAVX1nA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.1.18", + "@tailwindcss/oxide": "4.1.18", + "tailwindcss": "4.1.18" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7" + } + }, + "node_modules/@types/argparse": { + "version": "1.0.38", + "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz", + "integrity": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/chai": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" + } + }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/js-cookie": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-3.0.6.tgz", + "integrity": "sha512-wkw9yd1kEXOPnvEeEV1Go1MmxtBJL0RR79aOTAApecWFVu7w0NNXNqhcWgvw2YgZDYadliXkl14pa3WXw5jlCQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "24.10.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.3.tgz", + "integrity": "sha512-gqkrWUsS8hcm0r44yn7/xZeV1ERva/nLgrLxFRUGb7aoNMIJfZJ3AC261zDQuOAKC7MiXai1WCpYc48jAHoShQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@vitejs/plugin-vue": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.3.tgz", + "integrity": "sha512-TlGPkLFLVOY3T7fZrwdvKpjprR3s4fxRln0ORDo1VQ7HHyxJwTlrjKU3kpVWTlaAjIEuCTokmjkZnr8Tpc925w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "1.0.0-beta.53" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0", + "vue": "^3.2.25" + } + }, + "node_modules/@vitejs/plugin-vue-jsx": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue-jsx/-/plugin-vue-jsx-5.1.2.tgz", + "integrity": "sha512-3a2BOryRjG/Iih87x87YXz5c8nw27eSlHytvSKYfp8ZIsp5+FgFQoKeA7k2PnqWpjJrv6AoVTMnvmuKUXb771A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.5", + "@babel/plugin-syntax-typescript": "^7.27.1", + "@babel/plugin-transform-typescript": "^7.28.5", + "@rolldown/pluginutils": "^1.0.0-beta.50", + "@vue/babel-plugin-jsx": "^2.0.1" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0", + "vue": "^3.0.0" + } + }, + "node_modules/@vitest/expect": { + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.15.tgz", + "integrity": "sha512-Gfyva9/GxPAWXIWjyGDli9O+waHDC0Q0jaLdFP1qPAUUfo1FEXPXUfUkp3eZA0sSq340vPycSyOlYUeM15Ft1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.0.15", + "@vitest/utils": "4.0.15", + "chai": "^6.2.1", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.15.tgz", + "integrity": "sha512-CZ28GLfOEIFkvCFngN8Sfx5h+Se0zN+h4B7yOsPVCcgtiO7t5jt9xQh2E1UkFep+eb9fjyMfuC5gBypwb07fvQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.0.15", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/mocker/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/@vitest/pretty-format": { + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.15.tgz", + "integrity": "sha512-SWdqR8vEv83WtZcrfLNqlqeQXlQLh2iilO1Wk1gv4eiHKjEzvgHb2OVc3mIPyhZE6F+CtfYjNlDJwP5MN6Km7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.15.tgz", + "integrity": "sha512-+A+yMY8dGixUhHmNdPUxOh0la6uVzun86vAbuMT3hIDxMrAOmn5ILBHm8ajrqHE0t8R9T1dGnde1A5DTnmi3qw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "4.0.15", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.15.tgz", + "integrity": "sha512-A7Ob8EdFZJIBjLjeO0DZF4lqR6U7Ydi5/5LIZ0xcI+23lYlsYJAfGn8PrIWTYdZQRNnSRlzhg0zyGu37mVdy5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.15", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.15.tgz", + "integrity": "sha512-+EIjOJmnY6mIfdXtE/bnozKEvTC4Uczg19yeZ2vtCz5Yyb0QQ31QWVQ8hswJ3Ysx/K2EqaNsVanjr//2+P3FHw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.15.tgz", + "integrity": "sha512-HXjPW2w5dxhTD0dLwtYHDnelK3j8sR8cWIaLxr22evTyY6q8pRCjZSmhRWVjBaOVXChQd6AwMzi9pucorXCPZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.15", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@volar/language-core": { + "version": "2.4.26", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.26.tgz", + "integrity": "sha512-hH0SMitMxnB43OZpyF1IFPS9bgb2I3bpCh76m2WEK7BE0A0EzpYsRp0CCH2xNKshr7kacU5TQBLYn4zj7CG60A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/source-map": "2.4.26" + } + }, + "node_modules/@volar/source-map": { + "version": "2.4.26", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.26.tgz", + "integrity": "sha512-JJw0Tt/kSFsIRmgTQF4JSt81AUSI1aEye5Zl65EeZ8H35JHnTvFGmpDOBn5iOxd48fyGE+ZvZBp5FcgAy/1Qhw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@volar/typescript": { + "version": "2.4.26", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.26.tgz", + "integrity": "sha512-N87ecLD48Sp6zV9zID/5yuS1+5foj0DfuYGdQ6KHj/IbKvyKv1zNX6VCmnKYwtmHadEO6mFc2EKISiu3RDPAvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.26", + "path-browserify": "^1.0.1", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@vue/babel-helper-vue-transform-on": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-2.0.1.tgz", + "integrity": "sha512-uZ66EaFbnnZSYqYEyplWvn46GhZ1KuYSThdT68p+am7MgBNbQ3hphTL9L+xSIsWkdktwhPYLwPgVWqo96jDdRA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vue/babel-plugin-jsx": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-2.0.1.tgz", + "integrity": "sha512-a8CaLQjD/s4PVdhrLD/zT574ZNPnZBOY+IhdtKWRB4HRZ0I2tXBi5ne7d9eCfaYwp5gU5+4KIyFTV1W1YL9xZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.4", + "@babel/types": "^7.28.4", + "@vue/babel-helper-vue-transform-on": "2.0.1", + "@vue/babel-plugin-resolve-type": "2.0.1", + "@vue/shared": "^3.5.22" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + } + } + }, + "node_modules/@vue/babel-plugin-resolve-type": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-resolve-type/-/babel-plugin-resolve-type-2.0.1.tgz", + "integrity": "sha512-ybwgIuRGRRBhOU37GImDoWQoz+TlSqap65qVI6iwg/J7FfLTLmMf97TS7xQH9I7Qtr/gp161kYVdhr1ZMraSYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/parser": "^7.28.4", + "@vue/compiler-sfc": "^3.5.22" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.25", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.25.tgz", + "integrity": "sha512-vay5/oQJdsNHmliWoZfHPoVZZRmnSWhug0BYT34njkYTPqClh3DNWLkZNJBVSjsNMrg0CCrBfoKkjZQPM/QVUw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "@vue/shared": "3.5.25", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.25", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.25.tgz", + "integrity": "sha512-4We0OAcMZsKgYoGlMjzYvaoErltdFI2/25wqanuTu+S4gismOTRTBPi4IASOjxWdzIwrYSjnqONfKvuqkXzE2Q==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.25", + "@vue/shared": "3.5.25" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.25", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.25.tgz", + "integrity": "sha512-PUgKp2rn8fFsI++lF2sO7gwO2d9Yj57Utr5yEsDf3GNaQcowCLKL7sf+LvVFvtJDXUp/03+dC6f2+LCv5aK1ag==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "@vue/compiler-core": "3.5.25", + "@vue/compiler-dom": "3.5.25", + "@vue/compiler-ssr": "3.5.25", + "@vue/shared": "3.5.25", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.6", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.25", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.25.tgz", + "integrity": "sha512-ritPSKLBcParnsKYi+GNtbdbrIE1mtuFEJ4U1sWeuOMlIziK5GtOL85t5RhsNy4uWIXPgk+OUdpnXiTdzn8o3A==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.25", + "@vue/shared": "3.5.25" + } + }, + "node_modules/@vue/compiler-vue2": { + "version": "2.7.16", + "resolved": "https://registry.npmjs.org/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz", + "integrity": "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==", + "dev": true, + "license": "MIT", + "dependencies": { + "de-indent": "^1.0.2", + "he": "^1.2.0" + } + }, + "node_modules/@vue/devtools-api": { + "version": "7.7.9", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.7.9.tgz", + "integrity": "sha512-kIE8wvwlcZ6TJTbNeU2HQNtaxLx3a84aotTITUuL/4bzfPxzajGBOoqjMhwZJ8L9qFYDU/lAYMEEm11dnZOD6g==", + "license": "MIT", + "dependencies": { + "@vue/devtools-kit": "^7.7.9" + } + }, + "node_modules/@vue/devtools-kit": { + "version": "7.7.9", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.7.9.tgz", + "integrity": "sha512-PyQ6odHSgiDVd4hnTP+aDk2X4gl2HmLDfiyEnn3/oV+ckFDuswRs4IbBT7vacMuGdwY/XemxBoh302ctbsptuA==", + "license": "MIT", + "dependencies": { + "@vue/devtools-shared": "^7.7.9", + "birpc": "^2.3.0", + "hookable": "^5.5.3", + "mitt": "^3.0.1", + "perfect-debounce": "^1.0.0", + "speakingurl": "^14.0.1", + "superjson": "^2.2.2" + } + }, + "node_modules/@vue/devtools-shared": { + "version": "7.7.9", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.7.9.tgz", + "integrity": "sha512-iWAb0v2WYf0QWmxCGy0seZNDPdO3Sp5+u78ORnyeonS6MT4PC7VPrryX2BpMJrwlDeaZ6BD4vP4XKjK0SZqaeA==", + "license": "MIT", + "dependencies": { + "rfdc": "^1.4.1" + } + }, + "node_modules/@vue/language-core": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-3.1.8.tgz", + "integrity": "sha512-PfwAW7BLopqaJbneChNL6cUOTL3GL+0l8paYP5shhgY5toBNidWnMXWM+qDwL7MC9+zDtzCF2enT8r6VPu64iw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.26", + "@vue/compiler-dom": "^3.5.0", + "@vue/shared": "^3.5.0", + "alien-signals": "^3.0.0", + "muggle-string": "^0.4.1", + "path-browserify": "^1.0.1", + "picomatch": "^4.0.2" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.25", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.25.tgz", + "integrity": "sha512-5xfAypCQepv4Jog1U4zn8cZIcbKKFka3AgWHEFQeK65OW+Ys4XybP6z2kKgws4YB43KGpqp5D/K3go2UPPunLA==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.25" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.25", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.25.tgz", + "integrity": "sha512-Z751v203YWwYzy460bzsYQISDfPjHTl+6Zzwo/a3CsAf+0ccEjQ8c+0CdX1WsumRTHeywvyUFtW6KvNukT/smA==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.25", + "@vue/shared": "3.5.25" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.25", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.25.tgz", + "integrity": "sha512-a4WrkYFbb19i9pjkz38zJBg8wa/rboNERq3+hRRb0dHiJh13c+6kAbgqCPfMaJ2gg4weWD3APZswASOfmKwamA==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.25", + "@vue/runtime-core": "3.5.25", + "@vue/shared": "3.5.25", + "csstype": "^3.1.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.25", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.25.tgz", + "integrity": "sha512-UJaXR54vMG61i8XNIzTSf2Q7MOqZHpp8+x3XLGtE3+fL+nQd+k7O5+X3D/uWrnQXOdMw5VPih+Uremcw+u1woQ==", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.25", + "@vue/shared": "3.5.25" + }, + "peerDependencies": { + "vue": "3.5.25" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.25", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.25.tgz", + "integrity": "sha512-AbOPdQQnAnzs58H2FrrDxYj/TJfmeS2jdfEEhgiKINy+bnOANmVizIEgq1r+C5zsbs6l1CCQxtcj71rwNQ4jWg==", + "license": "MIT" + }, + "node_modules/@vue/tsconfig": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@vue/tsconfig/-/tsconfig-0.8.1.tgz", + "integrity": "sha512-aK7feIWPXFSUhsCP9PFqPyFOcz4ENkb8hZ2pneL6m2UjCkccvaOhC/5KCKluuBufvp2KzkbdA2W2pk20vLzu3g==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "typescript": "5.x", + "vue": "^3.4.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "vue": { + "optional": true + } + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-draft-04": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", + "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^8.5.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/alien-signals": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-3.1.1.tgz", + "integrity": "sha512-ogkIWbVrLwKtHY6oOAXaYkAxP+cTH7V5FZ5+Tm4NZFd8VDZ6uNMDrfzqctTZ42eTMCSR3ne3otpcxmqSnFfPYA==", + "dev": true, + "license": "MIT" + }, + "node_modules/ant-design-vue": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/ant-design-vue/-/ant-design-vue-4.2.6.tgz", + "integrity": "sha512-t7eX13Yj3i9+i5g9lqFyYneoIb3OzTvQjq9Tts1i+eiOd3Eva/6GagxBSXM1fOCjqemIu0FYVE1ByZ/38epR3Q==", + "license": "MIT", + "dependencies": { + "@ant-design/colors": "^6.0.0", + "@ant-design/icons-vue": "^7.0.0", + "@babel/runtime": "^7.10.5", + "@ctrl/tinycolor": "^3.5.0", + "@emotion/hash": "^0.9.0", + "@emotion/unitless": "^0.8.0", + "@simonwep/pickr": "~1.8.0", + "array-tree-filter": "^2.1.0", + "async-validator": "^4.0.0", + "csstype": "^3.1.1", + "dayjs": "^1.10.5", + "dom-align": "^1.12.1", + "dom-scroll-into-view": "^2.0.0", + "lodash": "^4.17.21", + "lodash-es": "^4.17.15", + "resize-observer-polyfill": "^1.5.1", + "scroll-into-view-if-needed": "^2.2.25", + "shallow-equal": "^1.0.0", + "stylis": "^4.1.3", + "throttle-debounce": "^5.0.0", + "vue-types": "^3.0.0", + "warning": "^4.0.0" + }, + "engines": { + "node": ">=12.22.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ant-design-vue" + }, + "peerDependencies": { + "vue": ">=3.2.0" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-tree-filter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-tree-filter/-/array-tree-filter-2.1.0.tgz", + "integrity": "sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==", + "license": "MIT" + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/async-validator": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz", + "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==", + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/autoprefixer": { + "version": "10.4.22", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.22.tgz", + "integrity": "sha512-ARe0v/t9gO28Bznv6GgqARmVqcWOV3mfgUPn9becPHMiD3o9BwlRgaeccZnwTpZ7Zwqrm+c1sUSsMxIzQzc8Xg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.27.0", + "caniuse-lite": "^1.0.30001754", + "fraction.js": "^5.3.4", + "normalize-range": "^0.1.2", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/axios": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", + "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.4", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.9.6", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.6.tgz", + "integrity": "sha512-v9BVVpOTLB59C9E7aSnmIF8h7qRsFpx+A2nugVMTszEOMcfjlZMsXRm4LF23I3Z9AJxc8ANpIvzbzONoX9VJlg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/birpc": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.9.0.tgz", + "integrity": "sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bundle-require": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-4.2.1.tgz", + "integrity": "sha512-7Q/6vkyYAwOmQNRw75x+4yRtZCZJXUDmHHlFdkiV0wgv/reNjtJwpu1jPJ0w2kbEpIM0uoKI3S4/f39dU7AjSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "load-tsconfig": "^0.2.3" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "peerDependencies": { + "esbuild": ">=0.17" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001760", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001760.tgz", + "integrity": "sha512-7AAMPcueWELt1p3mi13HR/LHH0TJLT11cnwDJEs3xA4+CK/PLKeO9Kl1oru24htkyUKtkGCvAx4ohB0Ttry8Dw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chai": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.1.tgz", + "integrity": "sha512-p4Z49OGG5W/WBCPSS/dH3jQ73kD6tiMmUM+bckNK6Jr5JHMG3k9bg/BvKR8lKmtVBKmOiuVaV2ws8s9oSbwysg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.2.tgz", + "integrity": "sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/compare-versions": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.1.tgz", + "integrity": "sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==", + "dev": true, + "license": "MIT" + }, + "node_modules/compute-scroll-into-view": { + "version": "1.0.20", + "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz", + "integrity": "sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==", + "license": "MIT" + }, + "node_modules/confbox": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.2.tgz", + "integrity": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/connect/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/connect/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/copy-anything": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-4.0.5.tgz", + "integrity": "sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==", + "license": "MIT", + "dependencies": { + "is-what": "^5.2.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/core-js": { + "version": "3.47.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.47.0.tgz", + "integrity": "sha512-c3Q2VVkGAUyupsjRnaNX6u8Dq2vAdzm9iuPj5FW0fRxzlxgq9Q39MDq10IvmQSpLgHQNyQzQmOo6bgGHmH3NNg==", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/dayjs": { + "version": "1.11.19", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.19.tgz", + "integrity": "sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==", + "license": "MIT" + }, + "node_modules/de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/diff": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.2.tgz", + "integrity": "sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dom-align": { + "version": "1.12.4", + "resolved": "https://registry.npmjs.org/dom-align/-/dom-align-1.12.4.tgz", + "integrity": "sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw==", + "license": "MIT" + }, + "node_modules/dom-scroll-into-view": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/dom-scroll-into-view/-/dom-scroll-into-view-2.0.1.tgz", + "integrity": "sha512-bvVTQe1lfaUr1oFzZX80ce9KLDlZ3iU+XGNE/bz9HnGdklTieqsbmsLHe+rT2XWqopvL0PckkYqN7ksmm5pe3w==", + "license": "MIT" + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/echarts": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/echarts/-/echarts-6.0.0.tgz", + "integrity": "sha512-Tte/grDQRiETQP4xz3iZWSvoHrkCQtwqd6hs+mifXcjrCuo2iKWbajFObuLJVBlDIJlOzgQPd1hsaKt/3+OMkQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "2.3.0", + "zrender": "6.0.0" + } + }, + "node_modules/echarts/node_modules/tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", + "license": "0BSD" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.267", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", + "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==", + "dev": true, + "license": "ISC" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.18.4", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.4.tgz", + "integrity": "sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "node_modules/esbuild-android-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz", + "integrity": "sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-android-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz", + "integrity": "sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-darwin-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz", + "integrity": "sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-darwin-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz", + "integrity": "sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz", + "integrity": "sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz", + "integrity": "sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-32": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz", + "integrity": "sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz", + "integrity": "sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz", + "integrity": "sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz", + "integrity": "sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-mips64le": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz", + "integrity": "sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-ppc64le": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz", + "integrity": "sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-riscv64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz", + "integrity": "sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-s390x": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz", + "integrity": "sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-netbsd-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz", + "integrity": "sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-openbsd-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz", + "integrity": "sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-sunos-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz", + "integrity": "sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-32": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz", + "integrity": "sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz", + "integrity": "sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz", + "integrity": "sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/expect-type": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", + "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/exsolve": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.8.tgz", + "integrity": "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fraction.js": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fs-extra": { + "version": "11.3.2", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz", + "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "license": "MIT" + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", + "dev": true, + "license": "MIT", + "optional": true, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/import-lazy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-object": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-3.0.1.tgz", + "integrity": "sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-what": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-5.5.0.tgz", + "integrity": "sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/jju": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", + "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-cookie": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz", + "integrity": "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/kolorist": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", + "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/less": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/less/-/less-4.4.2.tgz", + "integrity": "sha512-j1n1IuTX1VQjIy3tT7cyGbX7nvQOsFLoIqobZv4ttI5axP923gA44zUj6miiA6R5Aoms4sEGVIIcucXUbRI14g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "copy-anything": "^2.0.1", + "parse-node-version": "^1.0.1", + "tslib": "^2.3.0" + }, + "bin": { + "lessc": "bin/lessc" + }, + "engines": { + "node": ">=14" + }, + "optionalDependencies": { + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "make-dir": "^2.1.0", + "mime": "^1.4.1", + "needle": "^3.1.0", + "source-map": "~0.6.0" + } + }, + "node_modules/less/node_modules/copy-anything": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", + "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-what": "^3.14.1" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/less/node_modules/is-what": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", + "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", + "dev": true, + "license": "MIT" + }, + "node_modules/lightningcss": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.2.tgz", + "integrity": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.30.2", + "lightningcss-darwin-arm64": "1.30.2", + "lightningcss-darwin-x64": "1.30.2", + "lightningcss-freebsd-x64": "1.30.2", + "lightningcss-linux-arm-gnueabihf": "1.30.2", + "lightningcss-linux-arm64-gnu": "1.30.2", + "lightningcss-linux-arm64-musl": "1.30.2", + "lightningcss-linux-x64-gnu": "1.30.2", + "lightningcss-linux-x64-musl": "1.30.2", + "lightningcss-win32-arm64-msvc": "1.30.2", + "lightningcss-win32-x64-msvc": "1.30.2" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz", + "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz", + "integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz", + "integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz", + "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz", + "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz", + "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz", + "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz", + "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz", + "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz", + "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz", + "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/load-tsconfig": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz", + "integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/local-pkg": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.1.2.tgz", + "integrity": "sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "mlly": "^1.7.4", + "pkg-types": "^2.3.0", + "quansync": "^0.2.11" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "license": "MIT", + "optional": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz", + "integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==", + "dev": true, + "license": "ISC", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "license": "MIT" + }, + "node_modules/mlly": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.0.tgz", + "integrity": "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.15.0", + "pathe": "^2.0.3", + "pkg-types": "^1.3.1", + "ufo": "^1.6.1" + } + }, + "node_modules/mlly/node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/mlly/node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, + "node_modules/mockjs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mockjs/-/mockjs-1.1.0.tgz", + "integrity": "sha512-eQsKcWzIaZzEZ07NuEyO4Nw65g0hdWAyurVol1IPl1gahRwY+svqzfgfey8U8dahLwG44d6/RwEzuK52rSa/JQ==", + "dev": true, + "dependencies": { + "commander": "*" + }, + "bin": { + "random": "bin/random" + } + }, + "node_modules/mousetrap": { + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/mousetrap/-/mousetrap-1.6.5.tgz", + "integrity": "sha512-QNo4kEepaIBwiT8CDhP98umTetp+JNfQYBWvC1pc6/OAibuXtRcxZ58Qz8skvEHYvURne/7R8T5VoOI7rDsEUA==", + "license": "Apache-2.0 WITH LLVM-exception" + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/muggle-string": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", + "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/nanopop": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/nanopop/-/nanopop-2.4.2.tgz", + "integrity": "sha512-NzOgmMQ+elxxHeIha+OG/Pv3Oc3p4RU2aBhwWwAqDpXrdTbtRylbRLQztLy8dMMwfl6pclznBdfUhccEn9ZIzw==", + "license": "MIT" + }, + "node_modules/needle": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/needle/-/needle-3.3.1.tgz", + "integrity": "sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.3", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" + } + }, + "node_modules/node-releases": { + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/obug": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", + "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", + "dev": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT" + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dev": true, + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-to-regexp": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pinia": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pinia/-/pinia-3.0.4.tgz", + "integrity": "sha512-l7pqLUFTI/+ESXn6k3nu30ZIzW5E2WZF/LaHJEpoq6ElcLD+wduZoB2kBN19du6K/4FDpPMazY2wJr+IndBtQw==", + "license": "MIT", + "dependencies": { + "@vue/devtools-api": "^7.7.7" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "typescript": ">=4.5.0", + "vue": "^3.5.11" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/pkg-types": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz", + "integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.2.2", + "exsolve": "^1.0.7", + "pathe": "^2.0.3" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/quansync": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz", + "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==", + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "license": "MIT" + }, + "node_modules/rollup": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.53.3.tgz", + "integrity": "sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.53.3", + "@rollup/rollup-android-arm64": "4.53.3", + "@rollup/rollup-darwin-arm64": "4.53.3", + "@rollup/rollup-darwin-x64": "4.53.3", + "@rollup/rollup-freebsd-arm64": "4.53.3", + "@rollup/rollup-freebsd-x64": "4.53.3", + "@rollup/rollup-linux-arm-gnueabihf": "4.53.3", + "@rollup/rollup-linux-arm-musleabihf": "4.53.3", + "@rollup/rollup-linux-arm64-gnu": "4.53.3", + "@rollup/rollup-linux-arm64-musl": "4.53.3", + "@rollup/rollup-linux-loong64-gnu": "4.53.3", + "@rollup/rollup-linux-ppc64-gnu": "4.53.3", + "@rollup/rollup-linux-riscv64-gnu": "4.53.3", + "@rollup/rollup-linux-riscv64-musl": "4.53.3", + "@rollup/rollup-linux-s390x-gnu": "4.53.3", + "@rollup/rollup-linux-x64-gnu": "4.53.3", + "@rollup/rollup-linux-x64-musl": "4.53.3", + "@rollup/rollup-openharmony-arm64": "4.53.3", + "@rollup/rollup-win32-arm64-msvc": "4.53.3", + "@rollup/rollup-win32-ia32-msvc": "4.53.3", + "@rollup/rollup-win32-x64-gnu": "4.53.3", + "@rollup/rollup-win32-x64-msvc": "4.53.3", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/sax": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.3.tgz", + "integrity": "sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ==", + "dev": true, + "license": "BlueOak-1.0.0", + "optional": true + }, + "node_modules/scroll-into-view-if-needed": { + "version": "2.2.31", + "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.31.tgz", + "integrity": "sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==", + "license": "MIT", + "dependencies": { + "compute-scroll-into-view": "^1.0.20" + } + }, + "node_modules/scule": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/scule/-/scule-1.3.0.tgz", + "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==", + "dev": true, + "license": "MIT" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/shallow-equal": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/shallow-equal/-/shallow-equal-1.2.1.tgz", + "integrity": "sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==", + "license": "MIT" + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, + "node_modules/sortablejs": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.15.6.tgz", + "integrity": "sha512-aNfiuwMEpfBM/CN6LY0ibyhxPfPbyFeBTYJKCvzkJ2GkUpazIt3H+QIPAMHwqQ7tMKaHz1Qj+rJJCqljnf4p3A==", + "license": "MIT", + "peer": true + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/speakingurl": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", + "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/std-env": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", + "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-literal": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.1.0.tgz", + "integrity": "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^9.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/strip-literal/node_modules/js-tokens": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", + "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/stylis": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.6.tgz", + "integrity": "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==", + "license": "MIT" + }, + "node_modules/superjson": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.6.tgz", + "integrity": "sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==", + "license": "MIT", + "dependencies": { + "copy-anything": "^4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwindcss": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.18.tgz", + "integrity": "sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/throttle-debounce": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-5.0.2.tgz", + "integrity": "sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==", + "license": "MIT", + "engines": { + "node": ">=12.22" + } + }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyrainbow": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", + "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ufo": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz", + "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "dev": true, + "license": "MIT" + }, + "node_modules/unimport": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/unimport/-/unimport-5.5.0.tgz", + "integrity": "sha512-/JpWMG9s1nBSlXJAQ8EREFTFy3oy6USFd8T6AoBaw1q2GGcF4R9yp3ofg32UODZlYEO5VD0EWE1RpI9XDWyPYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.15.0", + "escape-string-regexp": "^5.0.0", + "estree-walker": "^3.0.3", + "local-pkg": "^1.1.2", + "magic-string": "^0.30.19", + "mlly": "^1.8.0", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "pkg-types": "^2.3.0", + "scule": "^1.3.0", + "strip-literal": "^3.1.0", + "tinyglobby": "^0.2.15", + "unplugin": "^2.3.10", + "unplugin-utils": "^0.3.0" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/unimport/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unplugin": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.3.11.tgz", + "integrity": "sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "acorn": "^8.15.0", + "picomatch": "^4.0.3", + "webpack-virtual-modules": "^0.6.2" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/unplugin-auto-import": { + "version": "20.3.0", + "resolved": "https://registry.npmjs.org/unplugin-auto-import/-/unplugin-auto-import-20.3.0.tgz", + "integrity": "sha512-RcSEQiVv7g0mLMMXibYVKk8mpteKxvyffGuDKqZZiFr7Oq3PB1HwgHdK5O7H4AzbhzHoVKG0NnMnsk/1HIVYzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "local-pkg": "^1.1.2", + "magic-string": "^0.30.21", + "picomatch": "^4.0.3", + "unimport": "^5.5.0", + "unplugin": "^2.3.11", + "unplugin-utils": "^0.3.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@nuxt/kit": "^4.0.0", + "@vueuse/core": "*" + }, + "peerDependenciesMeta": { + "@nuxt/kit": { + "optional": true + }, + "@vueuse/core": { + "optional": true + } + } + }, + "node_modules/unplugin-utils": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/unplugin-utils/-/unplugin-utils-0.3.1.tgz", + "integrity": "sha512-5lWVjgi6vuHhJ526bI4nlCOmkCIF3nnfXkCMDeMJrtdvxTs6ZFCM8oNufGTsDbKv/tJ/xj8RpvXjRuPBZJuJog==", + "dev": true, + "license": "MIT", + "dependencies": { + "pathe": "^2.0.3", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/unplugin-vue-components": { + "version": "30.0.0", + "resolved": "https://registry.npmjs.org/unplugin-vue-components/-/unplugin-vue-components-30.0.0.tgz", + "integrity": "sha512-4qVE/lwCgmdPTp6h0qsRN2u642tt4boBQtcpn4wQcWZAsr8TQwq+SPT3NDu/6kBFxzo/sSEK4ioXhOOBrXc3iw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^4.0.3", + "debug": "^4.4.3", + "local-pkg": "^1.1.2", + "magic-string": "^0.30.19", + "mlly": "^1.8.0", + "tinyglobby": "^0.2.15", + "unplugin": "^2.3.10", + "unplugin-utils": "^0.3.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@babel/parser": "^7.15.8", + "@nuxt/kit": "^3.2.2 || ^4.0.0", + "vue": "2 || 3" + }, + "peerDependenciesMeta": { + "@babel/parser": { + "optional": true + }, + "@nuxt/kit": { + "optional": true + } + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.2.tgz", + "integrity": "sha512-E85pfNzMQ9jpKkA7+TJAi4TJN+tBCuWh5rUcS/sv6cFi+1q9LYDwDI5dpUL0u/73EElyQ8d3TEaeW4sPedBqYA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/utility-types": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", + "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vite": { + "version": "7.2.7", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.2.7.tgz", + "integrity": "sha512-ITcnkFeR3+fI8P1wMgItjGrR10170d8auB4EpMLPqmx6uxElH3a/hHGQabSHKdqd4FXWO1nFIp9rRn7JQ34ACQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite-plugin-dts": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/vite-plugin-dts/-/vite-plugin-dts-4.5.4.tgz", + "integrity": "sha512-d4sOM8M/8z7vRXHHq/ebbblfaxENjogAAekcfcDCCwAyvGqnPrc7f4NZbvItS+g4WTgerW0xDwSz5qz11JT3vg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@microsoft/api-extractor": "^7.50.1", + "@rollup/pluginutils": "^5.1.4", + "@volar/typescript": "^2.4.11", + "@vue/language-core": "2.2.0", + "compare-versions": "^6.1.1", + "debug": "^4.4.0", + "kolorist": "^1.8.0", + "local-pkg": "^1.0.0", + "magic-string": "^0.30.17" + }, + "peerDependencies": { + "typescript": "*", + "vite": "*" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/vite-plugin-dts/node_modules/@vue/language-core": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.2.0.tgz", + "integrity": "sha512-O1ZZFaaBGkKbsRfnVH1ifOK1/1BUkyK+3SQsfnh6PmMmD4qJcTU8godCeA96jjDRTL6zgnK7YzCHfaUlH2r0Mw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "~2.4.11", + "@vue/compiler-dom": "^3.5.0", + "@vue/compiler-vue2": "^2.7.16", + "@vue/shared": "^3.5.0", + "alien-signals": "^0.4.9", + "minimatch": "^9.0.3", + "muggle-string": "^0.4.1", + "path-browserify": "^1.0.1" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vite-plugin-dts/node_modules/alien-signals": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-0.4.14.tgz", + "integrity": "sha512-itUAVzhczTmP2U5yX67xVpsbbOiquusbWVyA9N+sy6+r6YVbFkahXvNCeEPWEOMhwDYwbVbGHFkVL03N9I5g+Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/vite-plugin-dts/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/vite-plugin-mock": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/vite-plugin-mock/-/vite-plugin-mock-3.0.2.tgz", + "integrity": "sha512-bD//HvkTygGmk+LsIAdf0jGNlCv4iWv0kZlH9UEgWT6QYoUwfjQAE4SKxHRw2tfLgVhbPQVv/+X3YlNWvueGUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bundle-require": "^4.0.1", + "chokidar": "^3.5.3", + "connect": "^3.7.0", + "debug": "^4.3.4", + "fast-glob": "^3.2.12", + "path-to-regexp": "^6.2.1", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "esbuild": ">=0.17", + "mockjs": ">=1.1.0", + "vite": ">=4.0.0" + } + }, + "node_modules/vite-plugin-mock/node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/vite-plugin-mock/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/vite-plugin-mock/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/vitest": { + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.15.tgz", + "integrity": "sha512-n1RxDp8UJm6N0IbJLQo+yzLZ2sQCDyl1o0LeugbPWf8+8Fttp29GghsQBjYJVmWq3gBFfe9Hs1spR44vovn2wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "4.0.15", + "@vitest/mocker": "4.0.15", + "@vitest/pretty-format": "4.0.15", + "@vitest/runner": "4.0.15", + "@vitest/snapshot": "4.0.15", + "@vitest/spy": "4.0.15", + "@vitest/utils": "4.0.15", + "es-module-lexer": "^1.7.0", + "expect-type": "^1.2.2", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^3.10.0", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.0.3", + "vite": "^6.0.0 || ^7.0.0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.0.15", + "@vitest/browser-preview": "4.0.15", + "@vitest/browser-webdriverio": "4.0.15", + "@vitest/ui": "4.0.15", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/vscode-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", + "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/vue": { + "version": "3.5.25", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.25.tgz", + "integrity": "sha512-YLVdgv2K13WJ6n+kD5owehKtEXwdwXuj2TTyJMsO7pSeKw2bfRNZGjhB7YzrpbMYj5b5QsUebHpOqR3R3ziy/g==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.25", + "@vue/compiler-sfc": "3.5.25", + "@vue/runtime-dom": "3.5.25", + "@vue/server-renderer": "3.5.25", + "@vue/shared": "3.5.25" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-draggable-next": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/vue-draggable-next/-/vue-draggable-next-2.3.0.tgz", + "integrity": "sha512-ymbY0UIwfSdg0iDN/iyNNwUrTqZ/6KbPryzsvTNXBLuDCuOBdNijSK8yynNtmiSj6RapTPQfjLGQdJrZkzBd2w==", + "license": "MIT", + "peerDependencies": { + "sortablejs": "^1.14.0", + "vue": "^3.5.17" + } + }, + "node_modules/vue-router": { + "version": "4.6.4", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.6.4.tgz", + "integrity": "sha512-Hz9q5sa33Yhduglwz6g9skT8OBPii+4bFn88w6J+J4MfEo4KRRpmiNG/hHHkdbRFlLBOqxN8y8gf2Fb0MTUgVg==", + "license": "MIT", + "dependencies": { + "@vue/devtools-api": "^6.6.4" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "vue": "^3.5.0" + } + }, + "node_modules/vue-router/node_modules/@vue/devtools-api": { + "version": "6.6.4", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz", + "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==", + "license": "MIT" + }, + "node_modules/vue-tsc": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-3.1.8.tgz", + "integrity": "sha512-deKgwx6exIHeZwF601P1ktZKNF0bepaSN4jBU3AsbldPx9gylUc1JDxYppl82yxgkAgaz0Y0LCLOi+cXe9HMYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/typescript": "2.4.26", + "@vue/language-core": "3.1.8" + }, + "bin": { + "vue-tsc": "bin/vue-tsc.js" + }, + "peerDependencies": { + "typescript": ">=5.0.0" + } + }, + "node_modules/vue-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/vue-types/-/vue-types-3.0.2.tgz", + "integrity": "sha512-IwUC0Aq2zwaXqy74h4WCvFCUtoV0iSWr0snWnE9TnU18S66GAQyqQbRf2qfJtUuiFsBf6qp0MEwdonlwznlcrw==", + "license": "MIT", + "dependencies": { + "is-plain-object": "3.0.1" + }, + "engines": { + "node": ">=10.15.0" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/vuedraggable": { + "version": "2.24.3", + "resolved": "https://registry.npmjs.org/vuedraggable/-/vuedraggable-2.24.3.tgz", + "integrity": "sha512-6/HDXi92GzB+Hcs9fC6PAAozK1RLt1ewPTLjK0anTYguXLAeySDmcnqE8IC0xa7shvSzRjQXq3/+dsZ7ETGF3g==", + "license": "MIT", + "dependencies": { + "sortablejs": "1.10.2" + } + }, + "node_modules/vuedraggable/node_modules/sortablejs": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.10.2.tgz", + "integrity": "sha512-YkPGufevysvfwn5rfdlGyrGjt7/CRHwvRPogD/lC+TnvcN29jDpCifKP+rBqf+LRldfXSTh+0CGLcSg0VIxq3A==", + "license": "MIT" + }, + "node_modules/warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/webpack-virtual-modules": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", + "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/zrender": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/zrender/-/zrender-6.0.0.tgz", + "integrity": "sha512-41dFXEEXuJpNecuUQq6JlbybmnHaqqpGlbH1yxnA5V9MMP4SbohSVZsJIwz+zdjQXSSlR1Vc34EgH1zxyTDvhg==", + "license": "BSD-3-Clause", + "dependencies": { + "tslib": "2.3.0" + } + }, + "node_modules/zrender/node_modules/tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", + "license": "0BSD" + } + } +} diff --git a/modeler/package.json b/modeler/package.json new file mode 100644 index 0000000..b24023f --- /dev/null +++ b/modeler/package.json @@ -0,0 +1,47 @@ +{ + "name": "modeler", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vue-tsc -b && vite build", + "preview": "vite preview" + }, + "dependencies": { + "@antv/x6": "^3.1.2", + "@antv/x6-vue-shape": "^3.0.2", + "ant-design-vue": "^4.2.6", + "axios": "^1.13.2", + "echarts": "^6.0.0", + "js-cookie": "^3.0.5", + "pinia": "^3.0.4", + "vue": "^3.5.24", + "vue-draggable-next": "^2.3.0", + "vue-router": "^4.6.4", + "vuedraggable": "^2.24.3" + }, + "devDependencies": { + "@originjs/vite-plugin-commonjs": "^1.0.3", + "@tailwindcss/postcss": "^4.1.18", + "@tailwindcss/vite": "^4.1.18", + "@types/js-cookie": "^3.0.6", + "@types/node": "^24.10.1", + "@vitejs/plugin-vue": "^6.0.3", + "@vitejs/plugin-vue-jsx": "^5.1.2", + "@vue/tsconfig": "^0.8.1", + "autoprefixer": "^10.4.22", + "less": "^4.4.2", + "mockjs": "^1.1.0", + "postcss-selector-parser": "^7.1.1", + "tailwindcss": "^4.1.18", + "typescript": "~5.9.3", + "unplugin-auto-import": "^20.3.0", + "unplugin-vue-components": "^30.0.0", + "vite": "^7.2.4", + "vite-plugin-dts": "^4.5.4", + "vite-plugin-mock": "^3.0.2", + "vitest": "^4.0.15", + "vue-tsc": "^3.1.4" + } +} diff --git a/modeler/postcss.config.js b/modeler/postcss.config.js new file mode 100644 index 0000000..25dc28c --- /dev/null +++ b/modeler/postcss.config.js @@ -0,0 +1,15 @@ +/* + * This file is part of the kernelstudio package. + * + * (c) 2014-2025 zlin + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +export default { + plugins: { + '@tailwindcss/postcss': {}, + autoprefixer: {}, + }, +} \ No newline at end of file diff --git a/modeler/prettier.config.js b/modeler/prettier.config.js new file mode 100644 index 0000000..0a23d12 --- /dev/null +++ b/modeler/prettier.config.js @@ -0,0 +1,28 @@ +/* + * This file is part of the kernelstudio package. + * + * (c) 2014-2025 zlin + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +module.exports = { + "printWidth": 200, + "tabWidth": 2, + "useTabs": false, + "semi": true, + "vueIndentScriptAndStyle": true, + "singleQuote": true, + "quoteProps": "as-needed", + "bracketSpacing": true, + "trailingComma": "es5", + "jsxBracketSameLine": true, + "jsxSingleQuote": false, + "arrowParens": "always", + "insertPragma": false, + "requirePragma": false, + "proseWrap": "preserve", + "htmlWhitespaceSensitivity": "strict", + "endOfLine": "lf" +}; diff --git a/modeler/src/api/user.ts b/modeler/src/api/user.ts new file mode 100644 index 0000000..88dce12 --- /dev/null +++ b/modeler/src/api/user.ts @@ -0,0 +1,27 @@ +/* + * This file is part of the kernelstudio package. + * + * (c) 2014-2025 zlin + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +import request, { HttpRequestClient } from '@/utils/request'; +import type { BasicResponse, UserLoginForm, UserLoginResult, UserSessionResult } from '@/types'; + +const req = new HttpRequestClient(HttpRequestClient.build({ + baseURL: '/', +})); + +export const fetchUserSession = (): Promise => { + return req.get('/getInfo'); +}; + +export const signinByForm = (form: UserLoginForm): Promise => { + return req.postJson('/login', form); +}; + +export const logoutSession = (): Promise => { + return request.post('/logout'); +}; \ No newline at end of file diff --git a/modeler/src/assets/actions/delete.svg b/modeler/src/assets/actions/delete.svg new file mode 100644 index 0000000..31f45b8 --- /dev/null +++ b/modeler/src/assets/actions/delete.svg @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git a/modeler/src/assets/actions/eye.svg b/modeler/src/assets/actions/eye.svg new file mode 100644 index 0000000..db03686 --- /dev/null +++ b/modeler/src/assets/actions/eye.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/modeler/src/assets/actions/pause.svg b/modeler/src/assets/actions/pause.svg new file mode 100644 index 0000000..92f9779 --- /dev/null +++ b/modeler/src/assets/actions/pause.svg @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/modeler/src/assets/actions/start.svg b/modeler/src/assets/actions/start.svg new file mode 100644 index 0000000..045af22 --- /dev/null +++ b/modeler/src/assets/actions/start.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/modeler/src/assets/icons/+@2x.png b/modeler/src/assets/icons/+@2x.png new file mode 100644 index 0000000..8b4a6c0 Binary files /dev/null and b/modeler/src/assets/icons/+@2x.png differ diff --git a/modeler/src/assets/icons/28@2x.png b/modeler/src/assets/icons/28@2x.png new file mode 100644 index 0000000..45dc8ab Binary files /dev/null and b/modeler/src/assets/icons/28@2x.png differ diff --git a/modeler/src/assets/icons/29@2x.png b/modeler/src/assets/icons/29@2x.png new file mode 100644 index 0000000..2624b25 Binary files /dev/null and b/modeler/src/assets/icons/29@2x.png differ diff --git a/modeler/src/assets/icons/2@2x.png b/modeler/src/assets/icons/2@2x.png new file mode 100644 index 0000000..9e93de9 Binary files /dev/null and b/modeler/src/assets/icons/2@2x.png differ diff --git a/modeler/src/assets/icons/31@2x.png b/modeler/src/assets/icons/31@2x.png new file mode 100644 index 0000000..1b6428f Binary files /dev/null and b/modeler/src/assets/icons/31@2x.png differ diff --git a/modeler/src/assets/icons/33@2x.png b/modeler/src/assets/icons/33@2x.png new file mode 100644 index 0000000..6441297 Binary files /dev/null and b/modeler/src/assets/icons/33@2x.png differ diff --git a/modeler/src/assets/icons/6@2x.png b/modeler/src/assets/icons/6@2x.png new file mode 100644 index 0000000..ea24f39 Binary files /dev/null and b/modeler/src/assets/icons/6@2x.png differ diff --git a/modeler/src/assets/icons/CONFIGURATION@2x.png b/modeler/src/assets/icons/CONFIGURATION@2x.png new file mode 100644 index 0000000..2ad3ee1 Binary files /dev/null and b/modeler/src/assets/icons/CONFIGURATION@2x.png differ diff --git a/modeler/src/assets/icons/action-bottom-active.png b/modeler/src/assets/icons/action-bottom-active.png new file mode 100644 index 0000000..5d295f1 Binary files /dev/null and b/modeler/src/assets/icons/action-bottom-active.png differ diff --git a/modeler/src/assets/icons/action-bottom.png b/modeler/src/assets/icons/action-bottom.png new file mode 100644 index 0000000..aabbb70 Binary files /dev/null and b/modeler/src/assets/icons/action-bottom.png differ diff --git a/modeler/src/assets/icons/action-top-active.png b/modeler/src/assets/icons/action-top-active.png new file mode 100644 index 0000000..cc6db0e Binary files /dev/null and b/modeler/src/assets/icons/action-top-active.png differ diff --git a/modeler/src/assets/icons/action-top.png b/modeler/src/assets/icons/action-top.png new file mode 100644 index 0000000..157e49e Binary files /dev/null and b/modeler/src/assets/icons/action-top.png differ diff --git a/modeler/src/assets/icons/afsim.svg b/modeler/src/assets/icons/afsim.svg new file mode 100644 index 0000000..85c6bb4 --- /dev/null +++ b/modeler/src/assets/icons/afsim.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/modeler/src/assets/icons/arrow-left.svg b/modeler/src/assets/icons/arrow-left.svg new file mode 100644 index 0000000..404a3b4 --- /dev/null +++ b/modeler/src/assets/icons/arrow-left.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/modeler/src/assets/icons/arrow-right.svg b/modeler/src/assets/icons/arrow-right.svg new file mode 100644 index 0000000..7c65f1c --- /dev/null +++ b/modeler/src/assets/icons/arrow-right.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/modeler/src/assets/icons/back.png b/modeler/src/assets/icons/back.png new file mode 100644 index 0000000..b8569c2 Binary files /dev/null and b/modeler/src/assets/icons/back.png differ diff --git a/modeler/src/assets/icons/bg-card-head.png b/modeler/src/assets/icons/bg-card-head.png new file mode 100644 index 0000000..3070f23 Binary files /dev/null and b/modeler/src/assets/icons/bg-card-head.png differ diff --git a/modeler/src/assets/icons/bg-card-title-split.png b/modeler/src/assets/icons/bg-card-title-split.png new file mode 100644 index 0000000..f983000 Binary files /dev/null and b/modeler/src/assets/icons/bg-card-title-split.png differ diff --git a/modeler/src/assets/icons/bg-card.png b/modeler/src/assets/icons/bg-card.png new file mode 100644 index 0000000..853d49c Binary files /dev/null and b/modeler/src/assets/icons/bg-card.png differ diff --git a/modeler/src/assets/icons/bg-fk-point.png b/modeler/src/assets/icons/bg-fk-point.png new file mode 100644 index 0000000..f95c22e Binary files /dev/null and b/modeler/src/assets/icons/bg-fk-point.png differ diff --git a/modeler/src/assets/icons/bg-fk-title.png b/modeler/src/assets/icons/bg-fk-title.png new file mode 100644 index 0000000..c6d60fc Binary files /dev/null and b/modeler/src/assets/icons/bg-fk-title.png differ diff --git a/modeler/src/assets/icons/bg-fk.png b/modeler/src/assets/icons/bg-fk.png new file mode 100644 index 0000000..1bc89a2 Binary files /dev/null and b/modeler/src/assets/icons/bg-fk.png differ diff --git a/modeler/src/assets/icons/bg-menu-active.png b/modeler/src/assets/icons/bg-menu-active.png new file mode 100644 index 0000000..48f417f Binary files /dev/null and b/modeler/src/assets/icons/bg-menu-active.png differ diff --git a/modeler/src/assets/icons/bg-modal.png b/modeler/src/assets/icons/bg-modal.png new file mode 100644 index 0000000..fc5cc40 Binary files /dev/null and b/modeler/src/assets/icons/bg-modal.png differ diff --git a/modeler/src/assets/icons/bg-model-builder-canvas.png b/modeler/src/assets/icons/bg-model-builder-canvas.png new file mode 100644 index 0000000..f89b9c3 Binary files /dev/null and b/modeler/src/assets/icons/bg-model-builder-canvas.png differ diff --git a/modeler/src/assets/icons/bg-model-builder-card-title.png b/modeler/src/assets/icons/bg-model-builder-card-title.png new file mode 100644 index 0000000..53f6d7e Binary files /dev/null and b/modeler/src/assets/icons/bg-model-builder-card-title.png differ diff --git a/modeler/src/assets/icons/bg-node.png b/modeler/src/assets/icons/bg-node.png new file mode 100644 index 0000000..0d5a842 Binary files /dev/null and b/modeler/src/assets/icons/bg-node.png differ diff --git a/modeler/src/assets/icons/bg-page.png b/modeler/src/assets/icons/bg-page.png new file mode 100644 index 0000000..539278f Binary files /dev/null and b/modeler/src/assets/icons/bg-page.png differ diff --git a/modeler/src/assets/icons/bg-pk-body.png b/modeler/src/assets/icons/bg-pk-body.png new file mode 100644 index 0000000..de2851d Binary files /dev/null and b/modeler/src/assets/icons/bg-pk-body.png differ diff --git a/modeler/src/assets/icons/bg-pk-header.png b/modeler/src/assets/icons/bg-pk-header.png new file mode 100644 index 0000000..7d1a48a Binary files /dev/null and b/modeler/src/assets/icons/bg-pk-header.png differ diff --git a/modeler/src/assets/icons/bg-pk-left.png b/modeler/src/assets/icons/bg-pk-left.png new file mode 100644 index 0000000..908826c Binary files /dev/null and b/modeler/src/assets/icons/bg-pk-left.png differ diff --git a/modeler/src/assets/icons/bg-pk-right.png b/modeler/src/assets/icons/bg-pk-right.png new file mode 100644 index 0000000..2d9568a Binary files /dev/null and b/modeler/src/assets/icons/bg-pk-right.png differ diff --git a/modeler/src/assets/icons/bg-pk.png b/modeler/src/assets/icons/bg-pk.png new file mode 100644 index 0000000..7bb4c4a Binary files /dev/null and b/modeler/src/assets/icons/bg-pk.png differ diff --git a/modeler/src/assets/icons/bg-steps-card.png b/modeler/src/assets/icons/bg-steps-card.png new file mode 100644 index 0000000..f51deff Binary files /dev/null and b/modeler/src/assets/icons/bg-steps-card.png differ diff --git a/modeler/src/assets/icons/bg-tabs.png b/modeler/src/assets/icons/bg-tabs.png new file mode 100644 index 0000000..8790e2c Binary files /dev/null and b/modeler/src/assets/icons/bg-tabs.png differ diff --git a/modeler/src/assets/icons/bg-workspace-card-title.png b/modeler/src/assets/icons/bg-workspace-card-title.png new file mode 100644 index 0000000..f983000 Binary files /dev/null and b/modeler/src/assets/icons/bg-workspace-card-title.png differ diff --git a/modeler/src/assets/icons/bg-workspace-card.png b/modeler/src/assets/icons/bg-workspace-card.png new file mode 100644 index 0000000..c176821 Binary files /dev/null and b/modeler/src/assets/icons/bg-workspace-card.png differ diff --git a/modeler/src/assets/icons/card-head.png b/modeler/src/assets/icons/card-head.png new file mode 100644 index 0000000..6039206 Binary files /dev/null and b/modeler/src/assets/icons/card-head.png differ diff --git a/modeler/src/assets/icons/folder.png b/modeler/src/assets/icons/folder.png new file mode 100644 index 0000000..16faab3 Binary files /dev/null and b/modeler/src/assets/icons/folder.png differ diff --git a/modeler/src/assets/icons/goback.svg b/modeler/src/assets/icons/goback.svg new file mode 100644 index 0000000..4f96720 --- /dev/null +++ b/modeler/src/assets/icons/goback.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/modeler/src/assets/icons/header-logo.png b/modeler/src/assets/icons/header-logo.png new file mode 100644 index 0000000..4ca9a80 Binary files /dev/null and b/modeler/src/assets/icons/header-logo.png differ diff --git a/modeler/src/assets/icons/icon-grid.png b/modeler/src/assets/icons/icon-grid.png new file mode 100644 index 0000000..0c5c294 Binary files /dev/null and b/modeler/src/assets/icons/icon-grid.png differ diff --git a/modeler/src/assets/icons/icon-input.png b/modeler/src/assets/icons/icon-input.png new file mode 100644 index 0000000..2ad3ee1 Binary files /dev/null and b/modeler/src/assets/icons/icon-input.png differ diff --git a/modeler/src/assets/icons/icon-list.png b/modeler/src/assets/icons/icon-list.png new file mode 100644 index 0000000..fa4ca3f Binary files /dev/null and b/modeler/src/assets/icons/icon-list.png differ diff --git a/modeler/src/assets/icons/icon-model-input.png b/modeler/src/assets/icons/icon-model-input.png new file mode 100644 index 0000000..39ca436 Binary files /dev/null and b/modeler/src/assets/icons/icon-model-input.png differ diff --git a/modeler/src/assets/icons/icon-model.png b/modeler/src/assets/icons/icon-model.png new file mode 100644 index 0000000..58df008 Binary files /dev/null and b/modeler/src/assets/icons/icon-model.png differ diff --git a/modeler/src/assets/icons/icon-search.png b/modeler/src/assets/icons/icon-search.png new file mode 100644 index 0000000..ef15eae Binary files /dev/null and b/modeler/src/assets/icons/icon-search.png differ diff --git a/modeler/src/assets/icons/icon-settings.png b/modeler/src/assets/icons/icon-settings.png new file mode 100644 index 0000000..1ade64e Binary files /dev/null and b/modeler/src/assets/icons/icon-settings.png differ diff --git a/modeler/src/assets/icons/list.png b/modeler/src/assets/icons/list.png new file mode 100644 index 0000000..fa4ca3f Binary files /dev/null and b/modeler/src/assets/icons/list.png differ diff --git a/modeler/src/assets/icons/loading.gif b/modeler/src/assets/icons/loading.gif new file mode 100644 index 0000000..5bb90fd Binary files /dev/null and b/modeler/src/assets/icons/loading.gif differ diff --git a/modeler/src/assets/icons/m-01.png b/modeler/src/assets/icons/m-01.png new file mode 100644 index 0000000..9ad7ac6 Binary files /dev/null and b/modeler/src/assets/icons/m-01.png differ diff --git a/modeler/src/assets/icons/m-02.png b/modeler/src/assets/icons/m-02.png new file mode 100644 index 0000000..83a056d Binary files /dev/null and b/modeler/src/assets/icons/m-02.png differ diff --git a/modeler/src/assets/icons/m-03.png b/modeler/src/assets/icons/m-03.png new file mode 100644 index 0000000..ab7e4b9 Binary files /dev/null and b/modeler/src/assets/icons/m-03.png differ diff --git a/modeler/src/assets/icons/m-bg.png b/modeler/src/assets/icons/m-bg.png new file mode 100644 index 0000000..4b2bae4 Binary files /dev/null and b/modeler/src/assets/icons/m-bg.png differ diff --git a/modeler/src/assets/icons/m-left.png b/modeler/src/assets/icons/m-left.png new file mode 100644 index 0000000..8be13bc Binary files /dev/null and b/modeler/src/assets/icons/m-left.png differ diff --git a/modeler/src/assets/icons/m-right.png b/modeler/src/assets/icons/m-right.png new file mode 100644 index 0000000..e3a3183 Binary files /dev/null and b/modeler/src/assets/icons/m-right.png differ diff --git a/modeler/src/assets/icons/model-2.svg b/modeler/src/assets/icons/model-2.svg new file mode 100644 index 0000000..e9a5dde --- /dev/null +++ b/modeler/src/assets/icons/model-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/modeler/src/assets/icons/model-3.svg b/modeler/src/assets/icons/model-3.svg new file mode 100644 index 0000000..3439080 --- /dev/null +++ b/modeler/src/assets/icons/model-3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/modeler/src/assets/icons/model-4.svg b/modeler/src/assets/icons/model-4.svg new file mode 100644 index 0000000..49469de --- /dev/null +++ b/modeler/src/assets/icons/model-4.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/modeler/src/assets/icons/model.svg b/modeler/src/assets/icons/model.svg new file mode 100644 index 0000000..c2a3c00 --- /dev/null +++ b/modeler/src/assets/icons/model.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/modeler/src/assets/icons/no-0.png b/modeler/src/assets/icons/no-0.png new file mode 100644 index 0000000..0a04e76 Binary files /dev/null and b/modeler/src/assets/icons/no-0.png differ diff --git a/modeler/src/assets/icons/no-1.png b/modeler/src/assets/icons/no-1.png new file mode 100644 index 0000000..5ea1f90 Binary files /dev/null and b/modeler/src/assets/icons/no-1.png differ diff --git a/modeler/src/assets/icons/no-2.png b/modeler/src/assets/icons/no-2.png new file mode 100644 index 0000000..bc3d28e Binary files /dev/null and b/modeler/src/assets/icons/no-2.png differ diff --git a/modeler/src/assets/icons/no-3.png b/modeler/src/assets/icons/no-3.png new file mode 100644 index 0000000..a2531ba Binary files /dev/null and b/modeler/src/assets/icons/no-3.png differ diff --git a/modeler/src/assets/icons/no-4.png b/modeler/src/assets/icons/no-4.png new file mode 100644 index 0000000..4cab73d Binary files /dev/null and b/modeler/src/assets/icons/no-4.png differ diff --git a/modeler/src/assets/icons/no-5.png b/modeler/src/assets/icons/no-5.png new file mode 100644 index 0000000..c99b561 Binary files /dev/null and b/modeler/src/assets/icons/no-5.png differ diff --git a/modeler/src/assets/icons/no-6.png b/modeler/src/assets/icons/no-6.png new file mode 100644 index 0000000..cb18293 Binary files /dev/null and b/modeler/src/assets/icons/no-6.png differ diff --git a/modeler/src/assets/icons/no-7.png b/modeler/src/assets/icons/no-7.png new file mode 100644 index 0000000..3b1bb90 Binary files /dev/null and b/modeler/src/assets/icons/no-7.png differ diff --git a/modeler/src/assets/icons/no-8.png b/modeler/src/assets/icons/no-8.png new file mode 100644 index 0000000..5eaf98c Binary files /dev/null and b/modeler/src/assets/icons/no-8.png differ diff --git a/modeler/src/assets/icons/no-9.png b/modeler/src/assets/icons/no-9.png new file mode 100644 index 0000000..1db1a3d Binary files /dev/null and b/modeler/src/assets/icons/no-9.png differ diff --git a/modeler/src/assets/icons/page-card-body.png b/modeler/src/assets/icons/page-card-body.png new file mode 100644 index 0000000..f89b9c3 Binary files /dev/null and b/modeler/src/assets/icons/page-card-body.png differ diff --git a/modeler/src/assets/icons/page-card-head.png b/modeler/src/assets/icons/page-card-head.png new file mode 100644 index 0000000..4d2c1c8 Binary files /dev/null and b/modeler/src/assets/icons/page-card-head.png differ diff --git a/modeler/src/assets/icons/point.svg b/modeler/src/assets/icons/point.svg new file mode 100644 index 0000000..b1daa24 --- /dev/null +++ b/modeler/src/assets/icons/point.svg @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/modeler/src/assets/icons/save.svg b/modeler/src/assets/icons/save.svg new file mode 100644 index 0000000..512241b --- /dev/null +++ b/modeler/src/assets/icons/save.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/modeler/src/assets/icons/sm-card-selected.png b/modeler/src/assets/icons/sm-card-selected.png new file mode 100644 index 0000000..1eae8ce Binary files /dev/null and b/modeler/src/assets/icons/sm-card-selected.png differ diff --git a/modeler/src/assets/icons/sm-card.png b/modeler/src/assets/icons/sm-card.png new file mode 100644 index 0000000..0d5a842 Binary files /dev/null and b/modeler/src/assets/icons/sm-card.png differ diff --git a/modeler/src/assets/icons/tab-bg.png b/modeler/src/assets/icons/tab-bg.png new file mode 100644 index 0000000..9e852cd Binary files /dev/null and b/modeler/src/assets/icons/tab-bg.png differ diff --git a/modeler/src/assets/icons/tab-first.png b/modeler/src/assets/icons/tab-first.png new file mode 100644 index 0000000..bf9afa0 Binary files /dev/null and b/modeler/src/assets/icons/tab-first.png differ diff --git a/modeler/src/assets/icons/tab-item-active.png b/modeler/src/assets/icons/tab-item-active.png new file mode 100644 index 0000000..ca3acd6 Binary files /dev/null and b/modeler/src/assets/icons/tab-item-active.png differ diff --git a/modeler/src/assets/icons/tab-item.png b/modeler/src/assets/icons/tab-item.png new file mode 100644 index 0000000..5a3e839 Binary files /dev/null and b/modeler/src/assets/icons/tab-item.png differ diff --git a/modeler/src/assets/icons/—@2x.png b/modeler/src/assets/icons/—@2x.png new file mode 100644 index 0000000..61180ab Binary files /dev/null and b/modeler/src/assets/icons/—@2x.png differ diff --git a/modeler/src/assets/icons/下拉@2x.png b/modeler/src/assets/icons/下拉@2x.png new file mode 100644 index 0000000..ab30acf Binary files /dev/null and b/modeler/src/assets/icons/下拉@2x.png differ diff --git a/modeler/src/assets/icons/保存12拷贝@2x.png b/modeler/src/assets/icons/保存12拷贝@2x.png new file mode 100644 index 0000000..bc08f12 Binary files /dev/null and b/modeler/src/assets/icons/保存12拷贝@2x.png differ diff --git a/modeler/src/assets/icons/参数配置@2x.png b/modeler/src/assets/icons/参数配置@2x.png new file mode 100644 index 0000000..1ade64e Binary files /dev/null and b/modeler/src/assets/icons/参数配置@2x.png differ diff --git a/modeler/src/assets/icons/搜索@2x.png b/modeler/src/assets/icons/搜索@2x.png new file mode 100644 index 0000000..ef15eae Binary files /dev/null and b/modeler/src/assets/icons/搜索@2x.png differ diff --git a/modeler/src/assets/icons/方向@2x.png b/modeler/src/assets/icons/方向@2x.png new file mode 100644 index 0000000..9c33e22 Binary files /dev/null and b/modeler/src/assets/icons/方向@2x.png differ diff --git a/modeler/src/assets/icons/矩形33拷贝3@2x.png b/modeler/src/assets/icons/矩形33拷贝3@2x.png new file mode 100644 index 0000000..e58ec72 Binary files /dev/null and b/modeler/src/assets/icons/矩形33拷贝3@2x.png differ diff --git a/modeler/src/assets/icons/矩形4拷贝12@2x.png b/modeler/src/assets/icons/矩形4拷贝12@2x.png new file mode 100644 index 0000000..bb5a9e0 Binary files /dev/null and b/modeler/src/assets/icons/矩形4拷贝12@2x.png differ diff --git a/modeler/src/assets/icons/矩形50拷贝2@2x.png b/modeler/src/assets/icons/矩形50拷贝2@2x.png new file mode 100644 index 0000000..1eae8ce Binary files /dev/null and b/modeler/src/assets/icons/矩形50拷贝2@2x.png differ diff --git a/modeler/src/assets/icons/矩形6拷贝@2x.png b/modeler/src/assets/icons/矩形6拷贝@2x.png new file mode 100644 index 0000000..6ef6041 Binary files /dev/null and b/modeler/src/assets/icons/矩形6拷贝@2x.png differ diff --git a/modeler/src/assets/icons/编辑@2x.png b/modeler/src/assets/icons/编辑@2x.png new file mode 100644 index 0000000..9da9012 Binary files /dev/null and b/modeler/src/assets/icons/编辑@2x.png differ diff --git a/modeler/src/assets/icons/配置@2x.png b/modeler/src/assets/icons/配置@2x.png new file mode 100644 index 0000000..0c5c294 Binary files /dev/null and b/modeler/src/assets/icons/配置@2x.png differ diff --git a/modeler/src/assets/images/bg.jpeg b/modeler/src/assets/images/bg.jpeg new file mode 100644 index 0000000..e41d384 Binary files /dev/null and b/modeler/src/assets/images/bg.jpeg differ diff --git a/modeler/src/assets/images/bg.png b/modeler/src/assets/images/bg.png new file mode 100644 index 0000000..0b5833b Binary files /dev/null and b/modeler/src/assets/images/bg.png differ diff --git a/modeler/src/assets/rank/arrow.png b/modeler/src/assets/rank/arrow.png new file mode 100644 index 0000000..e2165c6 Binary files /dev/null and b/modeler/src/assets/rank/arrow.png differ diff --git a/modeler/src/assets/rank/bg-1.png b/modeler/src/assets/rank/bg-1.png new file mode 100644 index 0000000..cf9d6f3 Binary files /dev/null and b/modeler/src/assets/rank/bg-1.png differ diff --git a/modeler/src/assets/rank/bg-2.png b/modeler/src/assets/rank/bg-2.png new file mode 100644 index 0000000..e54d299 Binary files /dev/null and b/modeler/src/assets/rank/bg-2.png differ diff --git a/modeler/src/assets/rank/bg-3.png b/modeler/src/assets/rank/bg-3.png new file mode 100644 index 0000000..4c491db Binary files /dev/null and b/modeler/src/assets/rank/bg-3.png differ diff --git a/modeler/src/assets/rank/container.png b/modeler/src/assets/rank/container.png new file mode 100644 index 0000000..5265fca Binary files /dev/null and b/modeler/src/assets/rank/container.png differ diff --git a/modeler/src/assets/rank/icon-1.png b/modeler/src/assets/rank/icon-1.png new file mode 100644 index 0000000..1f65e77 Binary files /dev/null and b/modeler/src/assets/rank/icon-1.png differ diff --git a/modeler/src/assets/rank/icon-2.png b/modeler/src/assets/rank/icon-2.png new file mode 100644 index 0000000..676fff8 Binary files /dev/null and b/modeler/src/assets/rank/icon-2.png differ diff --git a/modeler/src/assets/rank/icon-3.png b/modeler/src/assets/rank/icon-3.png new file mode 100644 index 0000000..c7e5dda Binary files /dev/null and b/modeler/src/assets/rank/icon-3.png differ diff --git a/modeler/src/assets/rank/title.png b/modeler/src/assets/rank/title.png new file mode 100644 index 0000000..3b1340a Binary files /dev/null and b/modeler/src/assets/rank/title.png differ diff --git a/modeler/src/assets/rank/titled-container.png b/modeler/src/assets/rank/titled-container.png new file mode 100644 index 0000000..8cbe571 Binary files /dev/null and b/modeler/src/assets/rank/titled-container.png differ diff --git a/modeler/src/components/container.ts b/modeler/src/components/container.ts new file mode 100644 index 0000000..58eb3c8 --- /dev/null +++ b/modeler/src/components/container.ts @@ -0,0 +1,42 @@ +/* + * This file is part of the kernelstudio package. + * + * (c) 2014-2025 zlin + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +import {defineComponent, h, type VNode} from 'vue'; +import {ConfigProvider, StyleProvider} from 'ant-design-vue' +import zhCN from 'ant-design-vue/es/locale/zh_CN' + +export const Container = defineComponent({ + name: 'Container', + setup(_, {slots}) { + + const renderContent = (): VNode => { + const themeData = { + algorithm: [], + token: { + // colorPrimary: '#0653bf', + // borderPrimary: 'red', + // colorPrimaryBg: '#e6f7ff', // 按钮等 + // colorBgContainer:'#0e2877', // 卡片等 + }, + components: {}, + } + + return h(StyleProvider, {}, { + default: () => h(ConfigProvider, { + locale: zhCN, + theme: themeData, + }, { + default: () => slots.default ? slots.default() : null + }) + }) + } + + return () => renderContent() + }, +}); \ No newline at end of file diff --git a/modeler/src/components/endpoint.ts b/modeler/src/components/endpoint.ts new file mode 100644 index 0000000..17f7c9f --- /dev/null +++ b/modeler/src/components/endpoint.ts @@ -0,0 +1,26 @@ +/* + * This file is part of the kernelstudio package. + * + * (c) 2014-2025 zlin + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ +import {defineComponent, h} from 'vue'; +import {RouterView} from 'vue-router'; +import {Container} from './container' + +/** + * 应用入口组件,负责渲染路由视图 + * @name Entrypoint + * @component + */ +export const Entrypoint = defineComponent({ + name: 'Entrypoint', + setup() { + return () => h(Container, {}, { + default: () => h(RouterView) + }); + }, +}); + diff --git a/modeler/src/components/wrapper.ts b/modeler/src/components/wrapper.ts new file mode 100644 index 0000000..953adfe --- /dev/null +++ b/modeler/src/components/wrapper.ts @@ -0,0 +1,29 @@ +/* + * This file is part of the kernelstudio package. + * + * (c) 2014-2025 zlin + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +import {defineComponent, h, type VNode} from 'vue'; + +export const Wrapper = defineComponent({ + name: 'Wrapper', + setup(_, {slots}) { + const renderContent = (): VNode => { + return h('div', { + class: [ + 'ks-wrapper', + 'bg-wrapper', + 'w-full', + 'h-[100vh]' + ] + }, { + default: () => slots.default ? slots.default() : null + }) + } + return () => renderContent() + }, +}); \ No newline at end of file diff --git a/modeler/src/config/app.ts b/modeler/src/config/app.ts new file mode 100644 index 0000000..91e0fcc --- /dev/null +++ b/modeler/src/config/app.ts @@ -0,0 +1,16 @@ +/* + * This file is part of the kernelstudio package. + * + * (c) 2014-2025 zlin + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +export default { + dashboardUrl: '/app/ai/project/management', + // 训练任务监控URL + taskMonitorUrl: 'http://192.168.1.100:8080', + // 集群监控URL + monitorUrl: 'http://192.168.1.100:8080/d/addb4jj/e79b91-e68ea7-e5a4a7-e5b18f?var-interval=1m&orgId=1&from=now-1h&to=now&timezone=browser&var-datasource=cf88kfh76yxhce&var-job=&var-project=&var-origin_prometheus=&var-zone=&var-datacenter=&var-cluster_name=&var-namespace=$__all&var-container=$__all&var-pod=$__all&var-interface=$__all' +} \ No newline at end of file diff --git a/modeler/src/hooks/index.ts b/modeler/src/hooks/index.ts new file mode 100644 index 0000000..077de7f --- /dev/null +++ b/modeler/src/hooks/index.ts @@ -0,0 +1,10 @@ +/* + * This file is part of the kernelstudio package. + * + * (c) 2014-2025 zlin + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +export * from './session' \ No newline at end of file diff --git a/modeler/src/hooks/session.ts b/modeler/src/hooks/session.ts new file mode 100644 index 0000000..c1dc9d5 --- /dev/null +++ b/modeler/src/hooks/session.ts @@ -0,0 +1,75 @@ +/* + * This file is part of the kernelstudio package. + * + * (c) 2014-2025 zlin + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +import { computed, type ComputedRef, ref, type Ref } from 'vue'; +import { getToken, removeToken, setToken } from '../utils/token'; +import type { UserLoginForm, UserSessionResult } from '@/types'; +import { fetchUserSession, signinByForm } from '@/api/user'; + +const userDetails = ref(null); +const token = ref(getToken() || ''); + +export interface UseUserSession { + token: Ref; + details: ComputedRef; + load: () => Promise; + signin: (form: UserLoginForm) => Promise; + logout: () => Promise; +} + +export const useUserSession = (): UseUserSession => { + + const load = (): Promise => { + return new Promise((resolve, reject) => { + if (userDetails.value) { + resolve(userDetails.value); + } else { + fetchUserSession().then(r => { + if (r.user) { + userDetails.value = r; + resolve(r); + } else { + reject(new Error(r.msg ?? '获取用户信息失败.')); + } + }).catch((e: any)=> { + reject(e); + }); + } + }); + }; + + const logout = (): Promise => { + return new Promise((resolve) => { + removeToken(); + resolve(true); + // logoutSession().then(r => resolve(r.code === 200)); + }); + }; + + const signin = (form: UserLoginForm): Promise => { + return new Promise((resolve, reject) => { + signinByForm(form).then(r => { + if (r.token) { + setToken(r.token); + load().then(r => resolve(r)); + } else { + reject(new Error(r.msg ?? '登录失败')); + } + }); + }); + }; + + return { + token, + details: computed(() => userDetails.value), + load, + signin, + logout, + } as UseUserSession; +}; \ No newline at end of file diff --git a/modeler/src/main.ts b/modeler/src/main.ts new file mode 100644 index 0000000..b7052fb --- /dev/null +++ b/modeler/src/main.ts @@ -0,0 +1,18 @@ +/* + * This file is part of the kernelstudio package. + * + * (c) 2014-2025 zlin + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +import {createApp} from 'vue' +import './style.less' +import {Entrypoint} from './components/endpoint' +import {router} from './router' + +const app = createApp(Entrypoint) +app.use(router) + +app.mount('#app') diff --git a/modeler/src/router/config.ts b/modeler/src/router/config.ts new file mode 100644 index 0000000..0aa9c03 --- /dev/null +++ b/modeler/src/router/config.ts @@ -0,0 +1,15 @@ +/* + * This file is part of the kernelstudio package. + * + * (c) 2014-2025 zlin + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +import { type RouteRecordRaw } from 'vue-router'; +import { routers } from '@/views/ai/router'; + +export const routes: RouteRecordRaw[] = [ + ...routers, +] \ No newline at end of file diff --git a/modeler/src/router/context.ts b/modeler/src/router/context.ts new file mode 100644 index 0000000..21f564d --- /dev/null +++ b/modeler/src/router/context.ts @@ -0,0 +1,45 @@ +/* + * This file is part of the kernelstudio package. + * + * (c) 2014-2025 zlin + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +import {createRouter, createWebHistory, type RouteLocationNormalized,type RouteLocationNormalizedLoaded, type NavigationGuardNext} from 'vue-router'; +import {routes} from './config' +import {useUserSession} from '@/hooks' + +const router = createRouter({ + history: createWebHistory('/'), + routes, + scrollBehavior: () => ({left: 0, top: 0}), +}); + +router.beforeEach((to: RouteLocationNormalized, from: RouteLocationNormalizedLoaded, next: NavigationGuardNext)=> { + console.info('router from ',from) + if (to.path === '/signin') { + next(); + } else { + const s = useUserSession(); + s.load().then(r => { + if (!r.user) { + next({ + path: '/signin', + }); + } else { + next(); + } + }).catch((e) => { + console.error('Router error,', e); + next({ + path: '/signin', + }); + }); + } +}) + +export { + router +} \ No newline at end of file diff --git a/modeler/src/router/index.ts b/modeler/src/router/index.ts new file mode 100644 index 0000000..b42d5f7 --- /dev/null +++ b/modeler/src/router/index.ts @@ -0,0 +1,11 @@ +/* + * This file is part of the kernelstudio package. + * + * (c) 2014-2025 zlin + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +export {routes} from './config' +export {router} from './context' \ No newline at end of file diff --git a/modeler/src/style.less b/modeler/src/style.less new file mode 100644 index 0000000..18e1579 --- /dev/null +++ b/modeler/src/style.less @@ -0,0 +1,1825 @@ +/* + * This file is part of the kernelstudio package. + * + * (c) 2014-2025 zlin + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +/* 滚动条样式 */ +::-webkit-scrollbar { + width: 4px; + height: 4px; +} + +::-webkit-scrollbar-track { + background: #071327de; + border-radius: 3px; +} + +::-webkit-scrollbar-thumb { + background: #505861; + border-radius: 2px; +} + +::-webkit-scrollbar-thumb:hover { + background: #505861; +} + +@keyframes running-line { + to { + stroke-dashoffset: -1000; + } +} + +@keyframes flow-animation { + from { stroke-dashoffset: 100; } + to { stroke-dashoffset: 0; } +} + +.x6-edge-flow { + animation: flow-animation 3s infinite linear; + stroke: #3471F9; /* 流动线条颜色 */ + stroke-width: 2; /* 流动线条宽度 */ + stroke-linecap: round; +} + +@keyframes ant-line { + 0% { + stroke-dashoffset: 0; + } + 100% { + stroke-dashoffset: -210; + } +} +@keyframes flow { + 0% { + stroke-dashoffset: 0; + } + 100% { + stroke-dashoffset: 20; + } +} + +/* 为流动线条添加动画 */ +.flow-edge .flow-line { + animation: flow 2s linear infinite; +} + + +@keyframes flow-dot { + 0% { + stroke-dashoffset: 0; + } + 100% { + stroke-dashoffset: 20; /* 与 strokeDasharray 中的间隔值一致 */ + } +} + +/* 如果需要,可以为不同状态的连线添加不同颜色的圆点 */ +.running-line .x6-edge-path { + animation: flow-dot 2s linear infinite; +} + +// 4.0 以上需要使用css名称作为切换主题需要如下配置 +// https://tailwindcss.com/docs/dark-mode#toggling-dark-mode-manually +// @custom-variant dark (&:where(.dark, .dark *)); + +@config "./tailwind.ts"; +@import 'tailwindcss'; + +.ant-modal-root .ant-modal-mask { + background-color: rgb(0 0 0 / 80%); +} + +.ks-page-loading-overlay { + position: fixed; + top: 0; + left: 0; + overflow: hidden; + background: #141313a1; + width: 100%; + height: 100%; + z-index: 10; +} + +.ks-appearance-dark .ks-page-loading-overlay { + background: #000; +} + +.ks-page-loading-holder { + width: 32px; + height: 32px; + margin: 0 auto; + position: fixed; + left: 49%; + top: 49%; + z-index: 20; + background: url("@/assets/icons/loading.gif"); +} + +.ks-page-loading-text { + margin: 0 auto; + position: fixed; + left: 49%; + top: 50%; + z-index: 20; +} + +.BMap_cpyCtrl, .anchorBL { + display: none !important; +} + +.ks-page-card-goback{ + margin-left: 20px; + margin-top: 5px; + cursor: pointer; + color: #7ae8fc; + background: transparent; + line-height: 13px; + border: 1px solid #0d6da2; + border-radius: 5px; + padding: 4px; + min-width: 60px; + height: 25px; + box-shadow: 0px 0px 0px #7dd3f9; + font-size: 13px; + position: absolute; + top: 3px; + + & > span { + margin-top: -1px!important; + display: block!important; + float: left!important; + } +} + +.bg-wrapper { + color: #a2b1ba; + background-size: cover; + background: url('@/assets/images/bg.jpeg') no-repeat fixed center; + overflow: hidden; + height: 100vh; + background: #010b1c; + transition: all 0.2s, background 0s; + //background: #fefefe; + + .sidebar-collapsed{ + .ks-layout-main{ + margin-left: 0; + transition: all 0.2s, background 0s; + } + } + + .ant-layout { + .ks-layout-header { + height: 60px; + line-height: 50px; + background: #071327de; + color: #a2b1ba; + padding: 0; + } + + .ks-layout-header-logo { + width: 340px; + background: url('@/assets/icons/header-logo.png') center / 100% 100%; + box-shadow: none; + text-align: center; + height: 65px; + line-height: 58px; + font-size: 20px; + cursor: pointer; + + a { + color: #a2b1ba; + } + } + + .ks-layout-header-actions { + text-align: center; + //margin-left: -30px; + + & > span { + display: block; + float: left; + height: 60px; + width: 190px; + + &.top { + margin-left: -30px; + line-height: 58px; + margin-top: 3px; + background: url('@/assets/icons/action-top.png') center / 100% 100%; + + &.active { + background: url('@/assets/icons/action-top-active.png') center / 100% 100%; + } + } + + &.bottom { + height: 60px; + line-height: 60px; + margin-top: -2px; + margin-left: -30px; + background: url('@/assets/icons/action-bottom.png') center / 100% 100%; + + &.active { + background: url('@/assets/icons/action-bottom-active.png') center / 100% 100%; + } + } + } + } + + .ks-layout-header-right { + margin-left: auto; + margin-right: 15px; + line-height: 60px; + font-size: 15px; + } + + .ks-layout-body { + background: transparent; + //height: calc(100vh - 60px); + padding: 15px; + transition: all 0.2s, background 0s; + } + } + + .ks-sidebar-workspaces-title { + padding: 10px; + background: #eee; + } + + .ks-sidebar-workspaces-tree { + padding: 10px; + } + + .ks-layout-sidebar { + height: 90vh; + background: #071327de; + transition: all 0.2s, background 0s; + + .ks-layout-sidebar-card { + background: transparent; + border-radius: 0; + border: 0; + transition: all 0.2s, background 0s; + + .ant-card-head { + border: 0; + min-height: 40px; + background: url('@/assets/icons/card-head.png') left / 180% 100%; + padding: 0 10px; + } + + .ant-card-head-title { + color: #a2b1ba; + + & .icon { + background: url('@/assets/icons/list.png') center / 100% 100%; + width: 25px; + height: 25px; + display: block; + } + + & .text { + margin-left: 40px; + font-size: 16px; + color: #eee; + } + } + + .ant-card-body { + padding: 0; + } + } + } + + .ks-sidebar-menu { + border: 0; + border-inline-end: 0 !important; + background: transparent; + color: #a2b1ba; + + .ant-menu-submenu, + .ant-menu-submenu-title, + .ant-menu-item { + margin: 0; + border: 0; + border-radius: 0; + width: 100%; + } + + & > .ant-menu-submenu { + & > .ant-menu-submenu-title { + color: #a2b1ba; + font-size: 16px; + + &:hover { + color: #FFF; + } + } + } + + .ant-menu-submenu-title:hover, + .ant-menu-submenu-title:active, + .ant-menu-item:not(.ant-menu-item-selected):active, + .ant-menu-item-active, + .ant-menu-item-selected { + //background: url('@/assets/icons/bg-menu-active.png') center / 100% 100%; + background: linear-gradient(90deg, #0f4a7c 0%, #0a365b 100%); + background: linear-gradient(359deg, #082f56 1%, #144f88 55%); + transition: all 0.4s; + + & > .ant-menu-submenu-title { + color: #a2b1ba; + + &:hover { + color: #FFF; + } + } + + .ks-menu-item-label:before { + color: #43adea; + content: " "; + width: 6px; + height: 6px; + position: absolute; + background: #43adea; + top: 16px; + left: 30px; + border-radius: 50%; + } + } + + .ant-menu-item-selected, + .ant-menu-item:hover:not(.ant-menu-item-selected):not(.ant-menu-submenu-selected), + .ant-menu-submenu-title:hover:not(.ant-menu-item-selected):not(.ant-menu-submenu-selected) { + color: #fff; + } + + &>.ant-menu-item{ + &>.ant-menu-title-content{ + & > .ks-menu-item-label { + color: #a2b1ba; + font-size: 16px; + &:before{ + display: none; + opacity: 0; + } + } + } + &.ant-menu-item-selected, + &:hover{ + &>.ant-menu-title-content{ + & > .ks-menu-item-label { + color: #fff; + } + } + } + } + + } + + .ks-layout-main { + margin-left: 15px; + transition: all 0.2s, background 0s; + } + + .ks-page-card { + border: 0; + border-radius: 0; + min-height: calc(100vh - 90px); + background: transparent; + background: url('@/assets/icons/bg-fk.png') center / 100% 100%; + + .ant-tabs .ant-tabs-ink-bar { + position: absolute; + background: transparent; + pointer-events: none; + } + + + .ant-steps-horizontal{ + &.ant-steps.ant-steps-navigation .ant-steps-item.ant-steps-item-active::before { + width: 30%; + margin-left: 37%; + display: none; + } + .ant-steps-item-active{ + .ant-steps-item-container{ + &:after{ + height: 1px; + content: ''; + position: absolute; + bottom: 0; + background: #377ead; + display: block; + width: 100px; + } + } + } + + } + + + .ant-card-head { + border: 0; + color: #a2b1ba; + } + + & > .ant-card-head { + height: 40px; + min-height: 40px; + border-radius: 0; + padding: 5px 10px; + } + + & > .ant-card-head { + background: url('@/assets/icons/page-card-head.png') center / 100% 100%; + background: url('@/assets/icons/bg-fk-title.png') center / 100% 100%; + color: #eee; + + .point { + background: url('@/assets/icons/bg-fk-point.png') center / 100% 100%; + width: 25px; + height: 25px; + display: block; + margin-top: 5px; + } + + .text { + margin-top: 5px; + display: block; + font-size: 16px; + } + } + + & > .ant-card-body { + background: url('@/assets/icons/page-card-body.png') center / 100% 100%; + //min-height: 85vh; + } + + } + + .ant-card { + &.ks-pks-card, + &.ks-apps-card{ + //background: url('@/assets/icons/bg-steps-card.png') center / 100% 100%!important; + margin: 0!important; + &> .ant-card-head{ + } + &>.ant-card-body{ + height: 73.1vh; + overflow-x: hidden; + overflow-y: auto; + } + } + } + + + .ks-page-tabs { + .ant-tabs-nav-list { + background: transparent; + //background: url('@/assets/icons/bg-tabs.png') center / 100% 100%; + background: url('@/assets/icons/tab-bg.png') center / 100% 100%; + + .ant-tabs-tab { + padding: 10px 48px; + font-size: 15px; + color: #a2b1ba; + margin: 0; + + &:first-child { + } + + &.ant-tabs-tab-active { + &, .ant-tabs-tab-btn { + color: #fff; + } + } + } + } + + &.ant-tabs-top > .ant-tabs-nav::before, + &.ant-tabs-bottom > .ant-tabs-nav::before, + &.ant-tabs-top > div > .ant-tabs-nav::before, + &.ant-tabs-bottom > div > .ant-tabs-nav::before { + border-bottom: 1px solid #184557; + } + + + .ant-tabs-tabpane { + padding: 15px 0; + } + } + + .btn-link-edit { + color: #3886bc; + } + + .btn-link-delete { + color: #8b8e7a; + } + + .btn-link-detail { + color: #96b3c5; + } + + .ant-table-wrapper { + .ant-table { + background: transparent; + + .ant-table-tbody > tr.ant-table-row-selected > td, + .ant-table-tbody > tr.ant-table-row-selected > td { + background: #4a4e51; + } + + .ant-table-thead { + border-radius: 0; + + & > tr > th, + & > tr > td { + background: #081e3b; + border-bottom: 1px solid #455e72; + color: #a2b1ba; + padding: 10px 8px; + } + + & > tr > th { + border-radius: 0 !important; + border-top: 1px solid #455e72; + } + } + + .ant-table-tbody > tr.ant-table-row:hover > td, + .ant-table-tbody > tr > td.ant-table-cell-row-hover { + background: #143d5ddb; + } + + &:not(.ant-table-bordered) .ant-table-tbody > tr:last-child > td { + border-bottom: 1px solid #455e72; + } + + &:not(.ant-table-bordered) .ant-table-tbody > tr > td { + border-top: 1px solid #455e72; + border-bottom: transparent; + color: #a2b1ba; + } + + .ant-table-thead > tr > th:not(:last-child):not(.ant-table-selection-column):not(.ant-table-row-expand-icon-cell):not([colspan])::before, + .ant-table-thead > tr > td:not(:last-child):not(.ant-table-selection-column):not(.ant-table-row-expand-icon-cell):not([colspan])::before { + background: none; + } + + &.ant-table-bordered { + .ant-table-tbody > tr > td { + border-bottom: 1px solid #243644; + color: #a2b1ba; + } + + & > .ant-table-container { + & > .ant-table-content > table > thead > tr > th, + & > .ant-table-header > table > thead > tr > th, + & > .ant-table-body > table > thead > tr > th, + & > .ant-table-summary > table > thead > tr > th, + & > .ant-table-content > table > tbody > tr > td, + & > .ant-table-header > table > tbody > tr > td, + & > .ant-table-body > table > tbody > tr > td, + & > .ant-table-summary > table > tbody > tr > td, + & > .ant-table-content > table > tfoot > tr > th, + & > .ant-table-header > table > tfoot > tr > th, + & > .ant-table-body > table > tfoot > tr > th, + & > .ant-table-summary > table > tfoot > tr > th, + & > .ant-table-content > table > tfoot > tr > td, + & > .ant-table-header > table > tfoot > tr > td, + & > .ant-table-body > table > tfoot > tr > td, + & > .ant-table-summary > table > tfoot > tr > td { + border-inline-end: 1px solid #243644; + } + } + } + } + } + + //.ks-tabs-btn { + // border-radius: 2px; + // //border-color: #144087; + // //background: linear-gradient(90deg, #0f4a7c 0%, #0a365b 100%); + // border-color: #166094; + // background: linear-gradient(90deg, #3687bc 0%, #074375 100%); + // + // &:hover, + // &:active { + // border-color: #2a5195; + // background: linear-gradient(0deg, #284e91 0, #2c5dad 100%); + // } + //} + + + .ks-page-steps { + color: #1488c2; + + .ant-steps-item-process > .ant-steps-item-container > .ant-steps-item-content > .ant-steps-item-title { + color: #c7bf8a; + } + + .ant-steps-item-process .ant-steps-item-icon { + + } + + .ant-steps-icon { + display: none; + } + + .ant-steps-item-finish, + .ant-steps-item-wait { + .ant-steps-item-icon { + background-color: #0f97cc; + border-color: #0f97cc; + } + + & > .ant-steps-item-container > .ant-steps-item-content > .ant-steps-item-title { + color: #0f97cc; + } + } + + .ant-steps-item-tail::after { + background-color: rgb(15 151 204) !important; + } + + .ant-steps-item-process .ant-steps-item-icon { + background-color: #c7bf8a; + border-color: #c7bf8a; + } + + .ant-steps-item-active { + .ant-steps-item-process .ant-steps-item-icon { + background-color: #c7bf8a; + border-color: #c7bf8a; + } + } + } + + .ks-page-steps-card { + background: transparent; + //border-color: #2c4e79; + border-radius: 0; + border: 0; + background: url('@/assets/icons/bg-steps-card.png') center / 100% 100%; + + } + + .ks-page-steps-item-card { + & > .ant-card-head { + height: 40px; + min-height: 30px; + padding-left: 35px; + } + } + + .ks-workspace-card { + .ant-card { + border: 0; + background: url('@/assets/icons/bg-workspace-card.png') center / 100% 100%; + } + + .ks-card-title-split-icon { + background: url('@/assets/icons/bg-card-title-split.png') center / 100% 100%; + width: 150px; + height: 26px; + position: absolute; + left: 30px; + z-index: 1; + top: 10px; + display: block; + } + + .ks-card-title-split-prefix { + background: url('@/assets/icons/bg-model-builder-card-title.png') center / 100% 100%; + width: 15px; + height: 10px; + display: block; + position: absolute; + left: 12px; + top: 22px; + } + + .ks-card-title-split-title { + z-index: 10; + display: block; + margin-left: 10px; + } + } + + .ks-cards-wrapper { + .ant-card { + background: url('@/assets/icons/bg-card.png') center / 100% 100%; + //background: transparent; + margin-bottom: 15px; + border: 0; + //border-color: #2c4e79; + border-radius: 0; + + & > .ant-card-head { + background: url('@/assets/icons/bg-card-head.png') center / 100% 100%; + } + + .ant-card { + .ant-card-meta-title { + color: #96bbda; + font-size: 16px; + } + + .ant-card-meta-description { + color: #64859d; + } + } + } + + .ks-method-card { + background: url('@/assets/icons/m-bg.png') center / 100% 100%; + cursor: pointer; + margin-bottom: 15px; + .card-select-icon{ + margin-left: auto; + font-size: 20px; + color: #c7bf8a; + right: 14px; + top: 0px; + } + .card-header { + height: 30px; + padding: 0 15px; + span { + color: #96bbda; + margin: 5px; + font-size: 13px; + } + + .title-left { + width: 60px; + height: 10px; + margin-top: 11px; + background: url('@/assets/icons/m-left.png') center / 100% 100%; + } + + .title-right { + width: 60px; + height: 10px; + margin-top: 11px; + background: url('@/assets/icons/m-right.png') center / 100% 100%; + } + } + + .card-body { + padding: 15px 15px; + color: #64859d; + min-height: 100px; + + .card-icon { + width: 40px; + height: 40px; + } + + .card-description { + margin-left: 10px; + color: #96bcda; + } + + } + + &.simulation-card{ + background: none; + border-radius: 2px; + .card-header { + padding: 0 0 0 5px; + height: 30px; + //display: none; + background: linear-gradient(359deg, #082f56 1%, #144f88 55%); + span { + font-size: 12px; + } + } + .card-body{ + min-height: 75px; + padding: 15px 20px; + background: linear-gradient(359deg, #082f56 1%, #144f88 55%); + } + .card-description { + font-size: 13px; + } + .card-select-icon { + top: -3px; + } + } + } + + .ks-card-subtitle { + color: #0fa8cc; + border-bottom: 1px solid #1084a3; + } + } + + .ant-steps { + &.ks-create-step { + + &.ant-steps-navigation .ant-steps-item { + &::after { + width: 20px; + height: 20px; + border-top: 1px solid #377ead; + border-inline-end: 1px solid #377ead; + } + + &::before { + background-color: #377ead; + } + } + + .ant-steps-item-finish > .ant-steps-item-container > .ant-steps-item-content > .ant-steps-item-title, + .ant-steps-item-finish > .ant-steps-item-container > .ant-steps-item-content > .ant-steps-item-description { + color: #2db1e8; + } + + .ant-steps-item-wait .ant-steps-item-icon { + background: #7994a6; + } + + .ant-steps-item-wait .ant-steps-item-icon > .ant-steps-icon { + color: #02162e; + } + + .ant-steps-item-wait > .ant-steps-item-container > .ant-steps-item-content > .ant-steps-item-title, + .ant-steps-item-wait > .ant-steps-item-container > .ant-steps-item-content > .ant-steps-item-description, + .ant-steps-item-process > .ant-steps-item-container > .ant-steps-item-content > .ant-steps-item-title, + .ant-steps-item-process > .ant-steps-item-container > .ant-steps-item-content > .ant-steps-item-description { + color: #758d9b; + } + } + } + + + .ks-sm-card { + &.ant-card { + background: url('@/assets/icons/sm-card.png') center / 100% 100%; + border: 0; + color: #eee; + cursor: pointer; + + &.selected { + background: url('@/assets/icons/sm-card-selected.png') center / 100% 100%; + } + .ks-card-select-icon{ + font-size: 16px; + color: #e6cf69; + } + + .ant-card-head { + height: 30px; + line-height: 30px; + font-size: 14px; + min-height: 30px; + } + + &.card-size-lg{ + .ant-card-head { + height: 60px; + line-height: 50px; + font-size: 14px; + min-height: 40px; + } + .ks-card-select-icon{ + font-size: 26px; + } + } + + } + .plus-icon{ + margin-left: 10px; + font-size: 26px; + color:#1e9adb; + } + } +} + + +.ks-workspace-split-card { + height: 200px; +} + +.ks-workspace-full-card { + height: 415px; + + .ant-card-body { + padding: 30px; + font-size: 18px; + color: #70d3f0; + + p { + margin-bottom: 25px; + } + + span { + width: 160px; + display: block; + float: left; + font-size: 16px; + } + } + + .ks-role-tag{ + border-radius: 30px; + padding: 4px 10px; + background: #4a89d5; + color:#fff; + } +} + +.ks-process-card { + color: #70d3f0; + + .ant-progress .ant-progress-inner { + background-color: #01132c; + } + + p { + margin-bottom: 35px; + line-height: 20px; + } + + span.score { + position: absolute; + top: -13px; + right: 88px; + } + + span.level { + width: 80px; + margin-left: 10px; + } +} + +.icon-action{ + width: 23px; + height: 23px; + display: block; + &.delete { + background: url('@/assets/actions/delete.svg') center / 100% 100%; + } + &.eye { + background: url('@/assets/actions/eye.svg') center / 100% 100%; + width: 22px; + height: 22px; + } + &.pause { + background: url('@/assets/actions/pause.svg') center / 100% 100%; + } + &.start { + background: url('@/assets/actions/start.svg') center / 100% 100%; + } +} + +.bg-wrapper .ks-cards-wrapper .ant-card { + &.ks-pk-card { + border-radius: 2px !important; + background: hsl(219.04deg 83.84% 19.41% / 81%) !important; + cursor: pointer; + border: 1px solid #07265c; + + &:hover { + border-color: #74a3f4; + .pk-overlay { + background: #06265f00; + } + } + + .ant-card-extra{ + position: absolute; + right: 10px; + top: 4px; + } + + .ant-card-extra, + .ant-card-actions { + //border-top: 1px solid #25284b; + //background: #072869; + + & > li:not(:last-child) { + border-inline-end: 1px solid #25284b; + } + + .anticon { + color: #a5a9ca; + width: 18px; + height: 18px; + border: 1px solid #a2b1ba; + padding: 4px; + line-height: 0px; + text-align: center; + border-radius: 50%; + font-size: 14px; + &:hover { + color: #FFF; + } + } + + & > li { + margin: 0; + padding: 4px; + text-align: center; + } + } + + .ant-card-head { + //background: hsl(218.18deg 86.27% 20%) !important; + border-radius: 2px; + height: 30px !important; + min-height: 30px !important; + background: url('@/assets/icons/bg-pk-header.png') center / 100% 100% !important; + padding: 0 10px; + } + + .ant-card-body { + background: hsla(219.04, 83.84%, 19.41%, 0.81); // 半透明底色(可选,叠在背景图下) + height: 130px; + padding: 0; + position: relative; + // 背景图片核心设置:合并简写,避免属性冲突 + background-image: url('@/assets/icons/bg-pk-body.png'); + background-position: center; + background-repeat: no-repeat; + background-size: cover; // 初始覆盖整个容器 + // 关键:隐藏超出边界的部分,裁剪放大的背景图 + overflow: hidden; + // 过渡动画:仅针对背景尺寸,比 all 更高效 + transition: all 2s ease; + } + + &:hover { + .ant-card-body { + //background-size: 120%; + } + } + + .pk-overlay { + position: absolute; + width: 100%; + height: 100%; + background: #07276040; + z-index: 1; + } + + .pk-teams { + //background: url('@/assets/icons/bg-pk.png') center / 100% 100%; + height: 100px; + display: block; + position: relative; + } + + .pk-footer { + position: absolute; + width: 100%; + bottom: 10px; + z-index: 10; + padding: 0 10px; + + .pk-details-btn{ + font-size: 12px; + border-color: #5f718e; + background: linear-gradient(0deg, #000000 0, #1c51a7 100%); + width: 60px; + &.selected, &:not(:disabled):hover, &:hover, &:active { + color: #fff; + border-color: #3d6f93; + background: linear-gradient(90deg, #175e8c 0%, #1577c8 100%); + } + } + + .ant-progress { + margin: 0; + //padding: 0px 25px 0 10px; + + .ant-progress-text { + color: #eee; + } + + .ant-progress-inner { + background-color: #08255c; + } + } + } + + .right-team, + .left-team { + color: #fff; + font-size: 16px; + width: 120px; + margin-top: 12px; + z-index: 10; + } + + .left-team { + background: url('@/assets/icons/bg-pk-left.png') center / 100% 100%; + position: absolute; + left: -10px; + width: 100px; + text-align: right; + padding-right: 10px; + } + + .right-team { + background: url('@/assets/icons/bg-pk-right.png') center / 100% 100%; + position: absolute; + right: -24px; + text-align: left; + padding-left: 10px; + } + } +} + + +.ks-model-builder-body { + + .ks-model-builder-back { + background: url("@/assets/icons/back.png") center / 100% 100%; + z-index: 10; + position: fixed; + width: 50px; + height: 50px; + top: 50px; + cursor: pointer; + } + + .ks-model-builder-left, + .ks-model-builder-right { + height: calc(100vh - 90px); + + .ant-card-body { + padding: 6px; + } + } + + .ks-model-builder-card { + //margin-bottom: 15px; + background: #0b325778; + background: #041f39d9; + border: 0; + color: #eee; + border-radius: 0 !important; + + .ant-card-head { + border-radius: 0; + background: #0b3257; + color: #82c4e9; + border: 0; + height: 35px; + min-height: 35px; + background: url('@/assets/icons/card-head.png') left / 180% 100%; + padding-left: 80px; + } + + .ant-form-item { + margin-bottom: 10px; + } + } + + .ks-model-builder-title-icon { + width: 26px; + height: 26px; + display: block; + position: absolute; + left: 14px; + + &.icon-input { + background: url("@/assets/icons/icon-input.png") center / 100% 100%; + } + + &.icon-grid { + background: url("@/assets/icons/icon-grid.png") center / 100% 100%; + } + + &.icon-list { + background: url("@/assets/icons/icon-list.png") center / 100% 100%; + } + + &.icon-model { + background: url("@/assets/icons/icon-model.png") center / 100% 100%; + } + + &.icon-model-input { + background: url("@/assets/icons/icon-model-input.png") center / 100% 100%; + } + + &.icon-settings { + background: url("@/assets/icons/icon-settings.png") center / 100% 100%; + } + } + + //.ks-model-builder-goback { + // background: url("@/assets/icons/back.png") center / 100% 100%; + // z-index: 10; + // width: 36px; + // height: 36px; + // cursor: pointer; + // padding: 0; + // border: 0; + //} + .ks-model-builder-goback, + .ks-model-builder-save { + z-index: 10; + cursor: pointer; + color: #7ae8fc; + background: transparent; + line-height: 13px; + top: 2px; + border: 1px solid #0d6da2; + border-radius: 5px; + padding: 4px; + min-width: 60px; + height: 25px; + box-shadow: 0px 0px 0px #7dd3f9; + font-size: 13px; + + & > span { + display: block; + float: left; + } + } + + .ks-model-builder-left { + width: 250px; + float: left; + + .ks-model-builder-card { + height: 40vh; + &.algorithm-card{ + height: 32vh; + } + } + .ks-model-builder-body .ks-model-builder-title-icon { + left: 8px; + } + } + + .ks-model-builder-content { + width: calc(100% - 550px); + float: left; + position: relative; + + .ks-model-builder-actions { + display: block; + gap: 8px; + position: absolute; + z-index: 1; + top: 0px; + background: #0f4a7ca8; + width: 100%; + height: 35px; + line-height: 35px; + padding: 0 15px; + } + + + .ks-model-builder-canvas { + //margin: 0 15px; + height: calc(100vh - 90px); + //background: #0b325778 url("@/assets/icons/bg-model-builder-canvas.png") center / 100% 100%; + background: #041b36db; + border-left: 1px solid #062850; + border-right: 1px solid #062850; + width: 100%; + overflow: hidden; + } + } + + .ks-model-builder-right { + width: 300px; + float: left; + margin-left: -1px; + + .observation-items{ + //height: 160px; + height: 212px; + height: 180px; + overflow-x: hidden; + overflow-y: auto; + } + .reward-items{ + height: 44vh; + overflow-x: hidden; + overflow-y: auto; + } + + .ks-model-item{ + font-size:12px; + } + + .ks-model-builder-card { + min-height: 28vh; + } + + .ant-card-head { + padding-left: 100px; + } + + .ant-table-wrapper { + .ant-table { + .ant-table-tbody > tr > td { + font-size: 12px; + } + + .ant-table-thead { + & > tr { + & > td, + & > th { + padding: 6px 8px; + font-size: 12px; + } + } + } + } + } + } + + .ks-model-drag-item { + width: 50%; + text-align: center; + font-size: 12px; + cursor: pointer; + float: left; + padding: 4px; + margin-bottom: 10px; + height: 95px; + + .icon { + width: 50px; + height: 50px; + margin: 0 auto; + display: block; + font-size: 28px; + margin-bottom: 5px; + } + } + + .ks-model-item { + width: 50%; + text-align: center; + padding: 5px; + background: #0c385f; + border: 1px solid #0c385f; + cursor: pointer; + margin-bottom: 15px; + margin-bottom: 5px; + transition: all 0.3s; + position: relative; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + + &.control-item{ + width: 100%; + } + + & > .anticon { + position: absolute; + right: 4px; + top: 3px; + } + + &:hover, + &.selected { + background: #7ed4f9; + color: #1d1a1a; + background: linear-gradient(0deg, rgb(15 74 124) 0, rgb(58 133 210) 100%); + color: #fff; + cursor: pointer; + } + + &.selected-total-item { + background: #0c2949; + border: 1px solid #157dd1; + color: #84c7e8; + margin: 0 auto; + } + } + +} + +.control-container{ + + .control-wrapper{ + width: 32%; + margin-left: 2%; + border-left: 1px solid #0d385f; + padding-left: 5px; + border-radius: 2px; + &:first-child{ + border-left: 0; + } + } + .control-title{ + margin-bottom: 5px; + line-height: 30px; + } + + .ks-model-item{ + width: 50%; + padding-left: 5px; + } +} + +.ks-model-builder-tabs { + .ant-tabs-nav { + background: url(@/assets/icons/card-head.png) left / 180% 100%; + margin: 0; + } + + .ant-tabs-content, + .ant-tabs-tab { + padding: 6px 0; + color: #7abce2; + } + + .ant-tabs-nav-list { + margin-left: 75px; + + } + + &.multiply{ + + .ant-tabs-tab:first-child:after { + position: absolute; + z-index: 1; + transition: opacity 0.3s; + content: '/'; + pointer-events: none; + right: -19px; + line-height: 35px; + height: 35px; + top: 0; + } + } + + &.empty{ + .ant-tabs-content{ + height: 86.4vh!important; + } + .ant-empty{ + margin: 100% auto; + } + } + + .ant-tabs-tab.ant-tabs-tab-active .ant-tabs-tab-btn { + color: #eee; + } + + + .ks-model-builder-title-icon { + position: absolute; + top: 5px; + } + + .ant-tabs-content { + //padding: 15px; + background: #041b36db; + } + + .ant-tabs-content { + padding: 4px; + //height: 40vh; + //height: 36vh; + height: 26.3vh; + overflow: auto; + } + + .ant-select .ant-select-selection-placeholder, .ant-select .ant-select-selection-search-input, + .ant-select:not(.ant-select-customize-input) .ant-select-selector, .ant-input { + background-color: #081e3b; + border-color: #475f71; + color: #a2b1ba; + } + +} + +.ant-select-dropdown { + background-color: #081e3b; +} + + +.icon-gold { + color: #b5b39d; + font-size: 25px; + line-height: 40px; + margin-top: 2px; + cursor: pointer; +} + +.ant-pagination { + .ant-pagination-item-active { + background-color: #081e3b; + border-color: #475f71; + color: #a2b1ba; + } +} + +.ant-form-item { + .ant-form-item-label > label { + color: #adcde0; + } +} + +:deep(.ant-input::placeholder) { + color: rgba(220, 220, 220, 0.7) !important; + opacity: 1 !important; +} + + +.btn-select-template{ + background: transparent!important; + border-color: #1e9adb!important; + color:#1e9adb!important; + min-width: 160px; + .btn-select-template-icon{ + background: url('@/assets/icons/folder.png') center / 100% 100%; + width: 27px; + height: 20px; + } +} + +.ant-input-affix-wrapper, +.ant-table-wrapper .ant-table-tbody > tr.ant-table-placeholder:hover > td, +.ant-input-number, +.ant-select:not(.ant-select-customize-input) .ant-select-selector, +.ant-input { + background-color: #081e3b; + border-color: #475f71; + color: #a2b1ba; + + &::placeholder { + color: rgba(233, 237, 240, 0.6) !important; + opacity: 1 !important; + } +} + +.ant-input-number .ant-input-number-input, +.ant-input-affix-wrapper.ant-input-password input:-webkit-autofill, +.ant-input-affix-wrapper.ant-input-password input:-webkit-autofill:hover, +.ant-input-affix-wrapper.ant-input-password input:-webkit-autofill:focus, +.ant-input-affix-wrapper.ant-input-password input:-webkit-autofill:active, +.ant-table-wrapper .ant-table-tbody > tr.ant-table-placeholder:hover > td:-webkit-autofill, .ant-input-number:-webkit-autofill, .ant-select:not(.ant-select-customize-input) .ant-select-selector:-webkit-autofill, .ant-input:-webkit-autofill, .ant-table-wrapper .ant-table-tbody > tr.ant-table-placeholder:hover > td:-webkit-autofill:hover, .ant-input-number:-webkit-autofill:hover, .ant-select:not(.ant-select-customize-input) .ant-select-selector:-webkit-autofill:hover, .ant-input:-webkit-autofill:hover, .ant-table-wrapper .ant-table-tbody > tr.ant-table-placeholder:hover > td:-webkit-autofill:focus, .ant-input-number:-webkit-autofill:focus, .ant-select:not(.ant-select-customize-input) .ant-select-selector:-webkit-autofill:focus, .ant-input:-webkit-autofill:focus, .ant-table-wrapper .ant-table-tbody > tr.ant-table-placeholder:hover > td:-webkit-autofill:active, .ant-input-number:-webkit-autofill:active, .ant-select:not(.ant-select-customize-input) .ant-select-selector:-webkit-autofill:active, .ant-input:-webkit-autofill:active { + /* 背景色设置为暗黑模式的背景色 */ + -webkit-box-shadow: 0 0 0 100px #081e3b inset !important; + /* 文字颜色设置为白色 */ + -webkit-text-fill-color: #a2b1ba !important; + /* 保留透明的背景色,让 box-shadow 生效 */ + background-color: #081e3b !important; +} + +.ant-input-affix-wrapper .anticon.ant-input-password-icon { + color: rgb(245 225 225 / 45%); +} + +.ant-empty-normal{ + color: #adcde0 +} +.ant-input-number{ + .ant-input-number-input { + color: #adcde0 + } +} + +.ant-select { + &:not(.ant-select-customize-input) .ant-select-selector { + + } + .ant-select-selector{ + border-radius: 2px; + } + + + .ant-select-selection-placeholder, + .ant-select-selection-search-input { + border-radius: 2px; + background-color: #081e3b; + border-color: #475f71; + color: #a2b1ba; + opacity: 1 !important; + + .ant-select-selection-placeholder, + &::placeholder { + color: rgba(233, 237, 240, 0.6) !important; + opacity: 1 !important; + } + } + + .ant-select-arrow { + color: rgba(233, 237, 240, 0.6) !important; + } +} + +.ant-empty-small { + margin-block: 8px; + color: rgb(207 207 207 / 66%); +} +.ant-btn >span { + display: inline-block; + float: inherit; +} + +.ant-btn, +.ant-input { + border-radius: 2px; +} + +.ant-btn-primary { + color: #eee; + //border-color: #1b5b7d; + //background: linear-gradient(90deg, #1e4c65 0%, #0b3a62 100%); + border-color: #29759c; + background: linear-gradient(0deg, #0f374c 0, #154c69 100%); + &.selected, + &:not(:disabled):hover, + &:hover, + &:active { + border-color: #166094; + background: linear-gradient(90deg, #3687bc 0%, #074375 100%); + color: #fff; + } +} + +.ant-btn-default { + color: #eee; + //border-color: #144087; + //background: linear-gradient(90deg, #0f4a7c 0%, #0a365b 100%); + border-color: #1c468b; + background: linear-gradient(0deg, #284e91 0, #2c5dad 100%); + background: linear-gradient(0deg, #14223b 0, #1c468b 100%); + &.selected, + &:not(:disabled):hover, + &:hover, + &:active { + color: #fff; + border-color: #166094; + background: linear-gradient(90deg, #3687bc 0%, #074375 100%); + } + &:disabled, + &.disabled{ + color: #a9a3a3; + &:hover{ + color:#eee; + } + } +} + +.btn-field { + min-width: 120px; + background: #5796b2; + text-align: center; + cursor: pointer; + border-radius: 2px; + color: #fff; + padding: 5px; + border: 1px solid #5796b2; + + .anticon { + margin-left: 10px; + } + + &:hover, + &.selected { + background: #19b0ff; + border-color: #19b0ff; + } + + &.gold { + background: transparent; + border-color: #b5b39d; + color: #b5b39d; + cursor: pointer; + } +} + +.ant-select-selection-item, +.ant-select-dropdown .ant-select-item, +.ant-select-dropdown { + background-color: #081e3b; + color: #a2b1ba!important; +} +.ant-select-dropdown .ant-select-item-option-selected, +.ant-select-dropdown .ant-select-item-option-selected:not(.ant-select-item-option-disabled){ + color: rgb(187 185 185 / 88%); + font-weight: 600; + background-color: #475f71; +} + +.ant-modal { + + background: url('@/assets/icons/bg-modal.png') center / 100% 100%; + + .ant-modal-header{ + margin: 0; + padding-left: 15px; + } + + .ant-modal-header, + .ant-modal-content { + background: transparent; + } + + .ant-modal-title { + color: rgb(173 206 224); + } + + .ant-modal-close-x { + .anticon { + margin-top: 3px; + border: 1px solid #10e5ff; + border-radius: 50%; + padding: 3px; + color: #10e5ff; + } + } + + .ant-modal-content{ + } + .ant-modal-body{ + padding: 15px; + } +} + +.ant-radio-wrapper .ant-radio-inner { + background-color: #081e3b; + border-color: #737373; +} + +.ant-message-notice .ant-message-notice-content { + background: #464545; + color: #fff; +} + +.ant-tooltip .ant-tooltip-inner, +.ant-tooltip .ant-tooltip-arrow:before, +.ant-popover .ant-popover-arrow:before, +.ant-popover .ant-popover-inner{ + background-color: #00294b; +} +.ant-popconfirm .ant-popconfirm-message { + color: rgb(255 255 255 / 88%); +} + +.ant-dropdown .ant-dropdown-menu, +.ant-dropdown-menu-submenu .ant-dropdown-menu { + background-color: #475f71; + min-width: 120px; + border-radius: 3px; + padding: 0; +} + +.ant-dropdown .ant-dropdown-menu .ant-dropdown-menu-item, +.ant-dropdown-menu-submenu .ant-dropdown-menu .ant-dropdown-menu-item, +.ant-dropdown .ant-dropdown-menu .ant-dropdown-menu-submenu-title, +.ant-dropdown-menu-submenu .ant-dropdown-menu .ant-dropdown-menu-submenu-title { + color: rgb(255 248 248 / 88%); +} + +.ant-input-disabled, +.ant-input[disabled] { + background-color: rgba(0, 0, 0, 0.04); + border-color: #2c2a2a; + color: #a2b1ba; + &:hover{ + border-color: #3a547b; + border-inline-end-width: 1px; + } +} +.ant-select:not(.ant-select-customize-input) .ant-select-selector{ + border: 1px solid #2c2a2a; +} +.ant-select .ant-select-selection-placeholder, +.ant-select .ant-select-selection-search-input{ + background: transparent +} +.ant-select-disabled{ + .ant-select-selection-item{ + background: transparent!important; + } +} + +.ant-input-number{ + border-radius: 2px; +} + +.ant-input-search >.ant-input-group >.ant-input-group-addon:last-child .ant-input-search-button:not(.ant-btn-primary) { + color: rgb(255 255 255 / 45%); +} + +.ant-slider .ant-slider-rail { + background-color: rgb(42 73 134 / 60%)!important; +} + +.ant-popover .ant-popover-inner-content { + color: #a2b1ba; + min-width: 180px; +} \ No newline at end of file diff --git a/modeler/src/tailwind.ts b/modeler/src/tailwind.ts new file mode 100644 index 0000000..c904a5d --- /dev/null +++ b/modeler/src/tailwind.ts @@ -0,0 +1,45 @@ +/* + * This file is part of the kernelstudio package. + * + * (c) 2014-2025 zlin + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +import colors from 'tailwindcss/colors' +import plugin from 'tailwindcss/plugin' +import selectorParser from 'postcss-selector-parser' + +/** @type {import('tailwindcss').Config} */ +export default { + darkMode: 'class', + content: [ + "./**/*.{vue,js,ts,jsx,tsx}", + ], + theme: { + extend: { + colors: { + ...colors, + primary: { + light: '#e744ba', + dark: '#000' + } + }, + }, + }, + plugins: [ + plugin(function ({addVariant, prefix}: any) { + addVariant('dark', ({modifySelectors, separator}: any) => { + modifySelectors(({selector}: any) => { + return selectorParser((selectors) => { + selectors.walkClasses((sel) => { + sel.value = `dark${separator}${sel.value}` + sel.parent?.insertBefore(sel, selectorParser().astSync(prefix('.dark-mode '))) + }) + }).processSync(selector) + }) + }) + }) + ], +} diff --git a/modeler/src/types/core.ts b/modeler/src/types/core.ts new file mode 100644 index 0000000..91282f9 --- /dev/null +++ b/modeler/src/types/core.ts @@ -0,0 +1,36 @@ +/* + * This file is part of the kernelstudio package. + * + * (c) 2014-2025 zlin + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +export type NullableString = null | string + +// 定义后端响应数据的通用接口 +export interface BasicResponse { + code: number; + msg: NullableString; + + [key: string]: unknown; +} + +export interface ApiDataResponse extends BasicResponse { + code: number; + msg: NullableString; + data: T; + + [key: string]: unknown; +} + + +export interface PageableResponse extends BasicResponse { + code: number; + msg: NullableString; + total: number; + rows: T[]; + + [key: string]: unknown; +} diff --git a/modeler/src/types/index.ts b/modeler/src/types/index.ts new file mode 100644 index 0000000..2ee17a6 --- /dev/null +++ b/modeler/src/types/index.ts @@ -0,0 +1,11 @@ +/* + * This file is part of the kernelstudio package. + * + * (c) 2014-2025 zlin + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +export * from './core' +export * from './user' \ No newline at end of file diff --git a/modeler/src/types/user.ts b/modeler/src/types/user.ts new file mode 100644 index 0000000..a5ef007 --- /dev/null +++ b/modeler/src/types/user.ts @@ -0,0 +1,39 @@ +/* + * This file is part of the kernelstudio package. + * + * (c) 2014-2025 zlin + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ +import type { BasicResponse } from './core'; + +export interface UserLoginForm { + username: string; + password: string; + + [key: string]: unknown; +} + +export interface UserLoginResult extends BasicResponse { + token: string; + + [key: string]: unknown; +} + +export interface SessionUser { + userId: number; + userName: string | null; + avatar: string | null; + + [key: string]: unknown; +} + +export interface UserSessionResult extends BasicResponse { + + user: SessionUser; + roles: string[]; + permissions: string[]; + + [key: string]: unknown; +} diff --git a/modeler/src/utils/datetime.ts b/modeler/src/utils/datetime.ts new file mode 100644 index 0000000..a846de6 --- /dev/null +++ b/modeler/src/utils/datetime.ts @@ -0,0 +1,23 @@ +/* + * This file is part of the kernelstudio package. + * + * (c) 2014-2025 zlin + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + + +export const formatDatetime = (date: Date): string => { + // 获取年、月、日 + const year = date.getFullYear(); + // 月份是0开始的,需要+1,并且补0(保证两位数) + const month = (date.getMonth() + 1).toString().padStart(2, '0'); + const day = date.getDate().toString().padStart(2, '0'); + // 获取时、分、秒 + const hours = date.getHours().toString().padStart(2, '0'); + const minutes = date.getMinutes().toString().padStart(2, '0'); + const seconds = date.getSeconds().toString().padStart(2, '0'); + // 拼接成目标格式 + return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`; +}; \ No newline at end of file diff --git a/modeler/src/utils/event.ts b/modeler/src/utils/event.ts new file mode 100644 index 0000000..abb89e3 --- /dev/null +++ b/modeler/src/utils/event.ts @@ -0,0 +1,70 @@ +/* + * This file is part of the kernelstudio package. + * + * (c) 2014-2025 zlin + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +export class EventError { + code: number; + status: number; + message: string | null; + stack: string | null; + + constructor(code = 500, status = 500, message: string | null = null, stack: string | null = null) { + this.code = code; + this.status = status; + this.message = message; + this.stack = stack; + } +} + +export class EventListener { + + private readonly _listeners: Record; + + constructor(listeners: Record = {}) { + this._listeners = listeners; + } + + all(): Record { + return {...this._listeners}; // 返回副本,避免外部直接修改 + } + + has(name: string): boolean { + return Array.isArray(this._listeners[name]) && this._listeners[name].length > 0; + } + + on(name: string, fn: Function): void { + if (!Array.isArray(this._listeners[name])) { + this._listeners[name] = []; + } + this._listeners[name].push(fn); + } + + off(name: string): void { + delete this._listeners[name]; + } + + emit(name: string, options?: any): void { + const listeners = this._listeners[name]; + if (Array.isArray(listeners)) { + // 复制一份避免在执行中修改数组导致问题 + [...listeners].forEach(f => f(options)); + } + } +} + +export const safePreventDefault = (event: any) => { + if (event && typeof event.preventDefault === 'function') { + event.preventDefault(); + } +} + +export const safeStopPropagation = (event: any) => { + if (event && typeof event.stopPropagation === 'function') { + event.stopPropagation(); + } +} \ No newline at end of file diff --git a/modeler/src/utils/request.ts b/modeler/src/utils/request.ts new file mode 100644 index 0000000..1184520 --- /dev/null +++ b/modeler/src/utils/request.ts @@ -0,0 +1,338 @@ +/* + * This file is part of the kernelstudio package. + * + * (c) 2014-2025 zlin + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +import axios, { type AxiosError, type AxiosInstance, type AxiosRequestConfig, type AxiosResponse } from 'axios'; +import { message, notification } from 'ant-design-vue'; +import { getToken } from './token'; +import type { BasicResponse } from '@/types'; + +// 扩展Axios请求配置,添加自定义的showMessage属性 +export interface CustomAxiosRequestConfig extends AxiosRequestConfig { + showMessage?: boolean; +} + +/** + * 消息提示工具 + * 根据内容长度自动选择使用message(短内容)或notification(长内容) + * @param success - 是否为成功状态 + * @param content - 消息内容 + * @param title - 消息标题(仅长内容时显示),默认值为'消息提示' + */ +export const showMessage = ( + success: boolean, + content: string, + title: string = '消息提示', +): void => { + if (!content) return; + + const type: 'success' | 'error' = success ? 'success' : 'error'; + + if (content.length > 40) { + notification[type]({ + message: title, + description: content, + }); + } else { + message[type](content); + } +}; + +/** + * 处理响应后的消息通知 + * @param response - Axios响应对象 + * @returns 原响应对象 + */ +export const handleResponseNotification = ( + response: AxiosResponse, +): AxiosResponse => { + const { config, data } = response; + // 当配置允许显示且有消息时展示 + if (data.msg && (config as CustomAxiosRequestConfig).showMessage && data.code !== 200) { + showMessage(false, data.msg); + } + + return response; // 返回完整响应对象而非仅数据 +}; + +/** + * 处理请求出错后的逻辑 + * @param error - Axios错误对象 + * @returns 拒绝的Promise + */ +export const errorOnRequest = (error: AxiosError): Promise => { + const response = error.response; + + if (!response) { + showMessage(false, '网络错误'); + } else { + const { status, data } = response; + const errorData = data; + + if (status === 500 || (errorData && errorData.code === 500)) { + showMessage(false, errorData?.msg || '服务器出现错误.'); + } else if (status === 403 || (errorData && errorData.code === 403)) { + showMessage(false, '无权限访问.'); + } else if (status === 401 || (errorData && errorData.code === 401)) { + showMessage(false, '请认证后访问.'); + } else if (status === 400 || (errorData && errorData.code === 400)) { + showMessage(false, '请求错误.'); + } else if (errorData && errorData.msg) { + const isSuccess = errorData.success ?? false; + if (!isSuccess) { + showMessage(false, errorData.msg); + } + } + } + return Promise.reject(error); +}; + +/** + * 构建请求头 + * @param defaults - 默认请求头 + * @param needToken - 是否需要携带token,默认true + * @returns 构建后的请求头 + */ +export const buildRequestHeaders = ( + defaults: Record = {}, + needToken: boolean = true, +): Record => { + const headers = { ...defaults }; + const token = getToken(); + if (token && needToken) { + headers['Authorization'] = 'Bearer ' + token; + } + return headers; +}; + +/** + * HTTP请求客户端类,封装Axios实现各类HTTP请求 + */ +export class HttpRequestClient { + private client: AxiosInstance; + + constructor(client: AxiosInstance) { + this.client = client; + } + + /** + * 创建Axios实例 + * @param config - 自定义请求配置 + * @param addDefaultInterceptors - 是否添加默认拦截器,默认为true + * @returns Axios实例 + */ + static build( + config: CustomAxiosRequestConfig = {}, + addDefaultInterceptors: boolean = true, + ): AxiosInstance { + // 基础请求头 + const headers = buildRequestHeaders({ + 'X-Requested-With': 'XMLHttpRequest', + }); + + // 创建Axios实例 - 移除了不支持的crossDomain配置 + const axiosInstance = axios.create({ + timeout: 60000, + withCredentials: true, + responseType: 'json', + headers, + data: {}, + ...config, // 合并用户配置(用户配置优先级更高) + }); + + // 添加默认拦截器 + if (addDefaultInterceptors) { + axiosInstance.interceptors.response.use( + (response: AxiosResponse) => handleResponseNotification(response), + (error: AxiosError) => errorOnRequest(error), + ); + } + + return axiosInstance; + } + + /** + * 创建HttpRequestClient实例 + * @param config - 自定义请求配置 + * @param addDefaultInterceptors - 是否添加默认拦截器,默认为true + * @returns HttpRequestClient实例 + */ + static create( + config: CustomAxiosRequestConfig = {}, + addDefaultInterceptors: boolean = true, + ): HttpRequestClient { + const axiosInstance = this.build(config, addDefaultInterceptors); + return new HttpRequestClient(axiosInstance); + } + + /** + * JSON格式POST请求 + * @param url - 请求URL + * @param data - 请求数据 + * @param config - 自定义请求配置 + * @returns 响应数据Promise + */ + postJson( + url: string, + data: Record = {}, + config: CustomAxiosRequestConfig = {}, + ): Promise { + const requestConfig: CustomAxiosRequestConfig = { + url, + method: 'POST', + data, + headers: buildRequestHeaders({ + 'Content-Type': 'application/json;charset=utf-8', + 'Accept': 'application/json', + }), + transformRequest: [(data) => JSON.stringify(data)], + ...config, + }; + + return this.client(requestConfig).then(response => response.data); + } + + /** + * 表单格式POST请求 + * @param url - 请求URL + * @param data - 请求数据(键值对) + * @param config - 自定义请求配置 + * @returns 响应数据Promise + */ + post( + url: string, + data: Record = {}, + config: CustomAxiosRequestConfig = {}, + ): Promise { + const requestConfig: CustomAxiosRequestConfig = { + url, + method: 'POST', + data, + headers: buildRequestHeaders({ + 'Content-Type': 'application/x-www-form-urlencoded', + }), + ...config, + }; + + return this.client(requestConfig).then(response => response.data); + } + + /** + * GET请求 + * @param url - 请求URL + * @param params - URL参数 + * @param config - 自定义请求配置 + * @returns 响应数据Promise + */ + get( + url: string, + params: Record = {}, + config: CustomAxiosRequestConfig = {}, + ): Promise { + const requestConfig: CustomAxiosRequestConfig = { + url, + method: 'GET', + params, + headers: buildRequestHeaders({}), + ...config, + }; + + return this.client(requestConfig).then(response => response.data); + } + + /** + * DELETE请求 + * @param url - 请求URL + * @param params - URL参数 + * @param config - 自定义请求配置 + * @returns 响应数据Promise + */ + delete( + url: string, + params: Record = {}, + config: CustomAxiosRequestConfig = {}, + ): Promise { + const requestConfig: CustomAxiosRequestConfig = { + url, + method: 'DELETE', + params, + headers: buildRequestHeaders({}), + ...config, + }; + + return this.client(requestConfig).then(response => response.data); + } + + /** + * JSON格式PUT请求 + * @param url - 请求URL + * @param data - 请求数据 + * @param config - 自定义请求配置 + * @returns 响应数据Promise + */ + putJson( + url: string, + data: Record = {}, + config: CustomAxiosRequestConfig = {}, + ): Promise { + const requestConfig: CustomAxiosRequestConfig = { + url, + method: 'PUT', + data, + headers: buildRequestHeaders({ + 'Content-Type': 'application/json;charset=utf-8', + 'Accept': 'application/json', + }), + transformRequest: [(data) => JSON.stringify(data)], + ...config, + }; + + return this.client(requestConfig).then(response => response.data); + } + + /** + * 表单格式PUT请求 + * @param url - 请求URL + * @param data - 请求数据(键值对) + * @param config - 自定义请求配置 + * @returns 响应数据Promise + */ + put( + url: string, + data: Record = {}, + config: CustomAxiosRequestConfig = {}, + ): Promise { + const requestConfig: CustomAxiosRequestConfig = { + url, + method: 'PUT', + data, + headers: buildRequestHeaders({ + 'Content-Type': 'application/x-www-form-urlencoded', + }), + ...config, + }; + + return this.client(requestConfig).then(response => response.data); + } +} + +/** + * 原始请求(无基础URL,不添加额外前缀) + */ +export const originalAxios: AxiosInstance = HttpRequestClient.build(); +export const originalRequest: HttpRequestClient = new HttpRequestClient(originalAxios); + +/** + * 通用请求(带基础URL) + */ +export const generalAxios: AxiosInstance = HttpRequestClient.build({ + baseURL: '/api', +}); +export const request: HttpRequestClient = new HttpRequestClient(generalAxios); + +export default request; \ No newline at end of file diff --git a/modeler/src/utils/strings.ts b/modeler/src/utils/strings.ts new file mode 100644 index 0000000..c6f9f44 --- /dev/null +++ b/modeler/src/utils/strings.ts @@ -0,0 +1,13 @@ +/* + * This file is part of the kernelstudio package. + * + * (c) 2014-2025 zlin + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +export const generateKey = (type: string | null = ''): string => { + return `${type ? (type + '_') : ''}${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}` + .replace('-', '_').toLowerCase(); +}; \ No newline at end of file diff --git a/modeler/src/utils/token.ts b/modeler/src/utils/token.ts new file mode 100644 index 0000000..bd80ee1 --- /dev/null +++ b/modeler/src/utils/token.ts @@ -0,0 +1,25 @@ +/* + * This file is part of the kernelstudio package. + * + * (c) 2014-2025 zlin + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +import Cookies from 'js-cookie'; +import type { NullableString } from '@/types'; + +const TokenKey = 'Admin-Token'; + +export const getToken = (): NullableString => { + return Cookies.get(TokenKey) as NullableString; +}; + +export const setToken = (token: string): void => { + Cookies.set(TokenKey, token); +}; + +export const removeToken = (): void => { + Cookies.remove(TokenKey); +}; diff --git a/modeler/src/views/ai/api.ts b/modeler/src/views/ai/api.ts new file mode 100644 index 0000000..7c66d8e --- /dev/null +++ b/modeler/src/views/ai/api.ts @@ -0,0 +1,22 @@ +/* + * This file is part of the kernelstudio package. + * + * (c) 2014-2025 zlin + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +import request from '@/utils/request'; +import type { DeductionTestResponse, FinderBrowserResult } from './types'; +import type { NullableString } from '@/types'; + +export const findFinderBrowser = (path: NullableString): Promise => { + return request.post('/finder/browser', { + path: path, + }); +}; + +export const startDeduction = (): Promise => { + return request.postJson('/deductionTest/startDeduction', {}); +}; \ No newline at end of file diff --git a/modeler/src/views/ai/applications/api.ts b/modeler/src/views/ai/applications/api.ts new file mode 100644 index 0000000..823ce5a --- /dev/null +++ b/modeler/src/views/ai/applications/api.ts @@ -0,0 +1,36 @@ +/* + * This file is part of the kernelstudio package. + * + * (c) 2014-2025 zlin + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +import request from '@/utils/request'; +import type { DeductionPodResult, ModelDeduction, ModelDeductionDataResponse, ModelDeductionDetailsResponse, ModelDeductionPodStatusResponse } from './types'; +import type { BasicResponse } from '@/types'; + +export const findDeductionPodResult = (query: Record = { pageSize: 1000 }): Promise => { + return request.get('/deductionPodInfo/listAll', query); +}; + +export const createModelDeduction = (deduction: Partial): Promise => { + return request.postJson('/deductionPodInfo/add', deduction); +}; + +export const deleteModelDeduction = (id: number): Promise => { + return request.delete(`/deductionPodInfo/${id}`); +}; + +export const findOneModelDeductionDetails = (id: number): Promise => { + return request.get(`/deductionPodInfo/${id}`); +} + +export const findChartsDataById = (id: number): Promise => { + return request.get(`/deductionPodData/listByPodId/${id}`); +}; + +export const runDeductionPodAfsimControl = (data: any): Promise => { + return request.postJson(`/deductionPodInfo/afsimControl`, data); +}; \ No newline at end of file diff --git a/modeler/src/views/ai/applications/charts/area-options.ts b/modeler/src/views/ai/applications/charts/area-options.ts new file mode 100644 index 0000000..f5d6aab --- /dev/null +++ b/modeler/src/views/ai/applications/charts/area-options.ts @@ -0,0 +1,117 @@ +/* + * This file is part of the kernelstudio package. + * + * (c) 2014-2026 zlin + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +import { xAxisConfig } from './config'; +import * as echarts from 'echarts'; +import type { ChartOption } from './types'; + +export const createAreaChartOption = (options: ChartOption) => { + let blueName = options.blueName ?? '蓝方'; + let redName = options.redName ?? '红方'; + + return { + title: { + text: options.title, + textStyle: { + color: '#eee', + fontSize: 16, + }, + }, + tooltip: { + trigger: 'axis', + textStyle: { + color: '#999', + }, + }, + grid: { + left: '1%', + right: '5%', + bottom: '15%', + containLabel: true, + }, + legend: { + data: [blueName, redName], + textStyle: { + color: '#ddd', + fontSize: 14, + }, + }, + xAxis: { + type: 'category', + data: options.xAxisData, + boundaryGap: [0.1, 0.1], + ...xAxisConfig, + }, + yAxis: { + type: 'value', + boundaryGap: [0, 0.1], + ...xAxisConfig, + }, + series: [ + { + name: blueName, + data: options.blueData, + type: 'line', + areaStyle: { + opacity: 0.8, + color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [ + { + offset: 0, + color: '#0f86d7', + }, + { + offset: 1, + color: '#0f1e48cc', + }, + ]), + }, + itemStyle: { + color: '#409EFF', // 轮数1整体颜色 + }, + label: { + show: false, // 开启数值显示 + position: 'top', // 数值显示在柱子顶部(可选:top/inside/outside/bottom等) + textStyle: { + color: '#eee', // 数值文字颜色 + fontSize: 12, // 数值文字大小 + }, + }, + }, + { + name: redName, + data: options.redData, + type: 'line', + areaStyle: { + opacity: 0.8, + color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [ + { + offset: 0, + color: '#dc5959', + }, + { + offset: 1, + color: '#bc1f1f', + }, + ]), + }, + itemStyle: { + color: '#bc1f1f', // 轮数2整体颜色 + }, + label: { + show: false, // 开启数值显示 + position: 'top', // 数值显示在柱子顶部(可选:top/inside/outside/bottom等) + textStyle: { + color: '#eee', // 数值文字颜色 + fontSize: 12, // 数值文字大小 + }, + }, + }, + ], + }; +}; \ No newline at end of file diff --git a/modeler/src/views/ai/applications/charts/bar-options.ts b/modeler/src/views/ai/applications/charts/bar-options.ts new file mode 100644 index 0000000..9d6c304 --- /dev/null +++ b/modeler/src/views/ai/applications/charts/bar-options.ts @@ -0,0 +1,96 @@ +/* + * This file is part of the kernelstudio package. + * + * (c) 2014-2026 zlin + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +import { getVerticalGradient, xAxisConfig } from './config'; +import type { ChartOption } from './types'; + +export const createBarChartOption = (options: ChartOption) => { + let blueName = options.blueName ?? '蓝方'; + let redName = options.redName ?? '红方'; + + return { + title: { + text: options.title, + textStyle: { + color: '#eee', + fontSize: 16 + } + }, + tooltip: { + trigger: 'axis', + textStyle: { + color: '#999' + } + }, + grid: { + left: '1%', + right: '5%', + bottom: '15%', + containLabel: true + }, + legend: { + data: [blueName, redName], + textStyle: { + color: '#ddd', + fontSize: 14 + } + }, + xAxis: { + type: 'category', + data: options.xAxisData, + boundaryGap: [0.1, 0.1], + ...xAxisConfig + }, + yAxis: { + type: 'value', + boundaryGap: [0.1, 0.5], + ...xAxisConfig + }, + series: [ + { + name: blueName, + data: options.blueData, + type: 'bar', + barWidth: '20%', + barGap: '10%', + barCategoryGap: '30%', + itemStyle: { + color: getVerticalGradient('#409EFF', '#87CEFA') + }, + label: { + show: false, // 开启数值显示 + position: 'top', // 数值显示在柱子顶部(可选:top/inside/outside/bottom等) + textStyle: { + color: '#eee', // 数值文字颜色 + fontSize: 12 // 数值文字大小 + } + } + }, + { + name: redName, + data: options.redData, + type: 'bar', + barWidth: '20%', + barGap: '10%', + barCategoryGap: '30%', + itemStyle: { + color: getVerticalGradient('#bc1f1f', '#e67e7e') + }, + label: { + show: false, // 开启数值显示 + position: 'top', // 数值显示在柱子顶部(可选:top/inside/outside/bottom等) + textStyle: { + color: '#eee', // 数值文字颜色 + fontSize: 12 // 数值文字大小 + } + } + } + ] + }; +}; \ No newline at end of file diff --git a/modeler/src/views/ai/applications/charts/charts-001.vue b/modeler/src/views/ai/applications/charts/charts-001.vue new file mode 100644 index 0000000..f2979f4 --- /dev/null +++ b/modeler/src/views/ai/applications/charts/charts-001.vue @@ -0,0 +1,77 @@ + + + diff --git a/modeler/src/views/ai/applications/charts/charts-002-1.vue b/modeler/src/views/ai/applications/charts/charts-002-1.vue new file mode 100644 index 0000000..fde0054 --- /dev/null +++ b/modeler/src/views/ai/applications/charts/charts-002-1.vue @@ -0,0 +1,97 @@ + + + diff --git a/modeler/src/views/ai/applications/charts/charts-002-2.vue b/modeler/src/views/ai/applications/charts/charts-002-2.vue new file mode 100644 index 0000000..003c21a --- /dev/null +++ b/modeler/src/views/ai/applications/charts/charts-002-2.vue @@ -0,0 +1,94 @@ + + + diff --git a/modeler/src/views/ai/applications/charts/charts-002-3.vue b/modeler/src/views/ai/applications/charts/charts-002-3.vue new file mode 100644 index 0000000..de4de83 --- /dev/null +++ b/modeler/src/views/ai/applications/charts/charts-002-3.vue @@ -0,0 +1,94 @@ + + + diff --git a/modeler/src/views/ai/applications/charts/charts-002-4.vue b/modeler/src/views/ai/applications/charts/charts-002-4.vue new file mode 100644 index 0000000..4ccecf3 --- /dev/null +++ b/modeler/src/views/ai/applications/charts/charts-002-4.vue @@ -0,0 +1,94 @@ + + + diff --git a/modeler/src/views/ai/applications/charts/charts-002.vue b/modeler/src/views/ai/applications/charts/charts-002.vue new file mode 100644 index 0000000..878632e --- /dev/null +++ b/modeler/src/views/ai/applications/charts/charts-002.vue @@ -0,0 +1,72 @@ + + + diff --git a/modeler/src/views/ai/applications/charts/charts-003.vue b/modeler/src/views/ai/applications/charts/charts-003.vue new file mode 100644 index 0000000..1ac7c18 --- /dev/null +++ b/modeler/src/views/ai/applications/charts/charts-003.vue @@ -0,0 +1,72 @@ + + + diff --git a/modeler/src/views/ai/applications/charts/charts-004.vue b/modeler/src/views/ai/applications/charts/charts-004.vue new file mode 100644 index 0000000..87263bc --- /dev/null +++ b/modeler/src/views/ai/applications/charts/charts-004.vue @@ -0,0 +1,73 @@ + + + diff --git a/modeler/src/views/ai/applications/charts/charts-005.vue b/modeler/src/views/ai/applications/charts/charts-005.vue new file mode 100644 index 0000000..431bb05 --- /dev/null +++ b/modeler/src/views/ai/applications/charts/charts-005.vue @@ -0,0 +1,72 @@ + + + diff --git a/modeler/src/views/ai/applications/charts/charts-006-impl.vue b/modeler/src/views/ai/applications/charts/charts-006-impl.vue new file mode 100644 index 0000000..af5f46c --- /dev/null +++ b/modeler/src/views/ai/applications/charts/charts-006-impl.vue @@ -0,0 +1,74 @@ + + + + + diff --git a/modeler/src/views/ai/applications/charts/charts-006.vue b/modeler/src/views/ai/applications/charts/charts-006.vue new file mode 100644 index 0000000..719d9d0 --- /dev/null +++ b/modeler/src/views/ai/applications/charts/charts-006.vue @@ -0,0 +1,84 @@ + + + + + diff --git a/modeler/src/views/ai/applications/charts/charts-007.vue b/modeler/src/views/ai/applications/charts/charts-007.vue new file mode 100644 index 0000000..f91e205 --- /dev/null +++ b/modeler/src/views/ai/applications/charts/charts-007.vue @@ -0,0 +1,77 @@ + + + diff --git a/modeler/src/views/ai/applications/charts/charts-008.vue b/modeler/src/views/ai/applications/charts/charts-008.vue new file mode 100644 index 0000000..6ac9f41 --- /dev/null +++ b/modeler/src/views/ai/applications/charts/charts-008.vue @@ -0,0 +1,72 @@ + + + diff --git a/modeler/src/views/ai/applications/charts/charts-009-impl.vue b/modeler/src/views/ai/applications/charts/charts-009-impl.vue new file mode 100644 index 0000000..30ec062 --- /dev/null +++ b/modeler/src/views/ai/applications/charts/charts-009-impl.vue @@ -0,0 +1,74 @@ + + + + + diff --git a/modeler/src/views/ai/applications/charts/charts-009.vue b/modeler/src/views/ai/applications/charts/charts-009.vue new file mode 100644 index 0000000..4697aef --- /dev/null +++ b/modeler/src/views/ai/applications/charts/charts-009.vue @@ -0,0 +1,97 @@ + + + + + + diff --git a/modeler/src/views/ai/applications/charts/charts-blue.vue b/modeler/src/views/ai/applications/charts/charts-blue.vue new file mode 100644 index 0000000..df6c519 --- /dev/null +++ b/modeler/src/views/ai/applications/charts/charts-blue.vue @@ -0,0 +1,87 @@ + + + \ No newline at end of file diff --git a/modeler/src/views/ai/applications/charts/charts-modal.vue b/modeler/src/views/ai/applications/charts/charts-modal.vue new file mode 100644 index 0000000..b94da01 --- /dev/null +++ b/modeler/src/views/ai/applications/charts/charts-modal.vue @@ -0,0 +1,246 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modeler/src/views/ai/applications/charts/charts-red.vue b/modeler/src/views/ai/applications/charts/charts-red.vue new file mode 100644 index 0000000..85d8515 --- /dev/null +++ b/modeler/src/views/ai/applications/charts/charts-red.vue @@ -0,0 +1,87 @@ + + + \ No newline at end of file diff --git a/modeler/src/views/ai/applications/charts/charts.vue b/modeler/src/views/ai/applications/charts/charts.vue new file mode 100644 index 0000000..1fd7582 --- /dev/null +++ b/modeler/src/views/ai/applications/charts/charts.vue @@ -0,0 +1,376 @@ + + + + + \ No newline at end of file diff --git a/modeler/src/views/ai/applications/charts/config.ts b/modeler/src/views/ai/applications/charts/config.ts new file mode 100644 index 0000000..566b438 --- /dev/null +++ b/modeler/src/views/ai/applications/charts/config.ts @@ -0,0 +1,110 @@ +/* + * This file is part of the kernelstudio package. + * + * (c) 2014-2026 zlin + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +export const commonAxisConfig = { + axisLabel: { + color: '#eee', + fontSize: 12 + }, + axisLine: { + lineStyle: { + color: '#1e3150' + } + }, + axisTick: { + lineStyle: { + color: '#1e3150' + } + }, + splitLine: { + lineStyle: { + color: 'rgba(255, 255, 255, 0.1)' + } + } +}; + +export const getRadialGradient = (colorStart: string, colorEnd: string) => { + return { + type: 'radial', // 径向渐变(饼图首选) + x: 0.5, // 渐变中心x坐标(0-1,0.5为饼图中心) + y: 0.5, // 渐变中心y坐标 + r: 0.5, // 渐变半径(0-1,0.5适配饼图内半径到外半径) + colorStops: [ + { offset: 0, color: colorStart }, // 中心颜色(深) + { offset: 1, color: colorEnd } // 边缘颜色(浅) + ], + global: false // 局部渐变(仅作用于当前扇区) + }; +}; + +export const getVerticalGradient = (colorStart: string, colorEnd: string) => { + return { + type: 'linear', + x: 0, + y: 0, + x2: 0, + y2: 1, + colorStops: [ + { offset: 0, color: colorStart }, // 顶部颜色(深) + { offset: 1, color: colorEnd } // 底部颜色(浅) + ] + }; +}; + +export const xAxisConfig = { + splitLine: { + show: true, + lineStyle: { + color: 'rgba(255, 255, 255, 0.1)' // 网格线颜色(半透明白色) + } + }, + axisLabel: { + color: '#eee', + textStyle: { + color: '#EEE', // 标题字体颜色 + fontSize: 14 + } + }, + axisLine: { + show: true, + lineStyle: { + color: '#1e3150' // X轴线颜色(可选) + }, + textStyle: { + color: '#EEE', // 标题字体颜色 + fontSize: 14 + } + }, +} + +export const yAxisConfig = { + splitLine: { + show: true, + lineStyle: { + color: 'rgba(255, 255, 255, 0.1)' // 网格线颜色(半透明白色) + } + }, + axisLabel: { + color: '#eee', + textStyle: { + color: '#EEE', // 标题字体颜色 + fontSize: 14 + } + }, + axisLine: { + show: true, + lineStyle: { + color: '#1e3150' // X轴线颜色(可选) + }, + textStyle: { + color: '#EEE', // 标题字体颜色 + fontSize: 14 + } + }, +} \ No newline at end of file diff --git a/modeler/src/views/ai/applications/charts/line-options.ts b/modeler/src/views/ai/applications/charts/line-options.ts new file mode 100644 index 0000000..2bb0fc0 --- /dev/null +++ b/modeler/src/views/ai/applications/charts/line-options.ts @@ -0,0 +1,265 @@ +/* + * This file is part of the kernelstudio package. + * + * (c) 2014-2026 zlin + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +import { xAxisConfig } from './config'; +import type { ChartOption } from './types'; + +export interface LineChartOption extends ChartOption{ +} + +export const createLineChartOption = (options: LineChartOption = {}) => { + let blueName = options.blueName ?? '蓝方'; + let redName = options.redName ?? '红方'; + return { + title: { + text: options.title, + textStyle: { + color: '#EEE', // 标题字体颜色 + fontSize: 16, + }, + }, + tooltip: { + trigger: 'axis', + textStyle: { + color: '#999', // 提示框字体颜色 + }, + }, + grid: { + left: '1%', + right: '5%', + bottom: options.xAxisDataVisible ? '15%' : '10%', + containLabel: true, + }, + legend: { + data: [blueName, redName], + textStyle: { + color: '#ddd', + fontSize: 14, + }, + }, + xAxis: { + show: options.xAxisDataVisible, + type: 'category', + data: options.xAxisData, + boundaryGap: [0.1, 0.1], + ...xAxisConfig, + }, + yAxis: { + type: 'value', + boundaryGap: [0.1, 0.1], + ...xAxisConfig, + }, + series: [ + { + name: blueName, + type: 'line', + // stack: 'Total', + data: options.blueData, + lineStyle: { + color: '#409EFF', + width: 2, + }, + itemStyle: { + color: '#409EFF', + }, + emphasis: { + itemStyle: { + color: 'blue', // 高亮时填充色(白色) + borderColor: '#409EFF', // 高亮时边框色 + borderWidth: 4, + }, + symbolSize: 12, // 高亮时圆点放大 + }, + label: { + show: options.labelVisible, // 开启数值显示 + position: 'top', // 数值显示在柱子顶部(可选:top/inside/outside/bottom等) + textStyle: { + color: '#eee', // 数值文字颜色 + fontSize: 12, // 数值文字大小 + }, + }, + }, + { + name: redName, + type: 'line', + // stack: 'Total', + data: options.redData, + lineStyle: { + color: '#bc1f1f', + width: 2, + }, + itemStyle: { + color: '#bc1f1f', + }, + emphasis: { + itemStyle: { + color: 'blue', // 高亮时填充色(白色) + borderColor: 'red', // 高亮时边框色 + borderWidth: 4, + }, + symbolSize: 12, // 高亮时圆点放大 + }, + label: { + show: options.labelVisible, // 开启数值显示 + position: 'top', // 数值显示在柱子顶部(可选:top/inside/outside/bottom等) + textStyle: { + color: '#eee', // 数值文字颜色 + fontSize: 12, // 数值文字大小 + }, + }, + }, + ], + }; +}; + + +// line-options.ts +export interface ChartOptimizationOptions { + showAllSymbol?: boolean; + animation?: boolean; + large?: boolean; + progressive?: number; + progressiveThreshold?: number; +} + +export const createOptimizedLineChartOption = ( + title: string, + xAxisData: string[], + blueData: number[], + redData: number[], + optimization: ChartOptimizationOptions = {} +): echarts.EChartsOption => { + const { + showAllSymbol = false, + animation = false, + large = true, + progressive = 500, + progressiveThreshold = 1000, + } = optimization; + + return { + title: { + text: title, + left: 'center', + textStyle: { + fontSize: 16, + fontWeight: 'bold' + } + }, + tooltip: { + trigger: 'axis', + axisPointer: { + type: 'cross' + }, + // 大数据时优化tooltip性能 + confine: true, + appendToBody: true, + }, + legend: { + data: ['蓝方轨迹', '红方轨迹'], + bottom: 10 + }, + grid: { + left: '3%', + right: '4%', + bottom: '15%', + top: '15%', + containLabel: true + }, + xAxis: { + type: 'category', + data: xAxisData, + axisLabel: { + rotate: 45, + // 减少标签显示密度 + interval: (index: number) => index % 50 === 0, + }, + // 大数据优化 + splitLine: { + show: false + } + }, + yAxis: { + type: 'value', + name: '归一化值', + // 大数据优化 + splitLine: { + lineStyle: { + type: 'dashed' + } + } + }, + dataZoom: [ + { + type: 'inside', + start: 0, + end: 100, + minValueSpan: 10 + }, + { + show: true, + type: 'slider', + top: '90%', + start: 0, + end: 100 + } + ], + series: [ + { + name: '蓝方轨迹', + type: 'line', + data: blueData, + smooth: false, // 大数据时关闭平滑,提高性能 + lineStyle: { + width: 1 // 减小线宽 + }, + itemStyle: { + color: '#1890ff' + }, + // 性能优化配置 + showSymbol: showAllSymbol, + symbol: 'circle', + symbolSize: 2, // 减小符号大小 + animation: animation, + animationThreshold: 2000, + animationDuration: 1000, + animationEasing: 'cubicOut', + // 大数据模式优化 + progressive: progressive, + progressiveThreshold: progressiveThreshold, + progressiveChunkMode: 'mod', + // 采样策略 + sampling: 'lttb', // 使用LTTB采样算法,保留趋势特征 + }, + { + name: '红方轨迹', + type: 'line', + data: redData, + smooth: false, + lineStyle: { + width: 1 + }, + itemStyle: { + color: '#ff4d4f' + }, + showSymbol: showAllSymbol, + symbol: 'circle', + symbolSize: 2, + animation: animation, + animationThreshold: 2000, + animationDuration: 1000, + animationEasing: 'cubicOut', + progressive: progressive, + progressiveThreshold: progressiveThreshold, + progressiveChunkMode: 'mod', + sampling: 'lttb', + } + ] + }; +}; \ No newline at end of file diff --git a/modeler/src/views/ai/applications/charts/pie-options.ts b/modeler/src/views/ai/applications/charts/pie-options.ts new file mode 100644 index 0000000..1a0c194 --- /dev/null +++ b/modeler/src/views/ai/applications/charts/pie-options.ts @@ -0,0 +1,173 @@ +/* + * This file is part of the kernelstudio package. + * + * (c) 2014-2026 zlin + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +// 限定核心取值范围,同时保留扩展空间 +export type PieChartSide = 'blue' | 'red' | string + +export const createPieChartOption = ( + title: string, + side: PieChartSide, + progressPercent: number | null, + centerText: string, + blueName: string, + redName: string, +) => { + // 定义基础颜色常量,提升可读性 + const RED = '#bc1f1f'; + const BLUE = '#205aae'; + let color: string[]; + + // side=blue → 已占用(第一个元素)=红色,未占用(第二个)=蓝色 + // side=red → 已占用(第一个元素)=蓝色,未占用(第二个)=红色 + if (side === 'blue') { + color = [RED, BLUE]; + } else if (side === 'red') { + color = [BLUE, RED]; + } else { + // 兼容其他字符串值,使用默认逻辑 + color = [RED, BLUE]; + } + + let blueNameText = blueName ?? '蓝方'; + let redNameText = redName ?? '红方'; + + // 处理 null 值,避免显示 null% + const safeProgressPercent = Number(Number(progressPercent ?? 0).toFixed(2)); + + const realData = [ + { value: safeProgressPercent, name: side === 'blue' ? redNameText : blueNameText }, + { value: Number(Number(100 - safeProgressPercent).toFixed(2)), name: side === 'blue' ? blueNameText : redNameText } + ] + + // 核心修改1:文本截取逻辑 - 只显示前4个字符 + const displayText = centerText.length > 4 ? `${centerText.substring(0, 4)}...` : centerText; + // 保存完整文本用于tooltip显示 + const fullCenterText = centerText; + + console.error('realData',realData) + + return { + title: { + text: title, + textStyle: { + color: '#eee', + fontSize: 16 + } + }, + tooltip: { + trigger: 'item', + textStyle: { + color: '#999' + }, + // 核心修改2:自定义tooltip格式化内容,显示完整文本 + formatter: (params: any) => { + return ` +
+
${params.name}: ${params.value}%
+
${fullCenterText}
+
+ `; + } + }, + grid: { + left: '1%', + right: '5%', + bottom: '1%', + top: '30%', + containLabel: true + }, + xAxis: { + show: false, + axisLabel: { + color: '#eee', + textStyle: { + color: '#EEE', // 标题字体颜色 + fontSize: 14 + } + }, + axisLine: { + lineStyle: { + color: '#eee' // X轴线颜色(可选) + }, + textStyle: { + color: '#EEE', // 标题字体颜色 + fontSize: 14 + } + }, + }, + yAxis: { + show: false, + axisLabel: { + color: '#eee', + textStyle: { + color: '#EEE', // 标题字体颜色 + fontSize: 14 + } + }, + axisLine: { + lineStyle: { + color: '#eee' // X轴线颜色(可选) + }, + textStyle: { + color: '#EEE', // 标题字体颜色 + fontSize: 14 + } + }, + }, + series: [ + { + type: 'pie', + radius: ['40%', '60%'], + center: ['50%', '50%'], + data: realData, + color: color, + itemStyle: { + borderWidth: 0 + }, + // 启用饼图中心标签 + label: { + show: true, + position: 'center', + // 核心修改3:使用截取后的文本显示 + formatter: `{a|${safeProgressPercent}%}\n{b|${displayText}}`, + rich: { + a: { + fontSize: 28, + fontWeight: 'bold', + color: '#eee', + lineHeight: 36 + }, + b: { + fontSize: 16, + color: '#ccc', + lineHeight: 24 + } + } + }, + // 禁用外部标签 + labelLine: { + show: false + }, + emphasis: { + itemStyle: { + shadowBlur: 10, + shadowOffsetX: 0, + shadowColor: 'rgba(0, 0, 0, 0.5)' + }, + // 悬停时也显示中心标签 + label: { + show: true, + fontSize: 28, + fontWeight: 'bold' + } + } + } + ] + }; +}; \ No newline at end of file diff --git a/modeler/src/views/ai/applications/charts/scatter-options.ts b/modeler/src/views/ai/applications/charts/scatter-options.ts new file mode 100644 index 0000000..45390fc --- /dev/null +++ b/modeler/src/views/ai/applications/charts/scatter-options.ts @@ -0,0 +1,126 @@ +/* + * This file is part of the kernelstudio package. + * + * (c) 2014-2026 zlin + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +import { xAxisConfig } from './config'; +import type { ChartOption } from './types'; + +export interface ScatterChartOption extends ChartOption{ + +} + +// 自定义三角形路径(调整尺寸适配显示) +export const triangleSymbol = 'path://M0,-6 L6,6 L-6,6 Z'; + +export const createScatterChartOption = (options: ScatterChartOption) => { + let blueName = options.blueName ?? '蓝方'; + let redName = options.redName ?? '红方'; + + return { + title: { + text: options.title, + textStyle: { + color: '#eee', + fontSize: 16 + } + }, + tooltip: { + trigger: 'axis', + textStyle: { + color: '#999' + } + }, + grid: { + left: '1%', + right: '5%', + bottom: '15%', + containLabel: true + }, + legend: { + data: [blueName, redName], + textStyle: { + color: '#ddd', + fontSize: 14 + } + }, + xAxis: { + type: 'category', + data: options.xAxisData, + boundaryGap: [0.1, 0.1], + ...xAxisConfig + }, + yAxis: { + type: 'value', + boundaryGap: [0.1, 0.5], + ...xAxisConfig + }, + series: [ + { + name: blueName, + type: 'scatter', + data: options.blueData, + symbol: 'circle', // 显式指定蓝方使用圆点(ECharts默认也是circle,显式设置更清晰) + symbolSize: 8, // 圆点大小 + itemStyle: { + color: '#409EFF' // 圆点颜色 + }, + emphasis: { + itemStyle: { + color: 'white', + borderColor: '#409EFF', + borderWidth: 2 + }, + symbolSize: 12 + }, + // 数值标签配置 - 显示在圆点上方 + label: { + show: false, + position: 'top', + formatter: '{c}', // 直接显示数据值 + textStyle: { + color: '#eee', + fontSize: 12, + fontWeight: 'bold' + }, + offset: [0, -10] // 调整偏移量,让标签在圆点上方显示更美观 + } + // 移除了markPoint配置(去掉额外的三角形) + }, + { + name: redName, + type: 'scatter', + data: options.redData, + symbol: triangleSymbol, // 红方使用自定义三角形 + symbolSize: 12, // 三角形尺寸(比原圆点稍大,保证视觉清晰) + itemStyle: { + color: '#bc1f1f' // 三角形颜色 + }, + emphasis: { + itemStyle: { + color: 'white', + borderColor: '#bc1f1f', + borderWidth: 2 + }, + symbolSize: 16 // 高亮时三角形放大 + }, + // 红方的数值标签配置 + label: { + show: false, + position: 'top', + formatter: '{c}', // 直接显示数据值 + textStyle: { + color: '#eee', + fontSize: 12, + fontWeight: 'bold' + }, + offset: [0, -15] // 三角形高度更高,标签偏移量稍大 + } + }, + ] + } +}; \ No newline at end of file diff --git a/modeler/src/views/ai/applications/charts/types.ts b/modeler/src/views/ai/applications/charts/types.ts new file mode 100644 index 0000000..f06caad --- /dev/null +++ b/modeler/src/views/ai/applications/charts/types.ts @@ -0,0 +1,30 @@ +/* + * This file is part of the kernelstudio package. + * + * (c) 2014-2026 zlin + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +import type { ModelDeductionData } from '../types'; + +export interface ChartOption { + title?: string, + blueName?: string|undefined, + redName?: string|undefined, + xAxisData?: string[], + blueData?: any[], + redData?: any[], + xAxisDataVisible?: boolean, + labelVisible?: boolean, +} + +export interface ChartLineData { + name: string, + xAxisData: string[], + blueData: number[], + redData: number [], + options: any, + deduction: ModelDeductionData, +} \ No newline at end of file diff --git a/modeler/src/views/ai/applications/charts/utils.ts b/modeler/src/views/ai/applications/charts/utils.ts new file mode 100644 index 0000000..c46063a --- /dev/null +++ b/modeler/src/views/ai/applications/charts/utils.ts @@ -0,0 +1,25 @@ +/* + * This file is part of the kernelstudio package. + * + * (c) 2014-2026 zlin + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +export const downSampleData = (data: number[], targetCount = 200): number[] => { + if (!data.length || data.length <= targetCount) return data; + + const step = Math.ceil(data.length / targetCount); + const sampledData: number[] = []; + + for (let i = 0; i < data.length; i += step) { + sampledData.push(data[i] as any); + } + + if (sampledData[sampledData.length - 1] !== data[data.length - 1]) { + sampledData[Number(sampledData?.length - 1)] = data[data.length - 1] as number; + } + + return sampledData; +}; \ No newline at end of file diff --git a/modeler/src/views/ai/applications/config.ts b/modeler/src/views/ai/applications/config.ts new file mode 100644 index 0000000..e7d1920 --- /dev/null +++ b/modeler/src/views/ai/applications/config.ts @@ -0,0 +1,35 @@ +/* + * This file is part of the kernelstudio package. + * + * (c) 2014-2026 zlin + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +import type { ModelDeduction } from './types'; + +export const defaultModelDeduction = { + // 推演记录ID + id: null, + deductionId: null, + // 部署模型路径 + deploymentModelPath: null, + // 对抗轮数配置 + competitionRound: null, + // 对抗场次配置 + competitionSession: 1, + // 推演倍数设置 + deductionMultiple: 1, + // 并发调度配置 + balanceStrategy: 1, + // 对抗模式选择 + competitionMode: 1, + // 蓝方名称 + blueNames: null, + // 红方名称 + redNames: null, + // 数据状态(1-正常,0-已删除) + status: null, + stopped: false, +} as ModelDeduction; \ No newline at end of file diff --git a/modeler/src/views/ai/applications/gambling.vue b/modeler/src/views/ai/applications/gambling.vue new file mode 100644 index 0000000..59b2540 --- /dev/null +++ b/modeler/src/views/ai/applications/gambling.vue @@ -0,0 +1,673 @@ + + + + + \ No newline at end of file diff --git a/modeler/src/views/ai/applications/ranking-modal.vue b/modeler/src/views/ai/applications/ranking-modal.vue new file mode 100644 index 0000000..14d2e88 --- /dev/null +++ b/modeler/src/views/ai/applications/ranking-modal.vue @@ -0,0 +1,692 @@ + + + + + \ No newline at end of file diff --git a/modeler/src/views/ai/applications/types.ts b/modeler/src/views/ai/applications/types.ts new file mode 100644 index 0000000..cc8363e --- /dev/null +++ b/modeler/src/views/ai/applications/types.ts @@ -0,0 +1,222 @@ +/* + * This file is part of the kernelstudio package. + * + * (c) 2014-2026 zlin + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +import type { ApiDataResponse, NullableString } from '@/types'; + +export interface DeductionPodMetricsDetails { + // 开火奖励累计值 + fire_reward: NullableString; + // 接近敌机奖励累计值 + approach_reward: NullableString; + // 越界惩罚累计值 + boundary_penalty: NullableString; + lock_reward: NullableString; + damage_reward: NullableString; + // 胜利奖励值 + win_bonus: NullableString; + [key: string]: unknown; + +} + +export interface DeductionPodMetrics { + // 本轮总奖励。该 Episode 获得的总分。 + reward: NullableString; + // 本轮生存步数。该 Episode 持续的步数, + steps: number; + // 胜负判定。1 表示胜利,0表示失败/平局。 + is_win: number; + // 环境分项奖励明细。包含环境返回的所有细分奖励项(动态字段)。 + details: null | DeductionPodMetricsDetails; + + [key: string]: unknown; +} + +export interface DeductionPod { + id: number; + // 关联推演ID + deductionId: number; + // RayJob名称 + jobName: NullableString; + // RayJob主机IP + jobHostIp: NullableString; + // 8000端口映射 + jobNodePort8000: NullableString; + // 8265端口映射 + jobNodePort8265: NullableString; + // Afsim主机IP + afsimHostIp: NullableString; + // 6901端口映射 + afsimNodePort6901: NullableString; + // 50051端口映射 + afsimNodePort50051: NullableString; + // 状态(1-正常,0-已删除) + status: number; + // 推演任务Job_ID + jobId: NullableString; + // 总轮数 + totalRound: number; + // 当前轮数 + currentRound: number; + // 内部详细指标,JSON格式 + metrics: NullableString; + // 红方名称 + redName: NullableString, + // 蓝方名称 + blueName: NullableString; + // 仿真状态(1-运行,2-暂停) + simulationStatus: Number; + + metricsParsed: null | DeductionPodMetrics; + [key: string]: unknown; +} + +export interface DeductionPodResult extends ApiDataResponse { + +} + +export interface ModelDeduction { + // 推演记录ID + id: number | null, + deductionId: number | null, + // 部署模型路径 + deploymentModelPath: NullableString, + // 对抗轮数配置 + competitionRound: NullableString, + // 对抗场次配置 + competitionSession: number, + // 并发调度配置 + balanceStrategy: NullableString | number | undefined, + // 推演倍数设置 + deductionMultiple: number, + // 对抗模式选择 + competitionMode: NullableString | number | undefined | null, + // 数据状态(1-正常,0-已删除) + status: number | null, + // 蓝方名称 + blueNames: NullableString, + // 红方名称 + redNames: NullableString, + + stopped: boolean; + + [key: string]: unknown; +} + +export interface ModelDeductionData { + id: number | null, + // 关联Pod信息ID + deductionPodId: number, + // 当前轮数 + currentEpisode: number, + // 累计总步数 + totalSteps: number, + // 蓝方总开火次数 + fireTimesBlue: number, + // 红方总开火次数 + fireTimesRed: number, + // 蓝方本轮回报 + episodeReturnsBlue: number, + // 红方本轮回报 + episodeReturnsRed: number, + // 当前轮次生存步数 + episodeLengths: number, + // 胜负历史 + winHistory: NullableString, + // 蓝方最近10轮平均回报 + avgReturn1Last10: number, + // 蓝方最近100轮平均回报 + avgReturn1Last100: number, + // 红方最近10轮平均回报 + avgReturn2Last10: number, + // 红方最近100轮平均回报 + avgReturn2Last100: number, + // 平均每轮步数 + avgEpisodeLength: number, + // 蓝方胜率 + winRate: number, + // 蓝方败率 + lossRate: number, + // 平局率 + drawRate: number, + // 当前轮步数 + stepInEpisode: number, + // 蓝方回报分量详情 + returnComponentsBlue: NullableString, + // 红方回报分量详情 + returnComponentsRed: NullableString, + // 蓝方本轮惩罚值 + returnDelnatyBlue: number, + // 红方本轮惩罚值 + returnDelnatyRed: number, + // 蓝方每轮弹药消耗量 + fireConsumeBlue: number, + // 红方每轮弹药消耗量 + fireConsumeRed: number, + // 蓝方本轮首次开火时间步 + firstFireTimeBlue: number, + // 红方本轮首次开火时间步 + firstFireTimeRed: number, + // 蓝方攻击持续时间 + attackTimeBlue: number, + // 蓝方生存步数 + episodeLengthsBlue: number | null, + // 红方生存步数 + episodeLengthsRed: number | null, + // 蓝方胜次数 + blueWinRounds: number, + // 红方胜次数 + redWinRounds: number, + // 红方攻击持续时间 + attackTimeRed: number, + // 能量优势序列(JSON数组,1=优势,0=劣势) + energyAdvantage: NullableString, + // 蓝方轨迹纬度序列(JSON数组) + trajectoryBlueLat: NullableString, + // 蓝方轨迹经度序列(JSON数组 + trajectoryBlueLon: NullableString, + // 蓝方轨迹高度序列(JSON数组) + trajectoryBlueAlt: NullableString, + // 红方轨迹纬度序列(JSON数组) + trajectoryRedLat: NullableString, + // 红方轨迹经度序列(JSON数组) + trajectoryRedLon: NullableString, + // 红方轨迹高度序列(JSON数组 + trajectoryRedAlt: NullableString, + // 状态(1-正常,0-已删除) + status: number, + // 创建者 + createBy: NullableString, + // 创建时间 + createTime: NullableString, + // 备注 + remark: NullableString, + normalizedBlueTrajectory: number[]; + normalizedRedTrajectory: number[]; + + [key: string]: unknown; + +} + +export interface ModelDeductionDataResponse extends ApiDataResponse { + +} + +export interface ModelDeductionDetailsResponse extends ApiDataResponse { + +} + +export interface ModelDeductionPodStatus { + status: NullableString, + state: NullableString, + stateDescription: NullableString, +} + +export interface ModelDeductionPodStatusResponse extends ApiDataResponse { + +} \ No newline at end of file diff --git a/modeler/src/views/ai/builder/element.ts b/modeler/src/views/ai/builder/element.ts new file mode 100644 index 0000000..46472fe --- /dev/null +++ b/modeler/src/views/ai/builder/element.ts @@ -0,0 +1,22 @@ +/* + * This file is part of the kernelstudio package. + * + * (c) 2014-2026 zlin + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +import type { NullableString } from '@/types'; + +export interface DraggableElement { + id: number | null, + key?: NullableString, + name: NullableString, + description: NullableString, + category: NullableString, + draggable: boolean, + parent?: DraggableElement, + children: DraggableElement[] + [key: string]: unknown; +} \ No newline at end of file diff --git a/modeler/src/views/ai/builder/graph.ts b/modeler/src/views/ai/builder/graph.ts new file mode 100644 index 0000000..f8527f1 --- /dev/null +++ b/modeler/src/views/ai/builder/graph.ts @@ -0,0 +1,177 @@ +/* + * This file is part of the kernelstudio package. + * + * (c) 2014-2025 zlin + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +import { Edge, Graph, Path, Selection } from '@antv/x6'; +import type { ModelElement } from '../model/types'; +import type { Connecting } from '@antv/x6/lib/graph/options'; +import {createLineOptions} from './line' + +Graph.registerConnector( + 'sequenceFlowConnector', + (s, e) => { + const offset = 4; + const deltaY = Math.abs(e.y - s.y); + const control = Math.floor((deltaY / 3) * 2); + + const v1 = { x: s.x, y: s.y + offset + control }; + const v2 = { x: e.x, y: e.y - offset - control }; + + return Path.parse( + ` + M ${s.x} ${s.y} + L ${s.x} ${s.y + offset} + C ${v1.x} ${v1.y} ${v2.x} ${v2.y} ${e.x} ${e.y - offset} + L ${e.x} ${e.y} + `, + ).serialize(); + }, + true, +); + +export const createGraphConnectingAttributes = (): Partial => { + const lineOptions = createLineOptions(); + return { + snap: true, // 当 snap 设置为 true 时连线的过程中距离节点或者连接桩 50px 时会触发自动吸附 + allowBlank: false, // 是否允许连接到画布空白位置的点,默认为 true + allowLoop: false, // 是否允许创建循环连线,即边的起始节点和终止节点为同一节点,默认为 true + highlight: true, // 当连接到节点时,通过 sourceAnchor 来指定源节点的锚点。 + connector: 'smooth', + connectionPoint: 'anchor', // 指定连接点,默认值为 boundary。 + anchor: 'center', + // validateMagnet({ magnet }) { + // return magnet.getAttribute('port-group') !== 'top' + // }, + // 验证连接 + createEdge(this: Graph) { + const edge: Edge = this.createEdge({ + shape: 'edge', + ...lineOptions, // 应用动画配置 + attrs: lineOptions.attrs, + animation: lineOptions.animation, + markup: lineOptions.markup, + }) + return edge; + }, + validateConnection(this: Graph, { sourceCell, targetCell }) { + console.error('validateConnection'); + if (!sourceCell || !targetCell) return false; + + // 核心逻辑:禁止节点连接自己(自环) + if (sourceCell === targetCell) { + return false; + } + + // const sourceData = sourceCell.getData() as GraphElement; + const targetData = targetCell.getData() as ModelElement; + + // 根节点不能作为子节点 + if (targetData.type === 'startEvent') { + return false; + } + + // 4. 新增核心逻辑:检查源节点是否已有出边(已连接其他节点) + // const hasOutgoingEdge = this.getOutgoingEdges(sourceCell); + // if (hasOutgoingEdge && hasOutgoingEdge.length > 1) { + // return false; + // } + + // 检查是否已存在相同连接 + // const edges: Edge[] = this.getEdges(); + // const existingConnection = edges.find(edge => + // edge.getSourceCell() === sourceCell && + // edge.getTargetCell() === targetCell, + // ); + // + // return !existingConnection; + return true; + }, + }; +}; + +export const createGraphCanvas = (container: HTMLDivElement, readonly: boolean = false): Graph => { + const graph = new Graph({ + container: container, + grid: { + size: 20, + visible: true, + type: 'dot', + // color: '#e5e7eb' + }, + // 确保启用了异步渲染 + async: true, + panning: { + enabled: true, + eventTypes: ['leftMouseDown', 'mouseWheel'], + }, + mousewheel: { + enabled: true, + modifiers: 'ctrl', + factor: 1.1, + maxScale: 1.5, + minScale: 0.5, + }, + highlighting: { + magnetAdsorbed: { + name: 'stroke', + args: { + attrs: { + fill: '#fff', + stroke: '#31d0c6', + strokeWidth: 4, + }, + }, + }, + }, + connecting: createGraphConnectingAttributes(), + + scaling: { + min: 0.5, + max: 2, + }, + + // 背景配置 + background: {}, + + // 交互配置 + interacting: (cellView) => { + if (readonly) { + return false; // 只读模式下禁用所有交互 + } + + // 确保边(edge)的顶点交互权限开启 + if (cellView.cell.isEdge()) { + return { + vertexAddable: true, // 允许添加顶点 + vertexMovable: true, // 允许移动顶点 + vertexDeletable: true, // 允许删除顶点 + edgeMovable: true, // 允许整体拖动连线 + arrowheadMovable: true, // 允许拖动箭头调整端点 + }; + } + + // 节点的交互配置(保持不变) + return { + nodeMovable: true, + }; + }, + }); + + graph.use( + new Selection({ + multiple: true, + rubberEdge: true, + rubberNode: true, + modifiers: 'shift', + rubberband: true, + }), + ); + + return graph; + +}; \ No newline at end of file diff --git a/modeler/src/views/ai/builder/hooks.ts b/modeler/src/views/ai/builder/hooks.ts new file mode 100644 index 0000000..3065ae6 --- /dev/null +++ b/modeler/src/views/ai/builder/hooks.ts @@ -0,0 +1,249 @@ +/* + * This file is part of the kernelstudio package. + * + * (c) 2014-2025 zlin + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +import { computed, type ComputedRef, ref, type Ref } from 'vue'; +import { type Dom, Graph, Node } from '@antv/x6'; +import type { NodeViewPositionEventArgs } from '@antv/x6/es/view/node/type'; +import { createGraphCanvas } from './graph'; +import { EventListener } from '@/utils/event'; +import type { ModelElement } from '../model/types'; +// import {createLineOptions} from './line' + +export interface UseGraphCanvas { + container: Ref; + readonly: boolean; + eventListener: EventListener; + currentZoom: Ref; + graph: ComputedRef; + zoomIn: () => void; + zoomOut: () => void; + fitToScreen: () => void; + centerContent: () => void; + resizeCanvas: () => void; + handleGraphEvent: (name: string, fn: Function) => void; + emitGraphEvent: (name: string, options?: any) => void; + createCanvas: (c: HTMLDivElement) => Graph; +} + +export const useGraphCanvas = (readonly: boolean = false): UseGraphCanvas => { + + const graph = ref(null); + const container = ref(null); + const eventListener = new EventListener(); + const currentZoom = ref(0); + + const handleGraphEvent = (name: string, fn: Function) => { + eventListener.on(name, fn); + }; + + const emitGraphEvent = (name: string, options?: any): void => { + eventListener.emit(name, options); + }; + + const zoomIn = (): void => { + if (graph.value) { + const zoom = graph.value.zoom(); + graph.value.zoom(zoom + 0.1); + } + }; + + const zoomOut = (): void => { + if (graph.value) { + const zoom = graph.value.zoom(); + graph.value.zoom(Math.max(0.1, zoom - 0.1)); + } + }; + + const fitToScreen = () => { + if (graph.value) { + graph.value.zoomToFit({ padding: 20 }); + } + }; + + const centerContent = () => { + if (graph.value) { + graph.value.centerContent(); + } + }; + + const resizeCanvas = () => { + if (graph.value) { + graph.value?.resize(); + } + }; + + const initEvents = () => { + if (!graph.value) { + return; + } + graph.value.on('keydown', ({ e }: any) => { + if (e.key === 'Delete' || e.key === 'Backspace') { + const cells = graph.value?.getSelectedCells(); + if (cells && cells.length) { + graph.value?.removeCells(cells); + // 通知父组件更新状态 + emitGraphEvent('cells:removed', cells); + } + } + }); + + graph.value.on('scale', (ctx) => { + currentZoom.value = ctx.sx; + emitGraphEvent('scale', ctx); + }); + + // 监听画布空白点击 + graph.value.on('blank:click', () => { + graph.value?.cleanSelection(); + emitGraphEvent('blank:click'); + }); + + // 监听连线删除 + graph.value.on('edge:removed', ({ edge }) => { + emitGraphEvent('edge:removed', edge); // 添加此行 + }); + + graph.value.on('edge:added', ({ edge }) => { + // const lineOptions = createLineOptions(); + // edge.setAttrs(lineOptions.attrs); + // edge.set(lineOptions.animation); + // edge.setMarkup(lineOptions.markup); + emitGraphEvent('edge:added', edge); // 添加此行 + }); + + graph.value.on('edge:contextmenu', (ctx) => { + emitGraphEvent('edge:contextmenu', ctx); + }); + + graph.value.on('edge:connect:abort', () => { + // 当连线被拖拽到空白区域后释放,自动移除这条无效连线 + const edges = graph.value?.getEdges(); + const invalidEdges = (edges ?? []).filter(edge => + !edge.getSourceCell() || !edge.getTargetCell(), + ); + if (invalidEdges.length) { + graph.value?.removeCells(invalidEdges); + } + }); + + // 监听连接失败 + graph.value.on('edge:connect:invalid', () => { + emitGraphEvent('edge:connect:invalid'); + }); + + graph.value.on('edge:click', (edge) => { + emitGraphEvent('edge:connect:invalid', edge); + }); + + graph.value.on('edge:connected', ({ edge }) => { + const sourceNode = edge.getSourceCell() as Node; + const targetNode = edge.getTargetCell() as Node; + + if (sourceNode && targetNode) { + const sourceData = sourceNode.getData() as ModelElement; + const targetData = targetNode.getData() as ModelElement; + + // 将连线存储到节点数据中 + const sourceEdges = sourceData.edges || []; + const existingEdge = sourceEdges.find(e => e.targetKey === targetNode.id); + + if (!existingEdge) { + sourceEdges.push({ + key: edge.id, + sourceKey: sourceNode.id, + sourceName: sourceData.name, + targetKey: targetNode.id, + targetName: targetData.name, + }); + sourceNode.replaceData({ ...sourceData, edges: sourceEdges }); + } + } + + edge.attr('line/stroke', '#3b82f6'); // 显式设置颜色 + edge.attr('line/strokeWidth', 2); // 显式设置宽度 + // edge.refresh() // 刷新连线 + // graph.paint() // 重绘画布 + + emitGraphEvent('edge:connected', edge); + }); + + graph.value.on('node:click', (ctx: NodeViewPositionEventArgs) => { + console.info('node click', ctx); + emitGraphEvent('node:click', ctx); + }); + + // 监听节点选中事件 + graph.value.on('node:selected', ({ node }) => { + console.info('node select', node); + emitGraphEvent('node:selected', node); + }); + + // 监听节点取消选中 + graph.value.on('node:unselected', () => { + emitGraphEvent('node:unselected'); + }); + + // 监听节点鼠标移入,显示连接点 + graph.value.on('node:mouseenter', (ctx) => { + emitGraphEvent('node:mouseenter', ctx); + }); + + // 监听节点鼠标移出,隐藏连接点 + graph.value.on('node:mouseleave', (ctx) => { + emitGraphEvent('node:mouseleave', ctx); + }); + + // 监听节点状态变化 + graph.value.on('node:change:data', (ctx) => { + const edges = graph.value?.getIncomingEdges(ctx.node); + const { status } = ctx.node.getData(); + edges?.forEach((edge) => { + if (status === 'running') { + edge.attr('line/strokeDasharray', 5); + edge.attr('line/style/animation', 'running-line 30s infinite linear'); + } else { + edge.attr('line/strokeDasharray', ''); + edge.attr('line/style/animation', ''); + } + }); + emitGraphEvent('node:change:data', ctx); + }); + + }; + + const createCanvas = (c: HTMLDivElement): Graph => { + container.value = c; + graph.value = createGraphCanvas(c, readonly); + initEvents(); + + emitGraphEvent('created', graph.value); + + return graph.value as Graph; + }; + + const graphInstance = computed(() => graph.value); + + return { + container, + readonly, + graph: graphInstance, + eventListener, + currentZoom, + + emitGraphEvent, + handleGraphEvent, + + zoomIn, + zoomOut, + fitToScreen, + centerContent, + resizeCanvas, + createCanvas, + } as UseGraphCanvas; +}; \ No newline at end of file diff --git a/modeler/src/views/ai/builder/index.ts b/modeler/src/views/ai/builder/index.ts new file mode 100644 index 0000000..2c375c6 --- /dev/null +++ b/modeler/src/views/ai/builder/index.ts @@ -0,0 +1,11 @@ +/* + * This file is part of the kernelstudio package. + * + * (c) 2014-2025 zlin + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +export { createGraphCanvas } from './graph'; +export * from './hooks'; \ No newline at end of file diff --git a/modeler/src/views/ai/builder/line.ts b/modeler/src/views/ai/builder/line.ts new file mode 100644 index 0000000..7ee5b4e --- /dev/null +++ b/modeler/src/views/ai/builder/line.ts @@ -0,0 +1,47 @@ +/* + * This file is part of the kernelstudio package. + * + * (c) 2014-2026 zlin + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +import { Shape } from '@antv/x6'; + +export const createLineOptions = (): any => { + return { + markup: [ + { + tagName: 'circle', + selector: 'marker', + attrs: { + stroke: 'none', + r: 3, + }, + }, + ...Shape.Edge.getMarkup() as any, + ], + attrs: { + line: { + stroke: '#5da0df', + strokeWidth: 2, + strokeDasharray: ' ', + strokeDashoffset: 0, + }, + marker: { + fill: '#5da0df', + atConnectionRatio: 0, + }, + }, + animation: [ + [ + { 'attrs/marker/atConnectionRatio': 1 }, + { + duration: 2000, + iterations: Infinity, + }, + ], + ], + } +} \ No newline at end of file diff --git a/modeler/src/views/ai/builder/node.vue b/modeler/src/views/ai/builder/node.vue new file mode 100644 index 0000000..3115cb3 --- /dev/null +++ b/modeler/src/views/ai/builder/node.vue @@ -0,0 +1,322 @@ + + + + + \ No newline at end of file diff --git a/modeler/src/views/ai/builder/ports.ts b/modeler/src/views/ai/builder/ports.ts new file mode 100644 index 0000000..cd24310 --- /dev/null +++ b/modeler/src/views/ai/builder/ports.ts @@ -0,0 +1,51 @@ +/* + * This file is part of the kernelstudio package. + * + * (c) 2014-2025 zlin + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +export const createPort = (name: string = 'top', args: Record = { dx: 0 }) => { + return { + position: { name: name, args: args }, + attrs: { + circle: { + r: 4, // 大小 + magnet: true, + stroke: '#1b5e9f', // 边框颜色 + strokeWidth: 1, // 边框大小 + fill: '#3578bf', // 填充颜色 + style: { + visibility: 'visible', // 是否可见 + }, + }, + }, + }; +}; + +export const createPorts = (top: boolean = true, right: boolean = true, bottom: boolean = true, left: boolean = true) => { + const groups: any = {}; + const items: any = []; + if (top) { + groups['top'] = createPort('top'); + items.push({ group: 'top', id: 'top' }); + } + if (right) { + groups['right'] = createPort('right'); + items.push({ group: 'right', id: 'right' }); + } + if (bottom) { + groups['bottom'] = createPort('bottom'); + items.push({ group: 'bottom', id: 'bottom' }); + } + if (left) { + groups['left'] = createPort('left'); + items.push({ group: 'left', id: 'left' }); + } + return { + groups: groups, + items: items, + }; +}; \ No newline at end of file diff --git a/modeler/src/views/ai/builder/props.ts b/modeler/src/views/ai/builder/props.ts new file mode 100644 index 0000000..d51a5f3 --- /dev/null +++ b/modeler/src/views/ai/builder/props.ts @@ -0,0 +1,29 @@ +/* + * This file is part of the kernelstudio package. + * + * (c) 2014-2025 zlin + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +import { Graph, Node } from '@antv/x6'; +import { type ExtractPropTypes, type PropType } from 'vue'; +import type { ModelElement } from '../model/types'; + +export const elementProps = { + node: { + type: Object as PropType, + required: true, + }, + graph: { + type: Object as PropType, + required: true, + }, + element: { + type: Object as PropType, + required: false, + }, +}; + +export type ElementPropsType = ExtractPropTypes \ No newline at end of file diff --git a/modeler/src/views/ai/builder/register.ts b/modeler/src/views/ai/builder/register.ts new file mode 100644 index 0000000..a75a27e --- /dev/null +++ b/modeler/src/views/ai/builder/register.ts @@ -0,0 +1,50 @@ +/* + * This file is part of the kernelstudio package. + * + * (c) 2014-2025 zlin + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +/* + * This file is part of the kernelstudio package. + * + * (c) 2014-2025 zlin + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ +import { register } from '@antv/x6-vue-shape'; +import ModelElement from './node.vue'; + +export const registerNodeElement = () => { + console.info('registerNodeElement'); + register({ + shape: 'model', + component: ModelElement, + width: 120, + attrs: { + body: { + stroke: 'transparent', + strokeWidth: 0, + fill: 'transparent', + rx: 4, + ry: 4, + }, + }, + dragging: { + enabled: true, + }, + // 配置端口识别规则, + portMarkup: [ + { + tagName: 'div', + selector: 'port-body', + }, + ], + // 告诉 X6 如何识别 Vue 组件内的端口 + portAttribute: 'data-port', + // ports: createPorts(), + }); +}; \ No newline at end of file diff --git a/modeler/src/views/ai/config.ts b/modeler/src/views/ai/config.ts new file mode 100644 index 0000000..c862ab7 --- /dev/null +++ b/modeler/src/views/ai/config.ts @@ -0,0 +1,81 @@ +/* + * This file is part of the kernelstudio package. + * + * (c) 2014-2026 zlin + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +export const menuMap = [ + { + key: '0', + title: '工程空间', + children: [ + { + key: '0-1', + title: '工程管理', + path: '/app/ai/project/management', + }, + { + key: '0-2', + title: '新建/自定义', + path: '/app/ai/project/create', + }, + ], + }, + { + key: '1', + title: '智能体构建工具', + children: [ + { + key: '1-1', + title: '智能体管理', + path: '/app/ai/model/management', + }, + ], + }, + { + key: '2', + title: 'AI模型训练', + children: [ + { + key: '2-0', + title: '训练任务管理', + path: '/app/ai/training/task/management', + }, + { + key: '2-1', + title: '训练任务配置', + path: '/app/ai/training/task/configurer', + }, + // { + // key: '2-4', + // title: '训练任务监控', + // path: '/app/ai/training/task/monitor', + // }, + ], + }, + { + key: '3', + title: '博弈竞赛应用', + children: [ + { + key: '3-1', + title: '博弈竞赛单元运行环境', + path: '/app/ai/applications/gambling', + }, + { + key: '3-2', + title: '仿真测试推演脚本', + type: 'open-script-window' + }, + ], + }, + { + key: '2-3', + title: '训练资源监控', + path: '/app/ai/training/resources/monitor', + children: [] + }, +]; \ No newline at end of file diff --git a/modeler/src/views/ai/dashboard.vue b/modeler/src/views/ai/dashboard.vue new file mode 100644 index 0000000..1a04893 --- /dev/null +++ b/modeler/src/views/ai/dashboard.vue @@ -0,0 +1,47 @@ + + + diff --git a/modeler/src/views/ai/finder.vue b/modeler/src/views/ai/finder.vue new file mode 100644 index 0000000..4f18fa0 --- /dev/null +++ b/modeler/src/views/ai/finder.vue @@ -0,0 +1,274 @@ + + + + \ No newline at end of file diff --git a/modeler/src/views/ai/header.vue b/modeler/src/views/ai/header.vue new file mode 100644 index 0000000..c5658f7 --- /dev/null +++ b/modeler/src/views/ai/header.vue @@ -0,0 +1,77 @@ + + + \ No newline at end of file diff --git a/modeler/src/views/ai/layout.vue b/modeler/src/views/ai/layout.vue new file mode 100644 index 0000000..8c4826e --- /dev/null +++ b/modeler/src/views/ai/layout.vue @@ -0,0 +1,47 @@ + + + \ No newline at end of file diff --git a/modeler/src/views/ai/menu.vue b/modeler/src/views/ai/menu.vue new file mode 100644 index 0000000..8b7f121 --- /dev/null +++ b/modeler/src/views/ai/menu.vue @@ -0,0 +1,58 @@ + + + \ No newline at end of file diff --git a/modeler/src/views/ai/model/algorithm-card.vue b/modeler/src/views/ai/model/algorithm-card.vue new file mode 100644 index 0000000..45376e0 --- /dev/null +++ b/modeler/src/views/ai/model/algorithm-card.vue @@ -0,0 +1,47 @@ + + + + diff --git a/modeler/src/views/ai/model/api.ts b/modeler/src/views/ai/model/api.ts new file mode 100644 index 0000000..0ffcb20 --- /dev/null +++ b/modeler/src/views/ai/model/api.ts @@ -0,0 +1,48 @@ +/* + * This file is part of the kernelstudio package. + * + * (c) 2014-2025 zlin + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +import request from '@/utils/request'; +import type { Model, ModelQueryResult, ModelResult, NetworkModelResult, ObservationType, ObservationTypeResult, RewardDesign, RewardDesignResult } from './types'; +import type { ApiDataResponse, BasicResponse } from '@/types'; + +export const findAllNetworkModel = (): Promise => { + return request.get('/networkModel/all'); +}; + +export const findRewardDesignByQuery = (query: Partial = {}): Promise => { + return request.get('/rewardDesign/list', query); +}; + +export const findObservationTypeByQuery = (query: Partial = {}): Promise => { + return request.get('/observationType/list', query); +}; + +export const findModelByQuery = (query: Partial = {}): Promise => { + return request.get('/model/list', query); +}; + +export const findAllModels = (): Promise> => { + return request.get>('/model/all'); +}; + +export const findOneModelById = (id: number | string): Promise => { + return request.get(`/model/get/${id}`); +}; + +export const createModel = (rt: Partial): Promise => { + return request.postJson('/model/add', rt); +}; + +export const updateModel = (rt: Partial): Promise => { + return request.putJson('/model/edit', rt); +}; + +export const deleteModel = (id: number | string): Promise => { + return request.delete(`/model/logic/${id}`); +}; diff --git a/modeler/src/views/ai/model/builder-inputs.vue b/modeler/src/views/ai/model/builder-inputs.vue new file mode 100644 index 0000000..39e4f8c --- /dev/null +++ b/modeler/src/views/ai/model/builder-inputs.vue @@ -0,0 +1,148 @@ + + + + + \ No newline at end of file diff --git a/modeler/src/views/ai/model/builder-left-components.vue b/modeler/src/views/ai/model/builder-left-components.vue new file mode 100644 index 0000000..62105c5 --- /dev/null +++ b/modeler/src/views/ai/model/builder-left-components.vue @@ -0,0 +1,90 @@ + + + \ No newline at end of file diff --git a/modeler/src/views/ai/model/builder-right-control.vue b/modeler/src/views/ai/model/builder-right-control.vue new file mode 100644 index 0000000..6980bea --- /dev/null +++ b/modeler/src/views/ai/model/builder-right-control.vue @@ -0,0 +1,88 @@ + + + \ No newline at end of file diff --git a/modeler/src/views/ai/model/builder-right-manager.vue b/modeler/src/views/ai/model/builder-right-manager.vue new file mode 100644 index 0000000..731c03b --- /dev/null +++ b/modeler/src/views/ai/model/builder-right-manager.vue @@ -0,0 +1,60 @@ + + + \ No newline at end of file diff --git a/modeler/src/views/ai/model/builder-right-situation.vue b/modeler/src/views/ai/model/builder-right-situation.vue new file mode 100644 index 0000000..f62da08 --- /dev/null +++ b/modeler/src/views/ai/model/builder-right-situation.vue @@ -0,0 +1,49 @@ + + + \ No newline at end of file diff --git a/modeler/src/views/ai/model/builder-right-v1.vue b/modeler/src/views/ai/model/builder-right-v1.vue new file mode 100644 index 0000000..2e8e65f --- /dev/null +++ b/modeler/src/views/ai/model/builder-right-v1.vue @@ -0,0 +1,376 @@ + + + diff --git a/modeler/src/views/ai/model/builder-right.vue b/modeler/src/views/ai/model/builder-right.vue new file mode 100644 index 0000000..be457ad --- /dev/null +++ b/modeler/src/views/ai/model/builder-right.vue @@ -0,0 +1,281 @@ + + + diff --git a/modeler/src/views/ai/model/builder.vue b/modeler/src/views/ai/model/builder.vue new file mode 100644 index 0000000..6bd9624 --- /dev/null +++ b/modeler/src/views/ai/model/builder.vue @@ -0,0 +1,511 @@ + + + \ No newline at end of file diff --git a/modeler/src/views/ai/model/components.vue b/modeler/src/views/ai/model/components.vue new file mode 100644 index 0000000..a337cd2 --- /dev/null +++ b/modeler/src/views/ai/model/components.vue @@ -0,0 +1,208 @@ + + + \ No newline at end of file diff --git a/modeler/src/views/ai/model/config.ts b/modeler/src/views/ai/model/config.ts new file mode 100644 index 0000000..e462c8a --- /dev/null +++ b/modeler/src/views/ai/model/config.ts @@ -0,0 +1,65 @@ +/* + * This file is part of the kernelstudio package. + * + * (c) 2014-2025 zlin + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +import type { TableColumnType } from 'ant-design-vue'; +import type { Model, SavedGraphData } from './types'; + +export const defaultSavedGraphData = { + nodes: [], + edges: [], + observations: [], + rewards: [], + actionSpaces: [], +} as SavedGraphData + +export const modelColumns: TableColumnType[] = [ + { + title: '序号', + dataIndex: 'index', + key: 'index', + }, + { + title: '智能体名称', + dataIndex: 'name', + key: 'name', + }, + { + title: '所属工程', + dataIndex: 'projectSpaceName', + key: 'projectSpaceName', + }, + { + title: '智能体描述', + dataIndex: 'description', + key: 'description', + }, + { + title: '存储位置', + dataIndex: 'storageLocation', + key: 'storageLocation', + }, + { + title: '操作', + dataIndex: '_actions', + key: '_actions', + width: 100, + }, +]; + +export const defaultModel: Model = { + id: 0, + projectId: undefined, + projectSpaceName: null, + name: null, + description: null, + storageLocation: null, + configInfo: null, + status: 1, + createTime: null, +}; diff --git a/modeler/src/views/ai/model/control-options.ts b/modeler/src/views/ai/model/control-options.ts new file mode 100644 index 0000000..72c1caa --- /dev/null +++ b/modeler/src/views/ai/model/control-options.ts @@ -0,0 +1,264 @@ +/* + * This file is part of the kernelstudio package. + * + * (c) 2014-2026 zlin + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + + +import type { ElementInput } from './inputs'; + +export const taskInputs: ElementInput[] = [ + { + id: null, + name: '空中扫荡', + description: '', + category: 'task', + draggable: true, + children: [], + }, + { + id: null, + name: '战斗巡逻', + description: '', + category: 'task', + draggable: true, + children: [], + }, + { + id: null, + name: '空中护航', + description: '', + category: 'task', + draggable: true, + children: [], + }, + { + id: null, + name: '空中加油', + description: '', + category: 'task', + draggable: true, + children: [], + }, + { + id: null, + name: '侦察监视', + description: '', + category: 'task', + draggable: true, + children: [], + }, + { + id: null, + name: '压制防空', + description: '', + category: 'task', + draggable: true, + children: [], + }, +]; + +export const controlInputs: ElementInput[] = [ + { + id: null, + name: '追击', + description: '', + category: 'control', + draggable: true, + children: [], + }, + { + id: null, + name: '开火', + description: '', + category: 'control', + draggable: true, + children: [], + }, + { + id: null, + name: '偏置', + description: '', + category: 'control', + draggable: true, + children: [], + }, + { + id: null, + name: '脱离', + description: '', + category: 'control', + draggable: true, + children: [], + }, + { + id: null, + name: '目视追击', + description: '', + category: 'control', + draggable: true, + children: [], + }, + { + id: null, + name: '夹击追击', + description: '', + category: 'control', + draggable: true, + children: [], + }, + { + id: null, + name: '交替脱离', + description: '', + category: 'control', + draggable: true, + children: [], + }, + { + id: null, + name: '交替追击', + description: '', + category: 'control', + draggable: true, + children: [], + }, + { + id: null, + name: '航线巡逻', + description: '', + category: 'control', + draggable: true, + children: [], + }, +]; + +export const flyInputs: ElementInput[] = [ + { + id: null, + name: '滚转角', + description: '', + category: 'parameter', + draggable: true, + children: [], + }, + { + id: null, + name: '俯仰角', + description: '', + category: 'parameter', + draggable: true, + children: [], + }, + { + id: null, + name: '偏航角', + description: '', + category: 'parameter', + draggable: true, + children: [], + }, + { + id: null, + name: '油门', + description: '', + category: 'parameter', + draggable: true, + children: [], + }, + { + id: null, + name: '开火', + description: '', + category: 'parameter', + draggable: true, + children: [], + }, + { + id: null, + name: '飞行到点/位', + description: '', + category: 'parameter', + draggable: true, + children: [], + }, + { + id: null, + name: '飞行到位置', + description: '', + category: 'parameter', + draggable: true, + children: [], + }, + { + id: null, + name: '飞行到高度', + description: '', + category: 'parameter', + draggable: true, + children: [], + }, + { + id: null, + name: '转头', + description: '', + category: 'parameter', + draggable: true, + children: [], + }, + { + id: null, + name: '相对斜距转向', + description: '', + category: 'parameter', + draggable: true, + children: [], + }, + { + id: null, + name: '指定速度', + description: '', + category: 'parameter', + draggable: true, + children: [], + }, +]; + + +export const managerInputs: ElementInput[] = [ + { + id: null, + name: '启动', + description: '', + category: 'action', + draggable: true, + children: [], + }, + { + id: null, + name: '恢复', + description: '', + category: 'action', + draggable: true, + children: [], + }, + { + id: null, + name: '暂停', + description: '', + category: 'action', + draggable: true, + children: [], + }, + { + id: null, + name: '删除', + description: '', + category: 'action', + draggable: true, + children: [], + } +]; \ No newline at end of file diff --git a/modeler/src/views/ai/model/hooks.ts b/modeler/src/views/ai/model/hooks.ts new file mode 100644 index 0000000..a47cc82 --- /dev/null +++ b/modeler/src/views/ai/model/hooks.ts @@ -0,0 +1,8 @@ +/* + * This file is part of the kernelstudio package. + * + * (c) 2014-2026 zlin + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ diff --git a/modeler/src/views/ai/model/inputs.ts b/modeler/src/views/ai/model/inputs.ts new file mode 100644 index 0000000..e7daff8 --- /dev/null +++ b/modeler/src/views/ai/model/inputs.ts @@ -0,0 +1,186 @@ +/* + * This file is part of the kernelstudio package. + * + * (c) 2014-2026 zlin + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +import { findObservationTypeByQuery } from './api'; +import type { DraggableElement } from '../builder/element'; + +export interface ElementInput extends DraggableElement { + [key: string]: unknown; +} + +export const defaultBasicInputs: ElementInput[] = [ + { + id: null, + name: '基础状态', + description: null, + draggable: true, + category: 'input', + children:[ + { + id: null, + name: '时间数据', + description: null, + draggable: true, + category: 'input', + children:[] + }, + { + id: null, + name: '阵营数据', + description: null, + draggable: true, + category: 'input', + children:[] + } + ] + } +] + +export const defaultManeuverInputs: ElementInput[] = [ + { + id: null, + name: '机动状态', + description: null, + draggable: true, + category: 'input', + children:[] + } +] + +export const defaultWeaponInputs: ElementInput[] = [ + { + id: null, + name: '武器状态', + description: null, + draggable: true, + category: 'input', + children:[ + { + id: null, + name: '挂载武器', + description: null, + draggable: true, + category: 'input', + children:[] + }, + { + id: null, + name: '导弹状态', + description: null, + draggable: true, + category: 'input', + children:[] + } + ] + } +] + + +export const defaultSensorInputs: ElementInput[] = [ + { + id: null, + name: '传感器状态', + description: null, + draggable: true, + category: 'input', + children:[ + { + id: null, + name: '传感器名称', + description: null, + draggable: true, + category: 'input', + children:[] + }, + { + id: null, + name: '类型信息', + description: null, + draggable: true, + category: 'input', + children:[] + }, + { + id: null, + name: '激活状态', + description: null, + draggable: true, + category: 'input', + children:[] + } + ] + } +] + +export const defaultFuelInputs: ElementInput[] = [ + { + id: null, + name: '燃油状态', + description: null, + draggable: true, + category: 'input', + children:[ + { + id: null, + name: '当前燃油', + description: null, + draggable: true, + category: 'input', + children:[] + }, + { + id: null, + name: '当前油耗', + description: null, + draggable: true, + category: 'input', + children:[] + }, + ] + } +] + +export const resolveElementInputs = () : Promise=> { + return new Promise((resolve,reject)=> { + findObservationTypeByQuery().then(r => { + let items = []; + let item: ElementInput = { + id: null, + name: '机动状态', + description: null, + draggable: true, + category: 'input', + children:[] + }; + if(r.rows){ + r.rows.forEach(i=> { + item.children.push({ + name: i.typeName, + id: i.id, + description: i.description, + draggable: true, + category: 'input', + children: [], + }) + }) + } + items.push(item); + + resolve([ + ...defaultBasicInputs, + ...items, + ...defaultWeaponInputs, + ...defaultSensorInputs, + ...defaultFuelInputs, + ]) + }).catch((e:any)=> { + reject(e); + }); + }) +} \ No newline at end of file diff --git a/modeler/src/views/ai/model/management.vue b/modeler/src/views/ai/model/management.vue new file mode 100644 index 0000000..6b80c8f --- /dev/null +++ b/modeler/src/views/ai/model/management.vue @@ -0,0 +1,228 @@ + + + \ No newline at end of file diff --git a/modeler/src/views/ai/model/rules/fuzzy.json b/modeler/src/views/ai/model/rules/fuzzy.json new file mode 100644 index 0000000..cd29a53 --- /dev/null +++ b/modeler/src/views/ai/model/rules/fuzzy.json @@ -0,0 +1,402 @@ +[ + { + "id": 1, + "name": "三角隶属度模糊规则(Mamdani 型)" + }, + { + "id": 2, + "name": "高斯隶属度模糊规则(Mamdani 型)" + }, + { + "id": 3, + "name": "梯形隶属度模糊规则(Mamdani 型)" + }, + { + "id": 4, + "name": "钟形隶属度模糊规则(Mamdani 型)" + }, + { + "id": 5, + "name": "S 型隶属度模糊规则(Mamdani 型)" + }, + { + "id": 6, + "name": "Z 型隶属度模糊规则(Mamdani 型)" + }, + { + "id": 7, + "name": "单点隶属度模糊规则(Sugeno 型)" + }, + { + "id": 8, + "name": "线性隶属度模糊规则(Sugeno 型)" + }, + { + "id": 9, + "name": "二次函数隶属度模糊规则(Sugeno 型)" + }, + { + "id": 10, + "name": "最大 - 最小推理模糊规则(三角隶属度)" + }, + { + "id": 11, + "name": "最大 - 乘积推理模糊规则(三角隶属度)" + }, + { + "id": 12, + "name": "最小 - 最大推理模糊规则(高斯隶属度)" + }, + { + "id": 13, + "name": "最小 - 乘积推理模糊规则(高斯隶属度)" + }, + { + "id": 14, + "name": "重心法去模糊化模糊规则(Mamdani)" + }, + { + "id": 15, + "name": "最大隶属度法去模糊化模糊规则(Mamdani)" + }, + { + "id": 16, + "name": "加权平均法去模糊化模糊规则(Sugeno)" + }, + { + "id": 17, + "name": "中位数法去模糊化模糊规则(Mamdani)" + }, + { + "id": 18, + "name": "左最大隶属度法去模糊化模糊规则(Mamdani)" + }, + { + "id": 19, + "name": "右最大隶属度法去模糊化模糊规则(Mamdani)" + }, + { + "id": 20, + "name": "多输入单输出(MISO)模糊规则(三角隶属度)" + }, + { + "id": 21, + "name": "多输入多输出(MIMO)模糊规则(三角隶属度)" + }, + { + "id": 22, + "name": "单输入单输出(SISO)模糊规则(高斯隶属度)" + }, + { + "id": 23, + "name": "单输入多输出(SIMO)模糊规则(高斯隶属度)" + }, + { + "id": 24, + "name": "基于专家经验的静态模糊规则" + }, + { + "id": 25, + "name": "基于数据驱动的动态模糊规则" + }, + { + "id": 26, + "name": "自学习更新模糊规则(梯度下降)" + }, + { + "id": 27, + "name": "增量式更新模糊规则(新增数据适配)" + }, + { + "id": 28, + "name": "模糊聚类生成模糊规则(FCM)" + }, + { + "id": 29, + "name": "粗糙集约简模糊规则(去冗余)" + }, + { + "id": 30, + "name": "遗传算法优化模糊规则(规则库精简)" + }, + { + "id": 31, + "name": "粒子群优化模糊规则(隶属度参数优化)" + }, + { + "id": 32, + "name": "禁忌搜索优化模糊规则(规则排序优化)" + }, + { + "id": 33, + "name": "模糊关联规则(挖掘数据隐含关联)" + }, + { + "id": 34, + "name": "模糊产生式规则(if-then-else 拓展)" + }, + { + "id": 35, + "name": "模糊时序规则(处理时间序列数据)" + }, + { + "id": 36, + "name": "模糊空间规则(处理地理空间数据)" + }, + { + "id": 37, + "name": "模糊概率规则(融合概率分布)" + }, + { + "id": 38, + "name": "模糊可能性规则(基于可能性理论)" + }, + { + "id": 39, + "name": "模糊证据规则(融合 D-S 证据理论)" + }, + { + "id": 40, + "name": "直觉模糊规则(考虑隶属度与非隶属度)" + }, + { + "id": 41, + "name": "区间值模糊规则(隶属度为区间值)" + }, + { + "id": 42, + "name": "二型模糊规则(解决隶属度不确定性)" + }, + { + "id": 43, + "name": "区间二型模糊规则(二型模糊简化版)" + }, + { + "id": 44, + "name": "广义模糊规则(拓展隶属度函数空间)" + }, + { + "id": 45, + "name": "模糊逻辑控制规则(温控场景)" + }, + { + "id": 46, + "name": "模糊逻辑决策规则(金融风控场景)" + }, + { + "id": 47, + "name": "模糊逻辑分类规则(图像识别场景)" + }, + { + "id": 48, + "name": "模糊逻辑回归规则(预测场景)" + }, + { + "id": 49, + "name": "模糊规则插值(弥补规则库空缺)" + }, + { + "id": 50, + "name": "模糊规则约简(降低计算复杂度)" + }, + { + "id": 51, + "name": "三角隶属度 + 重心法模糊规则(经典组合)" + }, + { + "id": 52, + "name": "高斯隶属度 + 加权平均法模糊规则(高精度组合)" + }, + { + "id": 53, + "name": "梯形隶属度 + 最大隶属度法模糊规则(工业场景)" + }, + { + "id": 54, + "name": "钟形隶属度 + 中位数法模糊规则(平滑输出)" + }, + { + "id": 55, + "name": "多隶属度融合模糊规则(三角 + 高斯)" + }, + { + "id": 56, + "name": "分层模糊规则(多层级决策)" + }, + { + "id": 57, + "name": "并行模糊规则(多规则同步推理)" + }, + { + "id": 58, + "name": "串行模糊规则(规则链式推理)" + }, + { + "id": 59, + "name": "模糊规则库分级(核心规则 + 辅助规则)" + }, + { + "id": 60, + "name": "自适应隶属度模糊规则(动态调整参数)" + }, + { + "id": 61, + "name": "鲁棒模糊规则(抗数据噪声干扰)" + }, + { + "id": 62, + "name": "稀疏模糊规则(适用于高维数据)" + }, + { + "id": 63, + "name": "稠密模糊规则(适用于低维高精度场景)" + }, + { + "id": 64, + "name": "模糊规则可视化(规则库图形化)" + }, + { + "id": 65, + "name": "自然语言模糊规则(贴近人类表述)" + }, + { + "id": 66, + "name": "模糊数学规则(基于模糊集合运算)" + }, + { + "id": 67, + "name": "模糊矩阵规则(矩阵形式表示规则)" + }, + { + "id": 68, + "name": "模糊向量规则(向量空间映射规则)" + }, + { + "id": 69, + "name": "模糊变换规则(基于模糊线性变换)" + }, + { + "id": 70, + "name": "模糊阈值规则(设定模糊决策阈值)" + }, + { + "id": 71, + "name": "模糊滞后规则(处理系统滞后特性)" + }, + { + "id": 72, + "name": "模糊超前规则(预测系统未来状态)" + }, + { + "id": 73, + "name": "模糊自适应控制规则(机器人场景)" + }, + { + "id": 74, + "name": "模糊 PID 控制规则(工业过程控制)" + }, + { + "id": 75, + "name": "模糊滑模控制规则(非线性系统控制)" + }, + { + "id": 76, + "name": "模糊模型预测控制规则(多变量系统)" + }, + { + "id": 77, + "name": "模糊故障诊断规则(设备运维场景)" + }, + { + "id": 78, + "name": "模糊质量评估规则(产品检测场景)" + }, + { + "id": 79, + "name": "模糊信用评级规则(金融场景)" + }, + { + "id": 80, + "name": "模糊风险评估规则(项目管理场景)" + }, + { + "id": 81, + "name": "模糊图像分割规则(医学影像场景)" + }, + { + "id": 82, + "name": "模糊语音识别规则(语音处理场景)" + }, + { + "id": 83, + "name": "模糊文本分类规则(自然语言处理)" + }, + { + "id": 84, + "name": "模糊推荐规则(电商推荐场景)" + }, + { + "id": 85, + "name": "模糊聚类规则(客户分群场景)" + }, + { + "id": 86, + "name": "模糊特征选择规则(数据预处理场景)" + }, + { + "id": 87, + "name": "模糊异常检测规则(安防监控场景)" + }, + { + "id": 88, + "name": "模糊趋势预测规则(股市预测场景)" + }, + { + "id": 89, + "name": "模糊负荷预测规则(电力系统场景)" + }, + { + "id": 90, + "name": "模糊水文预报规则(水利工程场景)" + }, + { + "id": 91, + "name": "模糊气象预测规则(气象服务场景)" + }, + { + "id": 92, + "name": "模糊农业灌溉规则(智慧农业场景)" + }, + { + "id": 93, + "name": "模糊交通调度规则(智能交通场景)" + }, + { + "id": 94, + "name": "模糊物流优化规则(物流配送场景)" + }, + { + "id": 95, + "name": "模糊资源分配规则(企业管理场景)" + }, + { + "id": 96, + "name": "模糊人员调度规则(人力资源场景)" + }, + { + "id": 97, + "name": "模糊能耗优化规则(节能降耗场景)" + }, + { + "id": 98, + "name": "模糊环境监测规则(环保场景)" + }, + { + "id": 99, + "name": "模糊医疗诊断规则(临床医疗场景)" + }, + { + "id": 100, + "name": "模糊教育评估规则(教育教学场景)" + } +] \ No newline at end of file diff --git a/modeler/src/views/ai/model/rules/heuristic.json b/modeler/src/views/ai/model/rules/heuristic.json new file mode 100644 index 0000000..8c4b3ab --- /dev/null +++ b/modeler/src/views/ai/model/rules/heuristic.json @@ -0,0 +1,402 @@ +[ + { + "id": 1, + "name": "基本爬山法(最速上升 / 下降)" + }, + { + "id": 2, + "name": "随机爬山法(随机选择邻域解)" + }, + { + "id": 3, + "name": "随机重启爬山法(避免局部最优)" + }, + { + "id": 4, + "name": "模拟退火算法(经典 Metropolis 准则)" + }, + { + "id": 5, + "name": "快速模拟退火算法(加速收敛)" + }, + { + "id": 6, + "name": "自适应模拟退火算法(动态调整温度)" + }, + { + "id": 7, + "name": "禁忌搜索算法(基本禁忌表)" + }, + { + "id": 8, + "name": "自适应禁忌搜索算法(动态调整禁忌长度)" + }, + { + "id": 9, + "name": "带藐视准则的禁忌搜索算法(优质解豁免)" + }, + { + "id": 10, + "name": "并行禁忌搜索算法(多线程搜索)" + }, + { + "id": 11, + "name": "遗传算法(基本选择 / 交叉 / 变异)" + }, + { + "id": 12, + "name": "二进制遗传算法(编码为二进制串)" + }, + { + "id": 13, + "name": "实数编码遗传算法(适用于连续优化)" + }, + { + "id": 14, + "name": "整数编码遗传算法(适用于离散优化)" + }, + { + "id": 15, + "name": "自适应遗传算法(动态调整交叉 / 变异概率)" + }, + { + "id": 16, + "name": "精英保留遗传算法(保留最优个体)" + }, + { + "id": 17, + "name": "并行遗传算法(多种群同步进化)" + }, + { + "id": 18, + "name": "混合遗传算法(融合局部搜索)" + }, + { + "id": 19, + "name": "多目标遗传算法(NSGA-II)" + }, + { + "id": 20, + "name": "多目标遗传算法(MOEA/D)" + }, + { + "id": 21, + "name": "粒子群优化算法(基本 PSO)" + }, + { + "id": 22, + "name": "标准粒子群优化算法(SPSO)" + }, + { + "id": 23, + "name": "惯性权重自适应粒子群优化(WPSO)" + }, + { + "id": 24, + "name": "压缩因子粒子群优化(CPSO)" + }, + { + "id": 25, + "name": "离散粒子群优化(适用于离散问题)" + }, + { + "id": 26, + "name": "二进制粒子群优化(BPSO)" + }, + { + "id": 27, + "name": "多目标粒子群优化(MOPSO)" + }, + { + "id": 28, + "name": "并行粒子群优化(PPSO)" + }, + { + "id": 29, + "name": "带变异操作的粒子群优化(避免早熟)" + }, + { + "id": 30, + "name": "蚁群优化算法(基本 ACO)" + }, + { + "id": 31, + "name": "蚁群系统(ACS)" + }, + { + "id": 32, + "name": "最大最小蚁群系统(MMAS)" + }, + { + "id": 33, + "name": "精英蚁群系统(EACS)" + }, + { + "id": 34, + "name": "离散蚁群优化(适用于 TSP 问题)" + }, + { + "id": 35, + "name": "连续蚁群优化(适用于连续优化)" + }, + { + "id": 36, + "name": "多目标蚁群优化(MOACO)" + }, + { + "id": 37, + "name": "蚁群 - 遗传混合优化算法" + }, + { + "id": 38, + "name": "灰狼优化算法(基本 GWO)" + }, + { + "id": 39, + "name": "自适应灰狼优化算法(AGWO)" + }, + { + "id": 40, + "name": "改进灰狼优化算法(融入局部搜索)" + }, + { + "id": 41, + "name": "多目标灰狼优化算法(MOGWO)" + }, + { + "id": 42, + "name": "离散灰狼优化算法(DGWO)" + }, + { + "id": 43, + "name": "麻雀搜索算法(基本 SSA)" + }, + { + "id": 44, + "name": "自适应麻雀搜索算法(ASSA)" + }, + { + "id": 45, + "name": "改进麻雀搜索算法(融入变异操作)" + }, + { + "id": 46, + "name": "多目标麻雀搜索算法(MOSSA)" + }, + { + "id": 47, + "name": "鲸鱼优化算法(基本 WOA)" + }, + { + "id": 48, + "name": "自适应鲸鱼优化算法(AWOA)" + }, + { + "id": 49, + "name": "改进鲸鱼优化算法(避免局部最优)" + }, + { + "id": 50, + "name": "多目标鲸鱼优化算法(MOWOA)" + }, + { + "id": 51, + "name": "蝴蝶优化算法(基本 BOA)" + }, + { + "id": 52, + "name": "自适应蝴蝶优化算法(ABOA)" + }, + { + "id": 53, + "name": "混合蝴蝶优化算法(融合 GA)" + }, + { + "id": 54, + "name": "萤火虫算法(基本 FA)" + }, + { + "id": 55, + "name": "自适应萤火虫算法(AFA)" + }, + { + "id": 56, + "name": "多目标萤火虫算法(MOFA)" + }, + { + "id": 57, + "name": "果蝇优化算法(基本 FOA)" + }, + { + "id": 58, + "name": "改进果蝇优化算法(修正距离计算)" + }, + { + "id": 59, + "name": "自适应果蝇优化算法(AFOA)" + }, + { + "id": 60, + "name": "蝙蝠算法(基本 BA)" + }, + { + "id": 61, + "name": "自适应蝙蝠算法(ABA)" + }, + { + "id": 62, + "name": "改进蝙蝠算法(融入惯性权重)" + }, + { + "id": 63, + "name": "多目标蝙蝠算法(MOBA)" + }, + { + "id": 64, + "name": "花授粉算法(基本 FPA)" + }, + { + "id": 65, + "name": "改进花授粉算法(自适应步长)" + }, + { + "id": 66, + "name": "多目标花授粉算法(MOFPA)" + }, + { + "id": 67, + "name": "差分进化算法(基本 DE)" + }, + { + "id": 68, + "name": "自适应差分进化算法(ADE)" + }, + { + "id": 69, + "name": "精英保留差分进化算法(EDE)" + }, + { + "id": 70, + "name": "多目标差分进化算法(MODE)" + }, + { + "id": 71, + "name": "人工蜂群算法(基本 ABC)" + }, + { + "id": 72, + "name": "改进人工蜂群算法(IABC)" + }, + { + "id": 73, + "name": "自适应人工蜂群算法(AABC)" + }, + { + "id": 74, + "name": "多目标人工蜂群算法(MOABC)" + }, + { + "id": 75, + "name": "人工鱼群算法(基本 AFSA)" + }, + { + "id": 76, + "name": "自适应人工鱼群算法(AAFSA)" + }, + { + "id": 77, + "name": "改进人工鱼群算法(避免局部最优)" + }, + { + "id": 78, + "name": "布谷鸟搜索算法(基本 CS)" + }, + { + "id": 79, + "name": "改进布谷鸟搜索算法(自适应发现概率)" + }, + { + "id": 80, + "name": "多目标布谷鸟搜索算法(MOCS)" + }, + { + "id": 81, + "name": "鸡群优化算法(基本 CSO)" + }, + { + "id": 82, + "name": "自适应鸡群优化算法(ACSO)" + }, + { + "id": 83, + "name": "改进鸡群优化算法(融入局部搜索)" + }, + { + "id": 84, + "name": "鸽群优化算法(基本 PIO)" + }, + { + "id": 85, + "name": "改进鸽群优化算法(修正地图与罗盘算子)" + }, + { + "id": 86, + "name": "多目标鸽群优化算法(MOPIO)" + }, + { + "id": 87, + "name": "蝗虫优化算法(基本 LOA)" + }, + { + "id": 88, + "name": "自适应蝗虫优化算法(ALOA)" + }, + { + "id": 89, + "name": "改进蝗虫优化算法(融合 PSO)" + }, + { + "id": 90, + "name": "蜻蜓算法(基本 DA)" + }, + { + "id": 91, + "name": "自适应蜻蜓算法(ADA)" + }, + { + "id": 92, + "name": "多目标蜻蜓算法(MODA)" + }, + { + "id": 93, + "name": "沙蚕群优化算法(基本 CSE)" + }, + { + "id": 94, + "name": "自适应沙蚕群优化算法(ACSE)" + }, + { + "id": 95, + "name": "改进沙蚕群优化算法(融入禁忌搜索)" + }, + { + "id": 96, + "name": "人工免疫系统(基本 AIS)" + }, + { + "id": 97, + "name": "克隆选择算法(CSA)" + }, + { + "id": 98, + "name": "免疫遗传算法(IGA)" + }, + { + "id": 99, + "name": "梯度启发式算法(融合梯度信息)" + }, + { + "id": 100, + "name": "混合启发式算法(GA+PSO+SA,多算法融合)" + } +] \ No newline at end of file diff --git a/modeler/src/views/ai/model/rules/neural.json b/modeler/src/views/ai/model/rules/neural.json new file mode 100644 index 0000000..9f74d8f --- /dev/null +++ b/modeler/src/views/ai/model/rules/neural.json @@ -0,0 +1,402 @@ +[ + { + "id": 1, + "name": "基本 BP 神经网络(反向传播)" + }, + { + "id": 2, + "name": "多层 BP 神经网络(多隐藏层)" + }, + { + "id": 3, + "name": "自适应 BP 神经网络(动态调整学习率)" + }, + { + "id": 4, + "name": "弹性 BP 神经网络(RPROP)" + }, + { + "id": 5, + "name": "共轭梯度 BP 神经网络" + }, + { + "id": 6, + "name": "Levenberg-Marquardt BP 神经网络" + }, + { + "id": 7, + "name": "正则化 BP 神经网络(L1 正则)" + }, + { + "id": 8, + "name": "正则化 BP 神经网络(L2 正则)" + }, + { + "id": 9, + "name": "带 Dropout 的 BP 神经网络(防止过拟合)" + }, + { + "id": 10, + "name": "带 Batch Normalization 的 BP 神经网络(加速收敛)" + }, + { + "id": 11, + "name": "感知机(单层)" + }, + { + "id": 12, + "name": "多层感知机(MLP,基本型)" + }, + { + "id": 13, + "name": "深度多层感知机(DMLP,多隐藏层)" + }, + { + "id": 14, + "name": "稀疏多层感知机(稀疏权重)" + }, + { + "id": 15, + "name": "正则化多层感知机(L1+L2 正则)" + }, + { + "id": 16, + "name": "卷积神经网络(LeNet-5,经典入门)" + }, + { + "id": 17, + "name": "卷积神经网络(AlexNet,深度学习里程碑)" + }, + { + "id": 18, + "name": "卷积神经网络(VGG16,深度卷积)" + }, + { + "id": 19, + "name": "卷积神经网络(VGG19,更深卷积)" + }, + { + "id": 20, + "name": "卷积神经网络(GoogLeNet/Inception v1,多分支结构)" + }, + { + "id": 21, + "name": "卷积神经网络(Inception v2,批量归一化)" + }, + { + "id": 22, + "name": "卷积神经网络(Inception v3,优化结构)" + }, + { + "id": 23, + "name": "卷积神经网络(Inception v4,融合 ResNet)" + }, + { + "id": 24, + "name": "残差网络(ResNet18,残差连接)" + }, + { + "id": 25, + "name": "残差网络(ResNet34,更深残差)" + }, + { + "id": 26, + "name": "残差网络(ResNet50,瓶颈结构)" + }, + { + "id": 27, + "name": "残差网络(ResNet101,深层模型)" + }, + { + "id": 28, + "name": "残差网络(ResNet152,超深层模型)" + }, + { + "id": 29, + "name": "改进残差网络(ResNeXt,分组卷积)" + }, + { + "id": 30, + "name": "密集连接网络(DenseNet,密集连接)" + }, + { + "id": 31, + "name": "轻量级卷积网络(MobileNet v1,深度可分离卷积)" + }, + { + "id": 32, + "name": "轻量级卷积网络(MobileNet v2,倒残差结构)" + }, + { + "id": 33, + "name": "轻量级卷积网络(MobileNet v3,神经架构搜索)" + }, + { + "id": 34, + "name": "轻量级卷积网络(ShuffleNet v1,通道混洗)" + }, + { + "id": 35, + "name": "轻量级卷积网络(ShuffleNet v2,高效结构)" + }, + { + "id": 36, + "name": "循环神经网络(RNN,基本型)" + }, + { + "id": 37, + "name": "循环神经网络(Elman RNN,局部反馈)" + }, + { + "id": 38, + "name": "循环神经网络(Jordan RNN,全局反馈)" + }, + { + "id": 39, + "name": "长短期记忆网络(LSTM,基本型,解决梯度消失)" + }, + { + "id": 40, + "name": "门控循环单元(GRU,简化 LSTM)" + }, + { + "id": 41, + "name": "双向 LSTM(Bi-LSTM,双向时序学习)" + }, + { + "id": 42, + "name": "双向 GRU(Bi-GRU,双向简化时序学习)" + }, + { + "id": 43, + "name": "堆叠 LSTM(Stacked LSTM,多层 LSTM)" + }, + { + "id": 44, + "name": "堆叠 GRU(Stacked GRU,多层 GRU)" + }, + { + "id": 45, + "name": "带 Dropout 的 LSTM(防止过拟合)" + }, + { + "id": 46, + "name": "带 Batch Normalization 的 LSTM(加速收敛)" + }, + { + "id": 47, + "name": "长短期记忆网络(LSTM-LN,层归一化)" + }, + { + "id": 48, + "name": "门控循环单元(GRU-LN,层归一化)" + }, + { + "id": 49, + "name": "时序卷积网络(TCN,替代 RNN 处理时序)" + }, + { + "id": 50, + "name": "双向时序卷积网络(Bi-TCN)" + }, + { + "id": 51, + "name": "变压器网络(Transformer,注意力机制)" + }, + { + "id": 52, + "name": "迷你 Transformer(轻量级,适用于小数据)" + }, + { + "id": 53, + "name": "双向 Transformer(Bi-Transformer)" + }, + { + "id": 54, + "name": "预训练 Transformer(BERT,自然语言处理)" + }, + { + "id": 55, + "name": "预训练 Transformer(GPT,生成式模型)" + }, + { + "id": 56, + "name": "自编码器(AE,基本型,无监督学习)" + }, + { + "id": 57, + "name": "稀疏自编码器(Sparse AE,稀疏隐藏层)" + }, + { + "id": 58, + "name": "降噪自编码器(Denoising AE,抗噪声)" + }, + { + "id": 59, + "name": "卷积自编码器(Convolutional AE,处理图像)" + }, + { + "id": 60, + "name": "循环自编码器(Recurrent AE,处理时序)" + }, + { + "id": 61, + "name": "变分自编码器(VAE,生成式模型)" + }, + { + "id": 62, + "name": "深度变分自编码器(Deep VAE)" + }, + { + "id": 63, + "name": "生成对抗网络(GAN,基本型,生成式模型)" + }, + { + "id": 64, + "name": "深度卷积 GAN(DCGAN,处理图像)" + }, + { + "id": 65, + "name": "条件 GAN(CGAN,带条件约束)" + }, + { + "id": 66, + "name": "循环 GAN(CycleGAN,风格迁移)" + }, + { + "id": 67, + "name": "生成式对抗网络(WGAN,改进损失函数)" + }, + { + "id": 68, + "name": "生成式对抗网络(WGAN-GP,梯度惩罚)" + }, + { + "id": 69, + "name": "径向基函数神经网络(RBF,局部逼近)" + }, + { + "id": 70, + "name": "正交径向基函数神经网络(Orthogonal RBF)" + }, + { + "id": 71, + "name": "自适应径向基函数神经网络(Adaptive RBF)" + }, + { + "id": 72, + "name": "小波神经网络(WNN,融合小波变换)" + }, + { + "id": 73, + "name": "自适应小波神经网络(Adaptive WNN)" + }, + { + "id": 74, + "name": "模糊神经网络(FNN,融合模糊逻辑)" + }, + { + "id": 75, + "name": "神经模糊网络(NFN,模糊与神经深度融合)" + }, + { + "id": 76, + "name": "支持向量机神经网络(SVM-NN,融合 SVM)" + }, + { + "id": 77, + "name": "极限学习机(ELM,单隐藏层,快速训练)" + }, + { + "id": 78, + "name": "深度极限学习机(DELM,多隐藏层)" + }, + { + "id": 79, + "name": "正则化极限学习机(Regularized ELM)" + }, + { + "id": 80, + "name": "带 Dropout 的极限学习机(Dropout ELM)" + }, + { + "id": 81, + "name": "图神经网络(GNN,处理图结构数据)" + }, + { + "id": 82, + "name": "图卷积网络(GCN,卷积操作拓展到图)" + }, + { + "id": 83, + "name": "图注意力网络(GAT,注意力机制拓展到图)" + }, + { + "id": 84, + "name": "图循环网络(GRN,循环操作拓展到图)" + }, + { + "id": 85, + "name": "深度图卷积网络(Deep GCN)" + }, + { + "id": 86, + "name": "胶囊网络(CapsNet,替代卷积处理空间关系)" + }, + { + "id": 87, + "name": "深度胶囊网络(Deep CapsNet)" + }, + { + "id": 88, + "name": "注意力机制神经网络(Attention-NN,通用注意力)" + }, + { + "id": 89, + "name": "自注意力神经网络(Self-Attention-NN)" + }, + { + "id": 90, + "name": "多头注意力神经网络(Multi-Head Attention-NN)" + }, + { + "id": 91, + "name": "强化学习神经网络(DQN,深度 Q 网络)" + }, + { + "id": 92, + "name": "强化学习神经网络(DDQN,双重 DQN)" + }, + { + "id": 93, + "name": "强化学习神经网络(Dueling DQN,竞争网络)" + }, + { + "id": 94, + "name": "强化学习神经网络(PPO,近端策略优化)" + }, + { + "id": 95, + "name": "迁移学习神经网络(Transfer-NN,迁移预训练权重)" + }, + { + "id": 96, + "name": "联邦学习神经网络(Federated-NN,隐私保护)" + }, + { + "id": 97, + "name": "增量学习神经网络(Incremental-NN,持续学习)" + }, + { + "id": 98, + "name": "在线学习神经网络(Online-NN,实时更新)" + }, + { + "id": 99, + "name": "鲁棒神经网络(Robust-NN,抗噪声与攻击)" + }, + { + "id": 100, + "name": "轻量化神经网络(Lightweight-NN,适用于嵌入式设备)" + } +] \ No newline at end of file diff --git a/modeler/src/views/ai/model/types/index.ts b/modeler/src/views/ai/model/types/index.ts new file mode 100644 index 0000000..e3a9302 --- /dev/null +++ b/modeler/src/views/ai/model/types/index.ts @@ -0,0 +1,10 @@ +/* + * This file is part of the kernelstudio package. + * + * (c) 2014-2026 zlin + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +export * from './types' \ No newline at end of file diff --git a/modeler/src/views/ai/model/types/types.ts b/modeler/src/views/ai/model/types/types.ts new file mode 100644 index 0000000..18fe803 --- /dev/null +++ b/modeler/src/views/ai/model/types/types.ts @@ -0,0 +1,205 @@ +/* + * This file is part of the kernelstudio package. + * + * (c) 2014-2025 zlin + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +import type { ApiDataResponse, NullableString, PageableResponse } from '@/types'; +import type { DraggableElement } from '../../builder/element'; + +// 模型 +export interface Model { + id: number; + // 所属工程ID + projectId: number | undefined; + // 项目名称 + projectSpaceName: NullableString; + // 模型名称 + name: NullableString; + // 模型描述 + description: NullableString; + // 存储位置 + storageLocation: NullableString; + // 配置信息(JSON格式) + configInfo: NullableString; + // 状态 + status: number; + // 创建时间 + createTime: NullableString; + + [key: string]: unknown; +} + +export interface ModelResult extends ApiDataResponse { + + [key: string]: unknown; +} + +export interface ModelQueryResult extends PageableResponse { + + [key: string]: unknown; +} + +// 网络模型组件 +export interface NetworkModel { + id: number; + // 网络模型名称 + name: NullableString; + // 网络类型(如:mlp) + type: NullableString; + // 输入维度 + inputDim: number; + // 隐藏层大小(JSON数组格式,如:[256, 256, 128, 64]) + hiddenSizes: NullableString; + // 输出维度 + outputDim: number; + // 激活函数(如:relu) + activation: NullableString; + // 状态(1=正常,0=已删除) + status: number; + + [key: string]: unknown; +} + +export interface NetworkModelResult extends ApiDataResponse { + + [key: string]: unknown; +} + +// 观测类型 +export interface ObservationType { + id: number; + // 观测类型代码 + typeCode: NullableString; + // 观测类型名称 + typeName: NullableString; + // 字段类型 + fieldType: NullableString; + // 描述 + description: NullableString; + // 排序号 + sortOrder: number; + // 状态(1=正常,0=已删除 + status: number; + + [key: string]: unknown; +} + +export interface ObservationTypeResult extends PageableResponse { + + [key: string]: unknown; +} + +// 奖励设计 +export interface RewardDesign { + id: number; + // 奖励名称 + name: NullableString; + // 奖励代码 + rewardCode: NullableString; + // 奖励值 + reward: NullableString; + // 排序 + orderIndex: number; + // 说明 + description: NullableString; + // 组件ID + componentId: number; + // 状态(1=正常,0=已删除 + status: number; +} + +export interface RewardDesignResult extends PageableResponse { + data: RewardDesign[]; + + [key: string]: unknown; +} + +export interface ModelActionEntryAngleRange { + min: number; + max: number; +} + +export interface ModelActionEntryAngle { + // 俯仰角 + pitch?: ModelActionEntryAngleRange; + // 偏航角 + yaw?: ModelActionEntryAngleRange; + // 滚转角 + roll: ModelActionEntryAngleRange; + + [key: string]: unknown; +} + +export type ModelActionEntryArgs = ModelActionEntryAngle & Record; + +export interface ModelActionSpace { + // 动作实体 + entry: NullableString; + // 动作类型 + type: NullableString; + // 动作参数 + args: ModelActionEntryArgs; + + [key: string]: unknown; +} + +// 模型参数设置 +export interface ModelParameters { + // 隐藏纬度 + hiddenLatitude: NullableString; + // 激活函数 + activationFunction: NullableString; + + [key: string]: unknown; +} + +export interface ModelElementPosition { + x: number; + y: number; +} + +export type ModelElementStatus = 'default' | 'success' | 'failed' | 'running' | string | null + +export interface ModelBaseElement { + key: string; + name: string; + type: string; + width: number; + height: number; + position: ModelElementPosition; + category: NullableString; + element?: DraggableElement; + + [key: string]: unknown; +} + +export interface ModelElementEdge { + key: NullableString; + sourceKey: NullableString; + sourceName: NullableString; + targetKey: NullableString; + targetName: NullableString; +} + + +export interface ModelElement extends ModelBaseElement { + // 连线 + edges: ModelElementEdge[]; + // 模型参数设置 + parameters: ModelParameters; +} + +export interface SavedGraphData { + nodes: ModelElement[]; + edges: any[]; + // 观测类型 + observations: ObservationType[]; + // 奖励设计 + rewards: RewardDesign[]; + // 动作空间 + actionSpaces: ModelActionSpace[]; +} diff --git a/modeler/src/views/ai/model/utils.ts b/modeler/src/views/ai/model/utils.ts new file mode 100644 index 0000000..b13893e --- /dev/null +++ b/modeler/src/views/ai/model/utils.ts @@ -0,0 +1,127 @@ +/* + * This file is part of the kernelstudio package. + * + * (c) 2014-2026 zlin + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +import type { ModelElement } from './types'; +import { generateKey } from '@/utils/strings'; +import type { DraggableElement } from '../builder/element'; +import { createPorts } from '../builder/ports'; + +export const createNodePorts = (element: ModelElement): any => { + // 获取子元素数量,做更严谨的空值处理 + const childrenLength = element.element?.children?.length ?? 0; + + // 如果是组件类型、无分类或者无子元素,返回默认空连接桩 + if (element.category === 'component' || !element.category || childrenLength === 0) { + return createPorts(); + } + + return createPorts(); + + // // 存储分组配置和连接桩项 + // const groups: Record = {}; + // const items: Array<{ id: string; group: string }> = []; + // + // // 循环生成对应数量的左右侧连接桩 + // for (let i = 0; i < childrenLength; i++) { + // // 1. 左侧连接桩:使用X6支持的'left'作为位置名称,args配置偏移量(可选) + // const leftGroupKey = `left_port_group_${i}`; + // groups[leftGroupKey] = createPort('left', { dx: 0, dy: (i - (childrenLength - 1) / 2) * 20 + i + 10 }); + // // dy偏移量:让多个左侧连接桩垂直均匀分布,20是间距,可根据需求调整 + // + // // 2. 右侧连接桩:使用X6支持的'right'作为位置名称 + // const rightGroupKey = `right_port_group_${i}`; + // groups[rightGroupKey] = createPort('right', { dx: 0, dy: (i - (childrenLength - 1) / 2) * 20 + i + 10 }); + // + // // 生成左侧连接桩项(唯一ID) + // items.push({ + // id: `left_port_${i}`, + // group: leftGroupKey + // }); + // + // // 生成右侧连接桩项(唯一ID) + // items.push({ + // id: `right_port_${i}`, + // group: rightGroupKey + // }); + // } + // + // // 返回最终的连接桩配置 + // return { + // groups, + // items + // }; +}; + +export const defaultHeight: Record = { + component: 110, + // action: 80, + // task: 80, + // control: 110, +} + +export const createModelNode = (element: ModelElement, width: number = 250, height: number = 120): any => { + let realHeight = defaultHeight[element.category as string]; + if(!realHeight){ + realHeight = 110; + } + if(element?.element?.children){ + if(element.element?.children?.length > 4){ + realHeight = element.element?.children?.length * 35 + } else if(element.element?.children?.length <=1){ + realHeight = 100 + } + } + // if ('action' === element.category) { + // realHeight = 40; + // width = 140; + // } + return { + shape: element.type ?? 'model', + id: element.key, + position: { + x: element.position?.x || 0, + y: element.position?.y || 0, + }, + size: { + width: width, + height: realHeight, + }, + attrs: { + label: { + text: element.name, + }, + }, + data: element, + // ports: createNodePorts(element), + }; +}; + +export const createDraggableElement = (data: DraggableElement, x: number, y: number): ModelElement => { + return { + key: generateKey('model'), + type: 'model', + name: data.name || '', + element: data, + width: 250, + height: 120, + position: { + x, + y, + }, + category: data.category ?? 'component', + edges: [], + actionSpaces: [], + observations: [], + rewards: [], + parameters: { + hiddenLatitude: null, + activationFunction: 'relu', + }, + } as ModelElement; +}; \ No newline at end of file diff --git a/modeler/src/views/ai/project/api.ts b/modeler/src/views/ai/project/api.ts new file mode 100644 index 0000000..d6559c1 --- /dev/null +++ b/modeler/src/views/ai/project/api.ts @@ -0,0 +1,52 @@ +/* + * This file is part of the kernelstudio package. + * + * (c) 2014-2025 zlin + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +import request from '@/utils/request'; +import type { Project, ProjectConfig, ProjectConfigResult, ProjectQueryResult, ResourceTemplate, ResourceTemplateResult } from './types'; +import type { ApiDataResponse, BasicResponse } from '@/types'; + +export const findProjectByQuery = (query: Partial = {}): Promise => { + return request.get('/projectSpace/list', query); +}; + +export const findAllProjects = (): Promise> => { + return request.get>('/projectSpace/all'); +}; + +export const createProjectConfig = (project: ProjectConfig): Promise => { + return request.postJson('/projectSpace/config', project); +}; + +export const updateProject = (project: Project): Promise => { + return request.putJson('/projectSpace/edit', project); +}; + +export const deleteProjectById = (id: number | string): Promise => { + return request.delete(`/projectSpace/logic/${id}`); +}; + +export const findAllResourceTemplates = (): Promise => { + return request.get('/resourceTemplate/all'); +}; + +export const findResourceTemplateByQuery = (query: Partial): Promise => { + return request.get('/resourceTemplate/list', query); +}; + +export const createResourceTemplate = (rt: Partial): Promise => { + return request.postJson('/resourceTemplate/add', rt); +}; + +export const updateResourceTemplate = (rt: Partial): Promise => { + return request.putJson('/resourceTemplate/edit', rt); +}; + +export const deleteResourceTemplate = (id: number): Promise => { + return request.delete(`/resourceTemplate/logic/${id}`); +}; \ No newline at end of file diff --git a/modeler/src/views/ai/project/config.ts b/modeler/src/views/ai/project/config.ts new file mode 100644 index 0000000..440c72f --- /dev/null +++ b/modeler/src/views/ai/project/config.ts @@ -0,0 +1,119 @@ +/* + * This file is part of the kernelstudio package. + * + * (c) 2014-2025 zlin + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +import type { Project, ProjectConfig, ResourceTemplate } from './types'; + +export const projectColumns = [ + { + title: '序号', + dataIndex: 'index', + key: 'index', + }, + { + title: '名称', + dataIndex: 'name', + key: 'name', + }, + { + title: '训练实例数', + dataIndex: 'trainingInstanceCount', + key: 'trainingInstanceCount', + }, + { + title: '场景类型', + dataIndex: 'scene', + key: 'scene', + }, + // { + // title: '状态', + // dataIndex: 'status', + // key: 'status', + // }, + { + title: '描述', + dataIndex: 'description', + key: 'description', + }, + { + title: '操作', + dataIndex: '_actions', + key: '_actions', + width: 100, + }, +]; + +export const resourceTemplateColumns = [ + { + title: '序号', + dataIndex: 'index', + key: 'index', + }, + { + title: '名称', + dataIndex: 'name', + key: 'name', + }, + { + title: 'CPU数量配置', + dataIndex: 'cpuConfig', + key: 'cpuConfig', + }, + { + title: 'GPU数量配置', + dataIndex: 'gpuConfig', + key: 'gpuConfig', + }, + { + title: '存储资源配置', + dataIndex: 'storageConfig', + key: 'storageConfig', + }, + { + title: '状态', + dataIndex: 'status', + key: 'status', + }, + { + title: '操作', + dataIndex: '_actions', + key: '_actions', + }, +]; + +export const defaultProject: Project = { + id: 0, + name: null, + scene: 1, + trainingInstanceCount: 0, + description: null, + status: 1, +}; + +export const defaultResourceTemplate: ResourceTemplate = { + id: 0, + name: null, + projectSpaceId: null, + cpuConfig: null, + gpuConfig: null, + storageConfig: null, + status: 1, // 1=正常,0=已删除 +}; + +export const defaultProjectConfig: ProjectConfig = { + id: 0, + projectSpaceId: null, + genConfigId: null, + projectName: null, + taskName: null, + scenarioName: null, + storageLocation: null, + description: null, + trainingInstanceCount: null, + resourceTemplateId: undefined, +}; diff --git a/modeler/src/views/ai/project/config.vue b/modeler/src/views/ai/project/config.vue new file mode 100644 index 0000000..4064886 --- /dev/null +++ b/modeler/src/views/ai/project/config.vue @@ -0,0 +1,256 @@ + + + \ No newline at end of file diff --git a/modeler/src/views/ai/project/create-v1.vue b/modeler/src/views/ai/project/create-v1.vue new file mode 100644 index 0000000..ea84844 --- /dev/null +++ b/modeler/src/views/ai/project/create-v1.vue @@ -0,0 +1,208 @@ + + + \ No newline at end of file diff --git a/modeler/src/views/ai/project/create.vue b/modeler/src/views/ai/project/create.vue new file mode 100644 index 0000000..267e2f2 --- /dev/null +++ b/modeler/src/views/ai/project/create.vue @@ -0,0 +1,190 @@ + + + \ No newline at end of file diff --git a/modeler/src/views/ai/project/management.vue b/modeler/src/views/ai/project/management.vue new file mode 100644 index 0000000..bfc3b08 --- /dev/null +++ b/modeler/src/views/ai/project/management.vue @@ -0,0 +1,34 @@ + + + \ No newline at end of file diff --git a/modeler/src/views/ai/project/project-lists.vue b/modeler/src/views/ai/project/project-lists.vue new file mode 100644 index 0000000..84a691f --- /dev/null +++ b/modeler/src/views/ai/project/project-lists.vue @@ -0,0 +1,154 @@ + + + \ No newline at end of file diff --git a/modeler/src/views/ai/project/resource-templates.vue b/modeler/src/views/ai/project/resource-templates.vue new file mode 100644 index 0000000..fcde388 --- /dev/null +++ b/modeler/src/views/ai/project/resource-templates.vue @@ -0,0 +1,178 @@ + + + \ No newline at end of file diff --git a/modeler/src/views/ai/project/types.ts b/modeler/src/views/ai/project/types.ts new file mode 100644 index 0000000..c182895 --- /dev/null +++ b/modeler/src/views/ai/project/types.ts @@ -0,0 +1,65 @@ +/* + * This file is part of the kernelstudio package. + * + * (c) 2014-2025 zlin + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +import type { ApiDataResponse, BasicResponse, NullableString, PageableResponse } from '@/types'; + +// 工程 +export interface Project { + id: number; + name: NullableString; + scene: number; // 1=运行,2=停止 + trainingInstanceCount: number; // 训练实例数 + description: NullableString; // 描述 + status: number; // 1=正常,0=停用 + [key: string]: unknown; +} + + +export interface ProjectQueryResult extends PageableResponse { + + [key: string]: unknown; +} + +export interface ProjectConfig { + id: number; + projectSpaceId: number | null; + genConfigId: number | null; + projectName: NullableString; + taskName: NullableString; + scenarioName: NullableString; + storageLocation: NullableString; + description: NullableString; + trainingInstanceCount: number | null; + resourceTemplateId: number | undefined | null; + + [key: string]: unknown; +} + +export interface ProjectConfigResult extends BasicResponse { + + [key: string]: unknown; +} + + +// 资源模版 +export interface ResourceTemplate { + id: number; + projectSpaceId: number | null; + name: NullableString; + cpuConfig: NullableString; + gpuConfig: NullableString; + storageConfig: NullableString; + status: number; // 1=正常,0=已删除 + [key: string]: unknown; +} + +export interface ResourceTemplateResult extends ApiDataResponse { + + [key: string]: unknown; +} \ No newline at end of file diff --git a/modeler/src/views/ai/project/workspace.vue b/modeler/src/views/ai/project/workspace.vue new file mode 100644 index 0000000..381edc3 --- /dev/null +++ b/modeler/src/views/ai/project/workspace.vue @@ -0,0 +1,278 @@ + + + \ No newline at end of file diff --git a/modeler/src/views/ai/router.ts b/modeler/src/views/ai/router.ts new file mode 100644 index 0000000..4db3bd6 --- /dev/null +++ b/modeler/src/views/ai/router.ts @@ -0,0 +1,178 @@ +/* + * This file is part of the kernelstudio package. + * + * (c) 2014-2025 zlin + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +import {type RouteRecordRaw, type RouteRecordRedirect} from 'vue-router'; + +export const routers: RouteRecordRaw[] = [ + { + name: 'index', + path: '/', + redirect: '/app/ai/project/management', + meta: { + hidden: true, + }, + } as RouteRecordRedirect, + + { + name: 'signin', + path: '/signin', + meta: { + title: '登录', + }, + component: () => import('@/views/signin.vue') + }, + + { + path: '/', + meta: { + title: '工程空间', + }, + children: [ + { + name: 'ai-project-management', + path: '/app/ai/project/management', + meta: { + title: '工程管理', + }, + component: () => import('@/views/ai/project/management.vue') + }, + { + name: 'ai-project-create', + path: '/app/ai/project/create', + meta: { + title: '新建/自定义', + hidden: true, + }, + component: () => import('@/views/ai/project/create.vue') + }, + { + name: 'ai-project-workspace', + path: '/app/ai/project/workspace', + meta: { + title: '工程空间详情', + hidden: true, + }, + component: () => import('@/views/ai/project/workspace.vue') + }, + { + name: 'ai-training-task-monitor', + path: '/app/ai/training/task/monitor', + meta: { + title: '训练任务监控', + hidden: true, + }, + component: () => import('@/views/ai/training/task-monitor.vue') + }, + { + name: 'ai-training-resources-monitor', + path: '/app/ai/training/resources/monitor', + meta: { + title: '训练资源监控', + hidden: true, + }, + component: () => import('@/views/ai/training/resource-monitor.vue') + }, + { + name: 'ai-project-config', + path: '/app/ai/project/config', + meta: { + hidden: true, + }, + component: () => import('@/views/ai/project/config.vue') + }, + + ] + }, + + + { + path: '/', + meta: { + title: '模型构建', + }, + children: [ + { + name: 'ai-model-management', + path: '/app/ai/model/management', + meta: { + title: '模型管理', + }, + component: () => import('@/views/ai/model/management.vue') + }, + { + name: 'ai-model-builder-designer', + path: '/app/ai/model/builder/:id/designer', + meta: { + title: '模型构建', + }, + component: () => import('@/views/ai/model/builder.vue') + }, + { + name: 'ai-model-components', + path: '/app/ai/model/components', + meta: { + title: '模型组件设置', + }, + component: () => import('@/views/ai/model/components.vue') + }, + ] + }, + + { + path: '/', + meta: { + title: '模型训练', + }, + children: [ + { + name: 'ai-model-task-management', + path: '/app/ai/training/task/management', + meta: { + title: '任务管理', + }, + component: () => import('@/views/ai/training/task-management.vue') + }, + { + name: 'ai-training-task-configurer', + path: '/app/ai/training/task/configurer', + meta: { + title: '训练任务配置', + }, + component: () => import('@/views/ai/training/task-configurer.vue') + }, + ] + }, + + { + path: '/', + meta: { + title: '模型应用', + }, + children: [ + { + name: 'ai-applications-gambling', + path: '/app/ai/applications/gambling', + meta: { + title: '模型部署与推理', + }, + component: () => import('@/views/ai/applications/gambling.vue') + }, + { + name: 'ai-applications-gambling-charts', + path: '/app/ai/applications/gambling/:id/charts', + meta: { + title: '模型部署与推理', + }, + component: () => import('@/views/ai/applications/charts/charts.vue') + } + ] + }, + + +] \ No newline at end of file diff --git a/modeler/src/views/ai/sidebar.vue b/modeler/src/views/ai/sidebar.vue new file mode 100644 index 0000000..2389305 --- /dev/null +++ b/modeler/src/views/ai/sidebar.vue @@ -0,0 +1,207 @@ + + + \ No newline at end of file diff --git a/modeler/src/views/ai/training/api.ts b/modeler/src/views/ai/training/api.ts new file mode 100644 index 0000000..4361fc0 --- /dev/null +++ b/modeler/src/views/ai/training/api.ts @@ -0,0 +1,41 @@ +/* + * This file is part of the kernelstudio package. + * + * (c) 2014-2026 zlin + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + + +import type { TrainingAlgorithmResult, TrainingMethodResult, TrainingTask, TrainingTaskConfig, TrainingTaskResult } from './types'; +import request from '@/utils/request'; +import type { BasicResponse } from '@/types'; + +export const deleteTask = (id: number | string): Promise => { + return request.delete(`/trainTask/logic/${id}`); +}; + +export const findTrainingTaskByQuery = (query: Partial = {}): Promise => { + return request.get('/trainTask/list', query); +}; + +export const createTrainingTask = (rt: Partial): Promise => { + return request.postJson('/trainTask/add', rt); +}; + +export const updateTrainingTask = (rt: Partial): Promise => { + return request.putJson('/trainTask/edit', rt); +}; + +export const configTrainingTask = (rt: Partial): Promise => { + return request.postJson('/trainTask/config', rt); +}; + +export const findTrainingMethods = (): Promise => { + return request.get('/trainingMethod/list'); +}; + +export const findTrainingAlgorithms = (): Promise => { + return request.get('/algorithm/list'); +}; diff --git a/modeler/src/views/ai/training/config.ts b/modeler/src/views/ai/training/config.ts new file mode 100644 index 0000000..1689227 --- /dev/null +++ b/modeler/src/views/ai/training/config.ts @@ -0,0 +1,86 @@ +/* + * This file is part of the kernelstudio package. + * + * (c) 2014-2026 zlin + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +import type { TableColumnType } from 'ant-design-vue'; +import type { Hyperparameter, TrainingResource, TrainingTask, TrainingTaskConfig } from './types'; + +export const trainingTaskColumns: TableColumnType[] = [ + { + title: '序号', + dataIndex: 'index', + key: 'index', + }, + { + title: '任务名称', + dataIndex: 'taskName', + key: 'name', + }, + { + title: '运行状态', + dataIndex: 'runStatus', + key: 'runStatus', + }, + { + title: '版本信息', + dataIndex: 'versionInfo', + key: 'versionInfo', + }, + { + title: '任务描述', + dataIndex: 'description', + key: 'description', + }, + { + title: '操作', + dataIndex: '_actions', + key: '_actions', + width: 100, + }, +]; + +export const defaultTrainingTask: TrainingTask = { + id: null, + taskName: null, + versionInfo: null, + description: null, + modelId: undefined, + modelName: null, + modelPath: null, + algorithmId: null, + algorithmCode: null, + trainingMethodId: null, + trainingMethodCode: null, + relatedTaskId: null, + evaluationMetricSystem: null, + runStatus: 0, + status: 1, +}; + +export const defaultHyperparameter: Hyperparameter = { + id: null, + dataCount: 0, + epoch: 0, + iterations: 0, + learningRate: null, +}; + +export const defaultTrainingResource: TrainingResource = { + id: null, + resourcePoolType: null, + specification: null, + computeNodeCount: 0, + simulationType: 'afsim', + deduceMultiple: 0, +}; + +export const defaultTrainingTaskConfig: TrainingTaskConfig = { + trainTask: Object.assign({}, defaultTrainingTask), + hyperparameter: Object.assign({}, defaultHyperparameter), + trainResource: Object.assign({}, defaultTrainingResource), +}; diff --git a/modeler/src/views/ai/training/resource-monitor.vue b/modeler/src/views/ai/training/resource-monitor.vue new file mode 100644 index 0000000..2e9622e --- /dev/null +++ b/modeler/src/views/ai/training/resource-monitor.vue @@ -0,0 +1,30 @@ + + + \ No newline at end of file diff --git a/modeler/src/views/ai/training/task-configurer.vue b/modeler/src/views/ai/training/task-configurer.vue new file mode 100644 index 0000000..244352d --- /dev/null +++ b/modeler/src/views/ai/training/task-configurer.vue @@ -0,0 +1,512 @@ + + + \ No newline at end of file diff --git a/modeler/src/views/ai/training/task-management.vue b/modeler/src/views/ai/training/task-management.vue new file mode 100644 index 0000000..085591e --- /dev/null +++ b/modeler/src/views/ai/training/task-management.vue @@ -0,0 +1,181 @@ + + + \ No newline at end of file diff --git a/modeler/src/views/ai/training/task-monitor.vue b/modeler/src/views/ai/training/task-monitor.vue new file mode 100644 index 0000000..d60235e --- /dev/null +++ b/modeler/src/views/ai/training/task-monitor.vue @@ -0,0 +1,30 @@ + + + \ No newline at end of file diff --git a/modeler/src/views/ai/training/types.ts b/modeler/src/views/ai/training/types.ts new file mode 100644 index 0000000..48a886c --- /dev/null +++ b/modeler/src/views/ai/training/types.ts @@ -0,0 +1,139 @@ +/* + * This file is part of the kernelstudio package. + * + * (c) 2014-2026 zlin + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +import type { BasicResponse, NullableString, PageableResponse } from '@/types'; + +// 超参设置 +export interface Hyperparameter { + id: number | null; + // 数据条数 + dataCount: number; + // 迭代轮次/Epoch + epoch: number; + // 迭代步数/Iterations + iterations: number; + // 学习率/learning_rate + learningRate: NullableString; + + [key: string]: unknown; +} + + +// 训练资源配置 +export interface TrainingResource { + id: number | null; + // 资源池类型 + resourcePoolType: NullableString; + // 规格 + specification: NullableString; + // 计算节点个数 + computeNodeCount: number; + // 仿真容器类型选择 + simulationType: NullableString; + // 推演倍数 + deduceMultiple: number; + + [key: string]: unknown; +} + +// 训练任务配置 +export interface TrainingTaskConfig { + // 训练任务信息 + trainTask: TrainingTask; + // 超参设置 + hyperparameter: Hyperparameter; + // 训练资源配置 + trainResource: TrainingResource; + + [key: string]: unknown; + +} + +export interface TrainingTaskConfigResult extends BasicResponse { + + [key: string]: unknown; +} + +// 训练方法 +export interface TrainingMethod { + id: number; + methodName: NullableString; + methodCode: NullableString; + description: NullableString; + status: number; + + [key: string]: unknown; +} + +export interface TrainingMethodResult extends PageableResponse { + + [key: string]: unknown; +} + +// 算法 +export interface TrainingAlgorithm { + id: number; + // 算法名称 + algorithmName: NullableString; + // 算法代码(英文名称,如PPO、FULL_FINETUNE、LORA等) + algorithmCode: NullableString; + // 算法类型(如:微调、预训练、强化学习等 + algorithmType: NullableString; + // 算法描述 + description: NullableString; + + [key: string]: unknown; +} + +export interface TrainingAlgorithmResult extends PageableResponse { + + [key: string]: unknown; +} + + +export interface TrainingTask { + // 主键ID + id: number | null; + // 任务名称 + taskName: NullableString; + // 版本信息 + versionInfo: NullableString; + // 描述 + description: NullableString; + // 模型ID + modelId: number | undefined; + // 模型名称 + modelName: NullableString; + // 模型路径 + modelPath: NullableString; + // 算法表ID + algorithmId: number | null; + // 算法表code + algorithmCode: NullableString; + // 训练方法ID + trainingMethodId: number | null; + // 训练方法code + trainingMethodCode: NullableString; + // 关联任务ID + relatedTaskId: NullableString; + // 评估指标体系 + evaluationMetricSystem: NullableString; + // 运行状态(0=停止,1=运行中) + runStatus: number; + // 状态(1=正常,0=已删除) + status: number; + ip?: NullableString; + port?:NullableString; + [key: string]: unknown; +} + +export interface TrainingTaskResult extends PageableResponse { + + [key: string]: unknown; +} diff --git a/modeler/src/views/ai/types.ts b/modeler/src/views/ai/types.ts new file mode 100644 index 0000000..3cc3190 --- /dev/null +++ b/modeler/src/views/ai/types.ts @@ -0,0 +1,25 @@ +/* + * This file is part of the kernelstudio package. + * + * (c) 2014-2026 zlin + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +import type { ApiDataResponse, NullableString } from '@/types'; + +export interface FinderBrowser { + name: NullableString, + path: string, + directory: boolean, + children: FinderBrowser[] +} + +export interface FinderBrowserResult extends ApiDataResponse { + +} + +export interface DeductionTestResponse extends ApiDataResponse { + +} \ No newline at end of file diff --git a/modeler/src/views/signin.vue b/modeler/src/views/signin.vue new file mode 100644 index 0000000..1dc6c5a --- /dev/null +++ b/modeler/src/views/signin.vue @@ -0,0 +1,104 @@ + + + + + \ No newline at end of file diff --git a/modeler/tsconfig.app.json b/modeler/tsconfig.app.json new file mode 100644 index 0000000..ac482ed --- /dev/null +++ b/modeler/tsconfig.app.json @@ -0,0 +1,20 @@ +{ + "extends": "@vue/tsconfig/tsconfig.dom.json", + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "types": ["vite/client"], + "baseUrl": ".", // 基础路径(相对于当前tsconfig文件) + "paths": { + "@/*": ["src/*"] // 映射 @ 到 src 目录 + }, + /* Linting */ + "strict": true, + "noUnusedLocals": false, // 关闭未使用的局部变量检查(解决 TS6133) + "noUnusedParameters": false, // 关闭未使用的函数参数检查(可选,若有类似参数错误) + "erasableSyntaxOnly": true, + "strictNullChecks": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"] +} diff --git a/modeler/tsconfig.json b/modeler/tsconfig.json new file mode 100644 index 0000000..1ffef60 --- /dev/null +++ b/modeler/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/modeler/tsconfig.node.json b/modeler/tsconfig.node.json new file mode 100644 index 0000000..8a67f62 --- /dev/null +++ b/modeler/tsconfig.node.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "ES2023", + "lib": ["ES2023"], + "module": "ESNext", + "types": ["node"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/modeler/types/auto-imports.d.ts b/modeler/types/auto-imports.d.ts new file mode 100644 index 0000000..79fd3c2 --- /dev/null +++ b/modeler/types/auto-imports.d.ts @@ -0,0 +1,177 @@ +/* eslint-disable */ +/* prettier-ignore */ +// @ts-nocheck +// noinspection JSUnusedGlobalSymbols +// Generated by unplugin-auto-import +// biome-ignore lint: disable +export {} +declare global { + const EffectScope: typeof import('vue').EffectScope + const acceptHMRUpdate: typeof import('pinia').acceptHMRUpdate + const computed: typeof import('vue').computed + const createApp: typeof import('vue').createApp + const createPinia: typeof import('pinia').createPinia + const customRef: typeof import('vue').customRef + const defineAsyncComponent: typeof import('vue').defineAsyncComponent + const defineComponent: typeof import('vue').defineComponent + const defineStore: typeof import('pinia').defineStore + const effectScope: typeof import('vue').effectScope + const getActivePinia: typeof import('pinia').getActivePinia + const getCurrentInstance: typeof import('vue').getCurrentInstance + const getCurrentScope: typeof import('vue').getCurrentScope + const getCurrentWatcher: typeof import('vue').getCurrentWatcher + const inject: typeof import('vue').inject + const isProxy: typeof import('vue').isProxy + const isReactive: typeof import('vue').isReactive + const isReadonly: typeof import('vue').isReadonly + const isRef: typeof import('vue').isRef + const isShallow: typeof import('vue').isShallow + const mapActions: typeof import('pinia').mapActions + const mapGetters: typeof import('pinia').mapGetters + const mapState: typeof import('pinia').mapState + const mapStores: typeof import('pinia').mapStores + const mapWritableState: typeof import('pinia').mapWritableState + const markRaw: typeof import('vue').markRaw + const nextTick: typeof import('vue').nextTick + const onActivated: typeof import('vue').onActivated + const onBeforeMount: typeof import('vue').onBeforeMount + const onBeforeRouteLeave: typeof import('vue-router').onBeforeRouteLeave + const onBeforeRouteUpdate: typeof import('vue-router').onBeforeRouteUpdate + const onBeforeUnmount: typeof import('vue').onBeforeUnmount + const onBeforeUpdate: typeof import('vue').onBeforeUpdate + const onDeactivated: typeof import('vue').onDeactivated + const onErrorCaptured: typeof import('vue').onErrorCaptured + const onMounted: typeof import('vue').onMounted + const onRenderTracked: typeof import('vue').onRenderTracked + const onRenderTriggered: typeof import('vue').onRenderTriggered + const onScopeDispose: typeof import('vue').onScopeDispose + const onServerPrefetch: typeof import('vue').onServerPrefetch + const onUnmounted: typeof import('vue').onUnmounted + const onUpdated: typeof import('vue').onUpdated + const onWatcherCleanup: typeof import('vue').onWatcherCleanup + const provide: typeof import('vue').provide + const reactive: typeof import('vue').reactive + const readonly: typeof import('vue').readonly + const ref: typeof import('vue').ref + const resolveComponent: typeof import('vue').resolveComponent + const setActivePinia: typeof import('pinia').setActivePinia + const setMapStoreSuffix: typeof import('pinia').setMapStoreSuffix + const shallowReactive: typeof import('vue').shallowReactive + const shallowReadonly: typeof import('vue').shallowReadonly + const shallowRef: typeof import('vue').shallowRef + const storeToRefs: typeof import('pinia').storeToRefs + const toRaw: typeof import('vue').toRaw + const toRef: typeof import('vue').toRef + const toRefs: typeof import('vue').toRefs + const toValue: typeof import('vue').toValue + const triggerRef: typeof import('vue').triggerRef + const unref: typeof import('vue').unref + const useAttrs: typeof import('vue').useAttrs + const useClipboard: typeof import('@vueuse/core').useClipboard + const useCssModule: typeof import('vue').useCssModule + const useCssVars: typeof import('vue').useCssVars + const useDebounceFn: typeof import('@vueuse/core').useDebounceFn + const useId: typeof import('vue').useId + const useLink: typeof import('vue-router').useLink + const useLocalStorage: typeof import('@vueuse/core').useLocalStorage + const useModel: typeof import('vue').useModel + const useRoute: typeof import('vue-router').useRoute + const useRouter: typeof import('vue-router').useRouter + const useSlots: typeof import('vue').useSlots + const useTemplateRef: typeof import('vue').useTemplateRef + const watch: typeof import('vue').watch + const watchEffect: typeof import('vue').watchEffect + const watchPostEffect: typeof import('vue').watchPostEffect + const watchSyncEffect: typeof import('vue').watchSyncEffect +} +// for type re-export +declare global { + // @ts-ignore + export type { Component, Slot, Slots, ComponentPublicInstance, ComputedRef, DirectiveBinding, ExtractDefaultPropTypes, ExtractPropTypes, ExtractPublicPropTypes, InjectionKey, PropType, Ref, ShallowRef, MaybeRef, MaybeRefOrGetter, VNode, WritableComputedRef } from 'vue' + import('vue') +} + +// for vue template auto import +import { UnwrapRef } from 'vue' +declare module 'vue' { + interface GlobalComponents {} + interface ComponentCustomProperties { + readonly EffectScope: UnwrapRef + readonly acceptHMRUpdate: UnwrapRef + readonly computed: UnwrapRef + readonly createApp: UnwrapRef + readonly createPinia: UnwrapRef + readonly customRef: UnwrapRef + readonly defineAsyncComponent: UnwrapRef + readonly defineComponent: UnwrapRef + readonly defineStore: UnwrapRef + readonly effectScope: UnwrapRef + readonly getActivePinia: UnwrapRef + readonly getCurrentInstance: UnwrapRef + readonly getCurrentScope: UnwrapRef + readonly getCurrentWatcher: UnwrapRef + readonly inject: UnwrapRef + readonly isProxy: UnwrapRef + readonly isReactive: UnwrapRef + readonly isReadonly: UnwrapRef + readonly isRef: UnwrapRef + readonly isShallow: UnwrapRef + readonly mapActions: UnwrapRef + readonly mapGetters: UnwrapRef + readonly mapState: UnwrapRef + readonly mapStores: UnwrapRef + readonly mapWritableState: UnwrapRef + readonly markRaw: UnwrapRef + readonly nextTick: UnwrapRef + readonly onActivated: UnwrapRef + readonly onBeforeMount: UnwrapRef + readonly onBeforeRouteLeave: UnwrapRef + readonly onBeforeRouteUpdate: UnwrapRef + readonly onBeforeUnmount: UnwrapRef + readonly onBeforeUpdate: UnwrapRef + readonly onDeactivated: UnwrapRef + readonly onErrorCaptured: UnwrapRef + readonly onMounted: UnwrapRef + readonly onRenderTracked: UnwrapRef + readonly onRenderTriggered: UnwrapRef + readonly onScopeDispose: UnwrapRef + readonly onServerPrefetch: UnwrapRef + readonly onUnmounted: UnwrapRef + readonly onUpdated: UnwrapRef + readonly onWatcherCleanup: UnwrapRef + readonly provide: UnwrapRef + readonly reactive: UnwrapRef + readonly readonly: UnwrapRef + readonly ref: UnwrapRef + readonly resolveComponent: UnwrapRef + readonly setActivePinia: UnwrapRef + readonly setMapStoreSuffix: UnwrapRef + readonly shallowReactive: UnwrapRef + readonly shallowReadonly: UnwrapRef + readonly shallowRef: UnwrapRef + readonly storeToRefs: UnwrapRef + readonly toRaw: UnwrapRef + readonly toRef: UnwrapRef + readonly toRefs: UnwrapRef + readonly toValue: UnwrapRef + readonly triggerRef: UnwrapRef + readonly unref: UnwrapRef + readonly useAttrs: UnwrapRef + readonly useClipboard: UnwrapRef + readonly useCssModule: UnwrapRef + readonly useCssVars: UnwrapRef + readonly useDebounceFn: UnwrapRef + readonly useId: UnwrapRef + readonly useLink: UnwrapRef + readonly useLocalStorage: UnwrapRef + readonly useModel: UnwrapRef + readonly useRoute: UnwrapRef + readonly useRouter: UnwrapRef + readonly useSlots: UnwrapRef + readonly useTemplateRef: UnwrapRef + readonly watch: UnwrapRef + readonly watchEffect: UnwrapRef + readonly watchPostEffect: UnwrapRef + readonly watchSyncEffect: UnwrapRef + } +} \ No newline at end of file diff --git a/modeler/types/components.d.ts b/modeler/types/components.d.ts new file mode 100644 index 0000000..4b39106 --- /dev/null +++ b/modeler/types/components.d.ts @@ -0,0 +1,106 @@ +/* eslint-disable */ +// @ts-nocheck +// biome-ignore lint: disable +// oxlint-disable +// ------ +// Generated by unplugin-vue-components +// Read more: https://github.com/vuejs/core/pull/3399 +import { GlobalComponents } from 'vue' + +export {} + +/* prettier-ignore */ +declare module 'vue' { + export interface GlobalComponents { + AAvatar: typeof import('ant-design-vue/es')['Avatar'] + AButton: typeof import('ant-design-vue/es')['Button'] + ACard: typeof import('ant-design-vue/es')['Card'] + ACarousel: typeof import('ant-design-vue/es')['Carousel'] + ACheckbox: typeof import('ant-design-vue/es')['Checkbox'] + ACol: typeof import('ant-design-vue/es')['Col'] + ACollapse: typeof import('ant-design-vue/es')['Collapse'] + ACollapsePanel: typeof import('ant-design-vue/es')['CollapsePanel'] + ADropdown: typeof import('ant-design-vue/es')['Dropdown'] + AFlex: typeof import('ant-design-vue/es')['Flex'] + AFloatButton: typeof import('ant-design-vue/es')['FloatButton'] + AForm: typeof import('ant-design-vue/es')['Form'] + AFormItem: typeof import('ant-design-vue/es')['FormItem'] + AFormItemRest: typeof import('ant-design-vue/es')['FormItemRest'] + AInput: typeof import('ant-design-vue/es')['Input'] + AInputGroup: typeof import('ant-design-vue/es')['InputGroup'] + AInputNumber: typeof import('ant-design-vue/es')['InputNumber'] + AInputPassword: typeof import('ant-design-vue/es')['InputPassword'] + AInputSearch: typeof import('ant-design-vue/es')['InputSearch'] + ALayout: typeof import('ant-design-vue/es')['Layout'] + ALayoutContent: typeof import('ant-design-vue/es')['LayoutContent'] + ALayoutHeader: typeof import('ant-design-vue/es')['LayoutHeader'] + ALayoutSider: typeof import('ant-design-vue/es')['LayoutSider'] + AMenu: typeof import('ant-design-vue/es')['Menu'] + AMenuItem: typeof import('ant-design-vue/es')['MenuItem'] + AModal: typeof import('ant-design-vue/es')['Modal'] + APopconfirm: typeof import('ant-design-vue/es')['Popconfirm'] + APopover: typeof import('ant-design-vue/es')['Popover'] + AProgress: typeof import('ant-design-vue/es')['Progress'] + ARow: typeof import('ant-design-vue/es')['Row'] + ASelect: typeof import('ant-design-vue/es')['Select'] + ASelectOption: typeof import('ant-design-vue/es')['SelectOption'] + ASlider: typeof import('ant-design-vue/es')['Slider'] + ASpace: typeof import('ant-design-vue/es')['Space'] + ASteps: typeof import('ant-design-vue/es')['Steps'] + ASubMenu: typeof import('ant-design-vue/es')['SubMenu'] + ATable: typeof import('ant-design-vue/es')['Table'] + ATabPane: typeof import('ant-design-vue/es')['TabPane'] + ATabs: typeof import('ant-design-vue/es')['Tabs'] + ATextarea: typeof import('ant-design-vue/es')['Textarea'] + ATooltip: typeof import('ant-design-vue/es')['Tooltip'] + RouterLink: typeof import('vue-router')['RouterLink'] + RouterView: typeof import('vue-router')['RouterView'] + } +} + +// For TSX support +declare global { + const AAvatar: typeof import('ant-design-vue/es')['Avatar'] + const AButton: typeof import('ant-design-vue/es')['Button'] + const ACard: typeof import('ant-design-vue/es')['Card'] + const ACarousel: typeof import('ant-design-vue/es')['Carousel'] + const ACheckbox: typeof import('ant-design-vue/es')['Checkbox'] + const ACol: typeof import('ant-design-vue/es')['Col'] + const ACollapse: typeof import('ant-design-vue/es')['Collapse'] + const ACollapsePanel: typeof import('ant-design-vue/es')['CollapsePanel'] + const ADropdown: typeof import('ant-design-vue/es')['Dropdown'] + const AFlex: typeof import('ant-design-vue/es')['Flex'] + const AFloatButton: typeof import('ant-design-vue/es')['FloatButton'] + const AForm: typeof import('ant-design-vue/es')['Form'] + const AFormItem: typeof import('ant-design-vue/es')['FormItem'] + const AFormItemRest: typeof import('ant-design-vue/es')['FormItemRest'] + const AInput: typeof import('ant-design-vue/es')['Input'] + const AInputGroup: typeof import('ant-design-vue/es')['InputGroup'] + const AInputNumber: typeof import('ant-design-vue/es')['InputNumber'] + const AInputPassword: typeof import('ant-design-vue/es')['InputPassword'] + const AInputSearch: typeof import('ant-design-vue/es')['InputSearch'] + const ALayout: typeof import('ant-design-vue/es')['Layout'] + const ALayoutContent: typeof import('ant-design-vue/es')['LayoutContent'] + const ALayoutHeader: typeof import('ant-design-vue/es')['LayoutHeader'] + const ALayoutSider: typeof import('ant-design-vue/es')['LayoutSider'] + const AMenu: typeof import('ant-design-vue/es')['Menu'] + const AMenuItem: typeof import('ant-design-vue/es')['MenuItem'] + const AModal: typeof import('ant-design-vue/es')['Modal'] + const APopconfirm: typeof import('ant-design-vue/es')['Popconfirm'] + const APopover: typeof import('ant-design-vue/es')['Popover'] + const AProgress: typeof import('ant-design-vue/es')['Progress'] + const ARow: typeof import('ant-design-vue/es')['Row'] + const ASelect: typeof import('ant-design-vue/es')['Select'] + const ASelectOption: typeof import('ant-design-vue/es')['SelectOption'] + const ASlider: typeof import('ant-design-vue/es')['Slider'] + const ASpace: typeof import('ant-design-vue/es')['Space'] + const ASteps: typeof import('ant-design-vue/es')['Steps'] + const ASubMenu: typeof import('ant-design-vue/es')['SubMenu'] + const ATable: typeof import('ant-design-vue/es')['Table'] + const ATabPane: typeof import('ant-design-vue/es')['TabPane'] + const ATabs: typeof import('ant-design-vue/es')['Tabs'] + const ATextarea: typeof import('ant-design-vue/es')['Textarea'] + const ATooltip: typeof import('ant-design-vue/es')['Tooltip'] + const RouterLink: typeof import('vue-router')['RouterLink'] + const RouterView: typeof import('vue-router')['RouterView'] +} \ No newline at end of file diff --git a/modeler/types/env.d.ts b/modeler/types/env.d.ts new file mode 100644 index 0000000..1525ed3 --- /dev/null +++ b/modeler/types/env.d.ts @@ -0,0 +1,24 @@ +/* + * This file is part of the kernelstudio package. + * + * (c) 2014-2025 zlin + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare module '*.less' { + const classes: { [key: string]: string }; + export default classes; +} + +// 可选:同时声明其他样式文件类型(如需要) +declare module '*.css' { + const classes: { [key: string]: string }; + export default classes; +} + +declare module '*.scss' { + const classes: { [key: string]: string }; + export default classes; +} diff --git a/modeler/types/js-cookie.d.ts b/modeler/types/js-cookie.d.ts new file mode 100644 index 0000000..6fa4bcb --- /dev/null +++ b/modeler/types/js-cookie.d.ts @@ -0,0 +1,60 @@ +/* + * This file is part of the kernelstudio package. + * + * (c) 2014-2025 zlin + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ +declare module 'js-cookie' { + + interface CookiesStatic { + /** + * 获取指定名称的cookie值 + * @param name cookie名称 + * @returns cookie值或undefined + */ + get(name: string): string | undefined; + + /** + * 获取所有cookie + * @returns 包含所有cookie键值对的对象 + */ + get(): { [key: string]: string }; + + /** + * 设置cookie + * @param name cookie名称 + * @param value cookie值 + * @param options 配置项(过期时间、路径等) + * @returns 设置后的cookie字符串 + */ + set( + name: string, + value: string, + options?: { + expires?: number | Date; + path?: string; + domain?: string; + secure?: boolean; + sameSite?: 'strict' | 'lax' | 'none'; + } + ): string; + + /** + * 删除指定cookie + * @param name cookie名称 + * @param options 配置项(需与设置时一致) + */ + remove( + name: string, + options?: { + path?: string; + domain?: string; + } + ): void; + } + + const Cookies: CookiesStatic; + export default Cookies; +} \ No newline at end of file diff --git a/modeler/types/shims.d.ts b/modeler/types/shims.d.ts new file mode 100644 index 0000000..e8fe42a --- /dev/null +++ b/modeler/types/shims.d.ts @@ -0,0 +1,5 @@ +declare module '*.vue' { + import { DefineComponent } from 'vue'; + const component: DefineComponent<{}, {}, any>; + export default component; +} diff --git a/modeler/types/vite-env.d.ts b/modeler/types/vite-env.d.ts new file mode 100644 index 0000000..f5c4db1 --- /dev/null +++ b/modeler/types/vite-env.d.ts @@ -0,0 +1,20 @@ +/// +declare module '@originjs/vite-plugin-commonjs' { + import { Plugin } from 'vite'; + const commonjs: () => Plugin; + export default commonjs; +} + +interface ImportMetaEnv { + readonly VITE_API_URL: string; // 自定义环境变量 + readonly VITE_APP_TITLE: string; // 应用标题 +} + +interface ImportMeta { + readonly env: ImportMetaEnv; +} + +declare module "*.svg" { + const content: string; + export default content; +} diff --git a/modeler/vite.config.ts b/modeler/vite.config.ts new file mode 100644 index 0000000..ef74ea2 --- /dev/null +++ b/modeler/vite.config.ts @@ -0,0 +1,149 @@ +import { resolve } from 'path'; +import { defineConfig } from 'vite'; +import vue from '@vitejs/plugin-vue'; +import vueJsx from '@vitejs/plugin-vue-jsx'; +import { viteCommonjs } from '@originjs/vite-plugin-commonjs'; +import tailwindcss from '@tailwindcss/vite'; +import dts from 'vite-plugin-dts'; +import autoImport from 'unplugin-auto-import/vite'; +import components from 'unplugin-vue-components/vite'; +import { AntDesignVueResolver } from 'unplugin-vue-components/resolvers'; +import { viteMockServe } from 'vite-plugin-mock'; + +const projectPath = resolve(__dirname) + +export default defineConfig({ + base: '/', + resolve: { + alias: { + '@': `${projectPath}/src` + } + }, + server: { + host: true, // 等价于 0.0.0.0,允许所有网卡访问 + port: 8888, + open: false, + cors: true, + strictPort: true, + allowedHosts: [ + 'monitor.kernelstudio.com', + '127.0.0.1', + ], + // 修复 HMR 配置:简化 WS 连接逻辑,让 Vite 自动适配 + hmr: { + host: 'monitor.kernelstudio.com', + port: 8888, // Nginx 监听的端口 + protocol: 'ws', // 显式指定 WS 协议 + path: '/ws', // Vite HMR 的 WS 路径(关键) + }, + // 修复响应头:跨域头匹配实际访问域名 + headers: { + // 'X-Frame-Options': 'sameorigin', + // 开发环境放行所有跨域(更通用),替代原有的 127.0.0.1:8888 + 'Access-Control-Allow-Origin': '*', + 'Access-Control-Allow-Methods': 'GET,POST,PUT,DELETE,OPTIONS', + 'Access-Control-Allow-Headers': 'Content-Type,Authorization', + }, + // 移除无效的 /api 代理配置(原 target: /api 无意义) + // 如需代理 /api 到 3000 端口,正确配置如下(可选): + proxy: { + '/api': { + target: 'http://127.0.0.1:1777', // Prometheus 地址 + changeOrigin: true, + ws: true, + }, + '/login': { + target: 'http://127.0.0.1:1777', + changeOrigin: true, //是否跨域 + }, + '/getInfo': { + target: 'http://127.0.0.1:1777', + changeOrigin: true, + ws: true, + }, + '/api/live/ws': { + target: 'http://127.0.0.1:3000', + changeOrigin: true, + ws: true, + }, + }, + watch: { + ignored: [], + } + }, + css: { + preprocessorOptions: { + less: { + javascriptEnabled: true + } + } + }, + build: { + rollupOptions: { + output: { + entryFileNames: 'assets/js/[name].[hash].js', + chunkFileNames: 'assets/js/[name].[hash].js', + assetFileNames: (assetInfo) => { + if (/\.(css|less|scss|sass)$/.test(assetInfo.name || '')) { + return 'assets/css/[name].[hash].[ext]'; + } + if (/\.(woff|woff2|ttf|eot|otf)$/.test(assetInfo.name || '')) { + return 'assets/fonts/[name].[hash].[ext]'; + } + if (/\.(jpg|jpeg|png|icon|gif|svg)$/.test(assetInfo.name || '')) { + return 'assets/images/[name].[hash].[ext]'; + } + return 'assets/bundled/[name].[hash].[ext]'; + } + } + } + }, + plugins: [ + vue(), + viteCommonjs(), + tailwindcss(), + vueJsx({ + transformOn: true, + optimize: true, + }), + viteMockServe({ + mockPath: `${projectPath}/mock`, + enable: true, + }), + dts({ + tsconfigPath: `${projectPath}/tsconfig.json`, + outDir: `${projectPath}/types`, + }), + autoImport({ + dts: `${projectPath}/types/auto-imports.d.ts`, + eslintrc: {enabled: true}, + vueTemplate: true, + ignore: ['h'], + include: [ + /\.[tj]sx?$/, + /\.vue$/, + ], + resolvers: [ + AntDesignVueResolver({importStyle: false}), + ], + imports: [ + 'vue', + 'vue-router', + 'pinia', + { + '@vueuse/core': ['useLocalStorage', 'useClipboard', 'useDebounceFn'], + }, + ], + }), + components({ + directives: true, + extensions: ['vue'], + resolvers: [ + AntDesignVueResolver({ + importStyle: false, + }), + ], + dts: `${projectPath}/types/components.d.ts` + }) + ], +}) \ No newline at end of file diff --git a/ry.bat b/ry.bat deleted file mode 100644 index 8fcd686..0000000 --- a/ry.bat +++ /dev/null @@ -1,67 +0,0 @@ -@echo off - -rem jarƽĿ¼ -set AppName=auto-solution-admin.jar - -rem JVM -set JVM_OPTS="-Dname=%AppName% -Duser.timezone=Asia/Shanghai -Xms512m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:NewRatio=1 -XX:SurvivorRatio=30 -XX:+UseParallelGC -XX:+UseParallelOldGC" - - -ECHO. - ECHO. [1] %AppName% - ECHO. [2] ر%AppName% - ECHO. [3] %AppName% - ECHO. [4] ״̬ %AppName% - ECHO. [5] -ECHO. - -ECHO.ѡĿ: -set /p ID= - IF "%id%"=="1" GOTO start - IF "%id%"=="2" GOTO stop - IF "%id%"=="3" GOTO restart - IF "%id%"=="4" GOTO status - IF "%id%"=="5" EXIT -PAUSE -:start - for /f "usebackq tokens=1-2" %%a in (`jps -l ^| findstr %AppName%`) do ( - set pid=%%a - set image_name=%%b - ) - if defined pid ( - echo %%is running - PAUSE - ) - -start javaw %JVM_OPTS% -jar %AppName% - -echo starting -echo Start %AppName% success... -goto:eof - -rem stopͨjpspid -:stop - for /f "usebackq tokens=1-2" %%a in (`jps -l ^| findstr %AppName%`) do ( - set pid=%%a - set image_name=%%b - ) - if not defined pid (echo process %AppName% does not exists) else ( - echo prepare to kill %image_name% - echo start kill %pid% ... - rem ݽIDkill - taskkill /f /pid %pid% - ) -goto:eof -:restart - call :stop - call :start -goto:eof -:status - for /f "usebackq tokens=1-2" %%a in (`jps -l ^| findstr %AppName%`) do ( - set pid=%%a - set image_name=%%b - ) - if not defined pid (echo process %AppName% is dead ) else ( - echo %image_name% is running - ) -goto:eof diff --git a/solution-ui/.editorconfig b/solution-ui/.editorconfig deleted file mode 100644 index 7034f9b..0000000 --- a/solution-ui/.editorconfig +++ /dev/null @@ -1,22 +0,0 @@ -# 告诉EditorConfig插件,这是根文件,不用继续往上查找 -root = true - -# 匹配全部文件 -[*] -# 设置字符集 -charset = utf-8 -# 缩进风格,可选space、tab -indent_style = space -# 缩进的空格数 -indent_size = 2 -# 结尾换行符,可选lf、cr、crlf -end_of_line = lf -# 在文件结尾插入新行 -insert_final_newline = true -# 删除一行中的前后空格 -trim_trailing_whitespace = true - -# 匹配md结尾的文件 -[*.md] -insert_final_newline = false -trim_trailing_whitespace = false diff --git a/solution-ui/.env.development b/solution-ui/.env.development deleted file mode 100644 index 86f0e17..0000000 --- a/solution-ui/.env.development +++ /dev/null @@ -1,11 +0,0 @@ -# 页面标题 -VUE_APP_TITLE = 自动化管理系统 - -# 开发环境配置 -ENV = 'development' - -# 自动化管理系统/开发环境 -VUE_APP_BASE_API = '/dev-api' - -# 路由懒加载 -VUE_CLI_BABEL_TRANSPILE_MODULES = true diff --git a/solution-ui/.env.production b/solution-ui/.env.production deleted file mode 100644 index 48cb173..0000000 --- a/solution-ui/.env.production +++ /dev/null @@ -1,8 +0,0 @@ -# 页面标题 -VUE_APP_TITLE = 自动化管理系统 - -# 生产环境配置 -ENV = 'production' - -# 自动化管理系统/生产环境 -VUE_APP_BASE_API = '/prod-api' diff --git a/solution-ui/.env.staging b/solution-ui/.env.staging deleted file mode 100644 index 4f5809e..0000000 --- a/solution-ui/.env.staging +++ /dev/null @@ -1,12 +0,0 @@ -# 页面标题 -VUE_APP_TITLE = 自动化管理系统 - -BABEL_ENV = production - -NODE_ENV = production - -# 测试环境配置 -ENV = 'staging' - -# 自动化管理系统/测试环境 -VUE_APP_BASE_API = '/stage-api' diff --git a/solution-ui/.gitignore b/solution-ui/.gitignore deleted file mode 100644 index 78a752d..0000000 --- a/solution-ui/.gitignore +++ /dev/null @@ -1,23 +0,0 @@ -.DS_Store -node_modules/ -dist/ -npm-debug.log* -yarn-debug.log* -yarn-error.log* -**/*.log - -tests/**/coverage/ -tests/e2e/reports -selenium-debug.log - -# Editor directories and files -.idea -.vscode -*.suo -*.ntvs* -*.njsproj -*.sln -*.local - -package-lock.json -yarn.lock diff --git a/solution-ui/README.md b/solution-ui/README.md deleted file mode 100644 index 00c0ab8..0000000 --- a/solution-ui/README.md +++ /dev/null @@ -1,30 +0,0 @@ -## 开发 - -```bash -# 克隆项目 -git clone https://gitee.com/y_project/RuoYi-Vue - -# 进入项目目录 -cd ruoyi-ui - -# 安装依赖 -npm install - -# 建议不要直接使用 cnpm 安装依赖,会有各种诡异的 bug。可以通过如下操作解决 npm 下载速度慢的问题 -npm install --registry=https://registry.npmmirror.com - -# 启动服务 -npm run dev -``` - -浏览器访问 http://localhost:80 - -## 发布 - -```bash -# 构建测试环境 -npm run build:stage - -# 构建生产环境 -npm run build:prod -``` \ No newline at end of file diff --git a/solution-ui/babel.config.js b/solution-ui/babel.config.js deleted file mode 100644 index c8267b2..0000000 --- a/solution-ui/babel.config.js +++ /dev/null @@ -1,13 +0,0 @@ -module.exports = { - presets: [ - // https://github.com/vuejs/vue-cli/tree/master/packages/@vue/babel-preset-app - '@vue/cli-plugin-babel/preset' - ], - 'env': { - 'development': { - // babel-plugin-dynamic-import-node plugin only does one thing by converting all import() to require(). - // This plugin can significantly increase the speed of hot updates, when you have a large number of pages. - 'plugins': ['dynamic-import-node'] - } - } -} \ No newline at end of file diff --git a/solution-ui/bin/build.bat b/solution-ui/bin/build.bat deleted file mode 100644 index dda590d..0000000 --- a/solution-ui/bin/build.bat +++ /dev/null @@ -1,12 +0,0 @@ -@echo off -echo. -echo [Ϣ] Weḅdistļ -echo. - -%~d0 -cd %~dp0 - -cd .. -npm run build:prod - -pause \ No newline at end of file diff --git a/solution-ui/bin/package.bat b/solution-ui/bin/package.bat deleted file mode 100644 index 0e5bc0f..0000000 --- a/solution-ui/bin/package.bat +++ /dev/null @@ -1,12 +0,0 @@ -@echo off -echo. -echo [Ϣ] װWeḅnode_modulesļ -echo. - -%~d0 -cd %~dp0 - -cd .. -npm install --registry=https://registry.npmmirror.com - -pause \ No newline at end of file diff --git a/solution-ui/bin/run-web.bat b/solution-ui/bin/run-web.bat deleted file mode 100644 index d30deae..0000000 --- a/solution-ui/bin/run-web.bat +++ /dev/null @@ -1,12 +0,0 @@ -@echo off -echo. -echo [Ϣ] ʹ Vue CLI Web ̡ -echo. - -%~d0 -cd %~dp0 - -cd .. -npm run dev - -pause \ No newline at end of file diff --git a/solution-ui/build/index.js b/solution-ui/build/index.js deleted file mode 100644 index 0c57de2..0000000 --- a/solution-ui/build/index.js +++ /dev/null @@ -1,35 +0,0 @@ -const { run } = require('runjs') -const chalk = require('chalk') -const config = require('../vue.config.js') -const rawArgv = process.argv.slice(2) -const args = rawArgv.join(' ') - -if (process.env.npm_config_preview || rawArgv.includes('--preview')) { - const report = rawArgv.includes('--report') - - run(`vue-cli-service build ${args}`) - - const port = 9526 - const publicPath = config.publicPath - - var connect = require('connect') - var serveStatic = require('serve-static') - const app = connect() - - app.use( - publicPath, - serveStatic('./dist', { - index: ['index.html', '/'] - }) - ) - - app.listen(port, function () { - console.log(chalk.green(`> Preview at http://localhost:${port}${publicPath}`)) - if (report) { - console.log(chalk.green(`> Report at http://localhost:${port}${publicPath}report.html`)) - } - - }) -} else { - run(`vue-cli-service build ${args}`) -} diff --git a/solution-ui/package.json b/solution-ui/package.json deleted file mode 100644 index d58fe1c..0000000 --- a/solution-ui/package.json +++ /dev/null @@ -1,72 +0,0 @@ -{ - "name": "ruoyi", - "version": "3.9.1", - "description": "自动化生成系统", - "author": "自动化", - "license": "MIT", - "scripts": { - "dev": "vue-cli-service serve", - "build:prod": "vue-cli-service build", - "build:stage": "vue-cli-service build --mode staging", - "preview": "node build/index.js --preview" - }, - "keywords": [ - "vue", - "admin", - "dashboard", - "element-ui", - "boilerplate", - "admin-template", - "management-system" - ], - "repository": { - "type": "git", - "url": "https://gitee.com/y_project/RuoYi-Vue.git" - }, - "dependencies": { - "@riophae/vue-treeselect": "0.4.0", - "axios": "0.28.1", - "clipboard": "2.0.8", - "core-js": "3.37.1", - "echarts": "5.4.0", - "element-ui": "2.15.14", - "file-saver": "2.0.5", - "fuse.js": "6.4.3", - "highlight.js": "9.18.5", - "js-beautify": "1.13.0", - "js-cookie": "3.0.1", - "jsencrypt": "3.0.0-rc.1", - "nprogress": "0.2.0", - "quill": "2.0.2", - "screenfull": "5.0.2", - "sortablejs": "1.10.2", - "splitpanes": "2.4.1", - "vue": "2.6.12", - "vue-count-to": "1.0.13", - "vue-cropper": "0.5.5", - "vue-router": "3.4.9", - "vuedraggable": "2.24.3", - "vuex": "3.6.0" - }, - "devDependencies": { - "@vue/cli-plugin-babel": "4.4.6", - "@vue/cli-service": "4.4.6", - "babel-plugin-dynamic-import-node": "2.3.3", - "chalk": "4.1.0", - "compression-webpack-plugin": "6.1.2", - "connect": "3.6.6", - "sass": "1.32.13", - "sass-loader": "10.1.1", - "script-ext-html-webpack-plugin": "2.1.5", - "svg-sprite-loader": "5.1.1", - "vue-template-compiler": "2.6.12" - }, - "engines": { - "node": ">=8.9", - "npm": ">= 3.0.0" - }, - "browserslist": [ - "> 1%", - "last 2 versions" - ] -} diff --git a/solution-ui/public/favicon.ico b/solution-ui/public/favicon.ico deleted file mode 100644 index e263760..0000000 Binary files a/solution-ui/public/favicon.ico and /dev/null differ diff --git a/solution-ui/public/html/ie.html b/solution-ui/public/html/ie.html deleted file mode 100644 index 052ffcd..0000000 --- a/solution-ui/public/html/ie.html +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - 请升级您的浏览器 - - - - - - -

请升级您的浏览器,以便我们更好的为您提供服务!

-

您正在使用 Internet Explorer 的早期版本(IE11以下版本或使用该内核的浏览器)。这意味着在升级浏览器前,您将无法访问此网站。

-
-

请注意:微软公司对Windows XP 及 Internet Explorer 早期版本的支持已经结束

-

自 2016 年 1 月 12 日起,Microsoft 不再为 IE 11 以下版本提供相应支持和更新。没有关键的浏览器安全更新,您的电脑可能易受有害病毒、间谍软件和其他恶意软件的攻击,它们可以窃取或损害您的业务数据和信息。请参阅 微软对 Internet Explorer 早期版本的支持将于 2016 年 1 月 12 日结束的说明

-
-

您可以选择更先进的浏览器

-

推荐使用以下浏览器的最新版本。如果您的电脑已有以下浏览器的最新版本则直接使用该浏览器访问即可。

- -
- - \ No newline at end of file diff --git a/solution-ui/public/index.html b/solution-ui/public/index.html deleted file mode 100644 index 925455c..0000000 --- a/solution-ui/public/index.html +++ /dev/null @@ -1,208 +0,0 @@ - - - - - - - - - <%= webpackConfig.name %> - - - - -
-
-
-
-
-
正在加载系统资源,请耐心等待
-
-
- - diff --git a/solution-ui/public/robots.txt b/solution-ui/public/robots.txt deleted file mode 100644 index 77470cb..0000000 --- a/solution-ui/public/robots.txt +++ /dev/null @@ -1,2 +0,0 @@ -User-agent: * -Disallow: / \ No newline at end of file diff --git a/solution-ui/public/styles/theme-chalk/index.css b/solution-ui/public/styles/theme-chalk/index.css deleted file mode 100644 index b78d5a9..0000000 --- a/solution-ui/public/styles/theme-chalk/index.css +++ /dev/null @@ -1 +0,0 @@ -@charset "UTF-8";[class*=" el-icon-"],[class^=el-icon-]{font-family:element-icons!important;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;vertical-align:baseline;display:inline-block;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.el-icon-ice-cream-round:before{content:"\e6a0"}.el-icon-ice-cream-square:before{content:"\e6a3"}.el-icon-lollipop:before{content:"\e6a4"}.el-icon-potato-strips:before{content:"\e6a5"}.el-icon-milk-tea:before{content:"\e6a6"}.el-icon-ice-drink:before{content:"\e6a7"}.el-icon-ice-tea:before{content:"\e6a9"}.el-icon-coffee:before{content:"\e6aa"}.el-icon-orange:before{content:"\e6ab"}.el-icon-pear:before{content:"\e6ac"}.el-icon-apple:before{content:"\e6ad"}.el-icon-cherry:before{content:"\e6ae"}.el-icon-watermelon:before{content:"\e6af"}.el-icon-grape:before{content:"\e6b0"}.el-icon-refrigerator:before{content:"\e6b1"}.el-icon-goblet-square-full:before{content:"\e6b2"}.el-icon-goblet-square:before{content:"\e6b3"}.el-icon-goblet-full:before{content:"\e6b4"}.el-icon-goblet:before{content:"\e6b5"}.el-icon-cold-drink:before{content:"\e6b6"}.el-icon-coffee-cup:before{content:"\e6b8"}.el-icon-water-cup:before{content:"\e6b9"}.el-icon-hot-water:before{content:"\e6ba"}.el-icon-ice-cream:before{content:"\e6bb"}.el-icon-dessert:before{content:"\e6bc"}.el-icon-sugar:before{content:"\e6bd"}.el-icon-tableware:before{content:"\e6be"}.el-icon-burger:before{content:"\e6bf"}.el-icon-knife-fork:before{content:"\e6c1"}.el-icon-fork-spoon:before{content:"\e6c2"}.el-icon-chicken:before{content:"\e6c3"}.el-icon-food:before{content:"\e6c4"}.el-icon-dish-1:before{content:"\e6c5"}.el-icon-dish:before{content:"\e6c6"}.el-icon-moon-night:before{content:"\e6ee"}.el-icon-moon:before{content:"\e6f0"}.el-icon-cloudy-and-sunny:before{content:"\e6f1"}.el-icon-partly-cloudy:before{content:"\e6f2"}.el-icon-cloudy:before{content:"\e6f3"}.el-icon-sunny:before{content:"\e6f6"}.el-icon-sunset:before{content:"\e6f7"}.el-icon-sunrise-1:before{content:"\e6f8"}.el-icon-sunrise:before{content:"\e6f9"}.el-icon-heavy-rain:before{content:"\e6fa"}.el-icon-lightning:before{content:"\e6fb"}.el-icon-light-rain:before{content:"\e6fc"}.el-icon-wind-power:before{content:"\e6fd"}.el-icon-baseball:before{content:"\e712"}.el-icon-soccer:before{content:"\e713"}.el-icon-football:before{content:"\e715"}.el-icon-basketball:before{content:"\e716"}.el-icon-ship:before{content:"\e73f"}.el-icon-truck:before{content:"\e740"}.el-icon-bicycle:before{content:"\e741"}.el-icon-mobile-phone:before{content:"\e6d3"}.el-icon-service:before{content:"\e6d4"}.el-icon-key:before{content:"\e6e2"}.el-icon-unlock:before{content:"\e6e4"}.el-icon-lock:before{content:"\e6e5"}.el-icon-watch:before{content:"\e6fe"}.el-icon-watch-1:before{content:"\e6ff"}.el-icon-timer:before{content:"\e702"}.el-icon-alarm-clock:before{content:"\e703"}.el-icon-map-location:before{content:"\e704"}.el-icon-delete-location:before{content:"\e705"}.el-icon-add-location:before{content:"\e706"}.el-icon-location-information:before{content:"\e707"}.el-icon-location-outline:before{content:"\e708"}.el-icon-location:before{content:"\e79e"}.el-icon-place:before{content:"\e709"}.el-icon-discover:before{content:"\e70a"}.el-icon-first-aid-kit:before{content:"\e70b"}.el-icon-trophy-1:before{content:"\e70c"}.el-icon-trophy:before{content:"\e70d"}.el-icon-medal:before{content:"\e70e"}.el-icon-medal-1:before{content:"\e70f"}.el-icon-stopwatch:before{content:"\e710"}.el-icon-mic:before{content:"\e711"}.el-icon-copy-document:before{content:"\e718"}.el-icon-full-screen:before{content:"\e719"}.el-icon-switch-button:before{content:"\e71b"}.el-icon-aim:before{content:"\e71c"}.el-icon-crop:before{content:"\e71d"}.el-icon-odometer:before{content:"\e71e"}.el-icon-time:before{content:"\e71f"}.el-icon-bangzhu:before{content:"\e724"}.el-icon-close-notification:before{content:"\e726"}.el-icon-microphone:before{content:"\e727"}.el-icon-turn-off-microphone:before{content:"\e728"}.el-icon-position:before{content:"\e729"}.el-icon-postcard:before{content:"\e72a"}.el-icon-message:before{content:"\e72b"}.el-icon-chat-line-square:before{content:"\e72d"}.el-icon-chat-dot-square:before{content:"\e72e"}.el-icon-chat-dot-round:before{content:"\e72f"}.el-icon-chat-square:before{content:"\e730"}.el-icon-chat-line-round:before{content:"\e731"}.el-icon-chat-round:before{content:"\e732"}.el-icon-set-up:before{content:"\e733"}.el-icon-turn-off:before{content:"\e734"}.el-icon-open:before{content:"\e735"}.el-icon-connection:before{content:"\e736"}.el-icon-link:before{content:"\e737"}.el-icon-cpu:before{content:"\e738"}.el-icon-thumb:before{content:"\e739"}.el-icon-female:before{content:"\e73a"}.el-icon-male:before{content:"\e73b"}.el-icon-guide:before{content:"\e73c"}.el-icon-news:before{content:"\e73e"}.el-icon-price-tag:before{content:"\e744"}.el-icon-discount:before{content:"\e745"}.el-icon-wallet:before{content:"\e747"}.el-icon-coin:before{content:"\e748"}.el-icon-money:before{content:"\e749"}.el-icon-bank-card:before{content:"\e74a"}.el-icon-box:before{content:"\e74b"}.el-icon-present:before{content:"\e74c"}.el-icon-sell:before{content:"\e6d5"}.el-icon-sold-out:before{content:"\e6d6"}.el-icon-shopping-bag-2:before{content:"\e74d"}.el-icon-shopping-bag-1:before{content:"\e74e"}.el-icon-shopping-cart-2:before{content:"\e74f"}.el-icon-shopping-cart-1:before{content:"\e750"}.el-icon-shopping-cart-full:before{content:"\e751"}.el-icon-smoking:before{content:"\e752"}.el-icon-no-smoking:before{content:"\e753"}.el-icon-house:before{content:"\e754"}.el-icon-table-lamp:before{content:"\e755"}.el-icon-school:before{content:"\e756"}.el-icon-office-building:before{content:"\e757"}.el-icon-toilet-paper:before{content:"\e758"}.el-icon-notebook-2:before{content:"\e759"}.el-icon-notebook-1:before{content:"\e75a"}.el-icon-files:before{content:"\e75b"}.el-icon-collection:before{content:"\e75c"}.el-icon-receiving:before{content:"\e75d"}.el-icon-suitcase-1:before{content:"\e760"}.el-icon-suitcase:before{content:"\e761"}.el-icon-film:before{content:"\e763"}.el-icon-collection-tag:before{content:"\e765"}.el-icon-data-analysis:before{content:"\e766"}.el-icon-pie-chart:before{content:"\e767"}.el-icon-data-board:before{content:"\e768"}.el-icon-data-line:before{content:"\e76d"}.el-icon-reading:before{content:"\e769"}.el-icon-magic-stick:before{content:"\e76a"}.el-icon-coordinate:before{content:"\e76b"}.el-icon-mouse:before{content:"\e76c"}.el-icon-brush:before{content:"\e76e"}.el-icon-headset:before{content:"\e76f"}.el-icon-umbrella:before{content:"\e770"}.el-icon-scissors:before{content:"\e771"}.el-icon-mobile:before{content:"\e773"}.el-icon-attract:before{content:"\e774"}.el-icon-monitor:before{content:"\e775"}.el-icon-search:before{content:"\e778"}.el-icon-takeaway-box:before{content:"\e77a"}.el-icon-paperclip:before{content:"\e77d"}.el-icon-printer:before{content:"\e77e"}.el-icon-document-add:before{content:"\e782"}.el-icon-document:before{content:"\e785"}.el-icon-document-checked:before{content:"\e786"}.el-icon-document-copy:before{content:"\e787"}.el-icon-document-delete:before{content:"\e788"}.el-icon-document-remove:before{content:"\e789"}.el-icon-tickets:before{content:"\e78b"}.el-icon-folder-checked:before{content:"\e77f"}.el-icon-folder-delete:before{content:"\e780"}.el-icon-folder-remove:before{content:"\e781"}.el-icon-folder-add:before{content:"\e783"}.el-icon-folder-opened:before{content:"\e784"}.el-icon-folder:before{content:"\e78a"}.el-icon-edit-outline:before{content:"\e764"}.el-icon-edit:before{content:"\e78c"}.el-icon-date:before{content:"\e78e"}.el-icon-c-scale-to-original:before{content:"\e7c6"}.el-icon-view:before{content:"\e6ce"}.el-icon-loading:before{content:"\e6cf"}.el-icon-rank:before{content:"\e6d1"}.el-icon-sort-down:before{content:"\e7c4"}.el-icon-sort-up:before{content:"\e7c5"}.el-icon-sort:before{content:"\e6d2"}.el-icon-finished:before{content:"\e6cd"}.el-icon-refresh-left:before{content:"\e6c7"}.el-icon-refresh-right:before{content:"\e6c8"}.el-icon-refresh:before{content:"\e6d0"}.el-icon-video-play:before{content:"\e7c0"}.el-icon-video-pause:before{content:"\e7c1"}.el-icon-d-arrow-right:before{content:"\e6dc"}.el-icon-d-arrow-left:before{content:"\e6dd"}.el-icon-arrow-up:before{content:"\e6e1"}.el-icon-arrow-down:before{content:"\e6df"}.el-icon-arrow-right:before{content:"\e6e0"}.el-icon-arrow-left:before{content:"\e6de"}.el-icon-top-right:before{content:"\e6e7"}.el-icon-top-left:before{content:"\e6e8"}.el-icon-top:before{content:"\e6e6"}.el-icon-bottom:before{content:"\e6eb"}.el-icon-right:before{content:"\e6e9"}.el-icon-back:before{content:"\e6ea"}.el-icon-bottom-right:before{content:"\e6ec"}.el-icon-bottom-left:before{content:"\e6ed"}.el-icon-caret-top:before{content:"\e78f"}.el-icon-caret-bottom:before{content:"\e790"}.el-icon-caret-right:before{content:"\e791"}.el-icon-caret-left:before{content:"\e792"}.el-icon-d-caret:before{content:"\e79a"}.el-icon-share:before{content:"\e793"}.el-icon-menu:before{content:"\e798"}.el-icon-s-grid:before{content:"\e7a6"}.el-icon-s-check:before{content:"\e7a7"}.el-icon-s-data:before{content:"\e7a8"}.el-icon-s-opportunity:before{content:"\e7aa"}.el-icon-s-custom:before{content:"\e7ab"}.el-icon-s-claim:before{content:"\e7ad"}.el-icon-s-finance:before{content:"\e7ae"}.el-icon-s-comment:before{content:"\e7af"}.el-icon-s-flag:before{content:"\e7b0"}.el-icon-s-marketing:before{content:"\e7b1"}.el-icon-s-shop:before{content:"\e7b4"}.el-icon-s-open:before{content:"\e7b5"}.el-icon-s-management:before{content:"\e7b6"}.el-icon-s-ticket:before{content:"\e7b7"}.el-icon-s-release:before{content:"\e7b8"}.el-icon-s-home:before{content:"\e7b9"}.el-icon-s-promotion:before{content:"\e7ba"}.el-icon-s-operation:before{content:"\e7bb"}.el-icon-s-unfold:before{content:"\e7bc"}.el-icon-s-fold:before{content:"\e7a9"}.el-icon-s-platform:before{content:"\e7bd"}.el-icon-s-order:before{content:"\e7be"}.el-icon-s-cooperation:before{content:"\e7bf"}.el-icon-bell:before{content:"\e725"}.el-icon-message-solid:before{content:"\e799"}.el-icon-video-camera:before{content:"\e772"}.el-icon-video-camera-solid:before{content:"\e796"}.el-icon-camera:before{content:"\e779"}.el-icon-camera-solid:before{content:"\e79b"}.el-icon-download:before{content:"\e77c"}.el-icon-upload2:before{content:"\e77b"}.el-icon-upload:before{content:"\e7c3"}.el-icon-picture-outline-round:before{content:"\e75f"}.el-icon-picture-outline:before{content:"\e75e"}.el-icon-picture:before{content:"\e79f"}.el-icon-close:before{content:"\e6db"}.el-icon-check:before{content:"\e6da"}.el-icon-plus:before{content:"\e6d9"}.el-icon-minus:before{content:"\e6d8"}.el-icon-help:before{content:"\e73d"}.el-icon-s-help:before{content:"\e7b3"}.el-icon-circle-close:before{content:"\e78d"}.el-icon-circle-check:before{content:"\e720"}.el-icon-circle-plus-outline:before{content:"\e723"}.el-icon-remove-outline:before{content:"\e722"}.el-icon-zoom-out:before{content:"\e776"}.el-icon-zoom-in:before{content:"\e777"}.el-icon-error:before{content:"\e79d"}.el-icon-success:before{content:"\e79c"}.el-icon-circle-plus:before{content:"\e7a0"}.el-icon-remove:before{content:"\e7a2"}.el-icon-info:before{content:"\e7a1"}.el-icon-question:before{content:"\e7a4"}.el-icon-warning-outline:before{content:"\e6c9"}.el-icon-warning:before{content:"\e7a3"}.el-icon-goods:before{content:"\e7c2"}.el-icon-s-goods:before{content:"\e7b2"}.el-icon-star-off:before{content:"\e717"}.el-icon-star-on:before{content:"\e797"}.el-icon-more-outline:before{content:"\e6cc"}.el-icon-more:before{content:"\e794"}.el-icon-phone-outline:before{content:"\e6cb"}.el-icon-phone:before{content:"\e795"}.el-icon-user:before{content:"\e6e3"}.el-icon-user-solid:before{content:"\e7a5"}.el-icon-setting:before{content:"\e6ca"}.el-icon-s-tools:before{content:"\e7ac"}.el-icon-delete:before{content:"\e6d7"}.el-icon-delete-solid:before{content:"\e7c9"}.el-icon-eleme:before{content:"\e7c7"}.el-icon-platform-eleme:before{content:"\e7ca"}.el-icon-loading{-webkit-animation:rotating 2s linear infinite;animation:rotating 2s linear infinite}.el-icon--right{margin-left:5px}.el-icon--left{margin-right:5px}@-webkit-keyframes rotating{0%{-webkit-transform:rotateZ(0);transform:rotateZ(0)}100%{-webkit-transform:rotateZ(360deg);transform:rotateZ(360deg)}}@keyframes rotating{0%{-webkit-transform:rotateZ(0);transform:rotateZ(0)}100%{-webkit-transform:rotateZ(360deg);transform:rotateZ(360deg)}}.el-pagination{white-space:nowrap;padding:2px 5px;color:#303133;font-weight:700}.el-pagination::after,.el-pagination::before{display:table;content:""}.el-pagination::after{clear:both}.el-pagination button,.el-pagination span:not([class*=suffix]){display:inline-block;font-size:13px;min-width:35.5px;height:28px;line-height:28px;vertical-align:top;-webkit-box-sizing:border-box;box-sizing:border-box}.el-pagination .el-input__inner{text-align:center;-moz-appearance:textfield;line-height:normal}.el-pagination .el-input__suffix{right:0;-webkit-transform:scale(.8);transform:scale(.8)}.el-pagination .el-select .el-input{width:100px;margin:0 5px}.el-pagination .el-select .el-input .el-input__inner{padding-right:25px;border-radius:3px}.el-pagination button{border:none;padding:0 6px;background:0 0}.el-pagination button:focus{outline:0}.el-pagination button:hover{color:#409EFF}.el-pagination button:disabled{color:#C0C4CC;background-color:#FFF;cursor:not-allowed}.el-pagination .btn-next,.el-pagination .btn-prev{background:center center no-repeat #FFF;background-size:16px;cursor:pointer;margin:0;color:#303133}.el-pagination .btn-next .el-icon,.el-pagination .btn-prev .el-icon{display:block;font-size:12px;font-weight:700}.el-pagination .btn-prev{padding-right:12px}.el-pagination .btn-next{padding-left:12px}.el-pagination .el-pager li.disabled{color:#C0C4CC;cursor:not-allowed}.el-pager li,.el-pager li.btn-quicknext:hover,.el-pager li.btn-quickprev:hover{cursor:pointer}.el-pagination--small .btn-next,.el-pagination--small .btn-prev,.el-pagination--small .el-pager li,.el-pagination--small .el-pager li.btn-quicknext,.el-pagination--small .el-pager li.btn-quickprev,.el-pagination--small .el-pager li:last-child{border-color:transparent;font-size:12px;line-height:22px;height:22px;min-width:22px}.el-pagination--small .arrow.disabled{visibility:hidden}.el-pagination--small .more::before,.el-pagination--small li.more::before{line-height:24px}.el-pagination--small button,.el-pagination--small span:not([class*=suffix]){height:22px;line-height:22px}.el-pagination--small .el-pagination__editor,.el-pagination--small .el-pagination__editor.el-input .el-input__inner{height:22px}.el-pagination__sizes{margin:0 10px 0 0;font-weight:400;color:#606266}.el-pagination__sizes .el-input .el-input__inner{font-size:13px;padding-left:8px}.el-pagination__sizes .el-input .el-input__inner:hover{border-color:#409EFF}.el-pagination__total{margin-right:10px;font-weight:400;color:#606266}.el-pagination__jump{margin-left:24px;font-weight:400;color:#606266}.el-pagination__jump .el-input__inner{padding:0 3px}.el-pagination__rightwrapper{float:right}.el-pagination__editor{line-height:18px;padding:0 2px;height:28px;text-align:center;margin:0 2px;-webkit-box-sizing:border-box;box-sizing:border-box;border-radius:3px}.el-pager,.el-pagination.is-background .btn-next,.el-pagination.is-background .btn-prev{padding:0}.el-dialog,.el-pager li{-webkit-box-sizing:border-box}.el-pagination__editor.el-input{width:50px}.el-pagination__editor.el-input .el-input__inner{height:28px}.el-pagination__editor .el-input__inner::-webkit-inner-spin-button,.el-pagination__editor .el-input__inner::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.el-pagination.is-background .btn-next,.el-pagination.is-background .btn-prev,.el-pagination.is-background .el-pager li{margin:0 5px;background-color:#f4f4f5;color:#606266;min-width:30px;border-radius:2px}.el-pagination.is-background .btn-next.disabled,.el-pagination.is-background .btn-next:disabled,.el-pagination.is-background .btn-prev.disabled,.el-pagination.is-background .btn-prev:disabled,.el-pagination.is-background .el-pager li.disabled{color:#C0C4CC}.el-pagination.is-background .el-pager li:not(.disabled):hover{color:#409EFF}.el-pagination.is-background .el-pager li:not(.disabled).active{background-color:#409EFF;color:#FFF}.el-pagination.is-background.el-pagination--small .btn-next,.el-pagination.is-background.el-pagination--small .btn-prev,.el-pagination.is-background.el-pagination--small .el-pager li{margin:0 3px;min-width:22px}.el-pager,.el-pager li{vertical-align:top;margin:0;display:inline-block}.el-pager{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;list-style:none;font-size:0}.el-pager .more::before{line-height:30px}.el-pager li{padding:0 4px;background:#FFF;font-size:13px;min-width:35.5px;height:28px;line-height:28px;box-sizing:border-box;text-align:center}.el-pager li.btn-quicknext,.el-pager li.btn-quickprev{line-height:28px;color:#303133}.el-pager li.btn-quicknext.disabled,.el-pager li.btn-quickprev.disabled{color:#C0C4CC}.el-pager li.active+li{border-left:0}.el-pager li:hover{color:#409EFF}.el-pager li.active{color:#409EFF;cursor:default}@-webkit-keyframes v-modal-in{0%{opacity:0}}@-webkit-keyframes v-modal-out{100%{opacity:0}}.el-dialog{position:relative;margin:0 auto 50px;background:#FFF;border-radius:2px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,.3);box-shadow:0 1px 3px rgba(0,0,0,.3);box-sizing:border-box;width:50%}.el-dialog.is-fullscreen{width:100%;margin-top:0;margin-bottom:0;height:100%;overflow:auto}.el-dialog__wrapper{position:fixed;top:0;right:0;bottom:0;left:0;overflow:auto;margin:0}.el-dialog__header{padding:20px 20px 10px}.el-dialog__headerbtn{position:absolute;top:20px;right:20px;padding:0;background:0 0;border:none;outline:0;cursor:pointer;font-size:16px}.el-dialog__headerbtn .el-dialog__close{color:#909399}.el-dialog__headerbtn:focus .el-dialog__close,.el-dialog__headerbtn:hover .el-dialog__close{color:#409EFF}.el-dialog__title{line-height:24px;font-size:18px;color:#303133}.el-dialog__body{padding:30px 20px;color:#606266;font-size:14px;word-break:break-all}.el-dialog__footer{padding:10px 20px 20px;text-align:right;-webkit-box-sizing:border-box;box-sizing:border-box}.el-dialog--center{text-align:center}.el-dialog--center .el-dialog__body{text-align:initial;padding:25px 25px 30px}.el-dialog--center .el-dialog__footer{text-align:inherit}.dialog-fade-enter-active{-webkit-animation:dialog-fade-in .3s;animation:dialog-fade-in .3s}.dialog-fade-leave-active{-webkit-animation:dialog-fade-out .3s;animation:dialog-fade-out .3s}@-webkit-keyframes dialog-fade-in{0%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@keyframes dialog-fade-in{0%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@-webkit-keyframes dialog-fade-out{0%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}100%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}}@keyframes dialog-fade-out{0%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}100%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}}.el-autocomplete{position:relative;display:inline-block}.el-autocomplete-suggestion{margin:5px 0;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1);border-radius:4px;border:1px solid #E4E7ED;-webkit-box-sizing:border-box;box-sizing:border-box;background-color:#FFF}.el-autocomplete-suggestion__wrap{max-height:280px;padding:10px 0;-webkit-box-sizing:border-box;box-sizing:border-box}.el-autocomplete-suggestion__list{margin:0;padding:0}.el-autocomplete-suggestion li{padding:0 20px;margin:0;line-height:34px;cursor:pointer;color:#606266;font-size:14px;list-style:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.el-autocomplete-suggestion li.highlighted,.el-autocomplete-suggestion li:hover{background-color:#F5F7FA}.el-autocomplete-suggestion li.divider{margin-top:6px;border-top:1px solid #000}.el-autocomplete-suggestion li.divider:last-child{margin-bottom:-6px}.el-autocomplete-suggestion.is-loading li{text-align:center;height:100px;line-height:100px;font-size:20px;color:#999}.el-autocomplete-suggestion.is-loading li::after{display:inline-block;content:"";height:100%;vertical-align:middle}.el-autocomplete-suggestion.is-loading li:hover{background-color:#FFF}.el-autocomplete-suggestion.is-loading .el-icon-loading{vertical-align:middle}.el-dropdown{display:inline-block;position:relative;color:#606266;font-size:14px}.el-dropdown .el-button-group{display:block}.el-dropdown .el-button-group .el-button{float:none}.el-dropdown .el-dropdown__caret-button{padding-left:5px;padding-right:5px;position:relative;border-left:none}.el-dropdown .el-dropdown__caret-button::before{content:'';position:absolute;display:block;width:1px;top:5px;bottom:5px;left:0;background:rgba(255,255,255,.5)}.el-dropdown .el-dropdown__caret-button.el-button--default::before{background:rgba(220,223,230,.5)}.el-dropdown .el-dropdown__caret-button:hover:not(.is-disabled)::before{top:0;bottom:0}.el-dropdown .el-dropdown__caret-button .el-dropdown__icon{padding-left:0}.el-dropdown__icon{font-size:12px;margin:0 3px}.el-dropdown .el-dropdown-selfdefine:focus:active,.el-dropdown .el-dropdown-selfdefine:focus:not(.focusing){outline-width:0}.el-dropdown [disabled]{cursor:not-allowed;color:#bbb}.el-dropdown-menu{position:absolute;top:0;left:0;z-index:10;padding:10px 0;margin:5px 0;background-color:#FFF;border:1px solid #EBEEF5;border-radius:4px;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-dropdown-menu__item,.el-menu-item{font-size:14px;padding:0 20px;cursor:pointer}.el-dropdown-menu__item{list-style:none;line-height:36px;margin:0;color:#606266;outline:0}.el-dropdown-menu__item:focus,.el-dropdown-menu__item:not(.is-disabled):hover{background-color:#ecf5ff;color:#66b1ff}.el-dropdown-menu__item i{margin-right:5px}.el-dropdown-menu__item--divided{position:relative;margin-top:6px;border-top:1px solid #EBEEF5}.el-dropdown-menu__item--divided:before{content:'';height:6px;display:block;margin:0 -20px;background-color:#FFF}.el-dropdown-menu__item.is-disabled{cursor:default;color:#bbb;pointer-events:none}.el-dropdown-menu--medium{padding:6px 0}.el-dropdown-menu--medium .el-dropdown-menu__item{line-height:30px;padding:0 17px;font-size:14px}.el-dropdown-menu--medium .el-dropdown-menu__item.el-dropdown-menu__item--divided{margin-top:6px}.el-dropdown-menu--medium .el-dropdown-menu__item.el-dropdown-menu__item--divided:before{height:6px;margin:0 -17px}.el-dropdown-menu--small{padding:6px 0}.el-dropdown-menu--small .el-dropdown-menu__item{line-height:27px;padding:0 15px;font-size:13px}.el-dropdown-menu--small .el-dropdown-menu__item.el-dropdown-menu__item--divided{margin-top:4px}.el-dropdown-menu--small .el-dropdown-menu__item.el-dropdown-menu__item--divided:before{height:4px;margin:0 -15px}.el-dropdown-menu--mini{padding:3px 0}.el-dropdown-menu--mini .el-dropdown-menu__item{line-height:24px;padding:0 10px;font-size:12px}.el-dropdown-menu--mini .el-dropdown-menu__item.el-dropdown-menu__item--divided{margin-top:3px}.el-dropdown-menu--mini .el-dropdown-menu__item.el-dropdown-menu__item--divided:before{height:3px;margin:0 -10px}.el-menu{border-right:solid 1px #e6e6e6;list-style:none;position:relative;margin:0;padding-left:0;background-color:#FFF}.el-menu--horizontal>.el-menu-item:not(.is-disabled):focus,.el-menu--horizontal>.el-menu-item:not(.is-disabled):hover,.el-menu--horizontal>.el-submenu .el-submenu__title:hover{background-color:#fff}.el-menu::after,.el-menu::before{display:table;content:""}.el-breadcrumb__item:last-child .el-breadcrumb__separator,.el-menu--collapse>.el-menu-item .el-submenu__icon-arrow,.el-menu--collapse>.el-submenu>.el-submenu__title .el-submenu__icon-arrow{display:none}.el-menu::after{clear:both}.el-menu.el-menu--horizontal{border-bottom:solid 1px #e6e6e6}.el-menu--horizontal{border-right:none}.el-menu--horizontal>.el-menu-item{float:left;height:60px;line-height:60px;margin:0;border-bottom:2px solid transparent;color:#909399}.el-menu--horizontal>.el-menu-item a,.el-menu--horizontal>.el-menu-item a:hover{color:inherit}.el-menu--horizontal>.el-submenu{float:left}.el-menu--horizontal>.el-submenu:focus,.el-menu--horizontal>.el-submenu:hover{outline:0}.el-menu--horizontal>.el-submenu:focus .el-submenu__title,.el-menu--horizontal>.el-submenu:hover .el-submenu__title{color:#303133}.el-menu--horizontal>.el-submenu.is-active .el-submenu__title{border-bottom:2px solid #409EFF;color:#303133}.el-menu--horizontal>.el-submenu .el-submenu__title{height:60px;line-height:60px;border-bottom:2px solid transparent;color:#909399}.el-menu--horizontal>.el-submenu .el-submenu__icon-arrow{position:static;vertical-align:middle;margin-left:8px;margin-top:-3px}.el-menu--collapse .el-submenu,.el-menu-item{position:relative}.el-menu--horizontal .el-menu .el-menu-item,.el-menu--horizontal .el-menu .el-submenu__title{background-color:#FFF;float:none;height:36px;line-height:36px;padding:0 10px;color:#909399}.el-menu--horizontal .el-menu .el-menu-item.is-active,.el-menu--horizontal .el-menu .el-submenu.is-active>.el-submenu__title{color:#303133}.el-menu--horizontal .el-menu-item:not(.is-disabled):focus,.el-menu--horizontal .el-menu-item:not(.is-disabled):hover{outline:0;color:#303133}.el-menu--horizontal>.el-menu-item.is-active{border-bottom:2px solid #409EFF;color:#303133}.el-menu--collapse{width:64px}.el-menu--collapse>.el-menu-item [class^=el-icon-],.el-menu--collapse>.el-submenu>.el-submenu__title [class^=el-icon-]{margin:0;vertical-align:middle;width:24px;text-align:center}.el-menu--collapse>.el-menu-item span,.el-menu--collapse>.el-submenu>.el-submenu__title span{height:0;width:0;overflow:hidden;visibility:hidden;display:inline-block}.el-menu-item,.el-submenu__title{height:56px;line-height:56px;list-style:none}.el-menu--collapse>.el-menu-item.is-active i{color:inherit}.el-menu--collapse .el-menu .el-submenu{min-width:200px}.el-menu--collapse .el-submenu .el-menu{position:absolute;margin-left:5px;top:0;left:100%;z-index:10;border:1px solid #E4E7ED;border-radius:2px;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-menu--collapse .el-submenu.is-opened>.el-submenu__title .el-submenu__icon-arrow{-webkit-transform:none;transform:none}.el-menu--popup{z-index:100;min-width:200px;border:none;padding:5px 0;border-radius:2px;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-menu--popup-bottom-start{margin-top:5px}.el-menu--popup-right-start{margin-left:5px;margin-right:5px}.el-menu-item{color:#303133;-webkit-transition:border-color .3s,background-color .3s,color .3s;transition:border-color .3s,background-color .3s,color .3s;-webkit-box-sizing:border-box;box-sizing:border-box;white-space:nowrap}.el-radio-button__inner,.el-submenu__title{-webkit-box-sizing:border-box;position:relative;white-space:nowrap}.el-menu-item *{vertical-align:middle}.el-menu-item i{color:#909399}.el-menu-item:focus,.el-menu-item:hover{outline:0;background-color:#ecf5ff}.el-menu-item.is-disabled{opacity:.25;cursor:not-allowed;background:0 0!important}.el-menu-item [class^=el-icon-]{margin-right:5px;width:24px;text-align:center;font-size:18px;vertical-align:middle}.el-menu-item.is-active{color:#409EFF}.el-menu-item.is-active i{color:inherit}.el-submenu{list-style:none;margin:0;padding-left:0}.el-submenu__title{font-size:14px;color:#303133;padding:0 20px;cursor:pointer;-webkit-transition:border-color .3s,background-color .3s,color .3s;transition:border-color .3s,background-color .3s,color .3s;box-sizing:border-box}.el-submenu__title *{vertical-align:middle}.el-submenu__title i{color:#909399}.el-submenu__title:focus,.el-submenu__title:hover{outline:0;background-color:#ecf5ff}.el-submenu__title.is-disabled{opacity:.25;cursor:not-allowed;background:0 0!important}.el-submenu__title:hover{background-color:#ecf5ff}.el-submenu .el-menu{border:none}.el-submenu .el-menu-item{height:50px;line-height:50px;padding:0 45px;min-width:200px}.el-submenu__icon-arrow{position:absolute;top:50%;right:20px;margin-top:-7px;-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s;font-size:12px}.el-submenu.is-active .el-submenu__title{border-bottom-color:#409EFF}.el-submenu.is-opened>.el-submenu__title .el-submenu__icon-arrow{-webkit-transform:rotateZ(180deg);transform:rotateZ(180deg)}.el-submenu.is-disabled .el-menu-item,.el-submenu.is-disabled .el-submenu__title{opacity:.25;cursor:not-allowed;background:0 0!important}.el-submenu [class^=el-icon-]{vertical-align:middle;margin-right:5px;width:24px;text-align:center;font-size:18px}.el-menu-item-group>ul{padding:0}.el-menu-item-group__title{padding:7px 0 7px 20px;line-height:normal;font-size:12px;color:#909399}.el-radio-button__inner,.el-radio-group{display:inline-block;line-height:1;vertical-align:middle}.horizontal-collapse-transition .el-submenu__title .el-submenu__icon-arrow{-webkit-transition:.2s;transition:.2s;opacity:0}.el-radio-group{font-size:0}.el-radio-button{position:relative;display:inline-block;outline:0}.el-radio-button__inner{background:#FFF;border:1px solid #DCDFE6;font-weight:500;border-left:0;color:#606266;-webkit-appearance:none;text-align:center;box-sizing:border-box;outline:0;margin:0;cursor:pointer;-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1);padding:12px 20px;font-size:14px;border-radius:0}.el-radio-button__inner.is-round{padding:12px 20px}.el-radio-button__inner:hover{color:#409EFF}.el-radio-button__inner [class*=el-icon-]{line-height:.9}.el-radio-button__inner [class*=el-icon-]+span{margin-left:5px}.el-radio-button:first-child .el-radio-button__inner{border-left:1px solid #DCDFE6;border-radius:4px 0 0 4px;-webkit-box-shadow:none!important;box-shadow:none!important}.el-radio-button__orig-radio{opacity:0;outline:0;position:absolute;z-index:-1}.el-radio-button__orig-radio:checked+.el-radio-button__inner{color:#FFF;background-color:#409EFF;border-color:#409EFF;-webkit-box-shadow:-1px 0 0 0 #409EFF;box-shadow:-1px 0 0 0 #409EFF}.el-radio-button__orig-radio:disabled+.el-radio-button__inner{color:#C0C4CC;cursor:not-allowed;background-image:none;background-color:#FFF;border-color:#EBEEF5;-webkit-box-shadow:none;box-shadow:none}.el-radio-button__orig-radio:disabled:checked+.el-radio-button__inner{background-color:#F2F6FC}.el-radio-button:last-child .el-radio-button__inner{border-radius:0 4px 4px 0}.el-radio-button:first-child:last-child .el-radio-button__inner{border-radius:4px}.el-radio-button--medium .el-radio-button__inner{padding:10px 20px;font-size:14px;border-radius:0}.el-radio-button--medium .el-radio-button__inner.is-round{padding:10px 20px}.el-radio-button--small .el-radio-button__inner{padding:9px 15px;font-size:12px;border-radius:0}.el-radio-button--small .el-radio-button__inner.is-round{padding:9px 15px}.el-radio-button--mini .el-radio-button__inner{padding:7px 15px;font-size:12px;border-radius:0}.el-radio-button--mini .el-radio-button__inner.is-round{padding:7px 15px}.el-radio-button:focus:not(.is-focus):not(:active):not(.is-disabled){-webkit-box-shadow:0 0 2px 2px #409EFF;box-shadow:0 0 2px 2px #409EFF}.el-picker-panel,.el-popover,.el-select-dropdown,.el-table-filter,.el-time-panel{-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-switch{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;position:relative;font-size:14px;line-height:20px;height:20px;vertical-align:middle}.el-switch__core,.el-switch__label{display:inline-block;cursor:pointer}.el-switch.is-disabled .el-switch__core,.el-switch.is-disabled .el-switch__label{cursor:not-allowed}.el-switch__label{-webkit-transition:.2s;transition:.2s;height:20px;font-size:14px;font-weight:500;vertical-align:middle;color:#303133}.el-switch__label.is-active{color:#409EFF}.el-switch__label--left{margin-right:10px}.el-switch__label--right{margin-left:10px}.el-switch__label *{line-height:1;font-size:14px;display:inline-block}.el-switch__input{position:absolute;width:0;height:0;opacity:0;margin:0}.el-switch__core{margin:0;position:relative;width:40px;height:20px;border:1px solid #DCDFE6;outline:0;border-radius:10px;-webkit-box-sizing:border-box;box-sizing:border-box;background:#DCDFE6;-webkit-transition:border-color .3s,background-color .3s;transition:border-color .3s,background-color .3s;vertical-align:middle}.el-input__prefix,.el-input__suffix{-webkit-transition:all .3s;color:#C0C4CC}.el-switch__core:after{content:"";position:absolute;top:1px;left:1px;border-radius:100%;-webkit-transition:all .3s;transition:all .3s;width:16px;height:16px;background-color:#FFF}.el-switch.is-checked .el-switch__core{border-color:#409EFF;background-color:#409EFF}.el-switch.is-checked .el-switch__core::after{left:100%;margin-left:-17px}.el-switch.is-disabled{opacity:.6}.el-switch--wide .el-switch__label.el-switch__label--left span{left:10px}.el-switch--wide .el-switch__label.el-switch__label--right span{right:10px}.el-switch .label-fade-enter,.el-switch .label-fade-leave-active{opacity:0}.el-select-dropdown{position:absolute;z-index:1001;border:1px solid #E4E7ED;border-radius:4px;background-color:#FFF;box-shadow:0 2px 12px 0 rgba(0,0,0,.1);-webkit-box-sizing:border-box;box-sizing:border-box;margin:5px 0}.el-select-dropdown.is-multiple .el-select-dropdown__item{padding-right:40px}.el-select-dropdown.is-multiple .el-select-dropdown__item.selected{color:#409EFF;background-color:#FFF}.el-select-dropdown.is-multiple .el-select-dropdown__item.selected.hover{background-color:#F5F7FA}.el-select-dropdown.is-multiple .el-select-dropdown__item.selected::after{position:absolute;right:20px;font-family:element-icons;content:"\e6da";font-size:12px;font-weight:700;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.el-select-dropdown .el-scrollbar.is-empty .el-select-dropdown__list{padding:0}.el-select-dropdown__empty{padding:10px 0;margin:0;text-align:center;color:#999;font-size:14px}.el-select-dropdown__wrap{max-height:274px}.el-select-dropdown__list{list-style:none;padding:6px 0;margin:0;-webkit-box-sizing:border-box;box-sizing:border-box}.el-select-dropdown__item{font-size:14px;padding:0 20px;position:relative;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:#606266;height:34px;line-height:34px;-webkit-box-sizing:border-box;box-sizing:border-box;cursor:pointer}.el-select-dropdown__item.is-disabled{color:#C0C4CC;cursor:not-allowed}.el-select-dropdown__item.is-disabled:hover{background-color:#FFF}.el-select-dropdown__item.hover,.el-select-dropdown__item:hover{background-color:#F5F7FA}.el-select-dropdown__item.selected{color:#409EFF;font-weight:700}.el-select-group{margin:0;padding:0}.el-select-group__wrap{position:relative;list-style:none;margin:0;padding:0}.el-select-group__wrap:not(:last-of-type){padding-bottom:24px}.el-select-group__wrap:not(:last-of-type)::after{content:'';position:absolute;display:block;left:20px;right:20px;bottom:12px;height:1px;background:#E4E7ED}.el-select-group__title{padding-left:20px;font-size:12px;color:#909399;line-height:30px}.el-select-group .el-select-dropdown__item{padding-left:20px}.el-select{display:inline-block;position:relative}.el-select .el-select__tags>span{display:contents}.el-select:hover .el-input__inner{border-color:#C0C4CC}.el-select .el-input__inner{cursor:pointer;padding-right:35px}.el-select .el-input__inner:focus{border-color:#409EFF}.el-select .el-input .el-select__caret{color:#C0C4CC;font-size:14px;-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s;-webkit-transform:rotateZ(180deg);transform:rotateZ(180deg);cursor:pointer}.el-select .el-input .el-select__caret.is-reverse{-webkit-transform:rotateZ(0);transform:rotateZ(0)}.el-select .el-input .el-select__caret.is-show-close{font-size:14px;text-align:center;-webkit-transform:rotateZ(180deg);transform:rotateZ(180deg);border-radius:100%;color:#C0C4CC;-webkit-transition:color .2s cubic-bezier(.645,.045,.355,1);transition:color .2s cubic-bezier(.645,.045,.355,1)}.el-select .el-input .el-select__caret.is-show-close:hover{color:#909399}.el-select .el-input.is-disabled .el-input__inner{cursor:not-allowed}.el-select .el-input.is-disabled .el-input__inner:hover{border-color:#E4E7ED}.el-range-editor.is-active,.el-range-editor.is-active:hover,.el-select .el-input.is-focus .el-input__inner{border-color:#409EFF}.el-select>.el-input{display:block}.el-select__input{border:none;outline:0;padding:0;margin-left:15px;color:#666;font-size:14px;-webkit-appearance:none;-moz-appearance:none;appearance:none;height:28px;background-color:transparent}.el-select__input.is-mini{height:14px}.el-select__close{cursor:pointer;position:absolute;top:8px;z-index:1000;right:25px;color:#C0C4CC;line-height:18px;font-size:14px}.el-select__close:hover{color:#909399}.el-select__tags{position:absolute;line-height:normal;white-space:normal;z-index:1;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-wrap:wrap;flex-wrap:wrap}.el-select__tags-text{overflow:hidden;text-overflow:ellipsis}.el-select .el-tag{-webkit-box-sizing:border-box;box-sizing:border-box;border-color:transparent;margin:2px 0 2px 6px;background-color:#f0f2f5;display:-webkit-box;display:-ms-flexbox;display:flex;max-width:100%;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-select .el-tag__close.el-icon-close{background-color:#C0C4CC;top:0;color:#FFF;-ms-flex-negative:0;flex-shrink:0}.el-select .el-tag__close.el-icon-close:hover{background-color:#909399}.el-table,.el-table__expanded-cell{background-color:#FFF}.el-select .el-tag__close.el-icon-close::before{display:block;-webkit-transform:translate(0,.5px);transform:translate(0,.5px)}.el-table{position:relative;overflow:hidden;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-box-flex:1;-ms-flex:1;flex:1;width:100%;max-width:100%;font-size:14px;color:#606266}.el-table__empty-block{min-height:60px;text-align:center;width:100%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-table__empty-text{line-height:60px;width:50%;color:#909399}.el-table__expand-column .cell{padding:0;text-align:center}.el-table__expand-icon{position:relative;cursor:pointer;color:#666;font-size:12px;-webkit-transition:-webkit-transform .2s ease-in-out;transition:-webkit-transform .2s ease-in-out;transition:transform .2s ease-in-out;transition:transform .2s ease-in-out,-webkit-transform .2s ease-in-out;height:20px}.el-table__expand-icon--expanded{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.el-table__expand-icon>.el-icon{position:absolute;left:50%;top:50%;margin-left:-5px;margin-top:-5px}.el-table__expanded-cell[class*=cell]{padding:20px 50px}.el-table__expanded-cell:hover{background-color:transparent!important}.el-table__placeholder{display:inline-block;width:20px}.el-table__append-wrapper{overflow:hidden}.el-table--fit{border-right:0;border-bottom:0}.el-table--fit .el-table__cell.gutter{border-right-width:1px}.el-table--scrollable-x .el-table__body-wrapper{overflow-x:auto}.el-table--scrollable-y .el-table__body-wrapper{overflow-y:auto}.el-table thead{color:#909399;font-weight:500}.el-table thead.is-group th.el-table__cell{background:#F5F7FA}.el-table .el-table__cell{padding:12px 0;min-width:0;-webkit-box-sizing:border-box;box-sizing:border-box;text-overflow:ellipsis;vertical-align:middle;position:relative;text-align:left}.el-table .el-table__cell.is-center{text-align:center}.el-table .el-table__cell.is-right{text-align:right}.el-table .el-table__cell.gutter{width:15px;border-right-width:0;border-bottom-width:0;padding:0}.el-table .el-table__cell.is-hidden>*{visibility:hidden}.el-table--medium .el-table__cell{padding:10px 0}.el-table--small{font-size:12px}.el-table--small .el-table__cell{padding:8px 0}.el-table--mini{font-size:12px}.el-table--mini .el-table__cell{padding:6px 0}.el-table tr{background-color:#FFF}.el-table tr input[type=checkbox]{margin:0}.el-table td.el-table__cell,.el-table th.el-table__cell.is-leaf{border-bottom:1px solid #EBEEF5}.el-table th.el-table__cell.is-sortable{cursor:pointer}.el-table th.el-table__cell{overflow:hidden;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#FFF}.el-table th.el-table__cell>.cell{display:inline-block;-webkit-box-sizing:border-box;box-sizing:border-box;position:relative;vertical-align:middle;padding-left:10px;padding-right:10px;width:100%}.el-table th.el-table__cell>.cell.highlight{color:#409EFF}.el-table th.el-table__cell.required>div::before{display:inline-block;content:"";width:8px;height:8px;border-radius:50%;background:#ff4d51;margin-right:5px;vertical-align:middle}.el-table td.el-table__cell div{-webkit-box-sizing:border-box;box-sizing:border-box}.el-date-table td,.el-table .cell,.el-table-filter{-webkit-box-sizing:border-box}.el-table td.el-table__cell.gutter{width:0}.el-table .cell{box-sizing:border-box;overflow:hidden;text-overflow:ellipsis;white-space:normal;word-break:break-all;line-height:23px;padding-left:10px;padding-right:10px}.el-table .cell.el-tooltip{white-space:nowrap;min-width:50px}.el-table--border,.el-table--group{border:1px solid #EBEEF5}.el-table--border::after,.el-table--group::after,.el-table::before{content:'';position:absolute;background-color:#EBEEF5;z-index:1}.el-table--border::after,.el-table--group::after{top:0;right:0;width:1px;height:100%}.el-table::before{left:0;bottom:0;width:100%;height:1px}.el-table--border{border-right:none;border-bottom:none}.el-table--border.el-loading-parent--relative{border-color:transparent}.el-table--border .el-table__cell,.el-table__body-wrapper .el-table--border.is-scrolling-left~.el-table__fixed{border-right:1px solid #EBEEF5}.el-table--border .el-table__cell:first-child .cell{padding-left:10px}.el-table--border th.el-table__cell.gutter:last-of-type{border-bottom:1px solid #EBEEF5;border-bottom-width:1px}.el-table--border th.el-table__cell,.el-table__fixed-right-patch{border-bottom:1px solid #EBEEF5}.el-table--hidden{visibility:hidden}.el-table__fixed,.el-table__fixed-right{position:absolute;top:0;left:0;overflow-x:hidden;overflow-y:hidden;-webkit-box-shadow:0 0 10px rgba(0,0,0,.12);box-shadow:0 0 10px rgba(0,0,0,.12)}.el-table__fixed-right::before,.el-table__fixed::before{content:'';position:absolute;left:0;bottom:0;width:100%;height:1px;background-color:#EBEEF5;z-index:4}.el-table__fixed-right-patch{position:absolute;top:-1px;right:0;background-color:#FFF}.el-table__fixed-right{top:0;left:auto;right:0}.el-table__fixed-right .el-table__fixed-body-wrapper,.el-table__fixed-right .el-table__fixed-footer-wrapper,.el-table__fixed-right .el-table__fixed-header-wrapper{left:auto;right:0}.el-table__fixed-header-wrapper{position:absolute;left:0;top:0;z-index:3}.el-table__fixed-footer-wrapper{position:absolute;left:0;bottom:0;z-index:3}.el-table__fixed-footer-wrapper tbody td.el-table__cell{border-top:1px solid #EBEEF5;background-color:#F5F7FA;color:#606266}.el-table__fixed-body-wrapper{position:absolute;left:0;top:37px;overflow:hidden;z-index:3}.el-table__body-wrapper,.el-table__footer-wrapper,.el-table__header-wrapper{width:100%}.el-table__footer-wrapper{margin-top:-1px}.el-table__footer-wrapper td.el-table__cell{border-top:1px solid #EBEEF5}.el-table__body,.el-table__footer,.el-table__header{table-layout:fixed;border-collapse:separate}.el-table__footer-wrapper,.el-table__header-wrapper{overflow:hidden}.el-table__footer-wrapper tbody td.el-table__cell,.el-table__header-wrapper tbody td.el-table__cell{background-color:#F5F7FA;color:#606266}.el-table__body-wrapper{overflow:hidden;position:relative}.el-table__body-wrapper.is-scrolling-left~.el-table__fixed,.el-table__body-wrapper.is-scrolling-none~.el-table__fixed,.el-table__body-wrapper.is-scrolling-none~.el-table__fixed-right,.el-table__body-wrapper.is-scrolling-right~.el-table__fixed-right{-webkit-box-shadow:none;box-shadow:none}.el-table__body-wrapper .el-table--border.is-scrolling-right~.el-table__fixed-right{border-left:1px solid #EBEEF5}.el-table .caret-wrapper{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-ms-flex-align:center;align-items:center;height:34px;width:24px;vertical-align:middle;cursor:pointer;overflow:initial;position:relative}.el-table .sort-caret{width:0;height:0;border:5px solid transparent;position:absolute;left:7px}.el-table .sort-caret.ascending{border-bottom-color:#C0C4CC;top:5px}.el-table .sort-caret.descending{border-top-color:#C0C4CC;bottom:7px}.el-table .ascending .sort-caret.ascending{border-bottom-color:#409EFF}.el-table .descending .sort-caret.descending{border-top-color:#409EFF}.el-table .hidden-columns{visibility:hidden;position:absolute;z-index:-1}.el-table--striped .el-table__body tr.el-table__row--striped td.el-table__cell{background:#FAFAFA}.el-table--striped .el-table__body tr.el-table__row--striped.current-row td.el-table__cell,.el-table--striped .el-table__body tr.el-table__row--striped.selection-row td.el-table__cell{background-color:#ecf5ff}.el-table__body tr.hover-row.current-row>td.el-table__cell,.el-table__body tr.hover-row.el-table__row--striped.current-row>td.el-table__cell,.el-table__body tr.hover-row.el-table__row--striped.selection-row>td.el-table__cell,.el-table__body tr.hover-row.el-table__row--striped>td.el-table__cell,.el-table__body tr.hover-row.selection-row>td.el-table__cell,.el-table__body tr.hover-row>td.el-table__cell{background-color:#F5F7FA}.el-table__body tr.current-row>td.el-table__cell,.el-table__body tr.selection-row>td.el-table__cell{background-color:#ecf5ff}.el-table__column-resize-proxy{position:absolute;left:200px;top:0;bottom:0;width:0;border-left:1px solid #EBEEF5;z-index:10}.el-table__column-filter-trigger{display:inline-block;line-height:34px;cursor:pointer}.el-table__column-filter-trigger i{color:#909399;font-size:12px;-webkit-transform:scale(.75);transform:scale(.75)}.el-table--enable-row-transition .el-table__body td.el-table__cell{-webkit-transition:background-color .25s ease;transition:background-color .25s ease}.el-table--enable-row-hover .el-table__body tr:hover>td.el-table__cell{background-color:#F5F7FA}.el-table--fluid-height .el-table__fixed,.el-table--fluid-height .el-table__fixed-right{bottom:0;overflow:hidden}.el-table [class*=el-table__row--level] .el-table__expand-icon{display:inline-block;width:20px;line-height:20px;height:20px;text-align:center;margin-right:3px}.el-table-column--selection .cell{padding-left:14px;padding-right:14px}.el-table-filter{border:1px solid #EBEEF5;border-radius:2px;background-color:#FFF;box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-sizing:border-box;margin:2px 0}.el-table-filter__list{padding:5px 0;margin:0;list-style:none;min-width:100px}.el-table-filter__list-item{line-height:36px;padding:0 10px;cursor:pointer;font-size:14px}.el-table-filter__list-item:hover{background-color:#ecf5ff;color:#66b1ff}.el-table-filter__list-item.is-active{background-color:#409EFF;color:#FFF}.el-table-filter__content{min-width:100px}.el-table-filter__bottom{border-top:1px solid #EBEEF5;padding:8px}.el-table-filter__bottom button{background:0 0;border:none;color:#606266;cursor:pointer;font-size:13px;padding:0 3px}.el-date-table td.in-range div,.el-date-table td.in-range div:hover,.el-date-table.is-week-mode .el-date-table__row.current div,.el-date-table.is-week-mode .el-date-table__row:hover div{background-color:#F2F6FC}.el-table-filter__bottom button:hover{color:#409EFF}.el-table-filter__bottom button:focus{outline:0}.el-table-filter__bottom button.is-disabled{color:#C0C4CC;cursor:not-allowed}.el-table-filter__wrap{max-height:280px}.el-table-filter__checkbox-group{padding:10px}.el-table-filter__checkbox-group label.el-checkbox{display:block;margin-right:5px;margin-bottom:8px;margin-left:5px}.el-table-filter__checkbox-group .el-checkbox:last-child{margin-bottom:0}.el-date-table{font-size:12px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.el-date-table.is-week-mode .el-date-table__row:hover td.available:hover{color:#606266}.el-date-table.is-week-mode .el-date-table__row:hover td:first-child div{margin-left:5px;border-top-left-radius:15px;border-bottom-left-radius:15px}.el-date-table.is-week-mode .el-date-table__row:hover td:last-child div{margin-right:5px;border-top-right-radius:15px;border-bottom-right-radius:15px}.el-date-table td{width:32px;height:30px;padding:4px 0;box-sizing:border-box;text-align:center;cursor:pointer;position:relative}.el-date-table td div{height:30px;padding:3px 0;-webkit-box-sizing:border-box;box-sizing:border-box}.el-date-table td span{width:24px;height:24px;display:block;margin:0 auto;line-height:24px;position:absolute;left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%);border-radius:50%}.el-date-table td.next-month,.el-date-table td.prev-month{color:#C0C4CC}.el-date-table td.today{position:relative}.el-date-table td.today span{color:#409EFF;font-weight:700}.el-date-table td.today.end-date span,.el-date-table td.today.start-date span{color:#FFF}.el-date-table td.available:hover{color:#409EFF}.el-date-table td.current:not(.disabled) span{color:#FFF;background-color:#409EFF}.el-date-table td.end-date div,.el-date-table td.start-date div{color:#FFF}.el-date-table td.end-date span,.el-date-table td.start-date span{background-color:#409EFF}.el-date-table td.start-date div{margin-left:5px;border-top-left-radius:15px;border-bottom-left-radius:15px}.el-date-table td.end-date div{margin-right:5px;border-top-right-radius:15px;border-bottom-right-radius:15px}.el-date-table td.disabled div{background-color:#F5F7FA;opacity:1;cursor:not-allowed;color:#C0C4CC}.el-date-table td.selected div{margin-left:5px;margin-right:5px;background-color:#F2F6FC;border-radius:15px}.el-date-table td.selected div:hover{background-color:#F2F6FC}.el-date-table td.selected span{background-color:#409EFF;color:#FFF;border-radius:15px}.el-date-table td.week{font-size:80%;color:#606266}.el-month-table,.el-year-table{font-size:12px;border-collapse:collapse}.el-date-table th{padding:5px;color:#606266;font-weight:400;border-bottom:solid 1px #EBEEF5}.el-month-table{margin:-1px}.el-month-table td{text-align:center;padding:8px 0;cursor:pointer}.el-month-table td div{height:48px;padding:6px 0;-webkit-box-sizing:border-box;box-sizing:border-box}.el-month-table td.today .cell{color:#409EFF;font-weight:700}.el-month-table td.today.end-date .cell,.el-month-table td.today.start-date .cell{color:#FFF}.el-month-table td.disabled .cell{background-color:#F5F7FA;cursor:not-allowed;color:#C0C4CC}.el-month-table td.disabled .cell:hover{color:#C0C4CC}.el-month-table td .cell{width:60px;height:36px;display:block;line-height:36px;color:#606266;margin:0 auto;border-radius:18px}.el-month-table td .cell:hover{color:#409EFF}.el-month-table td.in-range div,.el-month-table td.in-range div:hover{background-color:#F2F6FC}.el-month-table td.end-date div,.el-month-table td.start-date div{color:#FFF}.el-month-table td.end-date .cell,.el-month-table td.start-date .cell{color:#FFF;background-color:#409EFF}.el-month-table td.start-date div{border-top-left-radius:24px;border-bottom-left-radius:24px}.el-month-table td.end-date div{border-top-right-radius:24px;border-bottom-right-radius:24px}.el-month-table td.current:not(.disabled) .cell{color:#409EFF}.el-year-table{margin:-1px}.el-year-table .el-icon{color:#303133}.el-year-table td{text-align:center;padding:20px 3px;cursor:pointer}.el-year-table td.today .cell{color:#409EFF;font-weight:700}.el-year-table td.disabled .cell{background-color:#F5F7FA;cursor:not-allowed;color:#C0C4CC}.el-year-table td.disabled .cell:hover{color:#C0C4CC}.el-year-table td .cell{width:48px;height:32px;display:block;line-height:32px;color:#606266;margin:0 auto}.el-year-table td .cell:hover,.el-year-table td.current:not(.disabled) .cell{color:#409EFF}.el-date-range-picker{width:646px}.el-date-range-picker.has-sidebar{width:756px}.el-date-range-picker table{table-layout:fixed;width:100%}.el-date-range-picker .el-picker-panel__body{min-width:513px}.el-date-range-picker .el-picker-panel__content{margin:0}.el-date-range-picker__header{position:relative;text-align:center;height:28px}.el-date-range-picker__header [class*=arrow-left]{float:left}.el-date-range-picker__header [class*=arrow-right]{float:right}.el-date-range-picker__header div{font-size:16px;font-weight:500;margin-right:50px}.el-date-range-picker__content{float:left;width:50%;-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:16px}.el-date-range-picker__content.is-left{border-right:1px solid #e4e4e4}.el-date-range-picker__content .el-date-range-picker__header div{margin-left:50px;margin-right:50px}.el-date-range-picker__editors-wrap{-webkit-box-sizing:border-box;box-sizing:border-box;display:table-cell}.el-date-range-picker__editors-wrap.is-right{text-align:right}.el-date-range-picker__time-header{position:relative;border-bottom:1px solid #e4e4e4;font-size:12px;padding:8px 5px 5px;display:table;width:100%;-webkit-box-sizing:border-box;box-sizing:border-box}.el-date-range-picker__time-header>.el-icon-arrow-right{font-size:20px;vertical-align:middle;display:table-cell;color:#303133}.el-date-range-picker__time-picker-wrap{position:relative;display:table-cell;padding:0 5px}.el-date-range-picker__time-picker-wrap .el-picker-panel{position:absolute;top:13px;right:0;z-index:1;background:#FFF}.el-date-picker{width:322px}.el-date-picker.has-sidebar.has-time{width:434px}.el-date-picker.has-sidebar{width:438px}.el-date-picker.has-time .el-picker-panel__body-wrapper{position:relative}.el-date-picker .el-picker-panel__content{width:292px}.el-date-picker table{table-layout:fixed;width:100%}.el-date-picker__editor-wrap{position:relative;display:table-cell;padding:0 5px}.el-date-picker__time-header{position:relative;border-bottom:1px solid #e4e4e4;font-size:12px;padding:8px 5px 5px;display:table;width:100%;-webkit-box-sizing:border-box;box-sizing:border-box}.el-date-picker__header{margin:12px;text-align:center}.el-date-picker__header--bordered{margin-bottom:0;padding-bottom:12px;border-bottom:solid 1px #EBEEF5}.el-date-picker__header--bordered+.el-picker-panel__content{margin-top:0}.el-date-picker__header-label{font-size:16px;font-weight:500;padding:0 5px;line-height:22px;text-align:center;cursor:pointer;color:#606266}.el-date-picker__header-label.active,.el-date-picker__header-label:hover{color:#409EFF}.el-date-picker__prev-btn{float:left}.el-date-picker__next-btn{float:right}.el-date-picker__time-wrap{padding:10px;text-align:center}.el-date-picker__time-label{float:left;cursor:pointer;line-height:30px;margin-left:10px}.time-select{margin:5px 0;min-width:0}.time-select .el-picker-panel__content{max-height:200px;margin:0}.time-select-item{padding:8px 10px;font-size:14px;line-height:20px}.time-select-item.selected:not(.disabled){color:#409EFF;font-weight:700}.time-select-item.disabled{color:#E4E7ED;cursor:not-allowed}.time-select-item:hover{background-color:#F5F7FA;font-weight:700;cursor:pointer}.el-date-editor{position:relative;display:inline-block;text-align:left}.el-date-editor.el-input,.el-date-editor.el-input__inner{width:220px}.el-date-editor--monthrange.el-input,.el-date-editor--monthrange.el-input__inner{width:300px}.el-date-editor--daterange.el-input,.el-date-editor--daterange.el-input__inner,.el-date-editor--timerange.el-input,.el-date-editor--timerange.el-input__inner{width:350px}.el-date-editor--datetimerange.el-input,.el-date-editor--datetimerange.el-input__inner{width:400px}.el-date-editor--dates .el-input__inner{text-overflow:ellipsis;white-space:nowrap}.el-date-editor .el-icon-circle-close{cursor:pointer}.el-date-editor .el-range__icon{font-size:14px;margin-left:-5px;color:#C0C4CC;float:left;line-height:32px}.el-date-editor .el-range-input{-webkit-appearance:none;-moz-appearance:none;appearance:none;border:none;outline:0;display:inline-block;height:100%;margin:0;padding:0;width:39%;text-align:center;font-size:14px;color:#606266}.el-date-editor .el-range-input::-webkit-input-placeholder{color:#C0C4CC}.el-date-editor .el-range-input:-ms-input-placeholder{color:#C0C4CC}.el-date-editor .el-range-input::-ms-input-placeholder{color:#C0C4CC}.el-date-editor .el-range-input::placeholder{color:#C0C4CC}.el-date-editor .el-range-separator{display:inline-block;height:100%;padding:0 5px;margin:0;text-align:center;line-height:32px;font-size:14px;width:5%;color:#303133}.el-date-editor .el-range__close-icon{font-size:14px;color:#C0C4CC;width:25px;display:inline-block;float:right;line-height:32px}.el-range-editor.el-input__inner{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:3px 10px}.el-range-editor .el-range-input{line-height:1}.el-range-editor--medium.el-input__inner{height:36px}.el-range-editor--medium .el-range-separator{line-height:28px;font-size:14px}.el-range-editor--medium .el-range-input{font-size:14px}.el-range-editor--medium .el-range__close-icon,.el-range-editor--medium .el-range__icon{line-height:28px}.el-range-editor--small.el-input__inner{height:32px}.el-range-editor--small .el-range-separator{line-height:24px;font-size:13px}.el-range-editor--small .el-range-input{font-size:13px}.el-range-editor--small .el-range__close-icon,.el-range-editor--small .el-range__icon{line-height:24px}.el-range-editor--mini.el-input__inner{height:28px}.el-range-editor--mini .el-range-separator{line-height:20px;font-size:12px}.el-range-editor--mini .el-range-input{font-size:12px}.el-range-editor--mini .el-range__close-icon,.el-range-editor--mini .el-range__icon{line-height:20px}.el-range-editor.is-disabled{background-color:#F5F7FA;border-color:#E4E7ED;color:#C0C4CC;cursor:not-allowed}.el-range-editor.is-disabled:focus,.el-range-editor.is-disabled:hover{border-color:#E4E7ED}.el-range-editor.is-disabled input{background-color:#F5F7FA;color:#C0C4CC;cursor:not-allowed}.el-range-editor.is-disabled input::-webkit-input-placeholder{color:#C0C4CC}.el-range-editor.is-disabled input:-ms-input-placeholder{color:#C0C4CC}.el-range-editor.is-disabled input::-ms-input-placeholder{color:#C0C4CC}.el-range-editor.is-disabled input::placeholder{color:#C0C4CC}.el-range-editor.is-disabled .el-range-separator{color:#C0C4CC}.el-picker-panel{color:#606266;border:1px solid #E4E7ED;box-shadow:0 2px 12px 0 rgba(0,0,0,.1);background:#FFF;border-radius:4px;line-height:30px;margin:5px 0}.el-picker-panel__body-wrapper::after,.el-picker-panel__body::after{content:"";display:table;clear:both}.el-picker-panel__content{position:relative;margin:15px}.el-picker-panel__footer{border-top:1px solid #e4e4e4;padding:4px;text-align:right;background-color:#FFF;position:relative;font-size:0}.el-picker-panel__shortcut{display:block;width:100%;border:0;background-color:transparent;line-height:28px;font-size:14px;color:#606266;padding-left:12px;text-align:left;outline:0;cursor:pointer}.el-picker-panel__shortcut:hover{color:#409EFF}.el-picker-panel__shortcut.active{background-color:#e6f1fe;color:#409EFF}.el-picker-panel__btn{border:1px solid #dcdcdc;color:#333;line-height:24px;border-radius:2px;padding:0 20px;cursor:pointer;background-color:transparent;outline:0;font-size:12px}.el-picker-panel__btn[disabled]{color:#ccc;cursor:not-allowed}.el-picker-panel__icon-btn{font-size:12px;color:#303133;border:0;background:0 0;cursor:pointer;outline:0;margin-top:8px}.el-picker-panel__icon-btn:hover{color:#409EFF}.el-picker-panel__icon-btn.is-disabled{color:#bbb}.el-picker-panel__icon-btn.is-disabled:hover{cursor:not-allowed}.el-picker-panel__link-btn{vertical-align:middle}.el-picker-panel [slot=sidebar],.el-picker-panel__sidebar{position:absolute;top:0;bottom:0;width:110px;border-right:1px solid #e4e4e4;-webkit-box-sizing:border-box;box-sizing:border-box;padding-top:6px;background-color:#FFF;overflow:auto}.el-picker-panel [slot=sidebar]+.el-picker-panel__body,.el-picker-panel__sidebar+.el-picker-panel__body{margin-left:110px}.el-time-spinner.has-seconds .el-time-spinner__wrapper{width:33.3%}.el-time-spinner__wrapper{max-height:190px;overflow:auto;display:inline-block;width:50%;vertical-align:top;position:relative}.el-time-spinner__wrapper .el-scrollbar__wrap:not(.el-scrollbar__wrap--hidden-default){padding-bottom:15px}.el-time-spinner__input.el-input .el-input__inner,.el-time-spinner__list{padding:0;text-align:center}.el-time-spinner__wrapper.is-arrow{-webkit-box-sizing:border-box;box-sizing:border-box;text-align:center;overflow:hidden}.el-time-spinner__wrapper.is-arrow .el-time-spinner__list{-webkit-transform:translateY(-32px);transform:translateY(-32px)}.el-time-spinner__wrapper.is-arrow .el-time-spinner__item:hover:not(.disabled):not(.active){background:#FFF;cursor:default}.el-time-spinner__arrow{font-size:12px;color:#909399;position:absolute;left:0;width:100%;z-index:1;text-align:center;height:30px;line-height:30px;cursor:pointer}.el-time-spinner__arrow:hover{color:#409EFF}.el-time-spinner__arrow.el-icon-arrow-up{top:10px}.el-time-spinner__arrow.el-icon-arrow-down{bottom:10px}.el-time-spinner__input.el-input{width:70%}.el-time-spinner__list{margin:0;list-style:none}.el-time-spinner__list::after,.el-time-spinner__list::before{content:'';display:block;width:100%;height:80px}.el-time-spinner__item{height:32px;line-height:32px;font-size:12px;color:#606266}.el-time-spinner__item:hover:not(.disabled):not(.active){background:#F5F7FA;cursor:pointer}.el-time-spinner__item.active:not(.disabled){color:#303133;font-weight:700}.el-time-spinner__item.disabled{color:#C0C4CC;cursor:not-allowed}.el-time-panel{margin:5px 0;border:1px solid #E4E7ED;background-color:#FFF;box-shadow:0 2px 12px 0 rgba(0,0,0,.1);border-radius:2px;position:absolute;width:180px;left:0;z-index:1000;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-box-sizing:content-box;box-sizing:content-box}.el-time-panel__content{font-size:0;position:relative;overflow:hidden}.el-time-panel__content::after,.el-time-panel__content::before{content:"";top:50%;position:absolute;margin-top:-15px;height:32px;z-index:-1;left:0;right:0;-webkit-box-sizing:border-box;box-sizing:border-box;padding-top:6px;text-align:left;border-top:1px solid #E4E7ED;border-bottom:1px solid #E4E7ED}.el-time-panel__content::after{left:50%;margin-left:12%;margin-right:12%}.el-time-panel__content::before{padding-left:50%;margin-right:12%;margin-left:12%}.el-time-panel__content.has-seconds::after{left:calc(100% / 3 * 2)}.el-time-panel__content.has-seconds::before{padding-left:calc(100% / 3)}.el-time-panel__footer{border-top:1px solid #e4e4e4;padding:4px;height:36px;line-height:25px;text-align:right;-webkit-box-sizing:border-box;box-sizing:border-box}.el-time-panel__btn{border:none;line-height:28px;padding:0 5px;margin:0 5px;cursor:pointer;background-color:transparent;outline:0;font-size:12px;color:#303133}.el-time-panel__btn.confirm{font-weight:800;color:#409EFF}.el-time-range-picker{width:354px;overflow:visible}.el-time-range-picker__content{position:relative;text-align:center;padding:10px}.el-time-range-picker__cell{-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:4px 7px 7px;width:50%;display:inline-block}.el-time-range-picker__header{margin-bottom:5px;text-align:center;font-size:14px}.el-time-range-picker__body{border-radius:2px;border:1px solid #E4E7ED}.el-popover{position:absolute;background:#FFF;min-width:150px;border-radius:4px;border:1px solid #EBEEF5;padding:12px;z-index:2000;color:#606266;line-height:1.4;text-align:justify;font-size:14px;box-shadow:0 2px 12px 0 rgba(0,0,0,.1);word-break:break-all}.el-card.is-always-shadow,.el-card.is-hover-shadow:focus,.el-card.is-hover-shadow:hover,.el-cascader__dropdown,.el-color-picker__panel,.el-message-box,.el-notification{-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-popover--plain{padding:18px 20px}.el-popover__title{color:#303133;font-size:16px;line-height:1;margin-bottom:12px}.el-popover:focus,.el-popover:focus:active,.el-popover__reference:focus:hover,.el-popover__reference:focus:not(.focusing){outline-width:0}.v-modal-enter{-webkit-animation:v-modal-in .2s ease;animation:v-modal-in .2s ease}.v-modal-leave{-webkit-animation:v-modal-out .2s ease forwards;animation:v-modal-out .2s ease forwards}@keyframes v-modal-in{0%{opacity:0}}@keyframes v-modal-out{100%{opacity:0}}.v-modal{position:fixed;left:0;top:0;width:100%;height:100%;opacity:.5;background:#000}.el-popup-parent--hidden{overflow:hidden}.el-message-box{display:inline-block;width:420px;padding-bottom:10px;vertical-align:middle;background-color:#FFF;border-radius:4px;border:1px solid #EBEEF5;font-size:18px;box-shadow:0 2px 12px 0 rgba(0,0,0,.1);text-align:left;overflow:hidden;-webkit-backface-visibility:hidden;backface-visibility:hidden}.el-message-box__wrapper{position:fixed;top:0;bottom:0;left:0;right:0;text-align:center}.el-message-box__wrapper::after{content:"";display:inline-block;height:100%;width:0;vertical-align:middle}.el-message-box__header{position:relative;padding:15px 15px 10px}.el-message-box__title{padding-left:0;margin-bottom:0;font-size:18px;line-height:1;color:#303133}.el-message-box__headerbtn{position:absolute;top:15px;right:15px;padding:0;border:none;outline:0;background:0 0;font-size:16px;cursor:pointer}.el-form-item.is-error .el-input__inner,.el-form-item.is-error .el-input__inner:focus,.el-form-item.is-error .el-textarea__inner,.el-form-item.is-error .el-textarea__inner:focus,.el-message-box__input input.invalid,.el-message-box__input input.invalid:focus{border-color:#F56C6C}.el-message-box__headerbtn .el-message-box__close{color:#909399}.el-message-box__headerbtn:focus .el-message-box__close,.el-message-box__headerbtn:hover .el-message-box__close{color:#409EFF}.el-message-box__content{padding:10px 15px;color:#606266;font-size:14px}.el-message-box__container{position:relative}.el-message-box__input{padding-top:15px}.el-message-box__status{position:absolute;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);font-size:24px!important}.el-message-box__status::before{padding-left:1px}.el-message-box__status+.el-message-box__message{padding-left:36px;padding-right:12px}.el-message-box__status.el-icon-success{color:#67C23A}.el-message-box__status.el-icon-info{color:#909399}.el-message-box__status.el-icon-warning{color:#E6A23C}.el-message-box__status.el-icon-error{color:#F56C6C}.el-message-box__message{margin:0}.el-message-box__message p{margin:0;line-height:24px}.el-message-box__errormsg{color:#F56C6C;font-size:12px;min-height:18px;margin-top:2px}.el-message-box__btns{padding:5px 15px 0;text-align:right}.el-message-box__btns button:nth-child(2){margin-left:10px}.el-message-box__btns-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.el-message-box--center{padding-bottom:30px}.el-message-box--center .el-message-box__header{padding-top:30px}.el-message-box--center .el-message-box__title{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.el-message-box--center .el-message-box__status{position:relative;top:auto;padding-right:5px;text-align:center;-webkit-transform:translateY(-1px);transform:translateY(-1px)}.el-message-box--center .el-message-box__message{margin-left:0}.el-message-box--center .el-message-box__btns,.el-message-box--center .el-message-box__content{text-align:center}.el-message-box--center .el-message-box__content{padding-left:27px;padding-right:27px}.msgbox-fade-enter-active{-webkit-animation:msgbox-fade-in .3s;animation:msgbox-fade-in .3s}.msgbox-fade-leave-active{-webkit-animation:msgbox-fade-out .3s;animation:msgbox-fade-out .3s}@-webkit-keyframes msgbox-fade-in{0%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@keyframes msgbox-fade-in{0%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@-webkit-keyframes msgbox-fade-out{0%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}100%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}}@keyframes msgbox-fade-out{0%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}100%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}}.el-breadcrumb{font-size:14px;line-height:1}.el-breadcrumb::after,.el-breadcrumb::before{display:table;content:""}.el-breadcrumb::after{clear:both}.el-breadcrumb__separator{margin:0 9px;font-weight:700;color:#C0C4CC}.el-breadcrumb__separator[class*=icon]{margin:0 6px;font-weight:400}.el-breadcrumb__item{float:left}.el-breadcrumb__inner{color:#606266}.el-breadcrumb__inner a,.el-breadcrumb__inner.is-link{font-weight:700;text-decoration:none;-webkit-transition:color .2s cubic-bezier(.645,.045,.355,1);transition:color .2s cubic-bezier(.645,.045,.355,1);color:#303133}.el-breadcrumb__inner a:hover,.el-breadcrumb__inner.is-link:hover{color:#409EFF;cursor:pointer}.el-breadcrumb__item:last-child .el-breadcrumb__inner,.el-breadcrumb__item:last-child .el-breadcrumb__inner a,.el-breadcrumb__item:last-child .el-breadcrumb__inner a:hover,.el-breadcrumb__item:last-child .el-breadcrumb__inner:hover{font-weight:400;color:#606266;cursor:text}.el-form--label-left .el-form-item__label{text-align:left}.el-form--label-top .el-form-item__label{float:none;display:inline-block;text-align:left;padding:0 0 10px}.el-form--inline .el-form-item{display:inline-block;margin-right:10px;vertical-align:top}.el-form--inline .el-form-item__label{float:none;display:inline-block}.el-form--inline .el-form-item__content{display:inline-block;vertical-align:top}.el-form--inline.el-form--label-top .el-form-item__content{display:block}.el-form-item{margin-bottom:22px}.el-form-item::after,.el-form-item::before{display:table;content:""}.el-form-item::after{clear:both}.el-form-item .el-form-item{margin-bottom:0}.el-form-item--mini.el-form-item,.el-form-item--small.el-form-item{margin-bottom:18px}.el-form-item .el-input__validateIcon{display:none}.el-form-item--medium .el-form-item__content,.el-form-item--medium .el-form-item__label{line-height:36px}.el-form-item--small .el-form-item__content,.el-form-item--small .el-form-item__label{line-height:32px}.el-form-item--small .el-form-item__error{padding-top:2px}.el-form-item--mini .el-form-item__content,.el-form-item--mini .el-form-item__label{line-height:28px}.el-form-item--mini .el-form-item__error{padding-top:1px}.el-form-item__label-wrap{float:left}.el-form-item__label-wrap .el-form-item__label{display:inline-block;float:none}.el-form-item__label{text-align:right;vertical-align:middle;float:left;font-size:14px;color:#606266;line-height:40px;padding:0 12px 0 0;-webkit-box-sizing:border-box;box-sizing:border-box}.el-form-item__content{line-height:40px;position:relative;font-size:14px}.el-form-item__content::after,.el-form-item__content::before{display:table;content:""}.el-form-item__content::after{clear:both}.el-form-item__content .el-input-group{vertical-align:top}.el-form-item__error{color:#F56C6C;font-size:12px;line-height:1;padding-top:4px;position:absolute;top:100%;left:0}.el-form-item__error--inline{position:relative;top:auto;left:auto;display:inline-block;margin-left:10px}.el-form-item.is-required:not(.is-no-asterisk) .el-form-item__label-wrap>.el-form-item__label:before,.el-form-item.is-required:not(.is-no-asterisk)>.el-form-item__label:before{content:'*';color:#F56C6C;margin-right:4px}.el-form-item.is-error .el-input-group__append .el-input__inner,.el-form-item.is-error .el-input-group__prepend .el-input__inner{border-color:transparent}.el-form-item.is-error .el-input__validateIcon{color:#F56C6C}.el-form-item--feedback .el-input__validateIcon{display:inline-block}.el-tabs__header{padding:0;position:relative;margin:0 0 15px}.el-tabs__active-bar{position:absolute;bottom:0;left:0;height:2px;background-color:#409EFF;z-index:1;-webkit-transition:-webkit-transform .3s cubic-bezier(.645,.045,.355,1);transition:-webkit-transform .3s cubic-bezier(.645,.045,.355,1);transition:transform .3s cubic-bezier(.645,.045,.355,1);transition:transform .3s cubic-bezier(.645,.045,.355,1),-webkit-transform .3s cubic-bezier(.645,.045,.355,1);list-style:none}.el-tabs__new-tab{float:right;border:1px solid #d3dce6;height:18px;width:18px;line-height:18px;margin:12px 0 9px 10px;border-radius:3px;text-align:center;font-size:12px;color:#d3dce6;cursor:pointer;-webkit-transition:all .15s;transition:all .15s}.el-tabs__new-tab .el-icon-plus{-webkit-transform:scale(.8,.8);transform:scale(.8,.8)}.el-tabs__new-tab:hover{color:#409EFF}.el-tabs__nav-wrap{overflow:hidden;margin-bottom:-1px;position:relative}.el-tabs__nav-wrap::after{content:"";position:absolute;left:0;bottom:0;width:100%;height:2px;background-color:#E4E7ED;z-index:1}.el-tabs__nav-wrap.is-scrollable{padding:0 20px;-webkit-box-sizing:border-box;box-sizing:border-box}.el-tabs__nav-scroll{overflow:hidden}.el-tabs__nav-next,.el-tabs__nav-prev{position:absolute;cursor:pointer;line-height:44px;font-size:12px;color:#909399}.el-tabs__nav-next{right:0}.el-tabs__nav-prev{left:0}.el-tabs__nav{white-space:nowrap;position:relative;-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s;float:left;z-index:2}.el-tabs__nav.is-stretch{min-width:100%;display:-webkit-box;display:-ms-flexbox;display:flex}.el-tabs__nav.is-stretch>*{-webkit-box-flex:1;-ms-flex:1;flex:1;text-align:center}.el-tabs__item{padding:0 20px;height:40px;-webkit-box-sizing:border-box;box-sizing:border-box;line-height:40px;display:inline-block;list-style:none;font-size:14px;font-weight:500;color:#303133;position:relative}.el-tabs__item:focus,.el-tabs__item:focus:active{outline:0}.el-tabs__item:focus.is-active.is-focus:not(:active){-webkit-box-shadow:0 0 2px 2px #409EFF inset;box-shadow:0 0 2px 2px #409EFF inset;border-radius:3px}.el-tabs__item .el-icon-close{border-radius:50%;text-align:center;-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1);margin-left:5px}.el-tabs__item .el-icon-close:before{-webkit-transform:scale(.9);transform:scale(.9);display:inline-block}.el-tabs--card>.el-tabs__header .el-tabs__active-bar,.el-tabs--left.el-tabs--card .el-tabs__active-bar.is-left,.el-tabs--right.el-tabs--card .el-tabs__active-bar.is-right{display:none}.el-tabs__item .el-icon-close:hover{background-color:#C0C4CC;color:#FFF}.el-tabs__item.is-active{color:#409EFF}.el-tabs__item:hover{color:#409EFF;cursor:pointer}.el-tabs__item.is-disabled{color:#C0C4CC;cursor:default}.el-tabs__content{overflow:hidden;position:relative}.el-tabs--card>.el-tabs__header{border-bottom:1px solid #E4E7ED}.el-tabs--card>.el-tabs__header .el-tabs__nav-wrap::after{content:none}.el-tabs--card>.el-tabs__header .el-tabs__nav{border:1px solid #E4E7ED;border-bottom:none;border-radius:4px 4px 0 0;-webkit-box-sizing:border-box;box-sizing:border-box}.el-tabs--card>.el-tabs__header .el-tabs__item .el-icon-close{position:relative;font-size:12px;width:0;height:14px;vertical-align:middle;line-height:15px;overflow:hidden;top:-1px;right:-2px;-webkit-transform-origin:100% 50%;transform-origin:100% 50%}.el-tabs--card>.el-tabs__header .el-tabs__item{border-bottom:1px solid transparent;border-left:1px solid #E4E7ED;-webkit-transition:color .3s cubic-bezier(.645,.045,.355,1),padding .3s cubic-bezier(.645,.045,.355,1);transition:color .3s cubic-bezier(.645,.045,.355,1),padding .3s cubic-bezier(.645,.045,.355,1)}.el-tabs--card>.el-tabs__header .el-tabs__item:first-child{border-left:none}.el-tabs--card>.el-tabs__header .el-tabs__item.is-closable:hover{padding-left:13px;padding-right:13px}.el-tabs--card>.el-tabs__header .el-tabs__item.is-closable:hover .el-icon-close{width:14px}.el-tabs--card>.el-tabs__header .el-tabs__item.is-active{border-bottom-color:#FFF}.el-tabs--card>.el-tabs__header .el-tabs__item.is-active.is-closable{padding-left:20px;padding-right:20px}.el-tabs--card>.el-tabs__header .el-tabs__item.is-active.is-closable .el-icon-close{width:14px}.el-tabs--border-card{background:#FFF;border:1px solid #DCDFE6;-webkit-box-shadow:0 2px 4px 0 rgba(0,0,0,.12),0 0 6px 0 rgba(0,0,0,.04);box-shadow:0 2px 4px 0 rgba(0,0,0,.12),0 0 6px 0 rgba(0,0,0,.04)}.el-tabs--border-card>.el-tabs__content{padding:15px}.el-tabs--border-card>.el-tabs__header{background-color:#F5F7FA;border-bottom:1px solid #E4E7ED;margin:0}.el-tabs--border-card>.el-tabs__header .el-tabs__nav-wrap::after{content:none}.el-tabs--border-card>.el-tabs__header .el-tabs__item{-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1);border:1px solid transparent;margin-top:-1px;color:#909399}.el-tabs--border-card>.el-tabs__header .el-tabs__item+.el-tabs__item,.el-tabs--border-card>.el-tabs__header .el-tabs__item:first-child{margin-left:-1px}.el-col-offset-0,.el-tabs--border-card>.el-tabs__header .is-scrollable .el-tabs__item:first-child{margin-left:0}.el-tabs--border-card>.el-tabs__header .el-tabs__item.is-active{color:#409EFF;background-color:#FFF;border-right-color:#DCDFE6;border-left-color:#DCDFE6}.el-tabs--border-card>.el-tabs__header .el-tabs__item:not(.is-disabled):hover{color:#409EFF}.el-tabs--border-card>.el-tabs__header .el-tabs__item.is-disabled{color:#C0C4CC}.el-tabs--bottom .el-tabs__item.is-bottom:nth-child(2),.el-tabs--bottom .el-tabs__item.is-top:nth-child(2),.el-tabs--top .el-tabs__item.is-bottom:nth-child(2),.el-tabs--top .el-tabs__item.is-top:nth-child(2){padding-left:0}.el-tabs--bottom .el-tabs__item.is-bottom:last-child,.el-tabs--bottom .el-tabs__item.is-top:last-child,.el-tabs--top .el-tabs__item.is-bottom:last-child,.el-tabs--top .el-tabs__item.is-top:last-child{padding-right:0}.el-cascader-menu:last-child .el-cascader-node,.el-tabs--bottom .el-tabs--left>.el-tabs__header .el-tabs__item:last-child,.el-tabs--bottom .el-tabs--right>.el-tabs__header .el-tabs__item:last-child,.el-tabs--bottom.el-tabs--border-card>.el-tabs__header .el-tabs__item:last-child,.el-tabs--bottom.el-tabs--card>.el-tabs__header .el-tabs__item:last-child,.el-tabs--top .el-tabs--left>.el-tabs__header .el-tabs__item:last-child,.el-tabs--top .el-tabs--right>.el-tabs__header .el-tabs__item:last-child,.el-tabs--top.el-tabs--border-card>.el-tabs__header .el-tabs__item:last-child,.el-tabs--top.el-tabs--card>.el-tabs__header .el-tabs__item:last-child{padding-right:20px}.el-tabs--bottom .el-tabs--left>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--bottom .el-tabs--right>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--bottom.el-tabs--border-card>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--bottom.el-tabs--card>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--top .el-tabs--left>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--top .el-tabs--right>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--top.el-tabs--border-card>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--top.el-tabs--card>.el-tabs__header .el-tabs__item:nth-child(2){padding-left:20px}.el-tabs--bottom .el-tabs__header.is-bottom{margin-bottom:0;margin-top:10px}.el-tabs--bottom.el-tabs--border-card .el-tabs__header.is-bottom{border-bottom:0;border-top:1px solid #DCDFE6}.el-tabs--bottom.el-tabs--border-card .el-tabs__nav-wrap.is-bottom{margin-top:-1px;margin-bottom:0}.el-tabs--bottom.el-tabs--border-card .el-tabs__item.is-bottom:not(.is-active){border:1px solid transparent}.el-tabs--bottom.el-tabs--border-card .el-tabs__item.is-bottom{margin:0 -1px -1px}.el-tabs--left,.el-tabs--right{overflow:hidden}.el-tabs--left .el-tabs__header.is-left,.el-tabs--left .el-tabs__header.is-right,.el-tabs--left .el-tabs__nav-scroll,.el-tabs--left .el-tabs__nav-wrap.is-left,.el-tabs--left .el-tabs__nav-wrap.is-right,.el-tabs--right .el-tabs__header.is-left,.el-tabs--right .el-tabs__header.is-right,.el-tabs--right .el-tabs__nav-scroll,.el-tabs--right .el-tabs__nav-wrap.is-left,.el-tabs--right .el-tabs__nav-wrap.is-right{height:100%}.el-tabs--left .el-tabs__active-bar.is-left,.el-tabs--left .el-tabs__active-bar.is-right,.el-tabs--right .el-tabs__active-bar.is-left,.el-tabs--right .el-tabs__active-bar.is-right{top:0;bottom:auto;width:2px;height:auto}.el-tabs--left .el-tabs__nav-wrap.is-left,.el-tabs--left .el-tabs__nav-wrap.is-right,.el-tabs--right .el-tabs__nav-wrap.is-left,.el-tabs--right .el-tabs__nav-wrap.is-right{margin-bottom:0}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-next,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev{height:30px;line-height:30px;width:100%;text-align:center;cursor:pointer}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-next i,.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev i,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-next i,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev i,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-next i,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev i,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-next i,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev i{-webkit-transform:rotateZ(90deg);transform:rotateZ(90deg)}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev{left:auto;top:0}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-next{right:auto;bottom:0}.el-tabs--left .el-tabs__active-bar.is-left,.el-tabs--left .el-tabs__nav-wrap.is-left::after{right:0;left:auto}.el-tabs--left .el-tabs__nav-wrap.is-left.is-scrollable,.el-tabs--left .el-tabs__nav-wrap.is-right.is-scrollable,.el-tabs--right .el-tabs__nav-wrap.is-left.is-scrollable,.el-tabs--right .el-tabs__nav-wrap.is-right.is-scrollable{padding:30px 0}.el-tabs--left .el-tabs__nav-wrap.is-left::after,.el-tabs--left .el-tabs__nav-wrap.is-right::after,.el-tabs--right .el-tabs__nav-wrap.is-left::after,.el-tabs--right .el-tabs__nav-wrap.is-right::after{height:100%;width:2px;bottom:auto;top:0}.el-tabs--left .el-tabs__nav.is-left,.el-tabs--left .el-tabs__nav.is-right,.el-tabs--right .el-tabs__nav.is-left,.el-tabs--right .el-tabs__nav.is-right{float:none}.el-tabs--left .el-tabs__item.is-left,.el-tabs--left .el-tabs__item.is-right,.el-tabs--right .el-tabs__item.is-left,.el-tabs--right .el-tabs__item.is-right{display:block}.el-tabs--left .el-tabs__header.is-left{float:left;margin-bottom:0;margin-right:10px}.el-button-group>.el-button:not(:last-child),.el-tabs--left .el-tabs__nav-wrap.is-left{margin-right:-1px}.el-tabs--left .el-tabs__item.is-left{text-align:right}.el-tabs--left.el-tabs--card .el-tabs__item.is-left{border-left:none;border-right:1px solid #E4E7ED;border-bottom:none;border-top:1px solid #E4E7ED;text-align:left}.el-tabs--left.el-tabs--card .el-tabs__item.is-left:first-child{border-right:1px solid #E4E7ED;border-top:none}.el-tabs--left.el-tabs--card .el-tabs__item.is-left.is-active{border:1px solid #E4E7ED;border-right-color:#fff;border-left:none;border-bottom:none}.el-tabs--left.el-tabs--card .el-tabs__item.is-left.is-active:first-child{border-top:none}.el-tabs--left.el-tabs--card .el-tabs__item.is-left.is-active:last-child{border-bottom:none}.el-tabs--left.el-tabs--card .el-tabs__nav{border-radius:4px 0 0 4px;border-bottom:1px solid #E4E7ED;border-right:none}.el-tabs--left.el-tabs--card .el-tabs__new-tab{float:none}.el-tabs--left.el-tabs--border-card .el-tabs__header.is-left{border-right:1px solid #dfe4ed}.el-tabs--left.el-tabs--border-card .el-tabs__item.is-left{border:1px solid transparent;margin:-1px 0 -1px -1px}.el-tabs--left.el-tabs--border-card .el-tabs__item.is-left.is-active{border-color:#d1dbe5 transparent}.el-tabs--right .el-tabs__header.is-right{float:right;margin-bottom:0;margin-left:10px}.el-tabs--right .el-tabs__nav-wrap.is-right{margin-left:-1px}.el-tabs--right .el-tabs__nav-wrap.is-right::after{left:0;right:auto}.el-tabs--right .el-tabs__active-bar.is-right{left:0}.el-tabs--right.el-tabs--card .el-tabs__item.is-right{border-bottom:none;border-top:1px solid #E4E7ED}.el-tabs--right.el-tabs--card .el-tabs__item.is-right:first-child{border-left:1px solid #E4E7ED;border-top:none}.el-tabs--right.el-tabs--card .el-tabs__item.is-right.is-active{border:1px solid #E4E7ED;border-left-color:#fff;border-right:none;border-bottom:none}.el-tabs--right.el-tabs--card .el-tabs__item.is-right.is-active:first-child{border-top:none}.el-tabs--right.el-tabs--card .el-tabs__item.is-right.is-active:last-child{border-bottom:none}.el-tabs--right.el-tabs--card .el-tabs__nav{border-radius:0 4px 4px 0;border-bottom:1px solid #E4E7ED;border-left:none}.el-tabs--right.el-tabs--border-card .el-tabs__header.is-right{border-left:1px solid #dfe4ed}.el-tabs--right.el-tabs--border-card .el-tabs__item.is-right{border:1px solid transparent;margin:-1px -1px -1px 0}.el-tabs--right.el-tabs--border-card .el-tabs__item.is-right.is-active{border-color:#d1dbe5 transparent}.slideInLeft-transition,.slideInRight-transition{display:inline-block}.slideInRight-enter{-webkit-animation:slideInRight-enter .3s;animation:slideInRight-enter .3s}.slideInRight-leave{position:absolute;left:0;right:0;-webkit-animation:slideInRight-leave .3s;animation:slideInRight-leave .3s}.slideInLeft-enter{-webkit-animation:slideInLeft-enter .3s;animation:slideInLeft-enter .3s}.slideInLeft-leave{position:absolute;left:0;right:0;-webkit-animation:slideInLeft-leave .3s;animation:slideInLeft-leave .3s}@-webkit-keyframes slideInRight-enter{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(100%);transform:translateX(100%)}to{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes slideInRight-enter{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(100%);transform:translateX(100%)}to{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes slideInRight-leave{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0);opacity:1}100%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(100%);transform:translateX(100%);opacity:0}}@keyframes slideInRight-leave{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0);opacity:1}100%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(100%);transform:translateX(100%);opacity:0}}@-webkit-keyframes slideInLeft-enter{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(-100%);transform:translateX(-100%)}to{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes slideInLeft-enter{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(-100%);transform:translateX(-100%)}to{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes slideInLeft-leave{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0);opacity:1}100%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(-100%);transform:translateX(-100%);opacity:0}}@keyframes slideInLeft-leave{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0);opacity:1}100%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(-100%);transform:translateX(-100%);opacity:0}}.el-tree{position:relative;cursor:default;background:#FFF;color:#606266}.el-tree__empty-block{position:relative;min-height:60px;text-align:center;width:100%;height:100%}.el-tree__empty-text{position:absolute;left:50%;top:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);color:#909399;font-size:14px}.el-tree__drop-indicator{position:absolute;left:0;right:0;height:1px;background-color:#409EFF}.el-tree-node{white-space:nowrap;outline:0}.el-tree-node:focus>.el-tree-node__content{background-color:#F5F7FA}.el-tree-node.is-drop-inner>.el-tree-node__content .el-tree-node__label{background-color:#409EFF;color:#fff}.el-tree-node__content:hover,.el-upload-list__item:hover{background-color:#F5F7FA}.el-tree-node__content{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;height:26px;cursor:pointer}.el-tree-node__content>.el-tree-node__expand-icon{padding:6px}.el-tree-node__content>label.el-checkbox{margin-right:8px}.el-tree.is-dragging .el-tree-node__content{cursor:move}.el-tree.is-dragging .el-tree-node__content *{pointer-events:none}.el-tree.is-dragging.is-drop-not-allow .el-tree-node__content{cursor:not-allowed}.el-tree-node__expand-icon{cursor:pointer;color:#C0C4CC;font-size:12px;-webkit-transform:rotate(0);transform:rotate(0);-webkit-transition:-webkit-transform .3s ease-in-out;transition:-webkit-transform .3s ease-in-out;transition:transform .3s ease-in-out;transition:transform .3s ease-in-out,-webkit-transform .3s ease-in-out}.el-tree-node__expand-icon.expanded{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.el-tree-node__expand-icon.is-leaf{color:transparent;cursor:default}.el-tree-node__label{font-size:14px}.el-tree-node__loading-icon{margin-right:8px;font-size:14px;color:#C0C4CC}.el-tree-node>.el-tree-node__children{overflow:hidden;background-color:transparent}.el-tree-node.is-expanded>.el-tree-node__children{display:block}.el-tree--highlight-current .el-tree-node.is-current>.el-tree-node__content{background-color:#f0f7ff}.el-alert{width:100%;padding:8px 16px;margin:0;-webkit-box-sizing:border-box;box-sizing:border-box;border-radius:4px;position:relative;background-color:#FFF;overflow:hidden;opacity:1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-transition:opacity .2s;transition:opacity .2s}.el-alert.is-light .el-alert__closebtn{color:#C0C4CC}.el-alert.is-dark .el-alert__closebtn,.el-alert.is-dark .el-alert__description{color:#FFF}.el-alert.is-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.el-alert--success.is-light{background-color:#f0f9eb;color:#67C23A}.el-alert--success.is-light .el-alert__description{color:#67C23A}.el-alert--success.is-dark{background-color:#67C23A;color:#FFF}.el-alert--info.is-light{background-color:#f4f4f5;color:#909399}.el-alert--info.is-dark{background-color:#909399;color:#FFF}.el-alert--info .el-alert__description{color:#909399}.el-alert--warning.is-light{background-color:#fdf6ec;color:#E6A23C}.el-alert--warning.is-light .el-alert__description{color:#E6A23C}.el-alert--warning.is-dark{background-color:#E6A23C;color:#FFF}.el-alert--error.is-light{background-color:#fef0f0;color:#F56C6C}.el-alert--error.is-light .el-alert__description{color:#F56C6C}.el-alert--error.is-dark{background-color:#F56C6C;color:#FFF}.el-alert__content{display:table-cell;padding:0 8px}.el-alert__icon{font-size:16px;width:16px}.el-alert__icon.is-big{font-size:28px;width:28px}.el-alert__title{font-size:13px;line-height:18px}.el-alert__title.is-bold{font-weight:700}.el-alert .el-alert__description{font-size:12px;margin:5px 0 0}.el-alert__closebtn{font-size:12px;opacity:1;position:absolute;top:12px;right:15px;cursor:pointer}.el-alert-fade-enter,.el-alert-fade-leave-active,.el-loading-fade-enter,.el-loading-fade-leave-active,.el-notification-fade-leave-active,.el-upload iframe{opacity:0}.el-carousel__arrow--right,.el-notification.right{right:16px}.el-alert__closebtn.is-customed{font-style:normal;font-size:13px;top:9px}.el-notification{display:-webkit-box;display:-ms-flexbox;display:flex;width:330px;padding:14px 26px 14px 13px;border-radius:8px;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid #EBEEF5;position:fixed;background-color:#FFF;box-shadow:0 2px 12px 0 rgba(0,0,0,.1);-webkit-transition:opacity .3s,left .3s,right .3s,top .4s,bottom .3s,-webkit-transform .3s;transition:opacity .3s,left .3s,right .3s,top .4s,bottom .3s,-webkit-transform .3s;transition:opacity .3s,transform .3s,left .3s,right .3s,top .4s,bottom .3s;transition:opacity .3s,transform .3s,left .3s,right .3s,top .4s,bottom .3s,-webkit-transform .3s;overflow:hidden}.el-notification.left{left:16px}.el-notification__group{margin-left:13px;margin-right:8px}.el-notification__title{font-weight:700;font-size:16px;color:#303133;margin:0}.el-notification__content{font-size:14px;line-height:21px;margin:6px 0 0;color:#606266;text-align:justify}.el-notification__content p{margin:0}.el-notification__icon{height:24px;width:24px;font-size:24px}.el-notification__closeBtn{position:absolute;top:18px;right:15px;cursor:pointer;color:#909399;font-size:16px}.el-notification__closeBtn:hover{color:#606266}.el-notification .el-icon-success{color:#67C23A}.el-notification .el-icon-error{color:#F56C6C}.el-notification .el-icon-info{color:#909399}.el-notification .el-icon-warning{color:#E6A23C}.el-notification-fade-enter.right{right:0;-webkit-transform:translateX(100%);transform:translateX(100%)}.el-notification-fade-enter.left{left:0;-webkit-transform:translateX(-100%);transform:translateX(-100%)}.el-input-number{position:relative;display:inline-block;width:180px;line-height:38px}.el-input-number .el-input{display:block}.el-input-number .el-input__inner{-webkit-appearance:none;padding-left:50px;padding-right:50px;text-align:center}.el-input-number__decrease,.el-input-number__increase{position:absolute;z-index:1;top:1px;width:40px;height:auto;text-align:center;background:#F5F7FA;color:#606266;cursor:pointer;font-size:13px}.el-input-number__decrease:hover,.el-input-number__increase:hover{color:#409EFF}.el-input-number__decrease:hover:not(.is-disabled)~.el-input .el-input__inner:not(.is-disabled),.el-input-number__increase:hover:not(.is-disabled)~.el-input .el-input__inner:not(.is-disabled){border-color:#409EFF}.el-input-number__decrease.is-disabled,.el-input-number__increase.is-disabled{color:#C0C4CC;cursor:not-allowed}.el-input-number__increase{right:1px;border-radius:0 4px 4px 0;border-left:1px solid #DCDFE6}.el-input-number__decrease{left:1px;border-radius:4px 0 0 4px;border-right:1px solid #DCDFE6}.el-input-number.is-disabled .el-input-number__decrease,.el-input-number.is-disabled .el-input-number__increase{border-color:#E4E7ED;color:#E4E7ED}.el-input-number.is-disabled .el-input-number__decrease:hover,.el-input-number.is-disabled .el-input-number__increase:hover{color:#E4E7ED;cursor:not-allowed}.el-input-number--medium{width:200px;line-height:34px}.el-input-number--medium .el-input-number__decrease,.el-input-number--medium .el-input-number__increase{width:36px;font-size:14px}.el-input-number--medium .el-input__inner{padding-left:43px;padding-right:43px}.el-input-number--small{width:130px;line-height:30px}.el-input-number--small .el-input-number__decrease,.el-input-number--small .el-input-number__increase{width:32px;font-size:13px}.el-input-number--small .el-input-number__decrease [class*=el-icon],.el-input-number--small .el-input-number__increase [class*=el-icon]{-webkit-transform:scale(.9);transform:scale(.9)}.el-input-number--small .el-input__inner{padding-left:39px;padding-right:39px}.el-input-number--mini{width:130px;line-height:26px}.el-input-number--mini .el-input-number__decrease,.el-input-number--mini .el-input-number__increase{width:28px;font-size:12px}.el-input-number--mini .el-input-number__decrease [class*=el-icon],.el-input-number--mini .el-input-number__increase [class*=el-icon]{-webkit-transform:scale(.8);transform:scale(.8)}.el-input-number--mini .el-input__inner{padding-left:35px;padding-right:35px}.el-input-number.is-without-controls .el-input__inner{padding-left:15px;padding-right:15px}.el-input-number.is-controls-right .el-input__inner{padding-left:15px;padding-right:50px}.el-input-number.is-controls-right .el-input-number__decrease,.el-input-number.is-controls-right .el-input-number__increase{height:auto;line-height:19px}.el-input-number.is-controls-right .el-input-number__decrease [class*=el-icon],.el-input-number.is-controls-right .el-input-number__increase [class*=el-icon]{-webkit-transform:scale(.8);transform:scale(.8)}.el-input-number.is-controls-right .el-input-number__increase{border-radius:0 4px 0 0;border-bottom:1px solid #DCDFE6}.el-input-number.is-controls-right .el-input-number__decrease{right:1px;bottom:1px;top:auto;left:auto;border-right:none;border-left:1px solid #DCDFE6;border-radius:0 0 4px}.el-input-number.is-controls-right[class*=medium] [class*=decrease],.el-input-number.is-controls-right[class*=medium] [class*=increase]{line-height:17px}.el-input-number.is-controls-right[class*=small] [class*=decrease],.el-input-number.is-controls-right[class*=small] [class*=increase]{line-height:15px}.el-input-number.is-controls-right[class*=mini] [class*=decrease],.el-input-number.is-controls-right[class*=mini] [class*=increase]{line-height:13px}.el-tooltip:focus:hover,.el-tooltip:focus:not(.focusing){outline-width:0}.el-tooltip__popper{position:absolute;border-radius:4px;padding:10px;z-index:2000;font-size:12px;line-height:1.2;min-width:10px;word-wrap:break-word}.el-tooltip__popper .popper__arrow,.el-tooltip__popper .popper__arrow::after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.el-tooltip__popper .popper__arrow{border-width:6px}.el-tooltip__popper .popper__arrow::after{content:" ";border-width:5px}.el-button-group::after,.el-button-group::before,.el-color-dropdown__main-wrapper::after,.el-link.is-underline:hover:after,.el-page-header__left::after,.el-progress-bar__inner::after,.el-row::after,.el-row::before,.el-slider::after,.el-slider::before,.el-slider__button-wrapper::after,.el-transfer-panel .el-transfer-panel__footer::after,.el-upload-cover::after,.el-upload-list--picture-card .el-upload-list__item-actions::after{content:""}.el-tooltip__popper[x-placement^=top]{margin-bottom:12px}.el-tooltip__popper[x-placement^=top] .popper__arrow{bottom:-6px;border-top-color:#303133;border-bottom-width:0}.el-tooltip__popper[x-placement^=top] .popper__arrow::after{bottom:1px;margin-left:-5px;border-top-color:#303133;border-bottom-width:0}.el-tooltip__popper[x-placement^=bottom]{margin-top:12px}.el-tooltip__popper[x-placement^=bottom] .popper__arrow{top:-6px;border-top-width:0;border-bottom-color:#303133}.el-tooltip__popper[x-placement^=bottom] .popper__arrow::after{top:1px;margin-left:-5px;border-top-width:0;border-bottom-color:#303133}.el-tooltip__popper[x-placement^=right]{margin-left:12px}.el-tooltip__popper[x-placement^=right] .popper__arrow{left:-6px;border-right-color:#303133;border-left-width:0}.el-tooltip__popper[x-placement^=right] .popper__arrow::after{bottom:-5px;left:1px;border-right-color:#303133;border-left-width:0}.el-tooltip__popper[x-placement^=left]{margin-right:12px}.el-tooltip__popper[x-placement^=left] .popper__arrow{right:-6px;border-right-width:0;border-left-color:#303133}.el-tooltip__popper[x-placement^=left] .popper__arrow::after{right:1px;bottom:-5px;margin-left:-5px;border-right-width:0;border-left-color:#303133}.el-tooltip__popper.is-dark{background:#303133;color:#FFF}.el-tooltip__popper.is-light{background:#FFF;border:1px solid #303133}.el-tooltip__popper.is-light[x-placement^=top] .popper__arrow{border-top-color:#303133}.el-tooltip__popper.is-light[x-placement^=top] .popper__arrow::after{border-top-color:#FFF}.el-tooltip__popper.is-light[x-placement^=bottom] .popper__arrow{border-bottom-color:#303133}.el-tooltip__popper.is-light[x-placement^=bottom] .popper__arrow::after{border-bottom-color:#FFF}.el-tooltip__popper.is-light[x-placement^=left] .popper__arrow{border-left-color:#303133}.el-tooltip__popper.is-light[x-placement^=left] .popper__arrow::after{border-left-color:#FFF}.el-tooltip__popper.is-light[x-placement^=right] .popper__arrow{border-right-color:#303133}.el-tooltip__popper.is-light[x-placement^=right] .popper__arrow::after{border-right-color:#FFF}.el-slider::after,.el-slider::before{display:table}.el-slider__button-wrapper .el-tooltip,.el-slider__button-wrapper::after{display:inline-block;vertical-align:middle}.el-slider::after{clear:both}.el-slider__runway{width:100%;height:6px;margin:16px 0;background-color:#E4E7ED;border-radius:3px;position:relative;cursor:pointer;vertical-align:middle}.el-slider__runway.show-input{margin-right:160px;width:auto}.el-slider__runway.disabled{cursor:default}.el-slider__runway.disabled .el-slider__bar{background-color:#C0C4CC}.el-slider__runway.disabled .el-slider__button{border-color:#C0C4CC}.el-slider__runway.disabled .el-slider__button-wrapper.dragging,.el-slider__runway.disabled .el-slider__button-wrapper.hover,.el-slider__runway.disabled .el-slider__button-wrapper:hover{cursor:not-allowed}.el-slider__runway.disabled .el-slider__button.dragging,.el-slider__runway.disabled .el-slider__button.hover,.el-slider__runway.disabled .el-slider__button:hover{-webkit-transform:scale(1);transform:scale(1);cursor:not-allowed}.el-slider__button-wrapper,.el-slider__stop{-webkit-transform:translateX(-50%);position:absolute}.el-slider__input{float:right;margin-top:3px;width:130px}.el-slider__input.el-input-number--mini{margin-top:5px}.el-slider__input.el-input-number--medium{margin-top:0}.el-slider__input.el-input-number--large{margin-top:-2px}.el-slider__bar{height:6px;background-color:#409EFF;border-top-left-radius:3px;border-bottom-left-radius:3px;position:absolute}.el-slider__button-wrapper{height:36px;width:36px;z-index:1001;top:-15px;transform:translateX(-50%);background-color:transparent;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;line-height:normal}.el-image-viewer__btn,.el-slider__button,.el-step__icon-inner{-moz-user-select:none;-ms-user-select:none}.el-slider__button-wrapper::after{height:100%}.el-slider__button-wrapper.hover,.el-slider__button-wrapper:hover{cursor:-webkit-grab;cursor:grab}.el-slider__button-wrapper.dragging{cursor:-webkit-grabbing;cursor:grabbing}.el-slider__button{width:16px;height:16px;border:2px solid #409EFF;background-color:#FFF;border-radius:50%;-webkit-transition:.2s;transition:.2s;-webkit-user-select:none;user-select:none}.el-slider__button.dragging,.el-slider__button.hover,.el-slider__button:hover{-webkit-transform:scale(1.2);transform:scale(1.2)}.el-slider__button.hover,.el-slider__button:hover{cursor:-webkit-grab;cursor:grab}.el-slider__button.dragging{cursor:-webkit-grabbing;cursor:grabbing}.el-slider__stop{height:6px;width:6px;border-radius:100%;background-color:#FFF;transform:translateX(-50%)}.el-slider__marks{top:0;left:12px;width:18px;height:100%}.el-slider__marks-text{position:absolute;-webkit-transform:translateX(-50%);transform:translateX(-50%);font-size:14px;color:#909399;margin-top:15px}.el-slider.is-vertical{position:relative}.el-slider.is-vertical .el-slider__runway{width:6px;height:100%;margin:0 16px}.el-slider.is-vertical .el-slider__bar{width:6px;height:auto;border-radius:0 0 3px 3px}.el-slider.is-vertical .el-slider__button-wrapper{top:auto;left:-15px;-webkit-transform:translateY(50%);transform:translateY(50%)}.el-slider.is-vertical .el-slider__stop{-webkit-transform:translateY(50%);transform:translateY(50%)}.el-slider.is-vertical.el-slider--with-input{padding-bottom:58px}.el-slider.is-vertical.el-slider--with-input .el-slider__input{overflow:visible;float:none;position:absolute;bottom:22px;width:36px;margin-top:15px}.el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input__inner{text-align:center;padding-left:5px;padding-right:5px}.el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input-number__decrease,.el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input-number__increase{top:32px;margin-top:-1px;border:1px solid #DCDFE6;line-height:20px;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1)}.el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input-number__decrease{width:18px;right:18px;border-bottom-left-radius:4px}.el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input-number__increase{width:19px;border-bottom-right-radius:4px}.el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input-number__increase~.el-input .el-input__inner{border-bottom-left-radius:0;border-bottom-right-radius:0}.el-slider.is-vertical.el-slider--with-input .el-slider__input:hover .el-input-number__decrease,.el-slider.is-vertical.el-slider--with-input .el-slider__input:hover .el-input-number__increase{border-color:#C0C4CC}.el-slider.is-vertical.el-slider--with-input .el-slider__input:active .el-input-number__decrease,.el-slider.is-vertical.el-slider--with-input .el-slider__input:active .el-input-number__increase{border-color:#409EFF}.el-slider.is-vertical .el-slider__marks-text{margin-top:0;left:15px;-webkit-transform:translateY(50%);transform:translateY(50%)}.el-loading-parent--relative{position:relative!important}.el-loading-parent--hidden{overflow:hidden!important}.el-loading-mask{position:absolute;z-index:2000;background-color:rgba(255,255,255,.9);margin:0;top:0;right:0;bottom:0;left:0;-webkit-transition:opacity .3s;transition:opacity .3s}.el-loading-mask.is-fullscreen{position:fixed}.el-loading-mask.is-fullscreen .el-loading-spinner{margin-top:-25px}.el-loading-mask.is-fullscreen .el-loading-spinner .circular{height:50px;width:50px}.el-loading-spinner{top:50%;margin-top:-21px;width:100%;text-align:center;position:absolute}.el-col-pull-0,.el-col-pull-1,.el-col-pull-10,.el-col-pull-11,.el-col-pull-12,.el-col-pull-13,.el-col-pull-14,.el-col-pull-15,.el-col-pull-16,.el-col-pull-17,.el-col-pull-18,.el-col-pull-19,.el-col-pull-2,.el-col-pull-20,.el-col-pull-21,.el-col-pull-22,.el-col-pull-23,.el-col-pull-24,.el-col-pull-3,.el-col-pull-4,.el-col-pull-5,.el-col-pull-6,.el-col-pull-7,.el-col-pull-8,.el-col-pull-9,.el-col-push-0,.el-col-push-1,.el-col-push-10,.el-col-push-11,.el-col-push-12,.el-col-push-13,.el-col-push-14,.el-col-push-15,.el-col-push-16,.el-col-push-17,.el-col-push-18,.el-col-push-19,.el-col-push-2,.el-col-push-20,.el-col-push-21,.el-col-push-22,.el-col-push-23,.el-col-push-24,.el-col-push-3,.el-col-push-4,.el-col-push-5,.el-col-push-6,.el-col-push-7,.el-col-push-8,.el-col-push-9,.el-row,.el-upload-dragger,.el-upload-list__item{position:relative}.el-loading-spinner .el-loading-text{color:#409EFF;margin:3px 0;font-size:14px}.el-loading-spinner .circular{height:42px;width:42px;-webkit-animation:loading-rotate 2s linear infinite;animation:loading-rotate 2s linear infinite}.el-loading-spinner .path{-webkit-animation:loading-dash 1.5s ease-in-out infinite;animation:loading-dash 1.5s ease-in-out infinite;stroke-dasharray:90,150;stroke-dashoffset:0;stroke-width:2;stroke:#409EFF;stroke-linecap:round}.el-loading-spinner i{color:#409EFF}@-webkit-keyframes loading-rotate{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes loading-rotate{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes loading-dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-40px}100%{stroke-dasharray:90,150;stroke-dashoffset:-120px}}@keyframes loading-dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-40px}100%{stroke-dasharray:90,150;stroke-dashoffset:-120px}}.el-row{-webkit-box-sizing:border-box;box-sizing:border-box}.el-row::after,.el-row::before{display:table}.el-row::after{clear:both}.el-row--flex{display:-webkit-box;display:-ms-flexbox;display:flex}.el-col-0,.el-row--flex:after,.el-row--flex:before{display:none}.el-row--flex.is-justify-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.el-row--flex.is-justify-end{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.el-row--flex.is-justify-space-between{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.el-row--flex.is-justify-space-around{-ms-flex-pack:distribute;justify-content:space-around}.el-row--flex.is-align-top{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.el-row--flex.is-align-middle{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-row--flex.is-align-bottom{-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end}[class*=el-col-]{float:left;-webkit-box-sizing:border-box;box-sizing:border-box}.el-col-0{width:0%}.el-col-pull-0{right:0}.el-col-push-0{left:0}.el-col-1{width:4.16667%}.el-col-offset-1{margin-left:4.16667%}.el-col-pull-1{right:4.16667%}.el-col-push-1{left:4.16667%}.el-col-2{width:8.33333%}.el-col-offset-2{margin-left:8.33333%}.el-col-pull-2{right:8.33333%}.el-col-push-2{left:8.33333%}.el-col-3{width:12.5%}.el-col-offset-3{margin-left:12.5%}.el-col-pull-3{right:12.5%}.el-col-push-3{left:12.5%}.el-col-4{width:16.66667%}.el-col-offset-4{margin-left:16.66667%}.el-col-pull-4{right:16.66667%}.el-col-push-4{left:16.66667%}.el-col-5{width:20.83333%}.el-col-offset-5{margin-left:20.83333%}.el-col-pull-5{right:20.83333%}.el-col-push-5{left:20.83333%}.el-col-6{width:25%}.el-col-offset-6{margin-left:25%}.el-col-pull-6{right:25%}.el-col-push-6{left:25%}.el-col-7{width:29.16667%}.el-col-offset-7{margin-left:29.16667%}.el-col-pull-7{right:29.16667%}.el-col-push-7{left:29.16667%}.el-col-8{width:33.33333%}.el-col-offset-8{margin-left:33.33333%}.el-col-pull-8{right:33.33333%}.el-col-push-8{left:33.33333%}.el-col-9{width:37.5%}.el-col-offset-9{margin-left:37.5%}.el-col-pull-9{right:37.5%}.el-col-push-9{left:37.5%}.el-col-10{width:41.66667%}.el-col-offset-10{margin-left:41.66667%}.el-col-pull-10{right:41.66667%}.el-col-push-10{left:41.66667%}.el-col-11{width:45.83333%}.el-col-offset-11{margin-left:45.83333%}.el-col-pull-11{right:45.83333%}.el-col-push-11{left:45.83333%}.el-col-12{width:50%}.el-col-offset-12{margin-left:50%}.el-col-pull-12{right:50%}.el-col-push-12{left:50%}.el-col-13{width:54.16667%}.el-col-offset-13{margin-left:54.16667%}.el-col-pull-13{right:54.16667%}.el-col-push-13{left:54.16667%}.el-col-14{width:58.33333%}.el-col-offset-14{margin-left:58.33333%}.el-col-pull-14{right:58.33333%}.el-col-push-14{left:58.33333%}.el-col-15{width:62.5%}.el-col-offset-15{margin-left:62.5%}.el-col-pull-15{right:62.5%}.el-col-push-15{left:62.5%}.el-col-16{width:66.66667%}.el-col-offset-16{margin-left:66.66667%}.el-col-pull-16{right:66.66667%}.el-col-push-16{left:66.66667%}.el-col-17{width:70.83333%}.el-col-offset-17{margin-left:70.83333%}.el-col-pull-17{right:70.83333%}.el-col-push-17{left:70.83333%}.el-col-18{width:75%}.el-col-offset-18{margin-left:75%}.el-col-pull-18{right:75%}.el-col-push-18{left:75%}.el-col-19{width:79.16667%}.el-col-offset-19{margin-left:79.16667%}.el-col-pull-19{right:79.16667%}.el-col-push-19{left:79.16667%}.el-col-20{width:83.33333%}.el-col-offset-20{margin-left:83.33333%}.el-col-pull-20{right:83.33333%}.el-col-push-20{left:83.33333%}.el-col-21{width:87.5%}.el-col-offset-21{margin-left:87.5%}.el-col-pull-21{right:87.5%}.el-col-push-21{left:87.5%}.el-col-22{width:91.66667%}.el-col-offset-22{margin-left:91.66667%}.el-col-pull-22{right:91.66667%}.el-col-push-22{left:91.66667%}.el-col-23{width:95.83333%}.el-col-offset-23{margin-left:95.83333%}.el-col-pull-23{right:95.83333%}.el-col-push-23{left:95.83333%}.el-col-24{width:100%}.el-col-offset-24{margin-left:100%}.el-col-pull-24{right:100%}.el-col-push-24{left:100%}@media only screen and (max-width:767px){.el-col-xs-0{display:none;width:0%}.el-col-xs-offset-0{margin-left:0}.el-col-xs-pull-0{position:relative;right:0}.el-col-xs-push-0{position:relative;left:0}.el-col-xs-1{width:4.16667%}.el-col-xs-offset-1{margin-left:4.16667%}.el-col-xs-pull-1{position:relative;right:4.16667%}.el-col-xs-push-1{position:relative;left:4.16667%}.el-col-xs-2{width:8.33333%}.el-col-xs-offset-2{margin-left:8.33333%}.el-col-xs-pull-2{position:relative;right:8.33333%}.el-col-xs-push-2{position:relative;left:8.33333%}.el-col-xs-3{width:12.5%}.el-col-xs-offset-3{margin-left:12.5%}.el-col-xs-pull-3{position:relative;right:12.5%}.el-col-xs-push-3{position:relative;left:12.5%}.el-col-xs-4{width:16.66667%}.el-col-xs-offset-4{margin-left:16.66667%}.el-col-xs-pull-4{position:relative;right:16.66667%}.el-col-xs-push-4{position:relative;left:16.66667%}.el-col-xs-5{width:20.83333%}.el-col-xs-offset-5{margin-left:20.83333%}.el-col-xs-pull-5{position:relative;right:20.83333%}.el-col-xs-push-5{position:relative;left:20.83333%}.el-col-xs-6{width:25%}.el-col-xs-offset-6{margin-left:25%}.el-col-xs-pull-6{position:relative;right:25%}.el-col-xs-push-6{position:relative;left:25%}.el-col-xs-7{width:29.16667%}.el-col-xs-offset-7{margin-left:29.16667%}.el-col-xs-pull-7{position:relative;right:29.16667%}.el-col-xs-push-7{position:relative;left:29.16667%}.el-col-xs-8{width:33.33333%}.el-col-xs-offset-8{margin-left:33.33333%}.el-col-xs-pull-8{position:relative;right:33.33333%}.el-col-xs-push-8{position:relative;left:33.33333%}.el-col-xs-9{width:37.5%}.el-col-xs-offset-9{margin-left:37.5%}.el-col-xs-pull-9{position:relative;right:37.5%}.el-col-xs-push-9{position:relative;left:37.5%}.el-col-xs-10{width:41.66667%}.el-col-xs-offset-10{margin-left:41.66667%}.el-col-xs-pull-10{position:relative;right:41.66667%}.el-col-xs-push-10{position:relative;left:41.66667%}.el-col-xs-11{width:45.83333%}.el-col-xs-offset-11{margin-left:45.83333%}.el-col-xs-pull-11{position:relative;right:45.83333%}.el-col-xs-push-11{position:relative;left:45.83333%}.el-col-xs-12{width:50%}.el-col-xs-offset-12{margin-left:50%}.el-col-xs-pull-12{position:relative;right:50%}.el-col-xs-push-12{position:relative;left:50%}.el-col-xs-13{width:54.16667%}.el-col-xs-offset-13{margin-left:54.16667%}.el-col-xs-pull-13{position:relative;right:54.16667%}.el-col-xs-push-13{position:relative;left:54.16667%}.el-col-xs-14{width:58.33333%}.el-col-xs-offset-14{margin-left:58.33333%}.el-col-xs-pull-14{position:relative;right:58.33333%}.el-col-xs-push-14{position:relative;left:58.33333%}.el-col-xs-15{width:62.5%}.el-col-xs-offset-15{margin-left:62.5%}.el-col-xs-pull-15{position:relative;right:62.5%}.el-col-xs-push-15{position:relative;left:62.5%}.el-col-xs-16{width:66.66667%}.el-col-xs-offset-16{margin-left:66.66667%}.el-col-xs-pull-16{position:relative;right:66.66667%}.el-col-xs-push-16{position:relative;left:66.66667%}.el-col-xs-17{width:70.83333%}.el-col-xs-offset-17{margin-left:70.83333%}.el-col-xs-pull-17{position:relative;right:70.83333%}.el-col-xs-push-17{position:relative;left:70.83333%}.el-col-xs-18{width:75%}.el-col-xs-offset-18{margin-left:75%}.el-col-xs-pull-18{position:relative;right:75%}.el-col-xs-push-18{position:relative;left:75%}.el-col-xs-19{width:79.16667%}.el-col-xs-offset-19{margin-left:79.16667%}.el-col-xs-pull-19{position:relative;right:79.16667%}.el-col-xs-push-19{position:relative;left:79.16667%}.el-col-xs-20{width:83.33333%}.el-col-xs-offset-20{margin-left:83.33333%}.el-col-xs-pull-20{position:relative;right:83.33333%}.el-col-xs-push-20{position:relative;left:83.33333%}.el-col-xs-21{width:87.5%}.el-col-xs-offset-21{margin-left:87.5%}.el-col-xs-pull-21{position:relative;right:87.5%}.el-col-xs-push-21{position:relative;left:87.5%}.el-col-xs-22{width:91.66667%}.el-col-xs-offset-22{margin-left:91.66667%}.el-col-xs-pull-22{position:relative;right:91.66667%}.el-col-xs-push-22{position:relative;left:91.66667%}.el-col-xs-23{width:95.83333%}.el-col-xs-offset-23{margin-left:95.83333%}.el-col-xs-pull-23{position:relative;right:95.83333%}.el-col-xs-push-23{position:relative;left:95.83333%}.el-col-xs-24{width:100%}.el-col-xs-offset-24{margin-left:100%}.el-col-xs-pull-24{position:relative;right:100%}.el-col-xs-push-24{position:relative;left:100%}}@media only screen and (min-width:768px){.el-col-sm-0{display:none;width:0%}.el-col-sm-offset-0{margin-left:0}.el-col-sm-pull-0{position:relative;right:0}.el-col-sm-push-0{position:relative;left:0}.el-col-sm-1{width:4.16667%}.el-col-sm-offset-1{margin-left:4.16667%}.el-col-sm-pull-1{position:relative;right:4.16667%}.el-col-sm-push-1{position:relative;left:4.16667%}.el-col-sm-2{width:8.33333%}.el-col-sm-offset-2{margin-left:8.33333%}.el-col-sm-pull-2{position:relative;right:8.33333%}.el-col-sm-push-2{position:relative;left:8.33333%}.el-col-sm-3{width:12.5%}.el-col-sm-offset-3{margin-left:12.5%}.el-col-sm-pull-3{position:relative;right:12.5%}.el-col-sm-push-3{position:relative;left:12.5%}.el-col-sm-4{width:16.66667%}.el-col-sm-offset-4{margin-left:16.66667%}.el-col-sm-pull-4{position:relative;right:16.66667%}.el-col-sm-push-4{position:relative;left:16.66667%}.el-col-sm-5{width:20.83333%}.el-col-sm-offset-5{margin-left:20.83333%}.el-col-sm-pull-5{position:relative;right:20.83333%}.el-col-sm-push-5{position:relative;left:20.83333%}.el-col-sm-6{width:25%}.el-col-sm-offset-6{margin-left:25%}.el-col-sm-pull-6{position:relative;right:25%}.el-col-sm-push-6{position:relative;left:25%}.el-col-sm-7{width:29.16667%}.el-col-sm-offset-7{margin-left:29.16667%}.el-col-sm-pull-7{position:relative;right:29.16667%}.el-col-sm-push-7{position:relative;left:29.16667%}.el-col-sm-8{width:33.33333%}.el-col-sm-offset-8{margin-left:33.33333%}.el-col-sm-pull-8{position:relative;right:33.33333%}.el-col-sm-push-8{position:relative;left:33.33333%}.el-col-sm-9{width:37.5%}.el-col-sm-offset-9{margin-left:37.5%}.el-col-sm-pull-9{position:relative;right:37.5%}.el-col-sm-push-9{position:relative;left:37.5%}.el-col-sm-10{width:41.66667%}.el-col-sm-offset-10{margin-left:41.66667%}.el-col-sm-pull-10{position:relative;right:41.66667%}.el-col-sm-push-10{position:relative;left:41.66667%}.el-col-sm-11{width:45.83333%}.el-col-sm-offset-11{margin-left:45.83333%}.el-col-sm-pull-11{position:relative;right:45.83333%}.el-col-sm-push-11{position:relative;left:45.83333%}.el-col-sm-12{width:50%}.el-col-sm-offset-12{margin-left:50%}.el-col-sm-pull-12{position:relative;right:50%}.el-col-sm-push-12{position:relative;left:50%}.el-col-sm-13{width:54.16667%}.el-col-sm-offset-13{margin-left:54.16667%}.el-col-sm-pull-13{position:relative;right:54.16667%}.el-col-sm-push-13{position:relative;left:54.16667%}.el-col-sm-14{width:58.33333%}.el-col-sm-offset-14{margin-left:58.33333%}.el-col-sm-pull-14{position:relative;right:58.33333%}.el-col-sm-push-14{position:relative;left:58.33333%}.el-col-sm-15{width:62.5%}.el-col-sm-offset-15{margin-left:62.5%}.el-col-sm-pull-15{position:relative;right:62.5%}.el-col-sm-push-15{position:relative;left:62.5%}.el-col-sm-16{width:66.66667%}.el-col-sm-offset-16{margin-left:66.66667%}.el-col-sm-pull-16{position:relative;right:66.66667%}.el-col-sm-push-16{position:relative;left:66.66667%}.el-col-sm-17{width:70.83333%}.el-col-sm-offset-17{margin-left:70.83333%}.el-col-sm-pull-17{position:relative;right:70.83333%}.el-col-sm-push-17{position:relative;left:70.83333%}.el-col-sm-18{width:75%}.el-col-sm-offset-18{margin-left:75%}.el-col-sm-pull-18{position:relative;right:75%}.el-col-sm-push-18{position:relative;left:75%}.el-col-sm-19{width:79.16667%}.el-col-sm-offset-19{margin-left:79.16667%}.el-col-sm-pull-19{position:relative;right:79.16667%}.el-col-sm-push-19{position:relative;left:79.16667%}.el-col-sm-20{width:83.33333%}.el-col-sm-offset-20{margin-left:83.33333%}.el-col-sm-pull-20{position:relative;right:83.33333%}.el-col-sm-push-20{position:relative;left:83.33333%}.el-col-sm-21{width:87.5%}.el-col-sm-offset-21{margin-left:87.5%}.el-col-sm-pull-21{position:relative;right:87.5%}.el-col-sm-push-21{position:relative;left:87.5%}.el-col-sm-22{width:91.66667%}.el-col-sm-offset-22{margin-left:91.66667%}.el-col-sm-pull-22{position:relative;right:91.66667%}.el-col-sm-push-22{position:relative;left:91.66667%}.el-col-sm-23{width:95.83333%}.el-col-sm-offset-23{margin-left:95.83333%}.el-col-sm-pull-23{position:relative;right:95.83333%}.el-col-sm-push-23{position:relative;left:95.83333%}.el-col-sm-24{width:100%}.el-col-sm-offset-24{margin-left:100%}.el-col-sm-pull-24{position:relative;right:100%}.el-col-sm-push-24{position:relative;left:100%}}@media only screen and (min-width:992px){.el-col-md-0{display:none;width:0%}.el-col-md-offset-0{margin-left:0}.el-col-md-pull-0{position:relative;right:0}.el-col-md-push-0{position:relative;left:0}.el-col-md-1{width:4.16667%}.el-col-md-offset-1{margin-left:4.16667%}.el-col-md-pull-1{position:relative;right:4.16667%}.el-col-md-push-1{position:relative;left:4.16667%}.el-col-md-2{width:8.33333%}.el-col-md-offset-2{margin-left:8.33333%}.el-col-md-pull-2{position:relative;right:8.33333%}.el-col-md-push-2{position:relative;left:8.33333%}.el-col-md-3{width:12.5%}.el-col-md-offset-3{margin-left:12.5%}.el-col-md-pull-3{position:relative;right:12.5%}.el-col-md-push-3{position:relative;left:12.5%}.el-col-md-4{width:16.66667%}.el-col-md-offset-4{margin-left:16.66667%}.el-col-md-pull-4{position:relative;right:16.66667%}.el-col-md-push-4{position:relative;left:16.66667%}.el-col-md-5{width:20.83333%}.el-col-md-offset-5{margin-left:20.83333%}.el-col-md-pull-5{position:relative;right:20.83333%}.el-col-md-push-5{position:relative;left:20.83333%}.el-col-md-6{width:25%}.el-col-md-offset-6{margin-left:25%}.el-col-md-pull-6{position:relative;right:25%}.el-col-md-push-6{position:relative;left:25%}.el-col-md-7{width:29.16667%}.el-col-md-offset-7{margin-left:29.16667%}.el-col-md-pull-7{position:relative;right:29.16667%}.el-col-md-push-7{position:relative;left:29.16667%}.el-col-md-8{width:33.33333%}.el-col-md-offset-8{margin-left:33.33333%}.el-col-md-pull-8{position:relative;right:33.33333%}.el-col-md-push-8{position:relative;left:33.33333%}.el-col-md-9{width:37.5%}.el-col-md-offset-9{margin-left:37.5%}.el-col-md-pull-9{position:relative;right:37.5%}.el-col-md-push-9{position:relative;left:37.5%}.el-col-md-10{width:41.66667%}.el-col-md-offset-10{margin-left:41.66667%}.el-col-md-pull-10{position:relative;right:41.66667%}.el-col-md-push-10{position:relative;left:41.66667%}.el-col-md-11{width:45.83333%}.el-col-md-offset-11{margin-left:45.83333%}.el-col-md-pull-11{position:relative;right:45.83333%}.el-col-md-push-11{position:relative;left:45.83333%}.el-col-md-12{width:50%}.el-col-md-offset-12{margin-left:50%}.el-col-md-pull-12{position:relative;right:50%}.el-col-md-push-12{position:relative;left:50%}.el-col-md-13{width:54.16667%}.el-col-md-offset-13{margin-left:54.16667%}.el-col-md-pull-13{position:relative;right:54.16667%}.el-col-md-push-13{position:relative;left:54.16667%}.el-col-md-14{width:58.33333%}.el-col-md-offset-14{margin-left:58.33333%}.el-col-md-pull-14{position:relative;right:58.33333%}.el-col-md-push-14{position:relative;left:58.33333%}.el-col-md-15{width:62.5%}.el-col-md-offset-15{margin-left:62.5%}.el-col-md-pull-15{position:relative;right:62.5%}.el-col-md-push-15{position:relative;left:62.5%}.el-col-md-16{width:66.66667%}.el-col-md-offset-16{margin-left:66.66667%}.el-col-md-pull-16{position:relative;right:66.66667%}.el-col-md-push-16{position:relative;left:66.66667%}.el-col-md-17{width:70.83333%}.el-col-md-offset-17{margin-left:70.83333%}.el-col-md-pull-17{position:relative;right:70.83333%}.el-col-md-push-17{position:relative;left:70.83333%}.el-col-md-18{width:75%}.el-col-md-offset-18{margin-left:75%}.el-col-md-pull-18{position:relative;right:75%}.el-col-md-push-18{position:relative;left:75%}.el-col-md-19{width:79.16667%}.el-col-md-offset-19{margin-left:79.16667%}.el-col-md-pull-19{position:relative;right:79.16667%}.el-col-md-push-19{position:relative;left:79.16667%}.el-col-md-20{width:83.33333%}.el-col-md-offset-20{margin-left:83.33333%}.el-col-md-pull-20{position:relative;right:83.33333%}.el-col-md-push-20{position:relative;left:83.33333%}.el-col-md-21{width:87.5%}.el-col-md-offset-21{margin-left:87.5%}.el-col-md-pull-21{position:relative;right:87.5%}.el-col-md-push-21{position:relative;left:87.5%}.el-col-md-22{width:91.66667%}.el-col-md-offset-22{margin-left:91.66667%}.el-col-md-pull-22{position:relative;right:91.66667%}.el-col-md-push-22{position:relative;left:91.66667%}.el-col-md-23{width:95.83333%}.el-col-md-offset-23{margin-left:95.83333%}.el-col-md-pull-23{position:relative;right:95.83333%}.el-col-md-push-23{position:relative;left:95.83333%}.el-col-md-24{width:100%}.el-col-md-offset-24{margin-left:100%}.el-col-md-pull-24{position:relative;right:100%}.el-col-md-push-24{position:relative;left:100%}}@media only screen and (min-width:1200px){.el-col-lg-0{display:none;width:0%}.el-col-lg-offset-0{margin-left:0}.el-col-lg-pull-0{position:relative;right:0}.el-col-lg-push-0{position:relative;left:0}.el-col-lg-1{width:4.16667%}.el-col-lg-offset-1{margin-left:4.16667%}.el-col-lg-pull-1{position:relative;right:4.16667%}.el-col-lg-push-1{position:relative;left:4.16667%}.el-col-lg-2{width:8.33333%}.el-col-lg-offset-2{margin-left:8.33333%}.el-col-lg-pull-2{position:relative;right:8.33333%}.el-col-lg-push-2{position:relative;left:8.33333%}.el-col-lg-3{width:12.5%}.el-col-lg-offset-3{margin-left:12.5%}.el-col-lg-pull-3{position:relative;right:12.5%}.el-col-lg-push-3{position:relative;left:12.5%}.el-col-lg-4{width:16.66667%}.el-col-lg-offset-4{margin-left:16.66667%}.el-col-lg-pull-4{position:relative;right:16.66667%}.el-col-lg-push-4{position:relative;left:16.66667%}.el-col-lg-5{width:20.83333%}.el-col-lg-offset-5{margin-left:20.83333%}.el-col-lg-pull-5{position:relative;right:20.83333%}.el-col-lg-push-5{position:relative;left:20.83333%}.el-col-lg-6{width:25%}.el-col-lg-offset-6{margin-left:25%}.el-col-lg-pull-6{position:relative;right:25%}.el-col-lg-push-6{position:relative;left:25%}.el-col-lg-7{width:29.16667%}.el-col-lg-offset-7{margin-left:29.16667%}.el-col-lg-pull-7{position:relative;right:29.16667%}.el-col-lg-push-7{position:relative;left:29.16667%}.el-col-lg-8{width:33.33333%}.el-col-lg-offset-8{margin-left:33.33333%}.el-col-lg-pull-8{position:relative;right:33.33333%}.el-col-lg-push-8{position:relative;left:33.33333%}.el-col-lg-9{width:37.5%}.el-col-lg-offset-9{margin-left:37.5%}.el-col-lg-pull-9{position:relative;right:37.5%}.el-col-lg-push-9{position:relative;left:37.5%}.el-col-lg-10{width:41.66667%}.el-col-lg-offset-10{margin-left:41.66667%}.el-col-lg-pull-10{position:relative;right:41.66667%}.el-col-lg-push-10{position:relative;left:41.66667%}.el-col-lg-11{width:45.83333%}.el-col-lg-offset-11{margin-left:45.83333%}.el-col-lg-pull-11{position:relative;right:45.83333%}.el-col-lg-push-11{position:relative;left:45.83333%}.el-col-lg-12{width:50%}.el-col-lg-offset-12{margin-left:50%}.el-col-lg-pull-12{position:relative;right:50%}.el-col-lg-push-12{position:relative;left:50%}.el-col-lg-13{width:54.16667%}.el-col-lg-offset-13{margin-left:54.16667%}.el-col-lg-pull-13{position:relative;right:54.16667%}.el-col-lg-push-13{position:relative;left:54.16667%}.el-col-lg-14{width:58.33333%}.el-col-lg-offset-14{margin-left:58.33333%}.el-col-lg-pull-14{position:relative;right:58.33333%}.el-col-lg-push-14{position:relative;left:58.33333%}.el-col-lg-15{width:62.5%}.el-col-lg-offset-15{margin-left:62.5%}.el-col-lg-pull-15{position:relative;right:62.5%}.el-col-lg-push-15{position:relative;left:62.5%}.el-col-lg-16{width:66.66667%}.el-col-lg-offset-16{margin-left:66.66667%}.el-col-lg-pull-16{position:relative;right:66.66667%}.el-col-lg-push-16{position:relative;left:66.66667%}.el-col-lg-17{width:70.83333%}.el-col-lg-offset-17{margin-left:70.83333%}.el-col-lg-pull-17{position:relative;right:70.83333%}.el-col-lg-push-17{position:relative;left:70.83333%}.el-col-lg-18{width:75%}.el-col-lg-offset-18{margin-left:75%}.el-col-lg-pull-18{position:relative;right:75%}.el-col-lg-push-18{position:relative;left:75%}.el-col-lg-19{width:79.16667%}.el-col-lg-offset-19{margin-left:79.16667%}.el-col-lg-pull-19{position:relative;right:79.16667%}.el-col-lg-push-19{position:relative;left:79.16667%}.el-col-lg-20{width:83.33333%}.el-col-lg-offset-20{margin-left:83.33333%}.el-col-lg-pull-20{position:relative;right:83.33333%}.el-col-lg-push-20{position:relative;left:83.33333%}.el-col-lg-21{width:87.5%}.el-col-lg-offset-21{margin-left:87.5%}.el-col-lg-pull-21{position:relative;right:87.5%}.el-col-lg-push-21{position:relative;left:87.5%}.el-col-lg-22{width:91.66667%}.el-col-lg-offset-22{margin-left:91.66667%}.el-col-lg-pull-22{position:relative;right:91.66667%}.el-col-lg-push-22{position:relative;left:91.66667%}.el-col-lg-23{width:95.83333%}.el-col-lg-offset-23{margin-left:95.83333%}.el-col-lg-pull-23{position:relative;right:95.83333%}.el-col-lg-push-23{position:relative;left:95.83333%}.el-col-lg-24{width:100%}.el-col-lg-offset-24{margin-left:100%}.el-col-lg-pull-24{position:relative;right:100%}.el-col-lg-push-24{position:relative;left:100%}}@media only screen and (min-width:1920px){.el-col-xl-0{display:none;width:0%}.el-col-xl-offset-0{margin-left:0}.el-col-xl-pull-0{position:relative;right:0}.el-col-xl-push-0{position:relative;left:0}.el-col-xl-1{width:4.16667%}.el-col-xl-offset-1{margin-left:4.16667%}.el-col-xl-pull-1{position:relative;right:4.16667%}.el-col-xl-push-1{position:relative;left:4.16667%}.el-col-xl-2{width:8.33333%}.el-col-xl-offset-2{margin-left:8.33333%}.el-col-xl-pull-2{position:relative;right:8.33333%}.el-col-xl-push-2{position:relative;left:8.33333%}.el-col-xl-3{width:12.5%}.el-col-xl-offset-3{margin-left:12.5%}.el-col-xl-pull-3{position:relative;right:12.5%}.el-col-xl-push-3{position:relative;left:12.5%}.el-col-xl-4{width:16.66667%}.el-col-xl-offset-4{margin-left:16.66667%}.el-col-xl-pull-4{position:relative;right:16.66667%}.el-col-xl-push-4{position:relative;left:16.66667%}.el-col-xl-5{width:20.83333%}.el-col-xl-offset-5{margin-left:20.83333%}.el-col-xl-pull-5{position:relative;right:20.83333%}.el-col-xl-push-5{position:relative;left:20.83333%}.el-col-xl-6{width:25%}.el-col-xl-offset-6{margin-left:25%}.el-col-xl-pull-6{position:relative;right:25%}.el-col-xl-push-6{position:relative;left:25%}.el-col-xl-7{width:29.16667%}.el-col-xl-offset-7{margin-left:29.16667%}.el-col-xl-pull-7{position:relative;right:29.16667%}.el-col-xl-push-7{position:relative;left:29.16667%}.el-col-xl-8{width:33.33333%}.el-col-xl-offset-8{margin-left:33.33333%}.el-col-xl-pull-8{position:relative;right:33.33333%}.el-col-xl-push-8{position:relative;left:33.33333%}.el-col-xl-9{width:37.5%}.el-col-xl-offset-9{margin-left:37.5%}.el-col-xl-pull-9{position:relative;right:37.5%}.el-col-xl-push-9{position:relative;left:37.5%}.el-col-xl-10{width:41.66667%}.el-col-xl-offset-10{margin-left:41.66667%}.el-col-xl-pull-10{position:relative;right:41.66667%}.el-col-xl-push-10{position:relative;left:41.66667%}.el-col-xl-11{width:45.83333%}.el-col-xl-offset-11{margin-left:45.83333%}.el-col-xl-pull-11{position:relative;right:45.83333%}.el-col-xl-push-11{position:relative;left:45.83333%}.el-col-xl-12{width:50%}.el-col-xl-offset-12{margin-left:50%}.el-col-xl-pull-12{position:relative;right:50%}.el-col-xl-push-12{position:relative;left:50%}.el-col-xl-13{width:54.16667%}.el-col-xl-offset-13{margin-left:54.16667%}.el-col-xl-pull-13{position:relative;right:54.16667%}.el-col-xl-push-13{position:relative;left:54.16667%}.el-col-xl-14{width:58.33333%}.el-col-xl-offset-14{margin-left:58.33333%}.el-col-xl-pull-14{position:relative;right:58.33333%}.el-col-xl-push-14{position:relative;left:58.33333%}.el-col-xl-15{width:62.5%}.el-col-xl-offset-15{margin-left:62.5%}.el-col-xl-pull-15{position:relative;right:62.5%}.el-col-xl-push-15{position:relative;left:62.5%}.el-col-xl-16{width:66.66667%}.el-col-xl-offset-16{margin-left:66.66667%}.el-col-xl-pull-16{position:relative;right:66.66667%}.el-col-xl-push-16{position:relative;left:66.66667%}.el-col-xl-17{width:70.83333%}.el-col-xl-offset-17{margin-left:70.83333%}.el-col-xl-pull-17{position:relative;right:70.83333%}.el-col-xl-push-17{position:relative;left:70.83333%}.el-col-xl-18{width:75%}.el-col-xl-offset-18{margin-left:75%}.el-col-xl-pull-18{position:relative;right:75%}.el-col-xl-push-18{position:relative;left:75%}.el-col-xl-19{width:79.16667%}.el-col-xl-offset-19{margin-left:79.16667%}.el-col-xl-pull-19{position:relative;right:79.16667%}.el-col-xl-push-19{position:relative;left:79.16667%}.el-col-xl-20{width:83.33333%}.el-col-xl-offset-20{margin-left:83.33333%}.el-col-xl-pull-20{position:relative;right:83.33333%}.el-col-xl-push-20{position:relative;left:83.33333%}.el-col-xl-21{width:87.5%}.el-col-xl-offset-21{margin-left:87.5%}.el-col-xl-pull-21{position:relative;right:87.5%}.el-col-xl-push-21{position:relative;left:87.5%}.el-col-xl-22{width:91.66667%}.el-col-xl-offset-22{margin-left:91.66667%}.el-col-xl-pull-22{position:relative;right:91.66667%}.el-col-xl-push-22{position:relative;left:91.66667%}.el-col-xl-23{width:95.83333%}.el-col-xl-offset-23{margin-left:95.83333%}.el-col-xl-pull-23{position:relative;right:95.83333%}.el-col-xl-push-23{position:relative;left:95.83333%}.el-col-xl-24{width:100%}.el-col-xl-offset-24{margin-left:100%}.el-col-xl-pull-24{position:relative;right:100%}.el-col-xl-push-24{position:relative;left:100%}}@-webkit-keyframes progress{0%{background-position:0 0}100%{background-position:32px 0}}.el-upload{display:inline-block;text-align:center;cursor:pointer;outline:0}.el-upload__input{display:none}.el-upload__tip{font-size:12px;color:#606266;margin-top:7px}.el-upload iframe{position:absolute;z-index:-1;top:0;left:0;filter:alpha(opacity=0)}.el-upload--picture-card{background-color:#fbfdff;border:1px dashed #c0ccda;border-radius:6px;-webkit-box-sizing:border-box;box-sizing:border-box;width:148px;height:148px;cursor:pointer;line-height:146px;vertical-align:top}.el-upload--picture-card i{font-size:28px;color:#8c939d}.el-upload--picture-card:hover,.el-upload:focus{border-color:#409EFF;color:#409EFF}.el-upload:focus .el-upload-dragger{border-color:#409EFF}.el-upload-dragger{background-color:#fff;border:1px dashed #d9d9d9;border-radius:6px;-webkit-box-sizing:border-box;box-sizing:border-box;width:360px;height:180px;text-align:center;cursor:pointer;overflow:hidden}.el-upload-dragger .el-icon-upload{font-size:67px;color:#C0C4CC;margin:40px 0 16px;line-height:50px}.el-upload-dragger+.el-upload__tip{text-align:center}.el-upload-dragger~.el-upload__files{border-top:1px solid #DCDFE6;margin-top:7px;padding-top:5px}.el-upload-dragger .el-upload__text{color:#606266;font-size:14px;text-align:center}.el-upload-dragger .el-upload__text em{color:#409EFF;font-style:normal}.el-upload-dragger:hover{border-color:#409EFF}.el-upload-dragger.is-dragover{background-color:rgba(32,159,255,.06);border:2px dashed #409EFF}.el-upload-list{margin:0;padding:0;list-style:none}.el-upload-list__item{-webkit-transition:all .5s cubic-bezier(.55,0,.1,1);transition:all .5s cubic-bezier(.55,0,.1,1);font-size:14px;color:#606266;line-height:1.8;margin-top:5px;-webkit-box-sizing:border-box;box-sizing:border-box;border-radius:4px;width:100%}.el-upload-list__item .el-progress{position:absolute;top:20px;width:100%}.el-upload-list__item .el-progress__text{position:absolute;right:0;top:-13px}.el-upload-list__item .el-progress-bar{margin-right:0;padding-right:0}.el-upload-list__item:first-child{margin-top:10px}.el-upload-list__item .el-icon-upload-success{color:#67C23A}.el-upload-list__item .el-icon-close{display:none;position:absolute;top:5px;right:5px;cursor:pointer;opacity:.75;color:#606266}.el-upload-list__item .el-icon-close:hover{opacity:1}.el-upload-list__item .el-icon-close-tip{display:none;position:absolute;top:5px;right:5px;font-size:12px;cursor:pointer;opacity:1;color:#409EFF}.el-upload-list__item:hover .el-icon-close{display:inline-block}.el-upload-list__item:hover .el-progress__text{display:none}.el-upload-list__item.is-success .el-upload-list__item-status-label{display:block}.el-upload-list__item.is-success .el-upload-list__item-name:focus,.el-upload-list__item.is-success .el-upload-list__item-name:hover{color:#409EFF;cursor:pointer}.el-upload-list__item.is-success:focus:not(:hover) .el-icon-close-tip{display:inline-block}.el-upload-list__item.is-success:active,.el-upload-list__item.is-success:not(.focusing):focus{outline-width:0}.el-upload-list__item.is-success:active .el-icon-close-tip,.el-upload-list__item.is-success:focus .el-upload-list__item-status-label,.el-upload-list__item.is-success:hover .el-upload-list__item-status-label,.el-upload-list__item.is-success:not(.focusing):focus .el-icon-close-tip{display:none}.el-upload-list.is-disabled .el-upload-list__item:hover .el-upload-list__item-status-label{display:block}.el-upload-list__item-name{color:#606266;display:block;margin-right:40px;overflow:hidden;padding-left:4px;text-overflow:ellipsis;-webkit-transition:color .3s;transition:color .3s;white-space:nowrap}.el-upload-list__item-name [class^=el-icon]{height:100%;margin-right:7px;color:#909399;line-height:inherit}.el-upload-list__item-status-label{position:absolute;right:5px;top:0;line-height:inherit;display:none}.el-upload-list__item-delete{position:absolute;right:10px;top:0;font-size:12px;color:#606266;display:none}.el-upload-list__item-delete:hover{color:#409EFF}.el-upload-list--picture-card{margin:0;display:inline;vertical-align:top}.el-upload-list--picture-card .el-upload-list__item{overflow:hidden;background-color:#fff;border:1px solid #c0ccda;border-radius:6px;-webkit-box-sizing:border-box;box-sizing:border-box;width:148px;height:148px;margin:0 8px 8px 0;display:inline-block}.el-upload-list--picture-card .el-upload-list__item .el-icon-check,.el-upload-list--picture-card .el-upload-list__item .el-icon-circle-check{color:#FFF}.el-upload-list--picture-card .el-upload-list__item .el-icon-close,.el-upload-list--picture-card .el-upload-list__item:hover .el-upload-list__item-status-label{display:none}.el-upload-list--picture-card .el-upload-list__item:hover .el-progress__text{display:block}.el-upload-list--picture-card .el-upload-list__item-name{display:none}.el-upload-list--picture-card .el-upload-list__item-thumbnail{width:100%;height:100%}.el-upload-list--picture-card .el-upload-list__item-status-label{position:absolute;right:-15px;top:-6px;width:40px;height:24px;background:#13ce66;text-align:center;-webkit-transform:rotate(45deg);transform:rotate(45deg);-webkit-box-shadow:0 0 1pc 1px rgba(0,0,0,.2);box-shadow:0 0 1pc 1px rgba(0,0,0,.2)}.el-upload-list--picture-card .el-upload-list__item-status-label i{font-size:12px;margin-top:11px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.el-upload-list--picture-card .el-upload-list__item-actions{position:absolute;width:100%;height:100%;left:0;top:0;cursor:default;text-align:center;color:#fff;opacity:0;font-size:20px;background-color:rgba(0,0,0,.5);-webkit-transition:opacity .3s;transition:opacity .3s}.el-upload-list--picture-card .el-upload-list__item-actions::after{display:inline-block;height:100%;vertical-align:middle}.el-upload-list--picture-card .el-upload-list__item-actions span{display:none;cursor:pointer}.el-upload-list--picture-card .el-upload-list__item-actions span+span{margin-left:15px}.el-upload-list--picture-card .el-upload-list__item-actions .el-upload-list__item-delete{position:static;font-size:inherit;color:inherit}.el-upload-list--picture-card .el-upload-list__item-actions:hover{opacity:1}.el-upload-list--picture-card .el-upload-list__item-actions:hover span{display:inline-block}.el-upload-list--picture-card .el-progress{top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);bottom:auto;width:126px}.el-upload-list--picture-card .el-progress .el-progress__text{top:50%}.el-upload-list--picture .el-upload-list__item{overflow:hidden;z-index:0;background-color:#fff;border:1px solid #c0ccda;border-radius:6px;-webkit-box-sizing:border-box;box-sizing:border-box;margin-top:10px;padding:10px 10px 10px 90px;height:92px}.el-upload-list--picture .el-upload-list__item .el-icon-check,.el-upload-list--picture .el-upload-list__item .el-icon-circle-check{color:#FFF}.el-upload-list--picture .el-upload-list__item:hover .el-upload-list__item-status-label{background:0 0;-webkit-box-shadow:none;box-shadow:none;top:-2px;right:-12px}.el-upload-list--picture .el-upload-list__item:hover .el-progress__text{display:block}.el-upload-list--picture .el-upload-list__item.is-success .el-upload-list__item-name{line-height:70px;margin-top:0}.el-upload-list--picture .el-upload-list__item.is-success .el-upload-list__item-name i{display:none}.el-upload-list--picture .el-upload-list__item-thumbnail{vertical-align:middle;display:inline-block;width:70px;height:70px;float:left;position:relative;z-index:1;margin-left:-80px;background-color:#FFF}.el-upload-list--picture .el-upload-list__item-name{display:block;margin-top:20px}.el-upload-list--picture .el-upload-list__item-name i{font-size:70px;line-height:1;position:absolute;left:9px;top:10px}.el-upload-list--picture .el-upload-list__item-status-label{position:absolute;right:-17px;top:-7px;width:46px;height:26px;background:#13ce66;text-align:center;-webkit-transform:rotate(45deg);transform:rotate(45deg);-webkit-box-shadow:0 1px 1px #ccc;box-shadow:0 1px 1px #ccc}.el-upload-list--picture .el-upload-list__item-status-label i{font-size:12px;margin-top:12px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.el-upload-list--picture .el-progress{position:relative;top:-7px}.el-upload-cover{position:absolute;left:0;top:0;width:100%;height:100%;overflow:hidden;z-index:10;cursor:default}.el-upload-cover::after{display:inline-block;height:100%;vertical-align:middle}.el-upload-cover img{display:block;width:100%;height:100%}.el-upload-cover__label{position:absolute;right:-15px;top:-6px;width:40px;height:24px;background:#13ce66;text-align:center;-webkit-transform:rotate(45deg);transform:rotate(45deg);-webkit-box-shadow:0 0 1pc 1px rgba(0,0,0,.2);box-shadow:0 0 1pc 1px rgba(0,0,0,.2)}.el-upload-cover__label i{font-size:12px;margin-top:11px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);color:#fff}.el-upload-cover__progress{display:inline-block;vertical-align:middle;position:static;width:243px}.el-upload-cover__progress+.el-upload__inner{opacity:0}.el-upload-cover__content{position:absolute;top:0;left:0;width:100%;height:100%}.el-upload-cover__interact{position:absolute;bottom:0;left:0;width:100%;height:100%;background-color:rgba(0,0,0,.72);text-align:center}.el-upload-cover__interact .btn{display:inline-block;color:#FFF;font-size:14px;cursor:pointer;vertical-align:middle;-webkit-transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);margin-top:60px}.el-upload-cover__interact .btn span{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.el-upload-cover__interact .btn:not(:first-child){margin-left:35px}.el-upload-cover__interact .btn:hover{-webkit-transform:translateY(-13px);transform:translateY(-13px)}.el-upload-cover__interact .btn:hover span{opacity:1}.el-upload-cover__interact .btn i{color:#FFF;display:block;font-size:24px;line-height:inherit;margin:0 auto 5px}.el-upload-cover__title{position:absolute;bottom:0;left:0;background-color:#FFF;height:36px;width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:400;text-align:left;padding:0 10px;margin:0;line-height:36px;font-size:14px;color:#303133}.el-upload-cover+.el-upload__inner{opacity:0;position:relative;z-index:1}.el-progress{position:relative;line-height:1}.el-progress__text{font-size:14px;color:#606266;display:inline-block;vertical-align:middle;margin-left:10px;line-height:1}.el-progress__text i{vertical-align:middle;display:block}.el-progress--circle,.el-progress--dashboard{display:inline-block}.el-progress--circle .el-progress__text,.el-progress--dashboard .el-progress__text{position:absolute;top:50%;left:0;width:100%;text-align:center;margin:0;-webkit-transform:translate(0,-50%);transform:translate(0,-50%)}.el-progress--circle .el-progress__text i,.el-progress--dashboard .el-progress__text i{vertical-align:middle;display:inline-block}.el-progress--without-text .el-progress__text{display:none}.el-progress--without-text .el-progress-bar{padding-right:0;margin-right:0;display:block}.el-progress--text-inside .el-progress-bar{padding-right:0;margin-right:0}.el-progress.is-success .el-progress-bar__inner{background-color:#67C23A}.el-progress.is-success .el-progress__text{color:#67C23A}.el-progress.is-warning .el-progress-bar__inner{background-color:#E6A23C}.el-badge__content,.el-progress.is-exception .el-progress-bar__inner{background-color:#F56C6C}.el-progress.is-warning .el-progress__text{color:#E6A23C}.el-progress.is-exception .el-progress__text{color:#F56C6C}.el-progress-bar{padding-right:50px;display:inline-block;vertical-align:middle;width:100%;margin-right:-55px;-webkit-box-sizing:border-box;box-sizing:border-box}.el-card__header,.el-message,.el-step__icon{-webkit-box-sizing:border-box}.el-progress-bar__outer{height:6px;border-radius:100px;background-color:#EBEEF5;overflow:hidden;position:relative;vertical-align:middle}.el-progress-bar__inner{position:absolute;left:0;top:0;height:100%;background-color:#409EFF;text-align:right;border-radius:100px;line-height:1;white-space:nowrap;-webkit-transition:width .6s ease;transition:width .6s ease}.el-progress-bar__inner::after{display:inline-block;height:100%;vertical-align:middle}.el-progress-bar__innerText{display:inline-block;vertical-align:middle;color:#FFF;font-size:12px;margin:0 5px}@keyframes progress{0%{background-position:0 0}100%{background-position:32px 0}}.el-time-spinner{width:100%;white-space:nowrap}.el-spinner{display:inline-block;vertical-align:middle}.el-spinner-inner{-webkit-animation:rotate 2s linear infinite;animation:rotate 2s linear infinite;width:50px;height:50px}.el-spinner-inner .path{stroke:#ececec;stroke-linecap:round;-webkit-animation:dash 1.5s ease-in-out infinite;animation:dash 1.5s ease-in-out infinite}@-webkit-keyframes rotate{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes rotate{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes dash{0%{stroke-dasharray:1,150;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-35}100%{stroke-dasharray:90,150;stroke-dashoffset:-124}}@keyframes dash{0%{stroke-dasharray:1,150;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-35}100%{stroke-dasharray:90,150;stroke-dashoffset:-124}}.el-message{min-width:380px;box-sizing:border-box;border-radius:4px;border-width:1px;border-style:solid;border-color:#EBEEF5;position:fixed;left:50%;top:20px;-webkit-transform:translateX(-50%);transform:translateX(-50%);background-color:#edf2fc;-webkit-transition:opacity .3s,top .4s,-webkit-transform .4s;transition:opacity .3s,top .4s,-webkit-transform .4s;transition:opacity .3s,transform .4s,top .4s;transition:opacity .3s,transform .4s,top .4s,-webkit-transform .4s;overflow:hidden;padding:15px 15px 15px 20px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-message.is-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.el-message.is-closable .el-message__content{padding-right:16px}.el-message p{margin:0}.el-message--info .el-message__content{color:#909399}.el-message--success{background-color:#f0f9eb;border-color:#e1f3d8}.el-message--success .el-message__content{color:#67C23A}.el-message--warning{background-color:#fdf6ec;border-color:#faecd8}.el-message--warning .el-message__content{color:#E6A23C}.el-message--error{background-color:#fef0f0;border-color:#fde2e2}.el-message--error .el-message__content{color:#F56C6C}.el-message__icon{margin-right:10px}.el-message__content{padding:0;font-size:14px;line-height:1}.el-message__content:focus{outline-width:0}.el-message__closeBtn{position:absolute;top:50%;right:15px;-webkit-transform:translateY(-50%);transform:translateY(-50%);cursor:pointer;color:#C0C4CC;font-size:16px}.el-message__closeBtn:focus{outline-width:0}.el-message__closeBtn:hover{color:#909399}.el-message .el-icon-success{color:#67C23A}.el-message .el-icon-error{color:#F56C6C}.el-message .el-icon-info{color:#909399}.el-message .el-icon-warning{color:#E6A23C}.el-message-fade-enter,.el-message-fade-leave-active{opacity:0;-webkit-transform:translate(-50%,-100%);transform:translate(-50%,-100%)}.el-badge{position:relative;vertical-align:middle;display:inline-block}.el-badge__content{border-radius:10px;color:#FFF;display:inline-block;font-size:12px;height:18px;line-height:18px;padding:0 6px;text-align:center;white-space:nowrap;border:1px solid #FFF}.el-badge__content.is-fixed{position:absolute;top:0;right:10px;-webkit-transform:translateY(-50%) translateX(100%);transform:translateY(-50%) translateX(100%)}.el-rate__icon,.el-rate__item{position:relative;display:inline-block}.el-badge__content.is-fixed.is-dot{right:5px}.el-badge__content.is-dot{height:8px;width:8px;padding:0;right:0;border-radius:50%}.el-badge__content--primary{background-color:#409EFF}.el-badge__content--success{background-color:#67C23A}.el-badge__content--warning{background-color:#E6A23C}.el-badge__content--info{background-color:#909399}.el-badge__content--danger{background-color:#F56C6C}.el-card{border-radius:4px;border:1px solid #EBEEF5;background-color:#FFF;overflow:hidden;color:#303133;-webkit-transition:.3s;transition:.3s}.el-card.is-always-shadow,.el-card.is-hover-shadow:focus,.el-card.is-hover-shadow:hover{box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-card__header{padding:18px 20px;border-bottom:1px solid #EBEEF5;box-sizing:border-box}.el-card__body,.el-main{padding:20px}.el-rate{height:20px;line-height:1}.el-rate:active,.el-rate:focus{outline-width:0}.el-rate__item{font-size:0;vertical-align:middle}.el-rate__icon{font-size:18px;margin-right:6px;color:#C0C4CC;-webkit-transition:.3s;transition:.3s}.el-rate__decimal,.el-rate__icon .path2{position:absolute;top:0;left:0}.el-rate__icon.hover{-webkit-transform:scale(1.15);transform:scale(1.15)}.el-rate__decimal{display:inline-block;overflow:hidden}.el-step.is-vertical,.el-steps{display:-webkit-box;display:-ms-flexbox}.el-rate__text{font-size:14px;vertical-align:middle}.el-steps{display:flex}.el-steps--simple{padding:13px 8%;border-radius:4px;background:#F5F7FA}.el-steps--horizontal{white-space:nowrap}.el-steps--vertical{height:100%;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-flow:column;flex-flow:column}.el-step{position:relative;-ms-flex-negative:1;flex-shrink:1}.el-step:last-of-type .el-step__line{display:none}.el-step:last-of-type.is-flex{-ms-flex-preferred-size:auto!important;flex-basis:auto!important;-ms-flex-negative:0;flex-shrink:0;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0}.el-step:last-of-type .el-step__description,.el-step:last-of-type .el-step__main{padding-right:0}.el-step__head{position:relative;width:100%}.el-step__head.is-process{color:#303133;border-color:#303133}.el-step__head.is-wait{color:#C0C4CC;border-color:#C0C4CC}.el-step__head.is-success{color:#67C23A;border-color:#67C23A}.el-step__head.is-error{color:#F56C6C;border-color:#F56C6C}.el-step__head.is-finish{color:#409EFF;border-color:#409EFF}.el-step__icon{position:relative;z-index:1;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:24px;height:24px;font-size:14px;box-sizing:border-box;background:#FFF;-webkit-transition:.15s ease-out;transition:.15s ease-out}.el-step.is-horizontal,.el-step__icon-inner{display:inline-block}.el-step__icon.is-text{border-radius:50%;border:2px solid;border-color:inherit}.el-step__icon.is-icon{width:40px}.el-step__icon-inner{-webkit-user-select:none;user-select:none;text-align:center;font-weight:700;line-height:1;color:inherit}.el-step__icon-inner[class*=el-icon]:not(.is-status){font-size:25px;font-weight:400}.el-step__icon-inner.is-status{-webkit-transform:translateY(1px);transform:translateY(1px)}.el-step__line{position:absolute;border-color:inherit;background-color:#C0C4CC}.el-step__line-inner{display:block;border-width:1px;border-style:solid;border-color:inherit;-webkit-transition:.15s ease-out;transition:.15s ease-out;-webkit-box-sizing:border-box;box-sizing:border-box;width:0;height:0}.el-step__main{white-space:normal;text-align:left}.el-step__title{font-size:16px;line-height:38px}.el-step__title.is-process{font-weight:700;color:#303133}.el-step__title.is-wait{color:#C0C4CC}.el-step__title.is-success{color:#67C23A}.el-step__title.is-error{color:#F56C6C}.el-step__title.is-finish{color:#409EFF}.el-step__description{padding-right:10%;margin-top:-5px;font-size:12px;line-height:20px;font-weight:400}.el-step__description.is-process{color:#303133}.el-step__description.is-wait{color:#C0C4CC}.el-step__description.is-success{color:#67C23A}.el-step__description.is-error{color:#F56C6C}.el-step__description.is-finish{color:#409EFF}.el-step.is-horizontal .el-step__line{height:2px;top:11px;left:0;right:0}.el-step.is-vertical{display:flex}.el-step.is-vertical .el-step__head{-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;width:24px}.el-step.is-vertical .el-step__main{padding-left:10px;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.el-step.is-vertical .el-step__title{line-height:24px;padding-bottom:8px}.el-step.is-vertical .el-step__line{width:2px;top:0;bottom:0;left:11px}.el-step.is-vertical .el-step__icon.is-icon{width:24px}.el-step.is-center .el-step__head,.el-step.is-center .el-step__main{text-align:center}.el-step.is-center .el-step__description{padding-left:20%;padding-right:20%}.el-step.is-center .el-step__line{left:50%;right:-50%}.el-step.is-simple{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-step.is-simple .el-step__head{width:auto;font-size:0;padding-right:10px}.el-step.is-simple .el-step__icon{background:0 0;width:16px;height:16px;font-size:12px}.el-step.is-simple .el-step__icon-inner[class*=el-icon]:not(.is-status){font-size:18px}.el-step.is-simple .el-step__icon-inner.is-status{-webkit-transform:scale(.8) translateY(1px);transform:scale(.8) translateY(1px)}.el-step.is-simple .el-step__main{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.el-step.is-simple .el-step__title{font-size:16px;line-height:20px}.el-step.is-simple:not(:last-of-type) .el-step__title{max-width:50%;word-break:break-all}.el-step.is-simple .el-step__arrow{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.el-step.is-simple .el-step__arrow::after,.el-step.is-simple .el-step__arrow::before{content:'';display:inline-block;position:absolute;height:15px;width:1px;background:#C0C4CC}.el-step.is-simple .el-step__arrow::before{-webkit-transform:rotate(-45deg) translateY(-4px);transform:rotate(-45deg) translateY(-4px);-webkit-transform-origin:0 0;transform-origin:0 0}.el-step.is-simple .el-step__arrow::after{-webkit-transform:rotate(45deg) translateY(4px);transform:rotate(45deg) translateY(4px);-webkit-transform-origin:100% 100%;transform-origin:100% 100%}.el-step.is-simple:last-of-type .el-step__arrow{display:none}.el-carousel{position:relative}.el-carousel--horizontal{overflow-x:hidden}.el-carousel--vertical{overflow-y:hidden}.el-carousel__container{position:relative;height:300px}.el-carousel__arrow{border:none;outline:0;padding:0;margin:0;height:36px;width:36px;cursor:pointer;-webkit-transition:.3s;transition:.3s;border-radius:50%;background-color:rgba(31,45,61,.11);color:#FFF;position:absolute;top:50%;z-index:10;-webkit-transform:translateY(-50%);transform:translateY(-50%);text-align:center;font-size:12px}.el-carousel__arrow--left{left:16px}.el-carousel__arrow:hover{background-color:rgba(31,45,61,.23)}.el-carousel__arrow i{cursor:pointer}.el-carousel__indicators{position:absolute;list-style:none;margin:0;padding:0;z-index:2}.el-carousel__indicators--horizontal{bottom:0;left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.el-carousel__indicators--vertical{right:0;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.el-carousel__indicators--outside{bottom:26px;text-align:center;position:static;-webkit-transform:none;transform:none}.el-carousel__indicators--outside .el-carousel__indicator:hover button{opacity:.64}.el-carousel__indicators--outside button{background-color:#C0C4CC;opacity:.24}.el-carousel__indicators--labels{left:0;right:0;-webkit-transform:none;transform:none;text-align:center}.el-carousel__indicators--labels .el-carousel__button{height:auto;width:auto;padding:2px 18px;font-size:12px}.el-carousel__indicators--labels .el-carousel__indicator{padding:6px 4px}.el-carousel__indicator{background-color:transparent;cursor:pointer}.el-carousel__indicator:hover button{opacity:.72}.el-carousel__indicator--horizontal{display:inline-block;padding:12px 4px}.el-carousel__indicator--vertical{padding:4px 12px}.el-carousel__indicator--vertical .el-carousel__button{width:2px;height:15px}.el-carousel__indicator.is-active button{opacity:1}.el-carousel__button{display:block;opacity:.48;width:30px;height:2px;background-color:#FFF;border:none;outline:0;padding:0;margin:0;cursor:pointer;-webkit-transition:.3s;transition:.3s}.el-carousel__item,.el-carousel__mask{height:100%;position:absolute;top:0;left:0}.carousel-arrow-left-enter,.carousel-arrow-left-leave-active{-webkit-transform:translateY(-50%) translateX(-10px);transform:translateY(-50%) translateX(-10px);opacity:0}.carousel-arrow-right-enter,.carousel-arrow-right-leave-active{-webkit-transform:translateY(-50%) translateX(10px);transform:translateY(-50%) translateX(10px);opacity:0}.el-carousel__item{width:100%;display:inline-block;overflow:hidden;z-index:0}.el-carousel__item.is-active{z-index:2}.el-carousel__item.is-animating{-webkit-transition:-webkit-transform .4s ease-in-out;transition:-webkit-transform .4s ease-in-out;transition:transform .4s ease-in-out;transition:transform .4s ease-in-out,-webkit-transform .4s ease-in-out}.el-carousel__item--card{width:50%;-webkit-transition:-webkit-transform .4s ease-in-out;transition:-webkit-transform .4s ease-in-out;transition:transform .4s ease-in-out;transition:transform .4s ease-in-out,-webkit-transform .4s ease-in-out}.el-carousel__item--card.is-in-stage{cursor:pointer;z-index:1}.el-carousel__item--card.is-in-stage.is-hover .el-carousel__mask,.el-carousel__item--card.is-in-stage:hover .el-carousel__mask{opacity:.12}.el-carousel__item--card.is-active{z-index:2}.el-carousel__mask{width:100%;background-color:#FFF;opacity:.24;-webkit-transition:.2s;transition:.2s}.fade-in-linear-enter-active,.fade-in-linear-leave-active{-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.fade-in-linear-enter,.fade-in-linear-leave,.fade-in-linear-leave-active{opacity:0}.el-fade-in-linear-enter-active,.el-fade-in-linear-leave-active{-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.el-fade-in-linear-enter,.el-fade-in-linear-leave,.el-fade-in-linear-leave-active{opacity:0}.el-fade-in-enter-active,.el-fade-in-leave-active{-webkit-transition:all .3s cubic-bezier(.55,0,.1,1);transition:all .3s cubic-bezier(.55,0,.1,1)}.el-fade-in-enter,.el-fade-in-leave-active{opacity:0}.el-zoom-in-center-enter-active,.el-zoom-in-center-leave-active{-webkit-transition:all .3s cubic-bezier(.55,0,.1,1);transition:all .3s cubic-bezier(.55,0,.1,1)}.el-zoom-in-center-enter,.el-zoom-in-center-leave-active{opacity:0;-webkit-transform:scaleX(0);transform:scaleX(0)}.el-zoom-in-top-enter-active,.el-zoom-in-top-leave-active{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1);-webkit-transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);-webkit-transform-origin:center top;transform-origin:center top}.el-zoom-in-top-enter,.el-zoom-in-top-leave-active{opacity:0;-webkit-transform:scaleY(0);transform:scaleY(0)}.el-zoom-in-bottom-enter-active,.el-zoom-in-bottom-leave-active{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1);-webkit-transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);-webkit-transform-origin:center bottom;transform-origin:center bottom}.el-zoom-in-bottom-enter,.el-zoom-in-bottom-leave-active{opacity:0;-webkit-transform:scaleY(0);transform:scaleY(0)}.el-zoom-in-left-enter-active,.el-zoom-in-left-leave-active{opacity:1;-webkit-transform:scale(1,1);transform:scale(1,1);-webkit-transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);-webkit-transform-origin:top left;transform-origin:top left}.el-zoom-in-left-enter,.el-zoom-in-left-leave-active{opacity:0;-webkit-transform:scale(.45,.45);transform:scale(.45,.45)}.collapse-transition{-webkit-transition:.3s height ease-in-out,.3s padding-top ease-in-out,.3s padding-bottom ease-in-out;transition:.3s height ease-in-out,.3s padding-top ease-in-out,.3s padding-bottom ease-in-out}.horizontal-collapse-transition{-webkit-transition:.3s width ease-in-out,.3s padding-left ease-in-out,.3s padding-right ease-in-out;transition:.3s width ease-in-out,.3s padding-left ease-in-out,.3s padding-right ease-in-out}.el-list-enter-active,.el-list-leave-active{-webkit-transition:all 1s;transition:all 1s}.el-list-enter,.el-list-leave-active{opacity:0;-webkit-transform:translateY(-30px);transform:translateY(-30px)}.el-opacity-transition{-webkit-transition:opacity .3s cubic-bezier(.55,0,.1,1);transition:opacity .3s cubic-bezier(.55,0,.1,1)}.el-collapse{border-top:1px solid #EBEEF5;border-bottom:1px solid #EBEEF5}.el-collapse-item.is-disabled .el-collapse-item__header{color:#bbb;cursor:not-allowed}.el-collapse-item__header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;height:48px;line-height:48px;background-color:#FFF;color:#303133;cursor:pointer;border-bottom:1px solid #EBEEF5;font-size:13px;font-weight:500;-webkit-transition:border-bottom-color .3s;transition:border-bottom-color .3s;outline:0}.el-collapse-item__arrow{margin:0 8px 0 auto;-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s;font-weight:300}.el-collapse-item__arrow.is-active{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.el-collapse-item__header.focusing:focus:not(:hover){color:#409EFF}.el-collapse-item__header.is-active{border-bottom-color:transparent}.el-collapse-item__wrap{will-change:height;background-color:#FFF;overflow:hidden;-webkit-box-sizing:border-box;box-sizing:border-box;border-bottom:1px solid #EBEEF5}.el-cascader__search-input,.el-cascader__tags,.el-tag{-webkit-box-sizing:border-box}.el-collapse-item__content{padding-bottom:25px;font-size:13px;color:#303133;line-height:1.769230769230769}.el-collapse-item:last-child{margin-bottom:-1px}.el-popper .popper__arrow,.el-popper .popper__arrow::after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.el-cascader,.el-tag{display:inline-block}.el-popper .popper__arrow{border-width:6px;-webkit-filter:drop-shadow(0 2px 12px rgba(0, 0, 0, .03));filter:drop-shadow(0 2px 12px rgba(0, 0, 0, .03))}.el-popper .popper__arrow::after{content:" ";border-width:6px}.el-popper[x-placement^=top]{margin-bottom:12px}.el-popper[x-placement^=top] .popper__arrow{bottom:-6px;left:50%;margin-right:3px;border-top-color:#EBEEF5;border-bottom-width:0}.el-popper[x-placement^=top] .popper__arrow::after{bottom:1px;margin-left:-6px;border-top-color:#FFF;border-bottom-width:0}.el-popper[x-placement^=bottom]{margin-top:12px}.el-popper[x-placement^=bottom] .popper__arrow{top:-6px;left:50%;margin-right:3px;border-top-width:0;border-bottom-color:#EBEEF5}.el-popper[x-placement^=bottom] .popper__arrow::after{top:1px;margin-left:-6px;border-top-width:0;border-bottom-color:#FFF}.el-popper[x-placement^=right]{margin-left:12px}.el-popper[x-placement^=right] .popper__arrow{top:50%;left:-6px;margin-bottom:3px;border-right-color:#EBEEF5;border-left-width:0}.el-popper[x-placement^=right] .popper__arrow::after{bottom:-6px;left:1px;border-right-color:#FFF;border-left-width:0}.el-popper[x-placement^=left]{margin-right:12px}.el-popper[x-placement^=left] .popper__arrow{top:50%;right:-6px;margin-bottom:3px;border-right-width:0;border-left-color:#EBEEF5}.el-popper[x-placement^=left] .popper__arrow::after{right:1px;bottom:-6px;margin-left:-6px;border-right-width:0;border-left-color:#FFF}.el-tag{background-color:#ecf5ff;border-color:#d9ecff;height:32px;padding:0 10px;line-height:30px;font-size:12px;color:#409EFF;border-width:1px;border-style:solid;border-radius:4px;box-sizing:border-box;white-space:nowrap}.el-tag.is-hit{border-color:#409EFF}.el-tag .el-tag__close{color:#409eff}.el-tag .el-tag__close:hover{color:#FFF;background-color:#409eff}.el-tag.el-tag--info{background-color:#f4f4f5;border-color:#e9e9eb;color:#909399}.el-tag.el-tag--info.is-hit{border-color:#909399}.el-tag.el-tag--info .el-tag__close{color:#909399}.el-tag.el-tag--info .el-tag__close:hover{color:#FFF;background-color:#909399}.el-tag.el-tag--success{background-color:#f0f9eb;border-color:#e1f3d8;color:#67c23a}.el-tag.el-tag--success.is-hit{border-color:#67C23A}.el-tag.el-tag--success .el-tag__close{color:#67c23a}.el-tag.el-tag--success .el-tag__close:hover{color:#FFF;background-color:#67c23a}.el-tag.el-tag--warning{background-color:#fdf6ec;border-color:#faecd8;color:#e6a23c}.el-tag.el-tag--warning.is-hit{border-color:#E6A23C}.el-tag.el-tag--warning .el-tag__close{color:#e6a23c}.el-tag.el-tag--warning .el-tag__close:hover{color:#FFF;background-color:#e6a23c}.el-tag.el-tag--danger{background-color:#fef0f0;border-color:#fde2e2;color:#f56c6c}.el-tag.el-tag--danger.is-hit{border-color:#F56C6C}.el-tag.el-tag--danger .el-tag__close{color:#f56c6c}.el-tag.el-tag--danger .el-tag__close:hover{color:#FFF;background-color:#f56c6c}.el-tag .el-icon-close{border-radius:50%;text-align:center;position:relative;cursor:pointer;font-size:12px;height:16px;width:16px;line-height:16px;vertical-align:middle;top:-1px;right:-5px}.el-tag .el-icon-close::before{display:block}.el-tag--dark{background-color:#409eff;border-color:#409eff;color:#fff}.el-tag--dark.is-hit{border-color:#409EFF}.el-tag--dark .el-tag__close{color:#fff}.el-tag--dark .el-tag__close:hover{color:#FFF;background-color:#66b1ff}.el-tag--dark.el-tag--info{background-color:#909399;border-color:#909399;color:#fff}.el-tag--dark.el-tag--info.is-hit{border-color:#909399}.el-tag--dark.el-tag--info .el-tag__close{color:#fff}.el-tag--dark.el-tag--info .el-tag__close:hover{color:#FFF;background-color:#a6a9ad}.el-tag--dark.el-tag--success{background-color:#67c23a;border-color:#67c23a;color:#fff}.el-tag--dark.el-tag--success.is-hit{border-color:#67C23A}.el-tag--dark.el-tag--success .el-tag__close{color:#fff}.el-tag--dark.el-tag--success .el-tag__close:hover{color:#FFF;background-color:#85ce61}.el-tag--dark.el-tag--warning{background-color:#e6a23c;border-color:#e6a23c;color:#fff}.el-tag--dark.el-tag--warning.is-hit{border-color:#E6A23C}.el-tag--dark.el-tag--warning .el-tag__close{color:#fff}.el-tag--dark.el-tag--warning .el-tag__close:hover{color:#FFF;background-color:#ebb563}.el-tag--dark.el-tag--danger{background-color:#f56c6c;border-color:#f56c6c;color:#fff}.el-tag--dark.el-tag--danger.is-hit{border-color:#F56C6C}.el-tag--dark.el-tag--danger .el-tag__close{color:#fff}.el-tag--dark.el-tag--danger .el-tag__close:hover{color:#FFF;background-color:#f78989}.el-tag--plain{background-color:#fff;border-color:#b3d8ff;color:#409eff}.el-tag--plain.is-hit{border-color:#409EFF}.el-tag--plain .el-tag__close{color:#409eff}.el-tag--plain .el-tag__close:hover{color:#FFF;background-color:#409eff}.el-tag--plain.el-tag--info{background-color:#fff;border-color:#d3d4d6;color:#909399}.el-tag--plain.el-tag--info.is-hit{border-color:#909399}.el-tag--plain.el-tag--info .el-tag__close{color:#909399}.el-tag--plain.el-tag--info .el-tag__close:hover{color:#FFF;background-color:#909399}.el-tag--plain.el-tag--success{background-color:#fff;border-color:#c2e7b0;color:#67c23a}.el-tag--plain.el-tag--success.is-hit{border-color:#67C23A}.el-tag--plain.el-tag--success .el-tag__close{color:#67c23a}.el-tag--plain.el-tag--success .el-tag__close:hover{color:#FFF;background-color:#67c23a}.el-tag--plain.el-tag--warning{background-color:#fff;border-color:#f5dab1;color:#e6a23c}.el-tag--plain.el-tag--warning.is-hit{border-color:#E6A23C}.el-tag--plain.el-tag--warning .el-tag__close{color:#e6a23c}.el-tag--plain.el-tag--warning .el-tag__close:hover{color:#FFF;background-color:#e6a23c}.el-tag--plain.el-tag--danger{background-color:#fff;border-color:#fbc4c4;color:#f56c6c}.el-tag--plain.el-tag--danger.is-hit{border-color:#F56C6C}.el-tag--plain.el-tag--danger .el-tag__close{color:#f56c6c}.el-tag--plain.el-tag--danger .el-tag__close:hover{color:#FFF;background-color:#f56c6c}.el-tag--medium{height:28px;line-height:26px}.el-tag--medium .el-icon-close{-webkit-transform:scale(.8);transform:scale(.8)}.el-tag--small{height:24px;padding:0 8px;line-height:22px}.el-tag--small .el-icon-close{-webkit-transform:scale(.8);transform:scale(.8)}.el-tag--mini{height:20px;padding:0 5px;line-height:19px}.el-tag--mini .el-icon-close{margin-left:-3px;-webkit-transform:scale(.7);transform:scale(.7)}.el-cascader{position:relative;font-size:14px;line-height:40px}.el-cascader:not(.is-disabled):hover .el-input__inner{cursor:pointer;border-color:#C0C4CC}.el-cascader .el-input .el-input__inner:focus,.el-cascader .el-input.is-focus .el-input__inner{border-color:#409EFF}.el-cascader .el-input{cursor:pointer}.el-cascader .el-input .el-input__inner{text-overflow:ellipsis}.el-cascader .el-input .el-icon-arrow-down{-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s;font-size:14px}.el-cascader .el-input .el-icon-arrow-down.is-reverse{-webkit-transform:rotateZ(180deg);transform:rotateZ(180deg)}.el-cascader .el-input .el-icon-circle-close:hover{color:#909399}.el-cascader--medium{font-size:14px;line-height:36px}.el-cascader--small{font-size:13px;line-height:32px}.el-cascader--mini{font-size:12px;line-height:28px}.el-cascader.is-disabled .el-cascader__label{z-index:2;color:#C0C4CC}.el-cascader__dropdown{margin:5px 0;font-size:14px;background:#FFF;border:1px solid #E4E7ED;border-radius:4px;box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-cascader__tags{position:absolute;left:0;right:30px;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;line-height:normal;text-align:left;box-sizing:border-box}.el-cascader__tags .el-tag{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;max-width:100%;margin:2px 0 2px 6px;text-overflow:ellipsis;background:#f0f2f5}.el-cascader__tags .el-tag:not(.is-hit){border-color:transparent}.el-cascader__tags .el-tag>span{-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:hidden;text-overflow:ellipsis}.el-cascader__tags .el-tag .el-icon-close{-webkit-box-flex:0;-ms-flex:none;flex:none;background-color:#C0C4CC;color:#FFF}.el-cascader__tags .el-tag .el-icon-close:hover{background-color:#909399}.el-cascader__suggestion-panel{border-radius:4px}.el-cascader__suggestion-list{max-height:204px;margin:0;padding:6px 0;font-size:14px;color:#606266;text-align:center}.el-cascader__suggestion-item{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center;height:34px;padding:0 15px;text-align:left;outline:0;cursor:pointer}.el-cascader__suggestion-item:focus,.el-cascader__suggestion-item:hover{background:#F5F7FA}.el-cascader__suggestion-item.is-checked{color:#409EFF;font-weight:700}.el-cascader__suggestion-item>span{margin-right:10px}.el-cascader__empty-text{margin:10px 0;color:#C0C4CC}.el-cascader__search-input{-webkit-box-flex:1;-ms-flex:1;flex:1;height:24px;min-width:60px;margin:2px 0 2px 15px;padding:0;color:#606266;border:none;outline:0;box-sizing:border-box}.el-cascader__search-input::-webkit-input-placeholder{color:#C0C4CC}.el-cascader__search-input:-ms-input-placeholder{color:#C0C4CC}.el-cascader__search-input::-ms-input-placeholder{color:#C0C4CC}.el-cascader__search-input::placeholder{color:#C0C4CC}.el-color-predefine{display:-webkit-box;display:-ms-flexbox;display:flex;font-size:12px;margin-top:8px;width:280px}.el-color-predefine__colors{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1;flex:1;-ms-flex-wrap:wrap;flex-wrap:wrap}.el-color-predefine__color-selector{margin:0 0 8px 8px;width:20px;height:20px;border-radius:4px;cursor:pointer}.el-color-predefine__color-selector:nth-child(10n+1){margin-left:0}.el-color-predefine__color-selector.selected{-webkit-box-shadow:0 0 3px 2px #409EFF;box-shadow:0 0 3px 2px #409EFF}.el-color-predefine__color-selector>div{display:-webkit-box;display:-ms-flexbox;display:flex;height:100%;border-radius:3px}.el-color-predefine__color-selector.is-alpha{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.el-color-hue-slider{position:relative;-webkit-box-sizing:border-box;box-sizing:border-box;width:280px;height:12px;background-color:red;padding:0 2px}.el-color-hue-slider__bar{position:relative;background:-webkit-gradient(linear,left top,right top,from(red),color-stop(17%,#ff0),color-stop(33%,#0f0),color-stop(50%,#0ff),color-stop(67%,#00f),color-stop(83%,#f0f),to(red));background:linear-gradient(to right,red 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red 100%);height:100%}.el-color-hue-slider__thumb{position:absolute;cursor:pointer;-webkit-box-sizing:border-box;box-sizing:border-box;left:0;top:0;width:4px;height:100%;border-radius:1px;background:#fff;border:1px solid #f0f0f0;-webkit-box-shadow:0 0 2px rgba(0,0,0,.6);box-shadow:0 0 2px rgba(0,0,0,.6);z-index:1}.el-color-hue-slider.is-vertical{width:12px;height:180px;padding:2px 0}.el-color-hue-slider.is-vertical .el-color-hue-slider__bar{background:-webkit-gradient(linear,left top,left bottom,from(red),color-stop(17%,#ff0),color-stop(33%,#0f0),color-stop(50%,#0ff),color-stop(67%,#00f),color-stop(83%,#f0f),to(red));background:linear-gradient(to bottom,red 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red 100%)}.el-color-hue-slider.is-vertical .el-color-hue-slider__thumb{left:0;top:0;width:100%;height:4px}.el-color-svpanel{position:relative;width:280px;height:180px}.el-color-svpanel__black,.el-color-svpanel__white{position:absolute;top:0;left:0;right:0;bottom:0}.el-color-svpanel__white{background:-webkit-gradient(linear,left top,right top,from(#fff),to(rgba(255,255,255,0)));background:linear-gradient(to right,#fff,rgba(255,255,255,0))}.el-color-svpanel__black{background:-webkit-gradient(linear,left bottom,left top,from(#000),to(rgba(0,0,0,0)));background:linear-gradient(to top,#000,rgba(0,0,0,0))}.el-color-svpanel__cursor{position:absolute}.el-color-svpanel__cursor>div{cursor:head;width:4px;height:4px;-webkit-box-shadow:0 0 0 1.5px #fff,inset 0 0 1px 1px rgba(0,0,0,.3),0 0 1px 2px rgba(0,0,0,.4);box-shadow:0 0 0 1.5px #fff,inset 0 0 1px 1px rgba(0,0,0,.3),0 0 1px 2px rgba(0,0,0,.4);border-radius:50%;-webkit-transform:translate(-2px,-2px);transform:translate(-2px,-2px)}.el-color-alpha-slider{position:relative;-webkit-box-sizing:border-box;box-sizing:border-box;width:280px;height:12px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.el-color-alpha-slider__bar{position:relative;background:-webkit-gradient(linear,left top,right top,from(rgba(255,255,255,0)),to(white));background:linear-gradient(to right,rgba(255,255,255,0) 0,#fff 100%);height:100%}.el-color-alpha-slider__thumb{position:absolute;cursor:pointer;-webkit-box-sizing:border-box;box-sizing:border-box;left:0;top:0;width:4px;height:100%;border-radius:1px;background:#fff;border:1px solid #f0f0f0;-webkit-box-shadow:0 0 2px rgba(0,0,0,.6);box-shadow:0 0 2px rgba(0,0,0,.6);z-index:1}.el-color-alpha-slider.is-vertical{width:20px;height:180px}.el-color-alpha-slider.is-vertical .el-color-alpha-slider__bar{background:-webkit-gradient(linear,left top,left bottom,from(rgba(255,255,255,0)),to(white));background:linear-gradient(to bottom,rgba(255,255,255,0) 0,#fff 100%)}.el-color-alpha-slider.is-vertical .el-color-alpha-slider__thumb{left:0;top:0;width:100%;height:4px}.el-color-dropdown{width:300px}.el-color-dropdown__main-wrapper{margin-bottom:6px}.el-color-dropdown__main-wrapper::after{display:table;clear:both}.el-color-dropdown__btns{margin-top:6px;text-align:right}.el-color-dropdown__value{float:left;line-height:26px;font-size:12px;color:#000;width:160px}.el-color-dropdown__btn{border:1px solid #dcdcdc;color:#333;line-height:24px;border-radius:2px;padding:0 20px;cursor:pointer;background-color:transparent;outline:0;font-size:12px}.el-color-dropdown__btn[disabled]{color:#ccc;cursor:not-allowed}.el-color-dropdown__btn:hover{color:#409EFF;border-color:#409EFF}.el-color-dropdown__link-btn{cursor:pointer;color:#409EFF;text-decoration:none;padding:15px;font-size:12px}.el-color-dropdown__link-btn:hover{color:tint(#409EFF,20%)}.el-color-picker{display:inline-block;position:relative;line-height:normal;height:40px}.el-color-picker.is-disabled .el-color-picker__trigger{cursor:not-allowed}.el-color-picker--medium{height:36px}.el-color-picker--medium .el-color-picker__trigger{height:36px;width:36px}.el-color-picker--medium .el-color-picker__mask{height:34px;width:34px}.el-color-picker--small{height:32px}.el-color-picker--small .el-color-picker__trigger{height:32px;width:32px}.el-color-picker--small .el-color-picker__mask{height:30px;width:30px}.el-color-picker--small .el-color-picker__empty,.el-color-picker--small .el-color-picker__icon{-webkit-transform:translate3d(-50%,-50%,0) scale(.8);transform:translate3d(-50%,-50%,0) scale(.8)}.el-color-picker--mini{height:28px}.el-color-picker--mini .el-color-picker__trigger{height:28px;width:28px}.el-color-picker--mini .el-color-picker__mask{height:26px;width:26px}.el-color-picker--mini .el-color-picker__empty,.el-color-picker--mini .el-color-picker__icon{-webkit-transform:translate3d(-50%,-50%,0) scale(.8);transform:translate3d(-50%,-50%,0) scale(.8)}.el-color-picker__mask{height:38px;width:38px;border-radius:4px;position:absolute;top:1px;left:1px;z-index:1;cursor:not-allowed;background-color:rgba(255,255,255,.7)}.el-color-picker__trigger{display:inline-block;-webkit-box-sizing:border-box;box-sizing:border-box;height:40px;width:40px;padding:4px;border:1px solid #e6e6e6;border-radius:4px;font-size:0;position:relative;cursor:pointer}.el-color-picker__color{position:relative;display:block;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid #999;border-radius:2px;width:100%;height:100%;text-align:center}.el-color-picker__icon,.el-input,.el-textarea{display:inline-block;width:100%}.el-color-picker__color.is-alpha{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.el-color-picker__color-inner{position:absolute;left:0;top:0;right:0;bottom:0}.el-color-picker__empty{font-size:12px;color:#999;position:absolute;top:50%;left:50%;-webkit-transform:translate3d(-50%,-50%,0);transform:translate3d(-50%,-50%,0)}.el-color-picker__icon{position:absolute;top:50%;left:50%;-webkit-transform:translate3d(-50%,-50%,0);transform:translate3d(-50%,-50%,0);color:#FFF;text-align:center;font-size:12px}.el-input__prefix,.el-input__suffix{position:absolute;top:0;text-align:center}.el-color-picker__panel{position:absolute;z-index:10;padding:6px;-webkit-box-sizing:content-box;box-sizing:content-box;background-color:#FFF;border:1px solid #EBEEF5;border-radius:4px;box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-input__inner,.el-textarea__inner,.el-transfer-panel{-webkit-box-sizing:border-box}.el-textarea{position:relative;vertical-align:bottom;font-size:14px}.el-textarea__inner{display:block;resize:vertical;padding:5px 15px;line-height:1.5;box-sizing:border-box;width:100%;font-size:inherit;color:#606266;background-color:#FFF;background-image:none;border:1px solid #DCDFE6;border-radius:4px;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1)}.el-textarea__inner::-webkit-input-placeholder{color:#C0C4CC}.el-textarea__inner:-ms-input-placeholder{color:#C0C4CC}.el-textarea__inner::-ms-input-placeholder{color:#C0C4CC}.el-textarea__inner::placeholder{color:#C0C4CC}.el-textarea__inner:hover{border-color:#C0C4CC}.el-textarea__inner:focus{outline:0;border-color:#409EFF}.el-textarea .el-input__count{color:#909399;background:#FFF;position:absolute;font-size:12px;bottom:5px;right:10px}.el-textarea.is-disabled .el-textarea__inner{background-color:#F5F7FA;border-color:#E4E7ED;color:#C0C4CC;cursor:not-allowed}.el-textarea.is-disabled .el-textarea__inner::-webkit-input-placeholder{color:#C0C4CC}.el-textarea.is-disabled .el-textarea__inner:-ms-input-placeholder{color:#C0C4CC}.el-textarea.is-disabled .el-textarea__inner::-ms-input-placeholder{color:#C0C4CC}.el-textarea.is-disabled .el-textarea__inner::placeholder{color:#C0C4CC}.el-textarea.is-exceed .el-textarea__inner{border-color:#F56C6C}.el-textarea.is-exceed .el-input__count{color:#F56C6C}.el-input{position:relative;font-size:14px}.el-input::-webkit-scrollbar{z-index:11;width:6px}.el-input::-webkit-scrollbar:horizontal{height:6px}.el-input::-webkit-scrollbar-thumb{border-radius:5px;width:6px;background:#b4bccc}.el-input::-webkit-scrollbar-corner{background:#fff}.el-input::-webkit-scrollbar-track{background:#fff}.el-input::-webkit-scrollbar-track-piece{background:#fff;width:6px}.el-input .el-input__clear{color:#C0C4CC;font-size:14px;cursor:pointer;-webkit-transition:color .2s cubic-bezier(.645,.045,.355,1);transition:color .2s cubic-bezier(.645,.045,.355,1)}.el-input .el-input__clear:hover{color:#909399}.el-input .el-input__count{height:100%;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:#909399;font-size:12px}.el-input-group__append .el-button,.el-input-group__append .el-input,.el-input-group__prepend .el-button,.el-input-group__prepend .el-input,.el-input__inner{font-size:inherit}.el-input .el-input__count .el-input__count-inner{background:#FFF;line-height:initial;display:inline-block;padding:0 5px}.el-input__inner{-webkit-appearance:none;background-color:#FFF;background-image:none;border-radius:4px;border:1px solid #DCDFE6;box-sizing:border-box;color:#606266;display:inline-block;height:40px;line-height:40px;outline:0;padding:0 15px;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1);width:100%}.el-input__inner::-ms-reveal{display:none}.el-input__inner::-webkit-input-placeholder{color:#C0C4CC}.el-input__inner:-ms-input-placeholder{color:#C0C4CC}.el-input__inner::-ms-input-placeholder{color:#C0C4CC}.el-input__inner::placeholder{color:#C0C4CC}.el-input__inner:hover{border-color:#C0C4CC}.el-input.is-active .el-input__inner,.el-input__inner:focus{border-color:#409EFF;outline:0}.el-input__suffix{height:100%;right:5px;transition:all .3s;pointer-events:none}.el-input__suffix-inner{pointer-events:all}.el-input__prefix{height:100%;left:5px;transition:all .3s}.el-input__icon{height:100%;width:25px;text-align:center;-webkit-transition:all .3s;transition:all .3s;line-height:40px}.el-input__icon:after{content:'';height:100%;width:0;display:inline-block;vertical-align:middle}.el-input__validateIcon{pointer-events:none}.el-input.is-disabled .el-input__inner{background-color:#F5F7FA;border-color:#E4E7ED;color:#C0C4CC;cursor:not-allowed}.el-input.is-disabled .el-input__inner::-webkit-input-placeholder{color:#C0C4CC}.el-input.is-disabled .el-input__inner:-ms-input-placeholder{color:#C0C4CC}.el-input.is-disabled .el-input__inner::-ms-input-placeholder{color:#C0C4CC}.el-input.is-disabled .el-input__inner::placeholder{color:#C0C4CC}.el-input.is-disabled .el-input__icon{cursor:not-allowed}.el-image-viewer__btn,.el-image__preview,.el-link,.el-transfer-panel__filter .el-icon-circle-close{cursor:pointer}.el-input.is-exceed .el-input__inner{border-color:#F56C6C}.el-input.is-exceed .el-input__suffix .el-input__count{color:#F56C6C}.el-input--suffix .el-input__inner{padding-right:30px}.el-input--prefix .el-input__inner{padding-left:30px}.el-input--medium{font-size:14px}.el-input--medium .el-input__inner{height:36px;line-height:36px}.el-input--medium .el-input__icon{line-height:36px}.el-input--small{font-size:13px}.el-input--small .el-input__inner{height:32px;line-height:32px}.el-input--small .el-input__icon{line-height:32px}.el-input--mini{font-size:12px}.el-input--mini .el-input__inner{height:28px;line-height:28px}.el-input--mini .el-input__icon{line-height:28px}.el-input-group{line-height:normal;display:inline-table;width:100%;border-collapse:separate;border-spacing:0}.el-input-group>.el-input__inner{vertical-align:middle;display:table-cell}.el-input-group__append,.el-input-group__prepend{background-color:#F5F7FA;color:#909399;vertical-align:middle;display:table-cell;position:relative;border:1px solid #DCDFE6;border-radius:4px;padding:0 20px;width:1px;white-space:nowrap}.el-input-group--append .el-input__inner,.el-input-group__prepend{border-top-right-radius:0;border-bottom-right-radius:0}.el-input-group__append:focus,.el-input-group__prepend:focus{outline:0}.el-input-group__append .el-button,.el-input-group__append .el-select,.el-input-group__prepend .el-button,.el-input-group__prepend .el-select{display:inline-block;margin:-10px -20px}.el-input-group__append button.el-button,.el-input-group__append div.el-select .el-input__inner,.el-input-group__append div.el-select:hover .el-input__inner,.el-input-group__prepend button.el-button,.el-input-group__prepend div.el-select .el-input__inner,.el-input-group__prepend div.el-select:hover .el-input__inner{border-color:transparent;background-color:transparent;color:inherit;border-top:0;border-bottom:0}.el-input-group__prepend{border-right:0}.el-input-group__append{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.el-input-group--append .el-select .el-input.is-focus .el-input__inner,.el-input-group--prepend .el-select .el-input.is-focus .el-input__inner{border-color:transparent}.el-input-group--prepend .el-input__inner{border-top-left-radius:0;border-bottom-left-radius:0}.el-input__inner::-ms-clear{display:none;width:0;height:0}.el-transfer{font-size:14px}.el-transfer__buttons{display:inline-block;vertical-align:middle;padding:0 30px}.el-transfer__button{display:block;margin:0 auto;padding:10px;border-radius:50%;color:#FFF;background-color:#409EFF;font-size:0}.el-button-group>.el-button+.el-button,.el-transfer-panel__item+.el-transfer-panel__item,.el-transfer__button [class*=el-icon-]+span{margin-left:0}.el-divider__text,.el-image__error,.el-link,.el-timeline,.el-transfer__button i,.el-transfer__button span{font-size:14px}.el-transfer__button.is-with-texts{border-radius:4px}.el-transfer__button.is-disabled,.el-transfer__button.is-disabled:hover{border:1px solid #DCDFE6;background-color:#F5F7FA;color:#C0C4CC}.el-transfer__button:first-child{margin-bottom:10px}.el-transfer__button:nth-child(2){margin:0}.el-transfer-panel{border:1px solid #EBEEF5;border-radius:4px;overflow:hidden;background:#FFF;display:inline-block;vertical-align:middle;width:200px;max-height:100%;box-sizing:border-box;position:relative}.el-transfer-panel__body{height:246px}.el-transfer-panel__body.is-with-footer{padding-bottom:40px}.el-transfer-panel__list{margin:0;padding:6px 0;list-style:none;height:246px;overflow:auto;-webkit-box-sizing:border-box;box-sizing:border-box}.el-transfer-panel__list.is-filterable{height:194px;padding-top:0}.el-transfer-panel__item{height:30px;line-height:30px;padding-left:15px;display:block!important}.el-transfer-panel__item.el-checkbox{color:#606266}.el-transfer-panel__item:hover{color:#409EFF}.el-transfer-panel__item.el-checkbox .el-checkbox__label{width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block;-webkit-box-sizing:border-box;box-sizing:border-box;padding-left:24px;line-height:30px}.el-transfer-panel__item .el-checkbox__input{position:absolute;top:8px}.el-transfer-panel__filter{text-align:center;margin:15px;-webkit-box-sizing:border-box;box-sizing:border-box;display:block;width:auto}.el-transfer-panel__filter .el-input__inner{height:32px;width:100%;font-size:12px;display:inline-block;-webkit-box-sizing:border-box;box-sizing:border-box;border-radius:16px;padding-right:10px;padding-left:30px}.el-transfer-panel__filter .el-input__icon{margin-left:5px}.el-transfer-panel .el-transfer-panel__header{height:40px;line-height:40px;background:#F5F7FA;margin:0;padding-left:15px;border-bottom:1px solid #EBEEF5;-webkit-box-sizing:border-box;box-sizing:border-box;color:#000}.el-container,.el-header{-webkit-box-sizing:border-box}.el-transfer-panel .el-transfer-panel__header .el-checkbox{display:block;line-height:40px}.el-transfer-panel .el-transfer-panel__header .el-checkbox .el-checkbox__label{font-size:16px;color:#303133;font-weight:400}.el-transfer-panel .el-transfer-panel__header .el-checkbox .el-checkbox__label span{position:absolute;right:15px;color:#909399;font-size:12px;font-weight:400}.el-transfer-panel .el-transfer-panel__footer{height:40px;background:#FFF;margin:0;padding:0;border-top:1px solid #EBEEF5;position:absolute;bottom:0;left:0;width:100%;z-index:1}.el-transfer-panel .el-transfer-panel__footer::after{display:inline-block;height:100%;vertical-align:middle}.el-container,.el-timeline-item__node{display:-webkit-box;display:-ms-flexbox}.el-transfer-panel .el-transfer-panel__footer .el-checkbox{padding-left:20px;color:#606266}.el-transfer-panel .el-transfer-panel__empty{margin:0;height:30px;line-height:30px;padding:6px 15px 0;color:#909399;text-align:center}.el-transfer-panel .el-checkbox__label{padding-left:8px}.el-transfer-panel .el-checkbox__inner{height:14px;width:14px;border-radius:3px}.el-transfer-panel .el-checkbox__inner::after{height:6px;width:3px;left:4px}.el-container{display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-flex:1;-ms-flex:1;flex:1;-ms-flex-preferred-size:auto;flex-basis:auto;box-sizing:border-box;min-width:0}.el-container.is-vertical,.el-drawer,.el-empty,.el-result{-webkit-box-orient:vertical;-webkit-box-direction:normal}.el-container.is-vertical{-ms-flex-direction:column;flex-direction:column}.el-header{padding:0 20px;box-sizing:border-box;-ms-flex-negative:0;flex-shrink:0}.el-aside{overflow:auto;-webkit-box-sizing:border-box;box-sizing:border-box;-ms-flex-negative:0;flex-shrink:0}.el-main{display:block;-webkit-box-flex:1;-ms-flex:1;flex:1;-ms-flex-preferred-size:auto;flex-basis:auto;overflow:auto;-webkit-box-sizing:border-box;box-sizing:border-box}.el-footer{padding:0 20px;-webkit-box-sizing:border-box;box-sizing:border-box;-ms-flex-negative:0;flex-shrink:0}.el-timeline{margin:0;list-style:none}.el-timeline .el-timeline-item:last-child .el-timeline-item__tail{display:none}.el-timeline-item{position:relative;padding-bottom:20px}.el-timeline-item__wrapper{position:relative;padding-left:28px;top:-3px}.el-timeline-item__tail{position:absolute;left:4px;height:100%;border-left:2px solid #E4E7ED}.el-timeline-item__icon{color:#FFF;font-size:13px}.el-timeline-item__node{position:absolute;background-color:#E4E7ED;border-radius:50%;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-image__error,.el-timeline-item__dot{display:-webkit-box;display:-ms-flexbox}.el-timeline-item__node--normal{left:-1px;width:12px;height:12px}.el-timeline-item__node--large{left:-2px;width:14px;height:14px}.el-timeline-item__node--primary{background-color:#409EFF}.el-timeline-item__node--success{background-color:#67C23A}.el-timeline-item__node--warning{background-color:#E6A23C}.el-timeline-item__node--danger{background-color:#F56C6C}.el-timeline-item__node--info{background-color:#909399}.el-timeline-item__dot{position:absolute;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-timeline-item__content{color:#303133}.el-timeline-item__timestamp{color:#909399;line-height:1;font-size:13px}.el-timeline-item__timestamp.is-top{margin-bottom:8px;padding-top:4px}.el-timeline-item__timestamp.is-bottom{margin-top:8px}.el-link{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;vertical-align:middle;position:relative;text-decoration:none;outline:0;padding:0;font-weight:500}.el-link.is-underline:hover:after{position:absolute;left:0;right:0;height:0;bottom:0;border-bottom:1px solid #409EFF}.el-link.el-link--default:after,.el-link.el-link--primary.is-underline:hover:after,.el-link.el-link--primary:after{border-color:#409EFF}.el-link.is-disabled{cursor:not-allowed}.el-link [class*=el-icon-]+span{margin-left:5px}.el-link.el-link--default{color:#606266}.el-link.el-link--default:hover{color:#409EFF}.el-link.el-link--default.is-disabled{color:#C0C4CC}.el-link.el-link--primary{color:#409EFF}.el-link.el-link--primary:hover{color:#66b1ff}.el-link.el-link--primary.is-disabled{color:#a0cfff}.el-link.el-link--danger.is-underline:hover:after,.el-link.el-link--danger:after{border-color:#F56C6C}.el-link.el-link--danger{color:#F56C6C}.el-link.el-link--danger:hover{color:#f78989}.el-link.el-link--danger.is-disabled{color:#fab6b6}.el-link.el-link--success.is-underline:hover:after,.el-link.el-link--success:after{border-color:#67C23A}.el-link.el-link--success{color:#67C23A}.el-link.el-link--success:hover{color:#85ce61}.el-link.el-link--success.is-disabled{color:#b3e19d}.el-link.el-link--warning.is-underline:hover:after,.el-link.el-link--warning:after{border-color:#E6A23C}.el-link.el-link--warning{color:#E6A23C}.el-link.el-link--warning:hover{color:#ebb563}.el-link.el-link--warning.is-disabled{color:#f3d19e}.el-link.el-link--info.is-underline:hover:after,.el-link.el-link--info:after{border-color:#909399}.el-link.el-link--info{color:#909399}.el-link.el-link--info:hover{color:#a6a9ad}.el-link.el-link--info.is-disabled{color:#c8c9cc}.el-divider{background-color:#DCDFE6;position:relative}.el-divider--horizontal{display:block;height:1px;width:100%;margin:24px 0}.el-divider--vertical{display:inline-block;width:1px;height:1em;margin:0 8px;vertical-align:middle;position:relative}.el-divider__text{position:absolute;background-color:#FFF;padding:0 20px;font-weight:500;color:#303133}.el-image__error,.el-image__placeholder{background:#F5F7FA}.el-divider__text.is-left{left:20px;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.el-divider__text.is-center{left:50%;-webkit-transform:translateX(-50%) translateY(-50%);transform:translateX(-50%) translateY(-50%)}.el-divider__text.is-right{right:20px;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.el-image__error,.el-image__inner,.el-image__placeholder{width:100%;height:100%}.el-image{position:relative;display:inline-block;overflow:hidden}.el-image__inner{vertical-align:top}.el-image__inner--center{position:relative;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);display:block}.el-image__error{display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:#C0C4CC;vertical-align:middle}.el-image-viewer__wrapper{position:fixed;top:0;right:0;bottom:0;left:0}.el-image-viewer__btn{position:absolute;z-index:1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;border-radius:50%;opacity:.8;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-user-select:none;user-select:none}.el-button,.el-checkbox,.el-checkbox-button__inner,.el-empty__image img,.el-radio{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.el-image-viewer__close{top:40px;right:40px;width:40px;height:40px;font-size:24px;color:#fff;background-color:#606266}.el-image-viewer__canvas{width:100%;height:100%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-image-viewer__actions{left:50%;bottom:30px;-webkit-transform:translateX(-50%);transform:translateX(-50%);width:282px;height:44px;padding:0 23px;background-color:#606266;border-color:#fff;border-radius:22px}.el-image-viewer__actions__inner{width:100%;height:100%;text-align:justify;cursor:default;font-size:23px;color:#fff;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-pack:distribute;justify-content:space-around}.el-image-viewer__next,.el-image-viewer__prev{width:44px;height:44px;font-size:24px;color:#fff;background-color:#606266;border-color:#fff;top:50%}.el-image-viewer__prev{-webkit-transform:translateY(-50%);transform:translateY(-50%);left:40px}.el-image-viewer__next{-webkit-transform:translateY(-50%);transform:translateY(-50%);right:40px;text-indent:2px}.el-image-viewer__mask{position:absolute;width:100%;height:100%;top:0;left:0;opacity:.5;background:#000}.viewer-fade-enter-active{-webkit-animation:viewer-fade-in .3s;animation:viewer-fade-in .3s}.viewer-fade-leave-active{-webkit-animation:viewer-fade-out .3s;animation:viewer-fade-out .3s}@-webkit-keyframes viewer-fade-in{0%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@keyframes viewer-fade-in{0%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@-webkit-keyframes viewer-fade-out{0%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}100%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}}@keyframes viewer-fade-out{0%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}100%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}}.el-button{display:inline-block;line-height:1;white-space:nowrap;cursor:pointer;background:#FFF;border:1px solid #DCDFE6;color:#606266;-webkit-appearance:none;text-align:center;-webkit-box-sizing:border-box;box-sizing:border-box;outline:0;margin:0;-webkit-transition:.1s;transition:.1s;font-weight:500;padding:12px 20px;font-size:14px;border-radius:4px}.el-button+.el-button,.el-checkbox.is-bordered+.el-checkbox.is-bordered{margin-left:10px}.el-button:focus,.el-button:hover{color:#409EFF;border-color:#c6e2ff;background-color:#ecf5ff}.el-button:active{color:#3a8ee6;border-color:#3a8ee6;outline:0}.el-button::-moz-focus-inner{border:0}.el-button [class*=el-icon-]+span{margin-left:5px}.el-button.is-plain:focus,.el-button.is-plain:hover{background:#FFF;border-color:#409EFF;color:#409EFF}.el-button.is-active,.el-button.is-plain:active{color:#3a8ee6;border-color:#3a8ee6}.el-button.is-plain:active{background:#FFF;outline:0}.el-button.is-disabled,.el-button.is-disabled:focus,.el-button.is-disabled:hover{color:#C0C4CC;cursor:not-allowed;background-image:none;background-color:#FFF;border-color:#EBEEF5}.el-button.is-disabled.el-button--text{background-color:transparent}.el-button.is-disabled.is-plain,.el-button.is-disabled.is-plain:focus,.el-button.is-disabled.is-plain:hover{background-color:#FFF;border-color:#EBEEF5;color:#C0C4CC}.el-button.is-loading{position:relative;pointer-events:none}.el-button.is-loading:before{pointer-events:none;content:'';position:absolute;left:-1px;top:-1px;right:-1px;bottom:-1px;border-radius:inherit;background-color:rgba(255,255,255,.35)}.el-button.is-round{border-radius:20px;padding:12px 23px}.el-button.is-circle{border-radius:50%;padding:12px}.el-button--primary{color:#FFF;background-color:#409EFF;border-color:#409EFF}.el-button--primary:focus,.el-button--primary:hover{background:#66b1ff;border-color:#66b1ff;color:#FFF}.el-button--primary.is-active,.el-button--primary:active{background:#3a8ee6;border-color:#3a8ee6;color:#FFF}.el-button--primary:active{outline:0}.el-button--primary.is-disabled,.el-button--primary.is-disabled:active,.el-button--primary.is-disabled:focus,.el-button--primary.is-disabled:hover{color:#FFF;background-color:#a0cfff;border-color:#a0cfff}.el-button--primary.is-plain{color:#409EFF;background:#ecf5ff;border-color:#b3d8ff}.el-button--primary.is-plain:focus,.el-button--primary.is-plain:hover{background:#409EFF;border-color:#409EFF;color:#FFF}.el-button--primary.is-plain:active{background:#3a8ee6;border-color:#3a8ee6;color:#FFF;outline:0}.el-button--primary.is-plain.is-disabled,.el-button--primary.is-plain.is-disabled:active,.el-button--primary.is-plain.is-disabled:focus,.el-button--primary.is-plain.is-disabled:hover{color:#8cc5ff;background-color:#ecf5ff;border-color:#d9ecff}.el-button--success{color:#FFF;background-color:#67C23A;border-color:#67C23A}.el-button--success:focus,.el-button--success:hover{background:#85ce61;border-color:#85ce61;color:#FFF}.el-button--success.is-active,.el-button--success:active{background:#5daf34;border-color:#5daf34;color:#FFF}.el-button--success:active{outline:0}.el-button--success.is-disabled,.el-button--success.is-disabled:active,.el-button--success.is-disabled:focus,.el-button--success.is-disabled:hover{color:#FFF;background-color:#b3e19d;border-color:#b3e19d}.el-button--success.is-plain{color:#67C23A;background:#f0f9eb;border-color:#c2e7b0}.el-button--success.is-plain:focus,.el-button--success.is-plain:hover{background:#67C23A;border-color:#67C23A;color:#FFF}.el-button--success.is-plain:active{background:#5daf34;border-color:#5daf34;color:#FFF;outline:0}.el-button--success.is-plain.is-disabled,.el-button--success.is-plain.is-disabled:active,.el-button--success.is-plain.is-disabled:focus,.el-button--success.is-plain.is-disabled:hover{color:#a4da89;background-color:#f0f9eb;border-color:#e1f3d8}.el-button--warning{color:#FFF;background-color:#E6A23C;border-color:#E6A23C}.el-button--warning:focus,.el-button--warning:hover{background:#ebb563;border-color:#ebb563;color:#FFF}.el-button--warning.is-active,.el-button--warning:active{background:#cf9236;border-color:#cf9236;color:#FFF}.el-button--warning:active{outline:0}.el-button--warning.is-disabled,.el-button--warning.is-disabled:active,.el-button--warning.is-disabled:focus,.el-button--warning.is-disabled:hover{color:#FFF;background-color:#f3d19e;border-color:#f3d19e}.el-button--warning.is-plain{color:#E6A23C;background:#fdf6ec;border-color:#f5dab1}.el-button--warning.is-plain:focus,.el-button--warning.is-plain:hover{background:#E6A23C;border-color:#E6A23C;color:#FFF}.el-button--warning.is-plain:active{background:#cf9236;border-color:#cf9236;color:#FFF;outline:0}.el-button--warning.is-plain.is-disabled,.el-button--warning.is-plain.is-disabled:active,.el-button--warning.is-plain.is-disabled:focus,.el-button--warning.is-plain.is-disabled:hover{color:#f0c78a;background-color:#fdf6ec;border-color:#faecd8}.el-button--danger{color:#FFF;background-color:#F56C6C;border-color:#F56C6C}.el-button--danger:focus,.el-button--danger:hover{background:#f78989;border-color:#f78989;color:#FFF}.el-button--danger.is-active,.el-button--danger:active{background:#dd6161;border-color:#dd6161;color:#FFF}.el-button--danger:active{outline:0}.el-button--danger.is-disabled,.el-button--danger.is-disabled:active,.el-button--danger.is-disabled:focus,.el-button--danger.is-disabled:hover{color:#FFF;background-color:#fab6b6;border-color:#fab6b6}.el-button--danger.is-plain{color:#F56C6C;background:#fef0f0;border-color:#fbc4c4}.el-button--danger.is-plain:focus,.el-button--danger.is-plain:hover{background:#F56C6C;border-color:#F56C6C;color:#FFF}.el-button--danger.is-plain:active{background:#dd6161;border-color:#dd6161;color:#FFF;outline:0}.el-button--danger.is-plain.is-disabled,.el-button--danger.is-plain.is-disabled:active,.el-button--danger.is-plain.is-disabled:focus,.el-button--danger.is-plain.is-disabled:hover{color:#f9a7a7;background-color:#fef0f0;border-color:#fde2e2}.el-button--info{color:#FFF;background-color:#909399;border-color:#909399}.el-button--info:focus,.el-button--info:hover{background:#a6a9ad;border-color:#a6a9ad;color:#FFF}.el-button--info.is-active,.el-button--info:active{background:#82848a;border-color:#82848a;color:#FFF}.el-button--info:active{outline:0}.el-button--info.is-disabled,.el-button--info.is-disabled:active,.el-button--info.is-disabled:focus,.el-button--info.is-disabled:hover{color:#FFF;background-color:#c8c9cc;border-color:#c8c9cc}.el-button--info.is-plain{color:#909399;background:#f4f4f5;border-color:#d3d4d6}.el-button--info.is-plain:focus,.el-button--info.is-plain:hover{background:#909399;border-color:#909399;color:#FFF}.el-button--info.is-plain:active{background:#82848a;border-color:#82848a;color:#FFF;outline:0}.el-button--info.is-plain.is-disabled,.el-button--info.is-plain.is-disabled:active,.el-button--info.is-plain.is-disabled:focus,.el-button--info.is-plain.is-disabled:hover{color:#bcbec2;background-color:#f4f4f5;border-color:#e9e9eb}.el-button--medium{padding:10px 20px;font-size:14px;border-radius:4px}.el-button--medium.is-round{padding:10px 20px}.el-button--medium.is-circle{padding:10px}.el-button--small{padding:9px 15px;font-size:12px;border-radius:3px}.el-button--small.is-round{padding:9px 15px}.el-button--small.is-circle{padding:9px}.el-button--mini,.el-button--mini.is-round{padding:7px 15px}.el-button--mini{font-size:12px;border-radius:3px}.el-button--mini.is-circle{padding:7px}.el-button--text{border-color:transparent;color:#409EFF;background:0 0;padding-left:0;padding-right:0}.el-button--text:focus,.el-button--text:hover{color:#66b1ff;border-color:transparent;background-color:transparent}.el-button--text:active{color:#3a8ee6;border-color:transparent;background-color:transparent}.el-button--text.is-disabled,.el-button--text.is-disabled:focus,.el-button--text.is-disabled:hover{border-color:transparent}.el-button-group .el-button--danger:last-child,.el-button-group .el-button--danger:not(:first-child):not(:last-child),.el-button-group .el-button--info:last-child,.el-button-group .el-button--info:not(:first-child):not(:last-child),.el-button-group .el-button--primary:last-child,.el-button-group .el-button--primary:not(:first-child):not(:last-child),.el-button-group .el-button--success:last-child,.el-button-group .el-button--success:not(:first-child):not(:last-child),.el-button-group .el-button--warning:last-child,.el-button-group .el-button--warning:not(:first-child):not(:last-child),.el-button-group>.el-dropdown>.el-button{border-left-color:rgba(255,255,255,.5)}.el-button-group .el-button--danger:first-child,.el-button-group .el-button--danger:not(:first-child):not(:last-child),.el-button-group .el-button--info:first-child,.el-button-group .el-button--info:not(:first-child):not(:last-child),.el-button-group .el-button--primary:first-child,.el-button-group .el-button--primary:not(:first-child):not(:last-child),.el-button-group .el-button--success:first-child,.el-button-group .el-button--success:not(:first-child):not(:last-child),.el-button-group .el-button--warning:first-child,.el-button-group .el-button--warning:not(:first-child):not(:last-child){border-right-color:rgba(255,255,255,.5)}.el-button-group{display:inline-block;vertical-align:middle}.el-button-group::after,.el-button-group::before{display:table}.el-button-group::after{clear:both}.el-button-group>.el-button{float:left;position:relative}.el-button-group>.el-button.is-disabled{z-index:1}.el-button-group>.el-button:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.el-button-group>.el-button:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.el-button-group>.el-button:first-child:last-child{border-radius:4px}.el-button-group>.el-button:first-child:last-child.is-round{border-radius:20px}.el-button-group>.el-button:first-child:last-child.is-circle{border-radius:50%}.el-button-group>.el-button:not(:first-child):not(:last-child){border-radius:0}.el-button-group>.el-button.is-active,.el-button-group>.el-button:not(.is-disabled):active,.el-button-group>.el-button:not(.is-disabled):focus,.el-button-group>.el-button:not(.is-disabled):hover{z-index:1}.el-button-group>.el-dropdown>.el-button{border-top-left-radius:0;border-bottom-left-radius:0}.el-calendar{background-color:#fff}.el-calendar__header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:12px 20px;border-bottom:1px solid #EBEEF5}.el-backtop,.el-page-header{display:-webkit-box;display:-ms-flexbox}.el-calendar__title{color:#000;-ms-flex-item-align:center;align-self:center}.el-calendar__body{padding:12px 20px 35px}.el-calendar-table{table-layout:fixed;width:100%}.el-calendar-table thead th{padding:12px 0;color:#606266;font-weight:400}.el-calendar-table:not(.is-range) td.next,.el-calendar-table:not(.is-range) td.prev{color:#C0C4CC}.el-backtop,.el-calendar-table td.is-today{color:#409EFF}.el-calendar-table td{border-bottom:1px solid #EBEEF5;border-right:1px solid #EBEEF5;vertical-align:top;-webkit-transition:background-color .2s ease;transition:background-color .2s ease}.el-calendar-table td.is-selected{background-color:#F2F8FE}.el-calendar-table tr:first-child td{border-top:1px solid #EBEEF5}.el-calendar-table tr td:first-child{border-left:1px solid #EBEEF5}.el-calendar-table tr.el-calendar-table__row--hide-border td{border-top:none}.el-calendar-table .el-calendar-day{-webkit-box-sizing:border-box;box-sizing:border-box;padding:8px;height:85px}.el-calendar-table .el-calendar-day:hover{cursor:pointer;background-color:#F2F8FE}.el-backtop{position:fixed;background-color:#FFF;width:40px;height:40px;border-radius:50%;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;font-size:20px;-webkit-box-shadow:0 0 6px rgba(0,0,0,.12);box-shadow:0 0 6px rgba(0,0,0,.12);cursor:pointer;z-index:5}.el-backtop:hover{background-color:#F2F6FC}.el-page-header{display:flex;line-height:24px}.el-page-header__left{display:-webkit-box;display:-ms-flexbox;display:flex;cursor:pointer;margin-right:40px;position:relative}.el-page-header__left::after{position:absolute;width:1px;height:16px;right:-20px;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);background-color:#DCDFE6}.el-checkbox,.el-checkbox__input{display:inline-block;position:relative;white-space:nowrap}.el-page-header__left .el-icon-back{font-size:18px;margin-right:6px;-ms-flex-item-align:center;align-self:center}.el-page-header__title{font-size:14px;font-weight:500}.el-page-header__content{font-size:18px;color:#303133}.el-checkbox{color:#606266;font-weight:500;font-size:14px;cursor:pointer;user-select:none;margin-right:30px}.el-checkbox.is-bordered{padding:9px 20px 9px 10px;border-radius:4px;border:1px solid #DCDFE6;-webkit-box-sizing:border-box;box-sizing:border-box;line-height:normal;height:40px}.el-checkbox.is-bordered.is-checked{border-color:#409EFF}.el-checkbox.is-bordered.is-disabled{border-color:#EBEEF5;cursor:not-allowed}.el-checkbox.is-bordered.el-checkbox--medium{padding:7px 20px 7px 10px;border-radius:4px;height:36px}.el-checkbox.is-bordered.el-checkbox--medium .el-checkbox__label{line-height:17px;font-size:14px}.el-checkbox.is-bordered.el-checkbox--medium .el-checkbox__inner{height:14px;width:14px}.el-checkbox.is-bordered.el-checkbox--small{padding:5px 15px 5px 10px;border-radius:3px;height:32px}.el-checkbox.is-bordered.el-checkbox--small .el-checkbox__label{line-height:15px;font-size:12px}.el-checkbox.is-bordered.el-checkbox--small .el-checkbox__inner{height:12px;width:12px}.el-checkbox.is-bordered.el-checkbox--small .el-checkbox__inner::after{height:6px;width:2px}.el-checkbox.is-bordered.el-checkbox--mini{padding:3px 15px 3px 10px;border-radius:3px;height:28px}.el-checkbox.is-bordered.el-checkbox--mini .el-checkbox__label{line-height:12px;font-size:12px}.el-checkbox.is-bordered.el-checkbox--mini .el-checkbox__inner{height:12px;width:12px}.el-checkbox.is-bordered.el-checkbox--mini .el-checkbox__inner::after{height:6px;width:2px}.el-checkbox__input{cursor:pointer;outline:0;line-height:1;vertical-align:middle}.el-checkbox__input.is-disabled .el-checkbox__inner{background-color:#edf2fc;border-color:#DCDFE6;cursor:not-allowed}.el-checkbox__input.is-disabled .el-checkbox__inner::after{cursor:not-allowed;border-color:#C0C4CC}.el-checkbox__input.is-disabled .el-checkbox__inner+.el-checkbox__label{cursor:not-allowed}.el-checkbox__input.is-disabled.is-checked .el-checkbox__inner{background-color:#F2F6FC;border-color:#DCDFE6}.el-checkbox__input.is-disabled.is-checked .el-checkbox__inner::after{border-color:#C0C4CC}.el-checkbox__input.is-disabled.is-indeterminate .el-checkbox__inner{background-color:#F2F6FC;border-color:#DCDFE6}.el-checkbox__input.is-disabled.is-indeterminate .el-checkbox__inner::before{background-color:#C0C4CC;border-color:#C0C4CC}.el-checkbox__input.is-checked .el-checkbox__inner,.el-checkbox__input.is-indeterminate .el-checkbox__inner{background-color:#409EFF;border-color:#409EFF}.el-checkbox__input.is-disabled+span.el-checkbox__label{color:#C0C4CC;cursor:not-allowed}.el-checkbox__input.is-checked .el-checkbox__inner::after{-webkit-transform:rotate(45deg) scaleY(1);transform:rotate(45deg) scaleY(1)}.el-checkbox__input.is-checked+.el-checkbox__label{color:#409EFF}.el-checkbox__input.is-focus .el-checkbox__inner{border-color:#409EFF}.el-checkbox__input.is-indeterminate .el-checkbox__inner::before{content:'';position:absolute;display:block;background-color:#FFF;height:2px;-webkit-transform:scale(.5);transform:scale(.5);left:0;right:0;top:5px}.el-checkbox__input.is-indeterminate .el-checkbox__inner::after{display:none}.el-checkbox__inner{display:inline-block;position:relative;border:1px solid #DCDFE6;border-radius:2px;-webkit-box-sizing:border-box;box-sizing:border-box;width:14px;height:14px;background-color:#FFF;z-index:1;-webkit-transition:border-color .25s cubic-bezier(.71,-.46,.29,1.46),background-color .25s cubic-bezier(.71,-.46,.29,1.46);transition:border-color .25s cubic-bezier(.71,-.46,.29,1.46),background-color .25s cubic-bezier(.71,-.46,.29,1.46)}.el-checkbox__inner:hover{border-color:#409EFF}.el-checkbox__inner::after{-webkit-box-sizing:content-box;box-sizing:content-box;content:"";border:1px solid #FFF;border-left:0;border-top:0;height:7px;left:4px;position:absolute;top:1px;-webkit-transform:rotate(45deg) scaleY(0);transform:rotate(45deg) scaleY(0);width:3px;-webkit-transition:-webkit-transform .15s ease-in .05s;transition:-webkit-transform .15s ease-in .05s;transition:transform .15s ease-in .05s;transition:transform .15s ease-in .05s,-webkit-transform .15s ease-in .05s;-webkit-transform-origin:center;transform-origin:center}.el-checkbox__original{opacity:0;outline:0;position:absolute;margin:0;width:0;height:0;z-index:-1}.el-checkbox-button,.el-checkbox-button__inner{display:inline-block;position:relative}.el-checkbox__label{display:inline-block;padding-left:10px;line-height:19px;font-size:14px}.el-checkbox:last-of-type{margin-right:0}.el-checkbox-button__inner{line-height:1;font-weight:500;white-space:nowrap;vertical-align:middle;cursor:pointer;background:#FFF;border:1px solid #DCDFE6;border-left:0;color:#606266;-webkit-appearance:none;text-align:center;-webkit-box-sizing:border-box;box-sizing:border-box;outline:0;margin:0;-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1);padding:12px 20px;font-size:14px;border-radius:0}.el-checkbox-button__inner.is-round{padding:12px 20px}.el-checkbox-button__inner:hover{color:#409EFF}.el-checkbox-button__inner [class*=el-icon-]{line-height:.9}.el-checkbox-button__inner [class*=el-icon-]+span{margin-left:5px}.el-checkbox-button__original{opacity:0;outline:0;position:absolute;margin:0;z-index:-1}.el-radio,.el-radio__inner,.el-radio__input{position:relative;display:inline-block}.el-checkbox-button.is-checked .el-checkbox-button__inner{color:#FFF;background-color:#409EFF;border-color:#409EFF;-webkit-box-shadow:-1px 0 0 0 #8cc5ff;box-shadow:-1px 0 0 0 #8cc5ff}.el-checkbox-button.is-checked:first-child .el-checkbox-button__inner{border-left-color:#409EFF}.el-checkbox-button.is-disabled .el-checkbox-button__inner{color:#C0C4CC;cursor:not-allowed;background-image:none;background-color:#FFF;border-color:#EBEEF5;-webkit-box-shadow:none;box-shadow:none}.el-checkbox-button.is-disabled:first-child .el-checkbox-button__inner{border-left-color:#EBEEF5}.el-checkbox-button:first-child .el-checkbox-button__inner{border-left:1px solid #DCDFE6;border-radius:4px 0 0 4px;-webkit-box-shadow:none!important;box-shadow:none!important}.el-checkbox-button.is-focus .el-checkbox-button__inner{border-color:#409EFF}.el-checkbox-button:last-child .el-checkbox-button__inner{border-radius:0 4px 4px 0}.el-checkbox-button--medium .el-checkbox-button__inner{padding:10px 20px;font-size:14px;border-radius:0}.el-checkbox-button--medium .el-checkbox-button__inner.is-round{padding:10px 20px}.el-checkbox-button--small .el-checkbox-button__inner{padding:9px 15px;font-size:12px;border-radius:0}.el-checkbox-button--small .el-checkbox-button__inner.is-round{padding:9px 15px}.el-checkbox-button--mini .el-checkbox-button__inner{padding:7px 15px;font-size:12px;border-radius:0}.el-checkbox-button--mini .el-checkbox-button__inner.is-round{padding:7px 15px}.el-checkbox-group{font-size:0}.el-avatar,.el-cascader-panel,.el-radio,.el-radio--medium.is-bordered .el-radio__label,.el-radio__label{font-size:14px}.el-radio{color:#606266;font-weight:500;line-height:1;cursor:pointer;white-space:nowrap;outline:0;margin-right:30px}.el-cascader-node>.el-radio,.el-radio:last-child{margin-right:0}.el-radio.is-bordered{padding:12px 20px 0 10px;border-radius:4px;border:1px solid #DCDFE6;-webkit-box-sizing:border-box;box-sizing:border-box;height:40px}.el-cascader-menu,.el-cascader-menu__list,.el-radio__inner{-webkit-box-sizing:border-box}.el-radio.is-bordered.is-checked{border-color:#409EFF}.el-radio.is-bordered.is-disabled{cursor:not-allowed;border-color:#EBEEF5}.el-radio__input.is-disabled .el-radio__inner,.el-radio__input.is-disabled.is-checked .el-radio__inner{background-color:#F5F7FA;border-color:#E4E7ED}.el-radio.is-bordered+.el-radio.is-bordered{margin-left:10px}.el-radio--medium.is-bordered{padding:10px 20px 0 10px;border-radius:4px;height:36px}.el-radio--mini.is-bordered .el-radio__label,.el-radio--small.is-bordered .el-radio__label{font-size:12px}.el-radio--medium.is-bordered .el-radio__inner{height:14px;width:14px}.el-radio--small.is-bordered{padding:8px 15px 0 10px;border-radius:3px;height:32px}.el-radio--small.is-bordered .el-radio__inner{height:12px;width:12px}.el-radio--mini.is-bordered{padding:6px 15px 0 10px;border-radius:3px;height:28px}.el-radio--mini.is-bordered .el-radio__inner{height:12px;width:12px}.el-radio__input{white-space:nowrap;cursor:pointer;outline:0;line-height:1;vertical-align:middle}.el-radio__input.is-disabled .el-radio__inner{cursor:not-allowed}.el-radio__input.is-disabled .el-radio__inner::after{cursor:not-allowed;background-color:#F5F7FA}.el-radio__input.is-disabled .el-radio__inner+.el-radio__label{cursor:not-allowed}.el-radio__input.is-disabled.is-checked .el-radio__inner::after{background-color:#C0C4CC}.el-radio__input.is-disabled+span.el-radio__label{color:#C0C4CC;cursor:not-allowed}.el-radio__input.is-checked .el-radio__inner{border-color:#409EFF;background:#409EFF}.el-radio__input.is-checked .el-radio__inner::after{-webkit-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1)}.el-radio__input.is-checked+.el-radio__label{color:#409EFF}.el-radio__input.is-focus .el-radio__inner{border-color:#409EFF}.el-radio__inner{border:1px solid #DCDFE6;border-radius:100%;width:14px;height:14px;background-color:#FFF;cursor:pointer;box-sizing:border-box}.el-radio__inner:hover{border-color:#409EFF}.el-radio__inner::after{width:4px;height:4px;border-radius:100%;background-color:#FFF;content:"";position:absolute;left:50%;top:50%;-webkit-transform:translate(-50%,-50%) scale(0);transform:translate(-50%,-50%) scale(0);-webkit-transition:-webkit-transform .15s ease-in;transition:-webkit-transform .15s ease-in;transition:transform .15s ease-in;transition:transform .15s ease-in,-webkit-transform .15s ease-in}.el-radio__original{opacity:0;outline:0;position:absolute;z-index:-1;top:0;left:0;right:0;bottom:0;margin:0}.el-radio:focus:not(.is-focus):not(:active):not(.is-disabled) .el-radio__inner{-webkit-box-shadow:0 0 2px 2px #409EFF;box-shadow:0 0 2px 2px #409EFF}.el-radio__label{padding-left:10px}.el-scrollbar{overflow:hidden;position:relative}.el-scrollbar:active>.el-scrollbar__bar,.el-scrollbar:focus>.el-scrollbar__bar,.el-scrollbar:hover>.el-scrollbar__bar{opacity:1;-webkit-transition:opacity 340ms ease-out;transition:opacity 340ms ease-out}.el-scrollbar__wrap{overflow:scroll;height:100%}.el-scrollbar__wrap--hidden-default{scrollbar-width:none}.el-scrollbar__wrap--hidden-default::-webkit-scrollbar{width:0;height:0}.el-scrollbar__thumb{position:relative;display:block;width:0;height:0;cursor:pointer;border-radius:inherit;background-color:rgba(144,147,153,.3);-webkit-transition:.3s background-color;transition:.3s background-color}.el-scrollbar__thumb:hover{background-color:rgba(144,147,153,.5)}.el-scrollbar__bar{position:absolute;right:2px;bottom:2px;z-index:1;border-radius:4px;opacity:0;-webkit-transition:opacity 120ms ease-out;transition:opacity 120ms ease-out}.el-scrollbar__bar.is-vertical{width:6px;top:2px}.el-scrollbar__bar.is-vertical>div{width:100%}.el-scrollbar__bar.is-horizontal{height:6px;left:2px}.el-scrollbar__bar.is-horizontal>div{height:100%}.el-cascader-panel{display:-webkit-box;display:-ms-flexbox;display:flex;border-radius:4px}.el-cascader-panel.is-bordered{border:1px solid #E4E7ED;border-radius:4px}.el-cascader-menu{min-width:180px;box-sizing:border-box;color:#606266;border-right:solid 1px #E4E7ED}.el-cascader-menu:last-child{border-right:none}.el-cascader-menu__wrap{height:204px}.el-cascader-menu__list{position:relative;min-height:100%;margin:0;padding:6px 0;list-style:none;box-sizing:border-box}.el-cascader-menu__hover-zone{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none}.el-cascader-menu__empty-text{position:absolute;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);text-align:center;color:#C0C4CC}.el-cascader-node{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:0 30px 0 20px;height:34px;line-height:34px;outline:0}.el-cascader-node.is-selectable.in-active-path{color:#606266}.el-cascader-node.in-active-path,.el-cascader-node.is-active,.el-cascader-node.is-selectable.in-checked-path{color:#409EFF;font-weight:700}.el-cascader-node:not(.is-disabled){cursor:pointer}.el-cascader-node:not(.is-disabled):focus,.el-cascader-node:not(.is-disabled):hover{background:#F5F7FA}.el-cascader-node.is-disabled{color:#C0C4CC;cursor:not-allowed}.el-cascader-node__prefix{position:absolute;left:10px}.el-cascader-node__postfix{position:absolute;right:10px}.el-cascader-node__label{-webkit-box-flex:1;-ms-flex:1;flex:1;padding:0 10px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.el-cascader-node>.el-radio .el-radio__label{padding-left:0}.el-avatar{display:inline-block;-webkit-box-sizing:border-box;box-sizing:border-box;text-align:center;overflow:hidden;color:#fff;background:#C0C4CC;width:40px;height:40px;line-height:40px}.el-drawer,.el-drawer__body>*{-webkit-box-sizing:border-box}.el-avatar>img{display:block;height:100%;vertical-align:middle}.el-empty__image img,.el-empty__image svg{vertical-align:top;height:100%;width:100%}.el-avatar--circle{border-radius:50%}.el-avatar--square{border-radius:4px}.el-avatar--icon{font-size:18px}.el-avatar--large{width:40px;height:40px;line-height:40px}.el-avatar--medium{width:36px;height:36px;line-height:36px}.el-avatar--small{width:28px;height:28px;line-height:28px}@-webkit-keyframes el-drawer-fade-in{0%{opacity:0}100%{opacity:1}}@keyframes el-drawer-fade-in{0%{opacity:0}100%{opacity:1}}@-webkit-keyframes rtl-drawer-in{0%{-webkit-transform:translate(100%,0);transform:translate(100%,0)}100%{-webkit-transform:translate(0,0);transform:translate(0,0)}}@keyframes rtl-drawer-in{0%{-webkit-transform:translate(100%,0);transform:translate(100%,0)}100%{-webkit-transform:translate(0,0);transform:translate(0,0)}}@-webkit-keyframes rtl-drawer-out{0%{-webkit-transform:translate(0,0);transform:translate(0,0)}100%{-webkit-transform:translate(100%,0);transform:translate(100%,0)}}@keyframes rtl-drawer-out{0%{-webkit-transform:translate(0,0);transform:translate(0,0)}100%{-webkit-transform:translate(100%,0);transform:translate(100%,0)}}@-webkit-keyframes ltr-drawer-in{0%{-webkit-transform:translate(-100%,0);transform:translate(-100%,0)}100%{-webkit-transform:translate(0,0);transform:translate(0,0)}}@keyframes ltr-drawer-in{0%{-webkit-transform:translate(-100%,0);transform:translate(-100%,0)}100%{-webkit-transform:translate(0,0);transform:translate(0,0)}}@-webkit-keyframes ltr-drawer-out{0%{-webkit-transform:translate(0,0);transform:translate(0,0)}100%{-webkit-transform:translate(-100%,0);transform:translate(-100%,0)}}@keyframes ltr-drawer-out{0%{-webkit-transform:translate(0,0);transform:translate(0,0)}100%{-webkit-transform:translate(-100%,0);transform:translate(-100%,0)}}@-webkit-keyframes ttb-drawer-in{0%{-webkit-transform:translate(0,-100%);transform:translate(0,-100%)}100%{-webkit-transform:translate(0,0);transform:translate(0,0)}}@keyframes ttb-drawer-in{0%{-webkit-transform:translate(0,-100%);transform:translate(0,-100%)}100%{-webkit-transform:translate(0,0);transform:translate(0,0)}}@-webkit-keyframes ttb-drawer-out{0%{-webkit-transform:translate(0,0);transform:translate(0,0)}100%{-webkit-transform:translate(0,-100%);transform:translate(0,-100%)}}@keyframes ttb-drawer-out{0%{-webkit-transform:translate(0,0);transform:translate(0,0)}100%{-webkit-transform:translate(0,-100%);transform:translate(0,-100%)}}@-webkit-keyframes btt-drawer-in{0%{-webkit-transform:translate(0,100%);transform:translate(0,100%)}100%{-webkit-transform:translate(0,0);transform:translate(0,0)}}@keyframes btt-drawer-in{0%{-webkit-transform:translate(0,100%);transform:translate(0,100%)}100%{-webkit-transform:translate(0,0);transform:translate(0,0)}}@-webkit-keyframes btt-drawer-out{0%{-webkit-transform:translate(0,0);transform:translate(0,0)}100%{-webkit-transform:translate(0,100%);transform:translate(0,100%)}}@keyframes btt-drawer-out{0%{-webkit-transform:translate(0,0);transform:translate(0,0)}100%{-webkit-transform:translate(0,100%);transform:translate(0,100%)}}.el-drawer{position:absolute;box-sizing:border-box;background-color:#FFF;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-webkit-box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12);box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12);overflow:hidden;outline:0}.el-drawer.rtl{-webkit-animation:rtl-drawer-out .3s;animation:rtl-drawer-out .3s;right:0}.el-drawer__open .el-drawer.rtl{-webkit-animation:rtl-drawer-in .3s 1ms;animation:rtl-drawer-in .3s 1ms}.el-drawer.ltr{-webkit-animation:ltr-drawer-out .3s;animation:ltr-drawer-out .3s;left:0}.el-drawer__open .el-drawer.ltr{-webkit-animation:ltr-drawer-in .3s 1ms;animation:ltr-drawer-in .3s 1ms}.el-drawer.ttb{-webkit-animation:ttb-drawer-out .3s;animation:ttb-drawer-out .3s;top:0}.el-drawer__open .el-drawer.ttb{-webkit-animation:ttb-drawer-in .3s 1ms;animation:ttb-drawer-in .3s 1ms}.el-drawer.btt{-webkit-animation:btt-drawer-out .3s;animation:btt-drawer-out .3s;bottom:0}.el-drawer__open .el-drawer.btt{-webkit-animation:btt-drawer-in .3s 1ms;animation:btt-drawer-in .3s 1ms}.el-drawer__wrapper{position:fixed;top:0;right:0;bottom:0;left:0;overflow:hidden;margin:0}.el-drawer__header{-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:#72767b;display:-webkit-box;display:-ms-flexbox;display:flex;margin-bottom:32px;padding:20px 20px 0}.el-drawer__header>:first-child{-webkit-box-flex:1;-ms-flex:1;flex:1}.el-drawer__title{margin:0;-webkit-box-flex:1;-ms-flex:1;flex:1;line-height:inherit;font-size:1rem}.el-drawer__close-btn{border:none;cursor:pointer;font-size:20px;color:inherit;background-color:transparent}.el-drawer__body{-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:auto}.el-drawer__body>*{box-sizing:border-box}.el-drawer.ltr,.el-drawer.rtl{height:100%;top:0;bottom:0}.el-drawer.btt,.el-drawer.ttb{width:100%;left:0;right:0}.el-drawer__container{position:relative;left:0;right:0;top:0;bottom:0;height:100%;width:100%}.el-drawer-fade-enter-active{-webkit-animation:el-drawer-fade-in .3s;animation:el-drawer-fade-in .3s}.el-drawer-fade-leave-active{animation:el-drawer-fade-in .3s reverse}.el-statistic{width:100%;-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;color:#000;font-variant:tabular-nums;list-style:none;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum";text-align:center}.el-statistic .head{margin-bottom:4px;color:#606266;font-size:13px}.el-statistic .con{font-family:Sans-serif;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:#303133}.el-statistic .con .number{font-size:20px;padding:0 4px}.el-statistic .con span{display:inline-block;margin:0;line-height:100%}.el-popconfirm__main,.el-skeleton__image{display:-ms-flexbox;-webkit-box-align:center;display:-webkit-box}.el-popconfirm__main{display:flex;-ms-flex-align:center;align-items:center}.el-popconfirm__icon{margin-right:5px}.el-popconfirm__action{text-align:right;margin:0}@-webkit-keyframes el-skeleton-loading{0%{background-position:100% 50%}100%{background-position:0 50%}}@keyframes el-skeleton-loading{0%{background-position:100% 50%}100%{background-position:0 50%}}.el-skeleton{width:100%}.el-skeleton__first-line,.el-skeleton__paragraph{height:16px;margin-top:16px;background:#f2f2f2}.el-skeleton.is-animated .el-skeleton__item{background:-webkit-gradient(linear,left top,right top,color-stop(25%,#f2f2f2),color-stop(37%,#e6e6e6),color-stop(63%,#f2f2f2));background:linear-gradient(90deg,#f2f2f2 25%,#e6e6e6 37%,#f2f2f2 63%);background-size:400% 100%;-webkit-animation:el-skeleton-loading 1.4s ease infinite;animation:el-skeleton-loading 1.4s ease infinite}.el-skeleton__item{background:#f2f2f2;display:inline-block;height:16px;border-radius:4px;width:100%}.el-skeleton__circle{border-radius:50%;width:36px;height:36px;line-height:36px}.el-skeleton__circle--lg{width:40px;height:40px;line-height:40px}.el-skeleton__circle--md{width:28px;height:28px;line-height:28px}.el-skeleton__button{height:40px;width:64px;border-radius:4px}.el-skeleton__p{width:100%}.el-skeleton__p.is-last{width:61%}.el-skeleton__p.is-first{width:33%}.el-skeleton__text{width:100%;height:13px}.el-skeleton__caption{height:12px}.el-skeleton__h1{height:20px}.el-skeleton__h3{height:18px}.el-skeleton__h5{height:16px}.el-skeleton__image{width:unset;display:flex;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;border-radius:0}.el-skeleton__image svg{fill:#DCDDE0;width:22%;height:22%}.el-empty{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-direction:column;flex-direction:column;text-align:center;-webkit-box-sizing:border-box;box-sizing:border-box;padding:40px 0}.el-empty__image{width:160px}.el-empty__image img{user-select:none;-o-object-fit:contain;object-fit:contain}.el-empty__image svg{fill:#DCDDE0}.el-empty__description{margin-top:20px}.el-empty__description p{margin:0;font-size:14px;color:#909399}.el-empty__bottom,.el-result__title{margin-top:20px}.el-descriptions{-webkit-box-sizing:border-box;box-sizing:border-box;font-size:14px;color:#303133}.el-descriptions__header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-bottom:20px}.el-descriptions__title{font-size:16px;font-weight:700}.el-descriptions--mini,.el-descriptions--small{font-size:12px}.el-descriptions__body{color:#606266;background-color:#FFF}.el-descriptions__body .el-descriptions__table{border-collapse:collapse;width:100%;table-layout:fixed}.el-descriptions__body .el-descriptions__table .el-descriptions-item__cell{-webkit-box-sizing:border-box;box-sizing:border-box;text-align:left;font-weight:400;line-height:1.5}.el-descriptions__body .el-descriptions__table .el-descriptions-item__cell.is-left{text-align:left}.el-descriptions__body .el-descriptions__table .el-descriptions-item__cell.is-center{text-align:center}.el-descriptions__body .el-descriptions__table .el-descriptions-item__cell.is-right{text-align:right}.el-descriptions .is-bordered{table-layout:auto}.el-descriptions .is-bordered .el-descriptions-item__cell{border:1px solid #EBEEF5;padding:12px 10px}.el-descriptions :not(.is-bordered) .el-descriptions-item__cell{padding-bottom:12px}.el-descriptions--medium.is-bordered .el-descriptions-item__cell{padding:10px}.el-descriptions--medium:not(.is-bordered) .el-descriptions-item__cell{padding-bottom:10px}.el-descriptions--small.is-bordered .el-descriptions-item__cell{padding:8px 10px}.el-descriptions--small:not(.is-bordered) .el-descriptions-item__cell{padding-bottom:8px}.el-descriptions--mini.is-bordered .el-descriptions-item__cell{padding:6px 10px}.el-descriptions--mini:not(.is-bordered) .el-descriptions-item__cell{padding-bottom:6px}.el-descriptions-item{vertical-align:top}.el-descriptions-item__container{display:-webkit-box;display:-ms-flexbox;display:flex}.el-descriptions-item__container .el-descriptions-item__content,.el-descriptions-item__container .el-descriptions-item__label{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:baseline;-ms-flex-align:baseline;align-items:baseline}.el-descriptions-item__container .el-descriptions-item__content{-webkit-box-flex:1;-ms-flex:1;flex:1}.el-descriptions-item__label.has-colon::after{content:':';position:relative;top:-.5px}.el-descriptions-item__label.is-bordered-label{font-weight:700;color:#909399;background:#fafafa}.el-descriptions-item__label:not(.is-bordered-label){margin-right:10px}.el-descriptions-item__content{word-break:break-word;overflow-wrap:break-word}.el-result{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-direction:column;flex-direction:column;text-align:center;-webkit-box-sizing:border-box;box-sizing:border-box;padding:40px 30px}.el-result__icon svg{width:64px;height:64px}.el-result__title p{margin:0;font-size:20px;color:#303133;line-height:1.3}.el-result__subtitle{margin-top:10px}.el-result__subtitle p{margin:0;font-size:14px;color:#606266;line-height:1.3}.el-result__extra{margin-top:30px }.el-result .icon-success{fill:#67C23A}.el-result .icon-error{fill:#F56C6C}.el-result .icon-info{fill:#909399}.el-result .icon-warning{fill:#E6A23C} \ No newline at end of file diff --git a/solution-ui/src/App.vue b/solution-ui/src/App.vue deleted file mode 100644 index 12df51d..0000000 --- a/solution-ui/src/App.vue +++ /dev/null @@ -1,20 +0,0 @@ - - - - diff --git a/solution-ui/src/api/login.js b/solution-ui/src/api/login.js deleted file mode 100644 index 7b7388f..0000000 --- a/solution-ui/src/api/login.js +++ /dev/null @@ -1,60 +0,0 @@ -import request from '@/utils/request' - -// 登录方法 -export function login(username, password, code, uuid) { - const data = { - username, - password, - code, - uuid - } - return request({ - url: '/login', - headers: { - isToken: false, - repeatSubmit: false - }, - method: 'post', - data: data - }) -} - -// 注册方法 -export function register(data) { - return request({ - url: '/register', - headers: { - isToken: false - }, - method: 'post', - data: data - }) -} - -// 获取用户详细信息 -export function getInfo() { - return request({ - url: '/getInfo', - method: 'get' - }) -} - -// 退出方法 -export function logout() { - return request({ - url: '/logout', - method: 'post' - }) -} - -// 获取验证码 -export function getCodeImg() { - return request({ - url: '/captchaImage', - headers: { - isToken: false - }, - method: 'get', - timeout: 20000 - }) -} \ No newline at end of file diff --git a/solution-ui/src/api/menu.js b/solution-ui/src/api/menu.js deleted file mode 100644 index faef101..0000000 --- a/solution-ui/src/api/menu.js +++ /dev/null @@ -1,9 +0,0 @@ -import request from '@/utils/request' - -// 获取路由 -export const getRouters = () => { - return request({ - url: '/getRouters', - method: 'get' - }) -} \ No newline at end of file diff --git a/solution-ui/src/api/monitor/cache.js b/solution-ui/src/api/monitor/cache.js deleted file mode 100644 index 72c5f6a..0000000 --- a/solution-ui/src/api/monitor/cache.js +++ /dev/null @@ -1,57 +0,0 @@ -import request from '@/utils/request' - -// 查询缓存详细 -export function getCache() { - return request({ - url: '/monitor/cache', - method: 'get' - }) -} - -// 查询缓存名称列表 -export function listCacheName() { - return request({ - url: '/monitor/cache/getNames', - method: 'get' - }) -} - -// 查询缓存键名列表 -export function listCacheKey(cacheName) { - return request({ - url: '/monitor/cache/getKeys/' + cacheName, - method: 'get' - }) -} - -// 查询缓存内容 -export function getCacheValue(cacheName, cacheKey) { - return request({ - url: '/monitor/cache/getValue/' + cacheName + '/' + cacheKey, - method: 'get' - }) -} - -// 清理指定名称缓存 -export function clearCacheName(cacheName) { - return request({ - url: '/monitor/cache/clearCacheName/' + cacheName, - method: 'delete' - }) -} - -// 清理指定键名缓存 -export function clearCacheKey(cacheKey) { - return request({ - url: '/monitor/cache/clearCacheKey/' + cacheKey, - method: 'delete' - }) -} - -// 清理全部缓存 -export function clearCacheAll() { - return request({ - url: '/monitor/cache/clearCacheAll', - method: 'delete' - }) -} diff --git a/solution-ui/src/api/monitor/job.js b/solution-ui/src/api/monitor/job.js deleted file mode 100644 index 3815569..0000000 --- a/solution-ui/src/api/monitor/job.js +++ /dev/null @@ -1,71 +0,0 @@ -import request from '@/utils/request' - -// 查询定时任务调度列表 -export function listJob(query) { - return request({ - url: '/monitor/job/list', - method: 'get', - params: query - }) -} - -// 查询定时任务调度详细 -export function getJob(jobId) { - return request({ - url: '/monitor/job/' + jobId, - method: 'get' - }) -} - -// 新增定时任务调度 -export function addJob(data) { - return request({ - url: '/monitor/job', - method: 'post', - data: data - }) -} - -// 修改定时任务调度 -export function updateJob(data) { - return request({ - url: '/monitor/job', - method: 'put', - data: data - }) -} - -// 删除定时任务调度 -export function delJob(jobId) { - return request({ - url: '/monitor/job/' + jobId, - method: 'delete' - }) -} - -// 任务状态修改 -export function changeJobStatus(jobId, status) { - const data = { - jobId, - status - } - return request({ - url: '/monitor/job/changeStatus', - method: 'put', - data: data - }) -} - - -// 定时任务立即执行一次 -export function runJob(jobId, jobGroup) { - const data = { - jobId, - jobGroup - } - return request({ - url: '/monitor/job/run', - method: 'put', - data: data - }) -} \ No newline at end of file diff --git a/solution-ui/src/api/monitor/jobLog.js b/solution-ui/src/api/monitor/jobLog.js deleted file mode 100644 index 6e0be61..0000000 --- a/solution-ui/src/api/monitor/jobLog.js +++ /dev/null @@ -1,26 +0,0 @@ -import request from '@/utils/request' - -// 查询调度日志列表 -export function listJobLog(query) { - return request({ - url: '/monitor/jobLog/list', - method: 'get', - params: query - }) -} - -// 删除调度日志 -export function delJobLog(jobLogId) { - return request({ - url: '/monitor/jobLog/' + jobLogId, - method: 'delete' - }) -} - -// 清空调度日志 -export function cleanJobLog() { - return request({ - url: '/monitor/jobLog/clean', - method: 'delete' - }) -} diff --git a/solution-ui/src/api/monitor/logininfor.js b/solution-ui/src/api/monitor/logininfor.js deleted file mode 100644 index 4d112b7..0000000 --- a/solution-ui/src/api/monitor/logininfor.js +++ /dev/null @@ -1,34 +0,0 @@ -import request from '@/utils/request' - -// 查询登录日志列表 -export function list(query) { - return request({ - url: '/monitor/logininfor/list', - method: 'get', - params: query - }) -} - -// 删除登录日志 -export function delLogininfor(infoId) { - return request({ - url: '/monitor/logininfor/' + infoId, - method: 'delete' - }) -} - -// 解锁用户登录状态 -export function unlockLogininfor(userName) { - return request({ - url: '/monitor/logininfor/unlock/' + userName, - method: 'get' - }) -} - -// 清空登录日志 -export function cleanLogininfor() { - return request({ - url: '/monitor/logininfor/clean', - method: 'delete' - }) -} diff --git a/solution-ui/src/api/monitor/online.js b/solution-ui/src/api/monitor/online.js deleted file mode 100644 index bd22137..0000000 --- a/solution-ui/src/api/monitor/online.js +++ /dev/null @@ -1,18 +0,0 @@ -import request from '@/utils/request' - -// 查询在线用户列表 -export function list(query) { - return request({ - url: '/monitor/online/list', - method: 'get', - params: query - }) -} - -// 强退用户 -export function forceLogout(tokenId) { - return request({ - url: '/monitor/online/' + tokenId, - method: 'delete' - }) -} diff --git a/solution-ui/src/api/monitor/operlog.js b/solution-ui/src/api/monitor/operlog.js deleted file mode 100644 index a04bca8..0000000 --- a/solution-ui/src/api/monitor/operlog.js +++ /dev/null @@ -1,26 +0,0 @@ -import request from '@/utils/request' - -// 查询操作日志列表 -export function list(query) { - return request({ - url: '/monitor/operlog/list', - method: 'get', - params: query - }) -} - -// 删除操作日志 -export function delOperlog(operId) { - return request({ - url: '/monitor/operlog/' + operId, - method: 'delete' - }) -} - -// 清空操作日志 -export function cleanOperlog() { - return request({ - url: '/monitor/operlog/clean', - method: 'delete' - }) -} diff --git a/solution-ui/src/api/monitor/server.js b/solution-ui/src/api/monitor/server.js deleted file mode 100644 index e1f9ca2..0000000 --- a/solution-ui/src/api/monitor/server.js +++ /dev/null @@ -1,9 +0,0 @@ -import request from '@/utils/request' - -// 获取服务信息 -export function getServer() { - return request({ - url: '/monitor/server', - method: 'get' - }) -} \ No newline at end of file diff --git a/solution-ui/src/api/system/config.js b/solution-ui/src/api/system/config.js deleted file mode 100644 index a404d82..0000000 --- a/solution-ui/src/api/system/config.js +++ /dev/null @@ -1,60 +0,0 @@ -import request from '@/utils/request' - -// 查询参数列表 -export function listConfig(query) { - return request({ - url: '/system/config/list', - method: 'get', - params: query - }) -} - -// 查询参数详细 -export function getConfig(configId) { - return request({ - url: '/system/config/' + configId, - method: 'get' - }) -} - -// 根据参数键名查询参数值 -export function getConfigKey(configKey) { - return request({ - url: '/system/config/configKey/' + configKey, - method: 'get' - }) -} - -// 新增参数配置 -export function addConfig(data) { - return request({ - url: '/system/config', - method: 'post', - data: data - }) -} - -// 修改参数配置 -export function updateConfig(data) { - return request({ - url: '/system/config', - method: 'put', - data: data - }) -} - -// 删除参数配置 -export function delConfig(configId) { - return request({ - url: '/system/config/' + configId, - method: 'delete' - }) -} - -// 刷新参数缓存 -export function refreshCache() { - return request({ - url: '/system/config/refreshCache', - method: 'delete' - }) -} diff --git a/solution-ui/src/api/system/dept.js b/solution-ui/src/api/system/dept.js deleted file mode 100644 index fc943cd..0000000 --- a/solution-ui/src/api/system/dept.js +++ /dev/null @@ -1,52 +0,0 @@ -import request from '@/utils/request' - -// 查询部门列表 -export function listDept(query) { - return request({ - url: '/system/dept/list', - method: 'get', - params: query - }) -} - -// 查询部门列表(排除节点) -export function listDeptExcludeChild(deptId) { - return request({ - url: '/system/dept/list/exclude/' + deptId, - method: 'get' - }) -} - -// 查询部门详细 -export function getDept(deptId) { - return request({ - url: '/system/dept/' + deptId, - method: 'get' - }) -} - -// 新增部门 -export function addDept(data) { - return request({ - url: '/system/dept', - method: 'post', - data: data - }) -} - -// 修改部门 -export function updateDept(data) { - return request({ - url: '/system/dept', - method: 'put', - data: data - }) -} - -// 删除部门 -export function delDept(deptId) { - return request({ - url: '/system/dept/' + deptId, - method: 'delete' - }) -} \ No newline at end of file diff --git a/solution-ui/src/api/system/dict/data.js b/solution-ui/src/api/system/dict/data.js deleted file mode 100644 index 6c9eb79..0000000 --- a/solution-ui/src/api/system/dict/data.js +++ /dev/null @@ -1,52 +0,0 @@ -import request from '@/utils/request' - -// 查询字典数据列表 -export function listData(query) { - return request({ - url: '/system/dict/data/list', - method: 'get', - params: query - }) -} - -// 查询字典数据详细 -export function getData(dictCode) { - return request({ - url: '/system/dict/data/' + dictCode, - method: 'get' - }) -} - -// 根据字典类型查询字典数据信息 -export function getDicts(dictType) { - return request({ - url: '/system/dict/data/type/' + dictType, - method: 'get' - }) -} - -// 新增字典数据 -export function addData(data) { - return request({ - url: '/system/dict/data', - method: 'post', - data: data - }) -} - -// 修改字典数据 -export function updateData(data) { - return request({ - url: '/system/dict/data', - method: 'put', - data: data - }) -} - -// 删除字典数据 -export function delData(dictCode) { - return request({ - url: '/system/dict/data/' + dictCode, - method: 'delete' - }) -} diff --git a/solution-ui/src/api/system/dict/type.js b/solution-ui/src/api/system/dict/type.js deleted file mode 100644 index a7a6e01..0000000 --- a/solution-ui/src/api/system/dict/type.js +++ /dev/null @@ -1,60 +0,0 @@ -import request from '@/utils/request' - -// 查询字典类型列表 -export function listType(query) { - return request({ - url: '/system/dict/type/list', - method: 'get', - params: query - }) -} - -// 查询字典类型详细 -export function getType(dictId) { - return request({ - url: '/system/dict/type/' + dictId, - method: 'get' - }) -} - -// 新增字典类型 -export function addType(data) { - return request({ - url: '/system/dict/type', - method: 'post', - data: data - }) -} - -// 修改字典类型 -export function updateType(data) { - return request({ - url: '/system/dict/type', - method: 'put', - data: data - }) -} - -// 删除字典类型 -export function delType(dictId) { - return request({ - url: '/system/dict/type/' + dictId, - method: 'delete' - }) -} - -// 刷新字典缓存 -export function refreshCache() { - return request({ - url: '/system/dict/type/refreshCache', - method: 'delete' - }) -} - -// 获取字典选择框列表 -export function optionselect() { - return request({ - url: '/system/dict/type/optionselect', - method: 'get' - }) -} \ No newline at end of file diff --git a/solution-ui/src/api/system/menu.js b/solution-ui/src/api/system/menu.js deleted file mode 100644 index f6415c6..0000000 --- a/solution-ui/src/api/system/menu.js +++ /dev/null @@ -1,60 +0,0 @@ -import request from '@/utils/request' - -// 查询菜单列表 -export function listMenu(query) { - return request({ - url: '/system/menu/list', - method: 'get', - params: query - }) -} - -// 查询菜单详细 -export function getMenu(menuId) { - return request({ - url: '/system/menu/' + menuId, - method: 'get' - }) -} - -// 查询菜单下拉树结构 -export function treeselect() { - return request({ - url: '/system/menu/treeselect', - method: 'get' - }) -} - -// 根据角色ID查询菜单下拉树结构 -export function roleMenuTreeselect(roleId) { - return request({ - url: '/system/menu/roleMenuTreeselect/' + roleId, - method: 'get' - }) -} - -// 新增菜单 -export function addMenu(data) { - return request({ - url: '/system/menu', - method: 'post', - data: data - }) -} - -// 修改菜单 -export function updateMenu(data) { - return request({ - url: '/system/menu', - method: 'put', - data: data - }) -} - -// 删除菜单 -export function delMenu(menuId) { - return request({ - url: '/system/menu/' + menuId, - method: 'delete' - }) -} \ No newline at end of file diff --git a/solution-ui/src/api/system/notice.js b/solution-ui/src/api/system/notice.js deleted file mode 100644 index c274ea5..0000000 --- a/solution-ui/src/api/system/notice.js +++ /dev/null @@ -1,44 +0,0 @@ -import request from '@/utils/request' - -// 查询公告列表 -export function listNotice(query) { - return request({ - url: '/system/notice/list', - method: 'get', - params: query - }) -} - -// 查询公告详细 -export function getNotice(noticeId) { - return request({ - url: '/system/notice/' + noticeId, - method: 'get' - }) -} - -// 新增公告 -export function addNotice(data) { - return request({ - url: '/system/notice', - method: 'post', - data: data - }) -} - -// 修改公告 -export function updateNotice(data) { - return request({ - url: '/system/notice', - method: 'put', - data: data - }) -} - -// 删除公告 -export function delNotice(noticeId) { - return request({ - url: '/system/notice/' + noticeId, - method: 'delete' - }) -} \ No newline at end of file diff --git a/solution-ui/src/api/system/post.js b/solution-ui/src/api/system/post.js deleted file mode 100644 index 1a8e9ca..0000000 --- a/solution-ui/src/api/system/post.js +++ /dev/null @@ -1,44 +0,0 @@ -import request from '@/utils/request' - -// 查询岗位列表 -export function listPost(query) { - return request({ - url: '/system/post/list', - method: 'get', - params: query - }) -} - -// 查询岗位详细 -export function getPost(postId) { - return request({ - url: '/system/post/' + postId, - method: 'get' - }) -} - -// 新增岗位 -export function addPost(data) { - return request({ - url: '/system/post', - method: 'post', - data: data - }) -} - -// 修改岗位 -export function updatePost(data) { - return request({ - url: '/system/post', - method: 'put', - data: data - }) -} - -// 删除岗位 -export function delPost(postId) { - return request({ - url: '/system/post/' + postId, - method: 'delete' - }) -} diff --git a/solution-ui/src/api/system/role.js b/solution-ui/src/api/system/role.js deleted file mode 100644 index f13e6f4..0000000 --- a/solution-ui/src/api/system/role.js +++ /dev/null @@ -1,119 +0,0 @@ -import request from '@/utils/request' - -// 查询角色列表 -export function listRole(query) { - return request({ - url: '/system/role/list', - method: 'get', - params: query - }) -} - -// 查询角色详细 -export function getRole(roleId) { - return request({ - url: '/system/role/' + roleId, - method: 'get' - }) -} - -// 新增角色 -export function addRole(data) { - return request({ - url: '/system/role', - method: 'post', - data: data - }) -} - -// 修改角色 -export function updateRole(data) { - return request({ - url: '/system/role', - method: 'put', - data: data - }) -} - -// 角色数据权限 -export function dataScope(data) { - return request({ - url: '/system/role/dataScope', - method: 'put', - data: data - }) -} - -// 角色状态修改 -export function changeRoleStatus(roleId, status) { - const data = { - roleId, - status - } - return request({ - url: '/system/role/changeStatus', - method: 'put', - data: data - }) -} - -// 删除角色 -export function delRole(roleId) { - return request({ - url: '/system/role/' + roleId, - method: 'delete' - }) -} - -// 查询角色已授权用户列表 -export function allocatedUserList(query) { - return request({ - url: '/system/role/authUser/allocatedList', - method: 'get', - params: query - }) -} - -// 查询角色未授权用户列表 -export function unallocatedUserList(query) { - return request({ - url: '/system/role/authUser/unallocatedList', - method: 'get', - params: query - }) -} - -// 取消用户授权角色 -export function authUserCancel(data) { - return request({ - url: '/system/role/authUser/cancel', - method: 'put', - data: data - }) -} - -// 批量取消用户授权角色 -export function authUserCancelAll(data) { - return request({ - url: '/system/role/authUser/cancelAll', - method: 'put', - params: data - }) -} - -// 授权用户选择 -export function authUserSelectAll(data) { - return request({ - url: '/system/role/authUser/selectAll', - method: 'put', - params: data - }) -} - -// 根据角色ID查询部门树结构 -export function deptTreeSelect(roleId) { - return request({ - url: '/system/role/deptTree/' + roleId, - method: 'get' - }) -} diff --git a/solution-ui/src/api/system/user.js b/solution-ui/src/api/system/user.js deleted file mode 100644 index b5e3edd..0000000 --- a/solution-ui/src/api/system/user.js +++ /dev/null @@ -1,136 +0,0 @@ -import request from '@/utils/request' -import { parseStrEmpty } from "@/utils/ruoyi"; - -// 查询用户列表 -export function listUser(query) { - return request({ - url: '/system/user/list', - method: 'get', - params: query - }) -} - -// 查询用户详细 -export function getUser(userId) { - return request({ - url: '/system/user/' + parseStrEmpty(userId), - method: 'get' - }) -} - -// 新增用户 -export function addUser(data) { - return request({ - url: '/system/user', - method: 'post', - data: data - }) -} - -// 修改用户 -export function updateUser(data) { - return request({ - url: '/system/user', - method: 'put', - data: data - }) -} - -// 删除用户 -export function delUser(userId) { - return request({ - url: '/system/user/' + userId, - method: 'delete' - }) -} - -// 用户密码重置 -export function resetUserPwd(userId, password) { - const data = { - userId, - password - } - return request({ - url: '/system/user/resetPwd', - method: 'put', - data: data - }) -} - -// 用户状态修改 -export function changeUserStatus(userId, status) { - const data = { - userId, - status - } - return request({ - url: '/system/user/changeStatus', - method: 'put', - data: data - }) -} - -// 查询用户个人信息 -export function getUserProfile() { - return request({ - url: '/system/user/profile', - method: 'get' - }) -} - -// 修改用户个人信息 -export function updateUserProfile(data) { - return request({ - url: '/system/user/profile', - method: 'put', - data: data - }) -} - -// 用户密码重置 -export function updateUserPwd(oldPassword, newPassword) { - const data = { - oldPassword, - newPassword - } - return request({ - url: '/system/user/profile/updatePwd', - method: 'put', - data: data - }) -} - -// 用户头像上传 -export function uploadAvatar(data) { - return request({ - url: '/system/user/profile/avatar', - method: 'post', - headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, - data: data - }) -} - -// 查询授权角色 -export function getAuthRole(userId) { - return request({ - url: '/system/user/authRole/' + userId, - method: 'get' - }) -} - -// 保存授权角色 -export function updateAuthRole(data) { - return request({ - url: '/system/user/authRole', - method: 'put', - params: data - }) -} - -// 查询部门下拉树结构 -export function deptTreeSelect() { - return request({ - url: '/system/user/deptTree', - method: 'get' - }) -} diff --git a/solution-ui/src/api/tool/gen.js b/solution-ui/src/api/tool/gen.js deleted file mode 100644 index 2075677..0000000 --- a/solution-ui/src/api/tool/gen.js +++ /dev/null @@ -1,85 +0,0 @@ -import request from '@/utils/request' - -// 查询生成表数据 -export function listTable(query) { - return request({ - url: '/tool/gen/list', - method: 'get', - params: query - }) -} -// 查询db数据库列表 -export function listDbTable(query) { - return request({ - url: '/tool/gen/db/list', - method: 'get', - params: query - }) -} - -// 查询表详细信息 -export function getGenTable(tableId) { - return request({ - url: '/tool/gen/' + tableId, - method: 'get' - }) -} - -// 修改代码生成信息 -export function updateGenTable(data) { - return request({ - url: '/tool/gen', - method: 'put', - data: data - }) -} - -// 导入表 -export function importTable(data) { - return request({ - url: '/tool/gen/importTable', - method: 'post', - params: data - }) -} - -// 创建表 -export function createTable(data) { - return request({ - url: '/tool/gen/createTable', - method: 'post', - params: data - }) -} - -// 预览生成代码 -export function previewTable(tableId) { - return request({ - url: '/tool/gen/preview/' + tableId, - method: 'get' - }) -} - -// 删除表数据 -export function delTable(tableId) { - return request({ - url: '/tool/gen/' + tableId, - method: 'delete' - }) -} - -// 生成代码(自定义路径) -export function genCode(tableName) { - return request({ - url: '/tool/gen/genCode/' + tableName, - method: 'get' - }) -} - -// 同步数据库 -export function synchDb(tableName) { - return request({ - url: '/tool/gen/synchDb/' + tableName, - method: 'get' - }) -} diff --git a/solution-ui/src/assets/401_images/401.gif b/solution-ui/src/assets/401_images/401.gif deleted file mode 100644 index cd6e0d9..0000000 Binary files a/solution-ui/src/assets/401_images/401.gif and /dev/null differ diff --git a/solution-ui/src/assets/404_images/404.png b/solution-ui/src/assets/404_images/404.png deleted file mode 100644 index 3d8e230..0000000 Binary files a/solution-ui/src/assets/404_images/404.png and /dev/null differ diff --git a/solution-ui/src/assets/404_images/404_cloud.png b/solution-ui/src/assets/404_images/404_cloud.png deleted file mode 100644 index c6281d0..0000000 Binary files a/solution-ui/src/assets/404_images/404_cloud.png and /dev/null differ diff --git a/solution-ui/src/assets/icons/index.js b/solution-ui/src/assets/icons/index.js deleted file mode 100644 index 2c6b309..0000000 --- a/solution-ui/src/assets/icons/index.js +++ /dev/null @@ -1,9 +0,0 @@ -import Vue from 'vue' -import SvgIcon from '@/components/SvgIcon'// svg component - -// register globally -Vue.component('svg-icon', SvgIcon) - -const req = require.context('./svg', false, /\.svg$/) -const requireAll = requireContext => requireContext.keys().map(requireContext) -requireAll(req) diff --git a/solution-ui/src/assets/icons/svg/404.svg b/solution-ui/src/assets/icons/svg/404.svg deleted file mode 100644 index 6df5019..0000000 --- a/solution-ui/src/assets/icons/svg/404.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/bug.svg b/solution-ui/src/assets/icons/svg/bug.svg deleted file mode 100644 index 05a150d..0000000 --- a/solution-ui/src/assets/icons/svg/bug.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/build.svg b/solution-ui/src/assets/icons/svg/build.svg deleted file mode 100644 index 97c4688..0000000 --- a/solution-ui/src/assets/icons/svg/build.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/button.svg b/solution-ui/src/assets/icons/svg/button.svg deleted file mode 100644 index 904fddc..0000000 --- a/solution-ui/src/assets/icons/svg/button.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/cascader.svg b/solution-ui/src/assets/icons/svg/cascader.svg deleted file mode 100644 index e256024..0000000 --- a/solution-ui/src/assets/icons/svg/cascader.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/chart.svg b/solution-ui/src/assets/icons/svg/chart.svg deleted file mode 100644 index 27728fb..0000000 --- a/solution-ui/src/assets/icons/svg/chart.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/checkbox.svg b/solution-ui/src/assets/icons/svg/checkbox.svg deleted file mode 100644 index 013fd3a..0000000 --- a/solution-ui/src/assets/icons/svg/checkbox.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/clipboard.svg b/solution-ui/src/assets/icons/svg/clipboard.svg deleted file mode 100644 index 90923ff..0000000 --- a/solution-ui/src/assets/icons/svg/clipboard.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/code.svg b/solution-ui/src/assets/icons/svg/code.svg deleted file mode 100644 index 5f9c5ab..0000000 --- a/solution-ui/src/assets/icons/svg/code.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/color.svg b/solution-ui/src/assets/icons/svg/color.svg deleted file mode 100644 index 44a81aa..0000000 --- a/solution-ui/src/assets/icons/svg/color.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/component.svg b/solution-ui/src/assets/icons/svg/component.svg deleted file mode 100644 index 29c3458..0000000 --- a/solution-ui/src/assets/icons/svg/component.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/dashboard.svg b/solution-ui/src/assets/icons/svg/dashboard.svg deleted file mode 100644 index 5317d37..0000000 --- a/solution-ui/src/assets/icons/svg/dashboard.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/date-range.svg b/solution-ui/src/assets/icons/svg/date-range.svg deleted file mode 100644 index fda571e..0000000 --- a/solution-ui/src/assets/icons/svg/date-range.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/date.svg b/solution-ui/src/assets/icons/svg/date.svg deleted file mode 100644 index 52dc73e..0000000 --- a/solution-ui/src/assets/icons/svg/date.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/dict.svg b/solution-ui/src/assets/icons/svg/dict.svg deleted file mode 100644 index 4849377..0000000 --- a/solution-ui/src/assets/icons/svg/dict.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/documentation.svg b/solution-ui/src/assets/icons/svg/documentation.svg deleted file mode 100644 index 7043122..0000000 --- a/solution-ui/src/assets/icons/svg/documentation.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/download.svg b/solution-ui/src/assets/icons/svg/download.svg deleted file mode 100644 index c896951..0000000 --- a/solution-ui/src/assets/icons/svg/download.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/drag.svg b/solution-ui/src/assets/icons/svg/drag.svg deleted file mode 100644 index 4185d3c..0000000 --- a/solution-ui/src/assets/icons/svg/drag.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/druid.svg b/solution-ui/src/assets/icons/svg/druid.svg deleted file mode 100644 index a2b4b4e..0000000 --- a/solution-ui/src/assets/icons/svg/druid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/edit.svg b/solution-ui/src/assets/icons/svg/edit.svg deleted file mode 100644 index d26101f..0000000 --- a/solution-ui/src/assets/icons/svg/edit.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/education.svg b/solution-ui/src/assets/icons/svg/education.svg deleted file mode 100644 index 7bfb01d..0000000 --- a/solution-ui/src/assets/icons/svg/education.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/email.svg b/solution-ui/src/assets/icons/svg/email.svg deleted file mode 100644 index 74d25e2..0000000 --- a/solution-ui/src/assets/icons/svg/email.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/enter.svg b/solution-ui/src/assets/icons/svg/enter.svg deleted file mode 100644 index f7cabf2..0000000 --- a/solution-ui/src/assets/icons/svg/enter.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/example.svg b/solution-ui/src/assets/icons/svg/example.svg deleted file mode 100644 index 46f42b5..0000000 --- a/solution-ui/src/assets/icons/svg/example.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/excel.svg b/solution-ui/src/assets/icons/svg/excel.svg deleted file mode 100644 index 74d97b8..0000000 --- a/solution-ui/src/assets/icons/svg/excel.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/exit-fullscreen.svg b/solution-ui/src/assets/icons/svg/exit-fullscreen.svg deleted file mode 100644 index 485c128..0000000 --- a/solution-ui/src/assets/icons/svg/exit-fullscreen.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/eye-open.svg b/solution-ui/src/assets/icons/svg/eye-open.svg deleted file mode 100644 index 88dcc98..0000000 --- a/solution-ui/src/assets/icons/svg/eye-open.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/eye.svg b/solution-ui/src/assets/icons/svg/eye.svg deleted file mode 100644 index 16ed2d8..0000000 --- a/solution-ui/src/assets/icons/svg/eye.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/form.svg b/solution-ui/src/assets/icons/svg/form.svg deleted file mode 100644 index dcbaa18..0000000 --- a/solution-ui/src/assets/icons/svg/form.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/fullscreen.svg b/solution-ui/src/assets/icons/svg/fullscreen.svg deleted file mode 100644 index 0e86b6f..0000000 --- a/solution-ui/src/assets/icons/svg/fullscreen.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/github.svg b/solution-ui/src/assets/icons/svg/github.svg deleted file mode 100644 index db0a0d4..0000000 --- a/solution-ui/src/assets/icons/svg/github.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/guide.svg b/solution-ui/src/assets/icons/svg/guide.svg deleted file mode 100644 index b271001..0000000 --- a/solution-ui/src/assets/icons/svg/guide.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/icon.svg b/solution-ui/src/assets/icons/svg/icon.svg deleted file mode 100644 index 82be8ee..0000000 --- a/solution-ui/src/assets/icons/svg/icon.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/input.svg b/solution-ui/src/assets/icons/svg/input.svg deleted file mode 100644 index ab91381..0000000 --- a/solution-ui/src/assets/icons/svg/input.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/international.svg b/solution-ui/src/assets/icons/svg/international.svg deleted file mode 100644 index e9b56ee..0000000 --- a/solution-ui/src/assets/icons/svg/international.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/job.svg b/solution-ui/src/assets/icons/svg/job.svg deleted file mode 100644 index 2a93a25..0000000 --- a/solution-ui/src/assets/icons/svg/job.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/language.svg b/solution-ui/src/assets/icons/svg/language.svg deleted file mode 100644 index 0082b57..0000000 --- a/solution-ui/src/assets/icons/svg/language.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/link.svg b/solution-ui/src/assets/icons/svg/link.svg deleted file mode 100644 index 48197ba..0000000 --- a/solution-ui/src/assets/icons/svg/link.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/list.svg b/solution-ui/src/assets/icons/svg/list.svg deleted file mode 100644 index 20259ed..0000000 --- a/solution-ui/src/assets/icons/svg/list.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/lock.svg b/solution-ui/src/assets/icons/svg/lock.svg deleted file mode 100644 index 74fee54..0000000 --- a/solution-ui/src/assets/icons/svg/lock.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/log.svg b/solution-ui/src/assets/icons/svg/log.svg deleted file mode 100644 index d879d33..0000000 --- a/solution-ui/src/assets/icons/svg/log.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/logininfor.svg b/solution-ui/src/assets/icons/svg/logininfor.svg deleted file mode 100644 index 267f844..0000000 --- a/solution-ui/src/assets/icons/svg/logininfor.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/message.svg b/solution-ui/src/assets/icons/svg/message.svg deleted file mode 100644 index 14ca817..0000000 --- a/solution-ui/src/assets/icons/svg/message.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/money.svg b/solution-ui/src/assets/icons/svg/money.svg deleted file mode 100644 index c1580de..0000000 --- a/solution-ui/src/assets/icons/svg/money.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/monitor.svg b/solution-ui/src/assets/icons/svg/monitor.svg deleted file mode 100644 index bc308cb..0000000 --- a/solution-ui/src/assets/icons/svg/monitor.svg +++ /dev/null @@ -1,2 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/more-up.svg b/solution-ui/src/assets/icons/svg/more-up.svg deleted file mode 100644 index d30ac11..0000000 --- a/solution-ui/src/assets/icons/svg/more-up.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/nested.svg b/solution-ui/src/assets/icons/svg/nested.svg deleted file mode 100644 index 06713a8..0000000 --- a/solution-ui/src/assets/icons/svg/nested.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/number.svg b/solution-ui/src/assets/icons/svg/number.svg deleted file mode 100644 index ad5ce9a..0000000 --- a/solution-ui/src/assets/icons/svg/number.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/online.svg b/solution-ui/src/assets/icons/svg/online.svg deleted file mode 100644 index 330a202..0000000 --- a/solution-ui/src/assets/icons/svg/online.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/password.svg b/solution-ui/src/assets/icons/svg/password.svg deleted file mode 100644 index 6c64def..0000000 --- a/solution-ui/src/assets/icons/svg/password.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/pdf.svg b/solution-ui/src/assets/icons/svg/pdf.svg deleted file mode 100644 index 957aa0c..0000000 --- a/solution-ui/src/assets/icons/svg/pdf.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/people.svg b/solution-ui/src/assets/icons/svg/people.svg deleted file mode 100644 index 2bd54ae..0000000 --- a/solution-ui/src/assets/icons/svg/people.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/peoples.svg b/solution-ui/src/assets/icons/svg/peoples.svg deleted file mode 100644 index aab852e..0000000 --- a/solution-ui/src/assets/icons/svg/peoples.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/phone.svg b/solution-ui/src/assets/icons/svg/phone.svg deleted file mode 100644 index ab8e8c4..0000000 --- a/solution-ui/src/assets/icons/svg/phone.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/post.svg b/solution-ui/src/assets/icons/svg/post.svg deleted file mode 100644 index 2922c61..0000000 --- a/solution-ui/src/assets/icons/svg/post.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/qq.svg b/solution-ui/src/assets/icons/svg/qq.svg deleted file mode 100644 index ee13d4e..0000000 --- a/solution-ui/src/assets/icons/svg/qq.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/question.svg b/solution-ui/src/assets/icons/svg/question.svg deleted file mode 100644 index cf75bd4..0000000 --- a/solution-ui/src/assets/icons/svg/question.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/radio.svg b/solution-ui/src/assets/icons/svg/radio.svg deleted file mode 100644 index 0cde345..0000000 --- a/solution-ui/src/assets/icons/svg/radio.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/rate.svg b/solution-ui/src/assets/icons/svg/rate.svg deleted file mode 100644 index aa3b14d..0000000 --- a/solution-ui/src/assets/icons/svg/rate.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/redis-list.svg b/solution-ui/src/assets/icons/svg/redis-list.svg deleted file mode 100644 index 98a15b2..0000000 --- a/solution-ui/src/assets/icons/svg/redis-list.svg +++ /dev/null @@ -1,2 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/redis.svg b/solution-ui/src/assets/icons/svg/redis.svg deleted file mode 100644 index 2f1d62d..0000000 --- a/solution-ui/src/assets/icons/svg/redis.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/row.svg b/solution-ui/src/assets/icons/svg/row.svg deleted file mode 100644 index 0780992..0000000 --- a/solution-ui/src/assets/icons/svg/row.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/search.svg b/solution-ui/src/assets/icons/svg/search.svg deleted file mode 100644 index 84233dd..0000000 --- a/solution-ui/src/assets/icons/svg/search.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/select.svg b/solution-ui/src/assets/icons/svg/select.svg deleted file mode 100644 index d628382..0000000 --- a/solution-ui/src/assets/icons/svg/select.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/server.svg b/solution-ui/src/assets/icons/svg/server.svg deleted file mode 100644 index eb287e3..0000000 --- a/solution-ui/src/assets/icons/svg/server.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/shopping.svg b/solution-ui/src/assets/icons/svg/shopping.svg deleted file mode 100644 index 87513e7..0000000 --- a/solution-ui/src/assets/icons/svg/shopping.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/size.svg b/solution-ui/src/assets/icons/svg/size.svg deleted file mode 100644 index ddb25b8..0000000 --- a/solution-ui/src/assets/icons/svg/size.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/skill.svg b/solution-ui/src/assets/icons/svg/skill.svg deleted file mode 100644 index a3b7312..0000000 --- a/solution-ui/src/assets/icons/svg/skill.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/slider.svg b/solution-ui/src/assets/icons/svg/slider.svg deleted file mode 100644 index fbe4f39..0000000 --- a/solution-ui/src/assets/icons/svg/slider.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/star.svg b/solution-ui/src/assets/icons/svg/star.svg deleted file mode 100644 index 6cf86e6..0000000 --- a/solution-ui/src/assets/icons/svg/star.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/swagger.svg b/solution-ui/src/assets/icons/svg/swagger.svg deleted file mode 100644 index 05d4e7b..0000000 --- a/solution-ui/src/assets/icons/svg/swagger.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/switch.svg b/solution-ui/src/assets/icons/svg/switch.svg deleted file mode 100644 index 0ba61e3..0000000 --- a/solution-ui/src/assets/icons/svg/switch.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/system.svg b/solution-ui/src/assets/icons/svg/system.svg deleted file mode 100644 index 5992593..0000000 --- a/solution-ui/src/assets/icons/svg/system.svg +++ /dev/null @@ -1,2 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/tab.svg b/solution-ui/src/assets/icons/svg/tab.svg deleted file mode 100644 index b4b48e4..0000000 --- a/solution-ui/src/assets/icons/svg/tab.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/table.svg b/solution-ui/src/assets/icons/svg/table.svg deleted file mode 100644 index 0e3dc9d..0000000 --- a/solution-ui/src/assets/icons/svg/table.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/textarea.svg b/solution-ui/src/assets/icons/svg/textarea.svg deleted file mode 100644 index 2709f29..0000000 --- a/solution-ui/src/assets/icons/svg/textarea.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/theme.svg b/solution-ui/src/assets/icons/svg/theme.svg deleted file mode 100644 index 5982a2f..0000000 --- a/solution-ui/src/assets/icons/svg/theme.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/time-range.svg b/solution-ui/src/assets/icons/svg/time-range.svg deleted file mode 100644 index 13c1202..0000000 --- a/solution-ui/src/assets/icons/svg/time-range.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/time.svg b/solution-ui/src/assets/icons/svg/time.svg deleted file mode 100644 index b376e32..0000000 --- a/solution-ui/src/assets/icons/svg/time.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/tool.svg b/solution-ui/src/assets/icons/svg/tool.svg deleted file mode 100644 index 48e0e35..0000000 --- a/solution-ui/src/assets/icons/svg/tool.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/tree-table.svg b/solution-ui/src/assets/icons/svg/tree-table.svg deleted file mode 100644 index 8aafdb8..0000000 --- a/solution-ui/src/assets/icons/svg/tree-table.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/tree.svg b/solution-ui/src/assets/icons/svg/tree.svg deleted file mode 100644 index dd4b7dd..0000000 --- a/solution-ui/src/assets/icons/svg/tree.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/upload.svg b/solution-ui/src/assets/icons/svg/upload.svg deleted file mode 100644 index bae49c0..0000000 --- a/solution-ui/src/assets/icons/svg/upload.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/user.svg b/solution-ui/src/assets/icons/svg/user.svg deleted file mode 100644 index 0ba0716..0000000 --- a/solution-ui/src/assets/icons/svg/user.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/validCode.svg b/solution-ui/src/assets/icons/svg/validCode.svg deleted file mode 100644 index cfb1021..0000000 --- a/solution-ui/src/assets/icons/svg/validCode.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/wechat.svg b/solution-ui/src/assets/icons/svg/wechat.svg deleted file mode 100644 index c586e55..0000000 --- a/solution-ui/src/assets/icons/svg/wechat.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svg/zip.svg b/solution-ui/src/assets/icons/svg/zip.svg deleted file mode 100644 index f806fc4..0000000 --- a/solution-ui/src/assets/icons/svg/zip.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/solution-ui/src/assets/icons/svgo.yml b/solution-ui/src/assets/icons/svgo.yml deleted file mode 100644 index d11906a..0000000 --- a/solution-ui/src/assets/icons/svgo.yml +++ /dev/null @@ -1,22 +0,0 @@ -# replace default config - -# multipass: true -# full: true - -plugins: - - # - name - # - # or: - # - name: false - # - name: true - # - # or: - # - name: - # param1: 1 - # param2: 2 - -- removeAttrs: - attrs: - - 'fill' - - 'fill-rule' diff --git a/solution-ui/src/assets/images/dark.svg b/solution-ui/src/assets/images/dark.svg deleted file mode 100644 index f646bd7..0000000 --- a/solution-ui/src/assets/images/dark.svg +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/solution-ui/src/assets/images/light.svg b/solution-ui/src/assets/images/light.svg deleted file mode 100644 index ab7cc08..0000000 --- a/solution-ui/src/assets/images/light.svg +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/solution-ui/src/assets/images/login-background.jpg b/solution-ui/src/assets/images/login-background.jpg deleted file mode 100644 index 8a89eb8..0000000 Binary files a/solution-ui/src/assets/images/login-background.jpg and /dev/null differ diff --git a/solution-ui/src/assets/images/pay.png b/solution-ui/src/assets/images/pay.png deleted file mode 100644 index bb8b967..0000000 Binary files a/solution-ui/src/assets/images/pay.png and /dev/null differ diff --git a/solution-ui/src/assets/images/profile.jpg b/solution-ui/src/assets/images/profile.jpg deleted file mode 100644 index b3a940b..0000000 Binary files a/solution-ui/src/assets/images/profile.jpg and /dev/null differ diff --git a/solution-ui/src/assets/logo/logo.png b/solution-ui/src/assets/logo/logo.png deleted file mode 100644 index e263760..0000000 Binary files a/solution-ui/src/assets/logo/logo.png and /dev/null differ diff --git a/solution-ui/src/assets/styles/btn.scss b/solution-ui/src/assets/styles/btn.scss deleted file mode 100644 index e6ba1a8..0000000 --- a/solution-ui/src/assets/styles/btn.scss +++ /dev/null @@ -1,99 +0,0 @@ -@import './variables.scss'; - -@mixin colorBtn($color) { - background: $color; - - &:hover { - color: $color; - - &:before, - &:after { - background: $color; - } - } -} - -.blue-btn { - @include colorBtn($blue) -} - -.light-blue-btn { - @include colorBtn($light-blue) -} - -.red-btn { - @include colorBtn($red) -} - -.pink-btn { - @include colorBtn($pink) -} - -.green-btn { - @include colorBtn($green) -} - -.tiffany-btn { - @include colorBtn($tiffany) -} - -.yellow-btn { - @include colorBtn($yellow) -} - -.pan-btn { - font-size: 14px; - color: #fff; - padding: 14px 36px; - border-radius: 8px; - border: none; - outline: none; - transition: 600ms ease all; - position: relative; - display: inline-block; - - &:hover { - background: #fff; - - &:before, - &:after { - width: 100%; - transition: 600ms ease all; - } - } - - &:before, - &:after { - content: ''; - position: absolute; - top: 0; - right: 0; - height: 2px; - width: 0; - transition: 400ms ease all; - } - - &::after { - right: inherit; - top: inherit; - left: 0; - bottom: 0; - } -} - -.custom-button { - display: inline-block; - line-height: 1; - white-space: nowrap; - cursor: pointer; - background: #fff; - color: #fff; - -webkit-appearance: none; - text-align: center; - box-sizing: border-box; - outline: 0; - margin: 0; - padding: 10px 15px; - font-size: 14px; - border-radius: 4px; -} diff --git a/solution-ui/src/assets/styles/element-ui.scss b/solution-ui/src/assets/styles/element-ui.scss deleted file mode 100644 index 363092a..0000000 --- a/solution-ui/src/assets/styles/element-ui.scss +++ /dev/null @@ -1,92 +0,0 @@ -// cover some element-ui styles - -.el-breadcrumb__inner, -.el-breadcrumb__inner a { - font-weight: 400 !important; -} - -.el-upload { - input[type="file"] { - display: none !important; - } -} - -.el-upload__input { - display: none; -} - -.cell { - .el-tag { - margin-right: 0px; - } -} - -.small-padding { - .cell { - padding-left: 5px; - padding-right: 5px; - } -} - -.fixed-width { - .el-button--mini { - padding: 7px 10px; - width: 60px; - } -} - -.status-col { - .cell { - padding: 0 10px; - text-align: center; - - .el-tag { - margin-right: 0px; - } - } -} - -// to fixed https://github.com/ElemeFE/element/issues/2461 -.el-dialog { - transform: none; - left: 0; - position: relative; - margin: 0 auto; -} - -// refine element ui upload -.upload-container { - .el-upload { - width: 100%; - - .el-upload-dragger { - width: 100%; - height: 200px; - } - } -} - -// dropdown -.el-dropdown-menu { - a { - display: block - } -} - -// fix date-picker ui bug in filter-item -.el-range-editor.el-input__inner { - display: inline-flex !important; -} - -// to fix el-date-picker css style -.el-range-separator { - box-sizing: content-box; -} - -.el-menu--collapse - > div - > .el-submenu - > .el-submenu__title - .el-submenu__icon-arrow { - display: none; -} \ No newline at end of file diff --git a/solution-ui/src/assets/styles/element-variables.scss b/solution-ui/src/assets/styles/element-variables.scss deleted file mode 100644 index 1615ff2..0000000 --- a/solution-ui/src/assets/styles/element-variables.scss +++ /dev/null @@ -1,31 +0,0 @@ -/** -* I think element-ui's default theme color is too light for long-term use. -* So I modified the default color and you can modify it to your liking. -**/ - -/* theme color */ -$--color-primary: #1890ff; -$--color-success: #13ce66; -$--color-warning: #ffba00; -$--color-danger: #ff4949; -// $--color-info: #1E1E1E; - -$--button-font-weight: 400; - -// $--color-text-regular: #1f2d3d; - -$--border-color-light: #dfe4ed; -$--border-color-lighter: #e6ebf5; - -$--table-border: 1px solid #dfe6ec; - -/* icon font path, required */ -$--font-path: '~element-ui/lib/theme-chalk/fonts'; - -@import "~element-ui/packages/theme-chalk/src/index"; - -// the :export directive is the magic sauce for webpack -// https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass -:export { - theme: $--color-primary; -} diff --git a/solution-ui/src/assets/styles/index.scss b/solution-ui/src/assets/styles/index.scss deleted file mode 100644 index bb87292..0000000 --- a/solution-ui/src/assets/styles/index.scss +++ /dev/null @@ -1,178 +0,0 @@ -@import './variables.scss'; -@import './mixin.scss'; -@import './transition.scss'; -@import './element-ui.scss'; -@import './sidebar.scss'; -@import './btn.scss'; - -body { - height: 100%; - -moz-osx-font-smoothing: grayscale; - -webkit-font-smoothing: antialiased; - text-rendering: optimizeLegibility; - font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, Microsoft YaHei, Arial, sans-serif; -} - -label { - font-weight: 700; -} - -html { - height: 100%; - box-sizing: border-box; -} - -#app { - height: 100%; -} - -*, -*:before, -*:after { - box-sizing: inherit; -} - -.no-padding { - padding: 0px !important; -} - -.padding-content { - padding: 4px 0; -} - -a:focus, -a:active { - outline: none; -} - -a, -a:focus, -a:hover { - cursor: pointer; - color: inherit; - text-decoration: none; -} - -div:focus { - outline: none; -} - -.fr { - float: right; -} - -.fl { - float: left; -} - -.pr-5 { - padding-right: 5px; -} - -.pl-5 { - padding-left: 5px; -} - -.block { - display: block; -} - -.pointer { - cursor: pointer; -} - -.inlineBlock { - display: block; -} - -.clearfix { - &:after { - visibility: hidden; - display: block; - font-size: 0; - content: " "; - clear: both; - height: 0; - } -} - -aside { - background: #eef1f6; - padding: 8px 24px; - margin-bottom: 20px; - border-radius: 2px; - display: block; - line-height: 32px; - font-size: 16px; - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; - color: #2c3e50; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - - a { - color: #337ab7; - cursor: pointer; - - &:hover { - color: rgb(32, 160, 255); - } - } -} - -//main-container全局样式 -.app-container { - padding: 20px; -} - -.components-container { - margin: 30px 50px; - position: relative; -} - -.text-center { - text-align: center -} - -.sub-navbar { - height: 50px; - line-height: 50px; - position: relative; - width: 100%; - text-align: right; - padding-right: 20px; - transition: 600ms ease position; - background: linear-gradient(90deg, rgba(32, 182, 249, 1) 0%, rgba(32, 182, 249, 1) 0%, rgba(33, 120, 241, 1) 100%, rgba(33, 120, 241, 1) 100%); - - .subtitle { - font-size: 20px; - color: #fff; - } - - &.draft { - background: #d0d0d0; - } - - &.deleted { - background: #d0d0d0; - } -} - -.link-type, -.link-type:focus { - color: #337ab7; - cursor: pointer; - - &:hover { - color: rgb(32, 160, 255); - } -} - -.filter-container { - padding-bottom: 10px; - - .filter-item { - display: inline-block; - vertical-align: middle; - margin-bottom: 10px; - } -} diff --git a/solution-ui/src/assets/styles/mixin.scss b/solution-ui/src/assets/styles/mixin.scss deleted file mode 100644 index 06fa061..0000000 --- a/solution-ui/src/assets/styles/mixin.scss +++ /dev/null @@ -1,66 +0,0 @@ -@mixin clearfix { - &:after { - content: ""; - display: table; - clear: both; - } -} - -@mixin scrollBar { - &::-webkit-scrollbar-track-piece { - background: #d3dce6; - } - - &::-webkit-scrollbar { - width: 6px; - } - - &::-webkit-scrollbar-thumb { - background: #99a9bf; - border-radius: 20px; - } -} - -@mixin relative { - position: relative; - width: 100%; - height: 100%; -} - -@mixin pct($pct) { - width: #{$pct}; - position: relative; - margin: 0 auto; -} - -@mixin triangle($width, $height, $color, $direction) { - $width: $width/2; - $color-border-style: $height solid $color; - $transparent-border-style: $width solid transparent; - height: 0; - width: 0; - - @if $direction==up { - border-bottom: $color-border-style; - border-left: $transparent-border-style; - border-right: $transparent-border-style; - } - - @else if $direction==right { - border-left: $color-border-style; - border-top: $transparent-border-style; - border-bottom: $transparent-border-style; - } - - @else if $direction==down { - border-top: $color-border-style; - border-left: $transparent-border-style; - border-right: $transparent-border-style; - } - - @else if $direction==left { - border-right: $color-border-style; - border-top: $transparent-border-style; - border-bottom: $transparent-border-style; - } -} diff --git a/solution-ui/src/assets/styles/ruoyi.scss b/solution-ui/src/assets/styles/ruoyi.scss deleted file mode 100644 index e1ba082..0000000 --- a/solution-ui/src/assets/styles/ruoyi.scss +++ /dev/null @@ -1,297 +0,0 @@ -/** -* 通用css样式布局处理 -* Copyright (c) 2019 ruoyi -*/ - -/** 基础通用 **/ -.pt5 { - padding-top: 5px; -} - -.pr5 { - padding-right: 5px; -} - -.pb5 { - padding-bottom: 5px; -} - -.mt5 { - margin-top: 5px; -} - -.mr5 { - margin-right: 5px; -} - -.mb5 { - margin-bottom: 5px; -} - -.mb8 { - margin-bottom: 8px; -} - -.ml5 { - margin-left: 5px; -} - -.mt10 { - margin-top: 10px; -} - -.mr10 { - margin-right: 10px; -} - -.mb10 { - margin-bottom: 10px; -} -.ml10 { - margin-left: 10px; -} - -.mt20 { - margin-top: 20px; -} - -.mr20 { - margin-right: 20px; -} - -.mb20 { - margin-bottom: 20px; -} -.ml20 { - margin-left: 20px; -} - -.h1, .h2, .h3, .h4, .h5, .h6, h1, h2, h3, h4, h5, h6 { - font-family: inherit; - font-weight: 500; - line-height: 1.1; - color: inherit; -} - -.el-message-box__status + .el-message-box__message{ - word-break: break-word; -} - -.el-dialog:not(.is-fullscreen) { - margin-top: 6vh !important; -} - -.el-dialog__wrapper.scrollbar .el-dialog .el-dialog__body { - overflow: auto; - overflow-x: hidden; - max-height: 70vh; - padding: 10px 20px 0; -} - -.el-table { - .el-table__header-wrapper, .el-table__fixed-header-wrapper { - th { - word-break: break-word; - background-color: #f8f8f9; - color: #515a6e; - height: 40px; - font-size: 13px; - } - } - - .el-table__body-wrapper { - .el-button [class*="el-icon-"] + span { - margin-left: 1px; - } - } -} - -/** 表单布局 **/ -.form-header { - font-size: 15px; - color: #6379bb; - border-bottom: 1px solid #ddd; - margin: 8px 10px 25px 10px; - padding-bottom: 5px -} - -/** 表格布局 **/ -.pagination-container { - display: flex; - justify-content: flex-end; - margin-top: 20px; -} - -/* tree border */ -.tree-border { - margin-top: 5px; - border: 1px solid #e5e6e7; - background: #FFFFFF none; - border-radius: 4px; -} - -/* horizontal el menu */ -.el-menu--horizontal .el-menu-item .svg-icon + span, -.el-menu--horizontal .el-submenu__title .svg-icon + span { - margin-left: 3px; -} - -.el-menu--horizontal .el-menu--popup { - min-width: 120px !important; -} - -@media (max-width: 768px) { - .pagination-container .el-pagination > .el-pagination__jump { - display: none !important; - } - .pagination-container .el-pagination > .el-pagination__sizes { - display: none !important; - } -} - -.el-table .fixed-width .el-button--mini { - padding-left: 0; - padding-right: 0; - width: inherit; -} - -/** 表格更多操作下拉样式 */ -.el-table .el-dropdown-link,.el-table .el-dropdown-selfdefine { - cursor: pointer; - margin-left: 5px; -} - -.el-table .el-dropdown, .el-icon-arrow-down { - font-size: 12px; -} - -.el-tree-node__content > .el-checkbox { - margin-right: 8px; -} - -.list-group-striped > .list-group-item { - border-left: 0; - border-right: 0; - border-radius: 0; - padding-left: 0; - padding-right: 0; -} - -.list-group { - padding-left: 0px; - list-style: none; -} - -.list-group-item { - border-bottom: 1px solid #e7eaec; - border-top: 1px solid #e7eaec; - margin-bottom: -1px; - padding: 11px 0px; - font-size: 13px; -} - -.pull-right { - float: right !important; -} - -.el-card__header { - padding: 14px 15px 7px; - min-height: 40px; -} - -.el-card__body { - padding: 15px 20px 20px 20px; -} - -.card-box { - margin-bottom: 10px; -} - -/* button color */ -.el-button--cyan.is-active, -.el-button--cyan:active { - background: #20B2AA; - border-color: #20B2AA; - color: #FFFFFF; -} - -.el-button--cyan:focus, -.el-button--cyan:hover { - background: #48D1CC; - border-color: #48D1CC; - color: #FFFFFF; -} - -.el-button--cyan { - background-color: #20B2AA; - border-color: #20B2AA; - color: #FFFFFF; -} - -/* text color */ -.text-navy { - color: #1ab394; -} - -.text-primary { - color: inherit; -} - -.text-success { - color: #1c84c6; -} - -.text-info { - color: #23c6c8; -} - -.text-warning { - color: #f8ac59; -} - -.text-danger { - color: #ed5565; -} - -.text-muted { - color: #888888; -} - -/* image */ -.img-circle { - border-radius: 50%; -} - -.img-lg { - width: 120px; - height: 120px; -} - -.avatar-upload-preview { - position: relative; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - width: 200px; - height: 200px; - border-radius: 50%; - box-shadow: 0 0 4px #ccc; - overflow: hidden; -} - -/* 拖拽列样式 */ -.sortable-ghost { - opacity: .8; - color: #fff !important; - background: #42b983 !important; -} - -.top-right-btn { - position: relative; - float: right; -} - -/* 分割面板样式 */ -.splitpanes.default-theme .splitpanes__pane { - background-color: #fff!important; -} diff --git a/solution-ui/src/assets/styles/sidebar.scss b/solution-ui/src/assets/styles/sidebar.scss deleted file mode 100644 index 5950ba9..0000000 --- a/solution-ui/src/assets/styles/sidebar.scss +++ /dev/null @@ -1,229 +0,0 @@ -#app { - - .main-container { - height: 100%; - transition: margin-left .28s; - margin-left: $base-sidebar-width; - position: relative; - } - - .sidebarHide { - margin-left: 0!important; - } - - .sidebar-container { - -webkit-transition: width .28s; - transition: width 0.28s; - width: $base-sidebar-width !important; - background-color: $base-menu-background; - height: 100%; - position: fixed; - font-size: 0px; - top: 0; - bottom: 0; - left: 0; - z-index: 1001; - overflow: hidden; - -webkit-box-shadow: 2px 0 6px rgba(0,21,41,.35); - box-shadow: 0px 0px 8px 0px rgba(0, 0, 0, 0.1); - - // reset element-ui css - .horizontal-collapse-transition { - transition: 0s width ease-in-out, 0s padding-left ease-in-out, 0s padding-right ease-in-out; - } - - .scrollbar-wrapper { - overflow-x: hidden !important; - } - - .el-scrollbar__bar.is-vertical { - right: 0px; - } - - .el-scrollbar { - height: 100%; - } - - &.has-logo { - .el-scrollbar { - height: calc(100% - 50px); - } - } - - .is-horizontal { - display: none; - } - - a { - display: inline-block; - width: 100%; - overflow: hidden; - } - - .svg-icon { - margin-right: 10px !important; - } - - .el-menu { - border: none; - height: 100%; - width: 100% !important; - } - - .el-menu-item, .el-submenu__title { - overflow: hidden !important; - text-overflow: ellipsis !important; - white-space: nowrap !important; - } - - // menu hover - .submenu-title-noDropdown, - .el-submenu__title { - &:hover { - background-color: rgba(0, 0, 0, 0.06) !important; - } - } - - & .theme-dark .is-active > .el-submenu__title { - color: $base-menu-color-active !important; - } - - & .nest-menu .el-submenu>.el-submenu__title, - & .el-submenu .el-menu-item { - min-width: $base-sidebar-width !important; - - &:hover { - background-color: rgba(0, 0, 0, 0.06) !important; - } - } - - & .theme-dark .nest-menu .el-submenu>.el-submenu__title, - & .theme-dark .el-submenu .el-menu-item { - background-color: $base-sub-menu-background !important; - - &:hover { - background-color: $base-sub-menu-hover !important; - } - } - } - - .hideSidebar { - .sidebar-container { - width: 54px !important; - } - - .main-container { - margin-left: 54px; - } - - .el-menu:not(.el-menu--horizontal) { - .submenu-title-noDropdown { - padding: 0 !important; - position: relative; - - .el-tooltip { - padding: 0 !important; - - .svg-icon { - margin-left: 20px; - } - } - } - } - - .el-submenu { - overflow: hidden; - - &>.el-submenu__title { - padding: 0 !important; - - .svg-icon { - margin-left: 20px; - } - - } - } - - .el-menu--collapse { - .el-submenu { - &>.el-submenu__title { - &>span { - height: 0; - width: 0; - overflow: hidden; - visibility: hidden; - display: inline-block; - } - } - } - } - } - - .el-menu--collapse .el-menu .el-submenu { - min-width: $base-sidebar-width !important; - } - - // mobile responsive - .mobile { - .main-container { - margin-left: 0px; - } - - .sidebar-container { - transition: transform .28s; - width: $base-sidebar-width !important; - } - - &.hideSidebar { - .sidebar-container { - pointer-events: none; - transition-duration: 0.3s; - transform: translate3d(-$base-sidebar-width, 0, 0); - } - } - } - - .withoutAnimation { - - .main-container, - .sidebar-container { - transition: none; - } - } -} - -// when menu collapsed -.el-menu--vertical { - &>.el-menu { - .svg-icon { - margin-right: 16px; - } - } - - .nest-menu .el-submenu>.el-submenu__title, - .el-menu-item { - &:hover { - // you can use $subMenuHover - background-color: rgba(0, 0, 0, 0.06) !important; - } - } - - // the scroll bar appears when the subMenu is too long - >.el-menu--popup { - max-height: 100vh; - overflow-y: auto; - - &::-webkit-scrollbar-track-piece { - background: #d3dce6; - } - - &::-webkit-scrollbar { - width: 6px; - } - - &::-webkit-scrollbar-thumb { - background: #99a9bf; - border-radius: 20px; - } - } -} diff --git a/solution-ui/src/assets/styles/transition.scss b/solution-ui/src/assets/styles/transition.scss deleted file mode 100644 index 073f8c6..0000000 --- a/solution-ui/src/assets/styles/transition.scss +++ /dev/null @@ -1,49 +0,0 @@ -// global transition css - -/* fade */ -.fade-enter-active, -.fade-leave-active { - transition: opacity 0.28s; -} - -.fade-enter, -.fade-leave-active { - opacity: 0; -} - -/* fade-transform */ -.fade-transform--move, -.fade-transform-leave-active, -.fade-transform-enter-active { - transition: all .5s; -} - -.fade-transform-enter { - opacity: 0; - transform: translateX(-30px); -} - -.fade-transform-leave-to { - opacity: 0; - transform: translateX(30px); -} - -/* breadcrumb transition */ -.breadcrumb-enter-active, -.breadcrumb-leave-active { - transition: all .5s; -} - -.breadcrumb-enter, -.breadcrumb-leave-active { - opacity: 0; - transform: translateX(20px); -} - -.breadcrumb-move { - transition: all .5s; -} - -.breadcrumb-leave-active { - position: absolute; -} diff --git a/solution-ui/src/assets/styles/variables.scss b/solution-ui/src/assets/styles/variables.scss deleted file mode 100644 index 34484d4..0000000 --- a/solution-ui/src/assets/styles/variables.scss +++ /dev/null @@ -1,54 +0,0 @@ -// base color -$blue:#324157; -$light-blue:#3A71A8; -$red:#C03639; -$pink: #E65D6E; -$green: #30B08F; -$tiffany: #4AB7BD; -$yellow:#FEC171; -$panGreen: #30B08F; - -// 默认菜单主题风格 -$base-menu-color:#bfcbd9; -$base-menu-color-active:#f4f4f5; -$base-menu-background:#304156; -$base-logo-title-color: #ffffff; - -$base-menu-light-color:rgba(0,0,0,.70); -$base-menu-light-background:#ffffff; -$base-logo-light-title-color: #001529; - -$base-sub-menu-background:#1f2d3d; -$base-sub-menu-hover:#001528; - -// 自定义暗色菜单风格 -/** -$base-menu-color:hsla(0,0%,100%,.65); -$base-menu-color-active:#fff; -$base-menu-background:#001529; -$base-logo-title-color: #ffffff; - -$base-menu-light-color:rgba(0,0,0,.70); -$base-menu-light-background:#ffffff; -$base-logo-light-title-color: #001529; - -$base-sub-menu-background:#000c17; -$base-sub-menu-hover:#001528; -*/ - -$base-sidebar-width: 200px; - -// the :export directive is the magic sauce for webpack -// https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass -:export { - menuColor: $base-menu-color; - menuLightColor: $base-menu-light-color; - menuColorActive: $base-menu-color-active; - menuBackground: $base-menu-background; - menuLightBackground: $base-menu-light-background; - subMenuBackground: $base-sub-menu-background; - subMenuHover: $base-sub-menu-hover; - sideBarWidth: $base-sidebar-width; - logoTitleColor: $base-logo-title-color; - logoLightTitleColor: $base-logo-light-title-color -} diff --git a/solution-ui/src/components/Breadcrumb/index.vue b/solution-ui/src/components/Breadcrumb/index.vue deleted file mode 100644 index 84f4831..0000000 --- a/solution-ui/src/components/Breadcrumb/index.vue +++ /dev/null @@ -1,102 +0,0 @@ - - - - - diff --git a/solution-ui/src/components/Crontab/day.vue b/solution-ui/src/components/Crontab/day.vue deleted file mode 100644 index d3faed7..0000000 --- a/solution-ui/src/components/Crontab/day.vue +++ /dev/null @@ -1,161 +0,0 @@ - - - diff --git a/solution-ui/src/components/Crontab/hour.vue b/solution-ui/src/components/Crontab/hour.vue deleted file mode 100644 index 5659bfb..0000000 --- a/solution-ui/src/components/Crontab/hour.vue +++ /dev/null @@ -1,120 +0,0 @@ - - - diff --git a/solution-ui/src/components/Crontab/index.vue b/solution-ui/src/components/Crontab/index.vue deleted file mode 100644 index 395f615..0000000 --- a/solution-ui/src/components/Crontab/index.vue +++ /dev/null @@ -1,430 +0,0 @@ - - - - diff --git a/solution-ui/src/components/Crontab/min.vue b/solution-ui/src/components/Crontab/min.vue deleted file mode 100644 index ec56a44..0000000 --- a/solution-ui/src/components/Crontab/min.vue +++ /dev/null @@ -1,116 +0,0 @@ - - - \ No newline at end of file diff --git a/solution-ui/src/components/Crontab/month.vue b/solution-ui/src/components/Crontab/month.vue deleted file mode 100644 index da60132..0000000 --- a/solution-ui/src/components/Crontab/month.vue +++ /dev/null @@ -1,114 +0,0 @@ - - - diff --git a/solution-ui/src/components/Crontab/result.vue b/solution-ui/src/components/Crontab/result.vue deleted file mode 100644 index 4e2952d..0000000 --- a/solution-ui/src/components/Crontab/result.vue +++ /dev/null @@ -1,558 +0,0 @@ - - - diff --git a/solution-ui/src/components/Crontab/second.vue b/solution-ui/src/components/Crontab/second.vue deleted file mode 100644 index 9201e06..0000000 --- a/solution-ui/src/components/Crontab/second.vue +++ /dev/null @@ -1,117 +0,0 @@ - - - diff --git a/solution-ui/src/components/Crontab/week.vue b/solution-ui/src/components/Crontab/week.vue deleted file mode 100644 index 75c42ed..0000000 --- a/solution-ui/src/components/Crontab/week.vue +++ /dev/null @@ -1,202 +0,0 @@ - - - diff --git a/solution-ui/src/components/Crontab/year.vue b/solution-ui/src/components/Crontab/year.vue deleted file mode 100644 index 8c18c78..0000000 --- a/solution-ui/src/components/Crontab/year.vue +++ /dev/null @@ -1,131 +0,0 @@ - - - diff --git a/solution-ui/src/components/DictData/index.js b/solution-ui/src/components/DictData/index.js deleted file mode 100644 index 7b85d4a..0000000 --- a/solution-ui/src/components/DictData/index.js +++ /dev/null @@ -1,49 +0,0 @@ -import Vue from 'vue' -import store from '@/store' -import DataDict from '@/utils/dict' -import { getDicts as getDicts } from '@/api/system/dict/data' - -function searchDictByKey(dict, key) { - if (key == null && key == "") { - return null - } - try { - for (let i = 0; i < dict.length; i++) { - if (dict[i].key == key) { - return dict[i].value - } - } - } catch (e) { - return null - } -} - -function install() { - Vue.use(DataDict, { - metas: { - '*': { - labelField: 'dictLabel', - valueField: 'dictValue', - request(dictMeta) { - const storeDict = searchDictByKey(store.getters.dict, dictMeta.type) - if (storeDict) { - return new Promise(resolve => { resolve(storeDict) }) - } else { - return new Promise((resolve, reject) => { - getDicts(dictMeta.type).then(res => { - store.dispatch('dict/setDict', { key: dictMeta.type, value: res.data }) - resolve(res.data) - }).catch(error => { - reject(error) - }) - }) - } - }, - }, - }, - }) -} - -export default { - install, -} \ No newline at end of file diff --git a/solution-ui/src/components/DictTag/index.vue b/solution-ui/src/components/DictTag/index.vue deleted file mode 100644 index 7c86744..0000000 --- a/solution-ui/src/components/DictTag/index.vue +++ /dev/null @@ -1,93 +0,0 @@ - - - - diff --git a/solution-ui/src/components/Editor/index.vue b/solution-ui/src/components/Editor/index.vue deleted file mode 100644 index 553f952..0000000 --- a/solution-ui/src/components/Editor/index.vue +++ /dev/null @@ -1,297 +0,0 @@ - - - - - diff --git a/solution-ui/src/components/FileUpload/index.vue b/solution-ui/src/components/FileUpload/index.vue deleted file mode 100644 index ca37c55..0000000 --- a/solution-ui/src/components/FileUpload/index.vue +++ /dev/null @@ -1,262 +0,0 @@ - - - - - diff --git a/solution-ui/src/components/Hamburger/index.vue b/solution-ui/src/components/Hamburger/index.vue deleted file mode 100644 index 368b002..0000000 --- a/solution-ui/src/components/Hamburger/index.vue +++ /dev/null @@ -1,44 +0,0 @@ - - - - - diff --git a/solution-ui/src/components/HeaderSearch/index.vue b/solution-ui/src/components/HeaderSearch/index.vue deleted file mode 100644 index a936bdf..0000000 --- a/solution-ui/src/components/HeaderSearch/index.vue +++ /dev/null @@ -1,264 +0,0 @@ - - - - - - diff --git a/solution-ui/src/components/IconSelect/index.vue b/solution-ui/src/components/IconSelect/index.vue deleted file mode 100644 index 8dadc02..0000000 --- a/solution-ui/src/components/IconSelect/index.vue +++ /dev/null @@ -1,104 +0,0 @@ - - - - - - diff --git a/solution-ui/src/components/IconSelect/requireIcons.js b/solution-ui/src/components/IconSelect/requireIcons.js deleted file mode 100644 index 99e5c54..0000000 --- a/solution-ui/src/components/IconSelect/requireIcons.js +++ /dev/null @@ -1,11 +0,0 @@ - -const req = require.context('../../assets/icons/svg', false, /\.svg$/) -const requireAll = requireContext => requireContext.keys() - -const re = /\.\/(.*)\.svg/ - -const icons = requireAll(req).map(i => { - return i.match(re)[1] -}) - -export default icons diff --git a/solution-ui/src/components/ImagePreview/index.vue b/solution-ui/src/components/ImagePreview/index.vue deleted file mode 100644 index 8b4738b..0000000 --- a/solution-ui/src/components/ImagePreview/index.vue +++ /dev/null @@ -1,90 +0,0 @@ - - - - - diff --git a/solution-ui/src/components/ImageUpload/index.vue b/solution-ui/src/components/ImageUpload/index.vue deleted file mode 100644 index 6b24f6e..0000000 --- a/solution-ui/src/components/ImageUpload/index.vue +++ /dev/null @@ -1,272 +0,0 @@ - - - - - diff --git a/solution-ui/src/components/Pagination/index.vue b/solution-ui/src/components/Pagination/index.vue deleted file mode 100644 index 08ac487..0000000 --- a/solution-ui/src/components/Pagination/index.vue +++ /dev/null @@ -1,113 +0,0 @@ - - - - - diff --git a/solution-ui/src/components/PanThumb/index.vue b/solution-ui/src/components/PanThumb/index.vue deleted file mode 100644 index b24e026..0000000 --- a/solution-ui/src/components/PanThumb/index.vue +++ /dev/null @@ -1,141 +0,0 @@ - - - - - diff --git a/solution-ui/src/components/ParentView/index.vue b/solution-ui/src/components/ParentView/index.vue deleted file mode 100644 index 7bf6148..0000000 --- a/solution-ui/src/components/ParentView/index.vue +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/solution-ui/src/components/RightToolbar/index.vue b/solution-ui/src/components/RightToolbar/index.vue deleted file mode 100644 index c71029a..0000000 --- a/solution-ui/src/components/RightToolbar/index.vue +++ /dev/null @@ -1,186 +0,0 @@ - - - - - diff --git a/solution-ui/src/components/RuoYi/Doc/index.vue b/solution-ui/src/components/RuoYi/Doc/index.vue deleted file mode 100644 index 75fa864..0000000 --- a/solution-ui/src/components/RuoYi/Doc/index.vue +++ /dev/null @@ -1,21 +0,0 @@ - - - \ No newline at end of file diff --git a/solution-ui/src/components/RuoYi/Git/index.vue b/solution-ui/src/components/RuoYi/Git/index.vue deleted file mode 100644 index bdafbae..0000000 --- a/solution-ui/src/components/RuoYi/Git/index.vue +++ /dev/null @@ -1,21 +0,0 @@ - - - \ No newline at end of file diff --git a/solution-ui/src/components/Screenfull/index.vue b/solution-ui/src/components/Screenfull/index.vue deleted file mode 100644 index d4e539c..0000000 --- a/solution-ui/src/components/Screenfull/index.vue +++ /dev/null @@ -1,57 +0,0 @@ - - - - - diff --git a/solution-ui/src/components/SizeSelect/index.vue b/solution-ui/src/components/SizeSelect/index.vue deleted file mode 100644 index e513948..0000000 --- a/solution-ui/src/components/SizeSelect/index.vue +++ /dev/null @@ -1,55 +0,0 @@ - - - diff --git a/solution-ui/src/components/SvgIcon/index.vue b/solution-ui/src/components/SvgIcon/index.vue deleted file mode 100644 index e4bf5ad..0000000 --- a/solution-ui/src/components/SvgIcon/index.vue +++ /dev/null @@ -1,61 +0,0 @@ - - - - - diff --git a/solution-ui/src/components/ThemePicker/index.vue b/solution-ui/src/components/ThemePicker/index.vue deleted file mode 100644 index a69ee45..0000000 --- a/solution-ui/src/components/ThemePicker/index.vue +++ /dev/null @@ -1,170 +0,0 @@ - - - - - diff --git a/solution-ui/src/components/TopNav/index.vue b/solution-ui/src/components/TopNav/index.vue deleted file mode 100644 index 8e742c5..0000000 --- a/solution-ui/src/components/TopNav/index.vue +++ /dev/null @@ -1,193 +0,0 @@ - - - - - diff --git a/solution-ui/src/components/iFrame/index.vue b/solution-ui/src/components/iFrame/index.vue deleted file mode 100644 index f4334f3..0000000 --- a/solution-ui/src/components/iFrame/index.vue +++ /dev/null @@ -1,36 +0,0 @@ - - - diff --git a/solution-ui/src/layout/components/Navbar.vue b/solution-ui/src/layout/components/Navbar.vue deleted file mode 100644 index 8271da4..0000000 --- a/solution-ui/src/layout/components/Navbar.vue +++ /dev/null @@ -1,245 +0,0 @@ - - - - - diff --git a/solution-ui/src/layout/components/Settings/index.vue b/solution-ui/src/layout/components/Settings/index.vue deleted file mode 100644 index 9e67399..0000000 --- a/solution-ui/src/layout/components/Settings/index.vue +++ /dev/null @@ -1,389 +0,0 @@ - - - - - diff --git a/solution-ui/src/layout/components/Sidebar/FixiOSBug.js b/solution-ui/src/layout/components/Sidebar/FixiOSBug.js deleted file mode 100644 index 6823726..0000000 --- a/solution-ui/src/layout/components/Sidebar/FixiOSBug.js +++ /dev/null @@ -1,25 +0,0 @@ -export default { - computed: { - device() { - return this.$store.state.app.device - } - }, - mounted() { - // In order to fix the click on menu on the ios device will trigger the mouseleave bug - this.fixBugIniOS() - }, - methods: { - fixBugIniOS() { - const $subMenu = this.$refs.subMenu - if ($subMenu) { - const handleMouseleave = $subMenu.handleMouseleave - $subMenu.handleMouseleave = (e) => { - if (this.device === 'mobile') { - return - } - handleMouseleave(e) - } - } - } - } -} diff --git a/solution-ui/src/layout/components/Sidebar/Item.vue b/solution-ui/src/layout/components/Sidebar/Item.vue deleted file mode 100644 index be3285d..0000000 --- a/solution-ui/src/layout/components/Sidebar/Item.vue +++ /dev/null @@ -1,33 +0,0 @@ - diff --git a/solution-ui/src/layout/components/Sidebar/Link.vue b/solution-ui/src/layout/components/Sidebar/Link.vue deleted file mode 100644 index 8b0bc93..0000000 --- a/solution-ui/src/layout/components/Sidebar/Link.vue +++ /dev/null @@ -1,43 +0,0 @@ - - - diff --git a/solution-ui/src/layout/components/Sidebar/Logo.vue b/solution-ui/src/layout/components/Sidebar/Logo.vue deleted file mode 100644 index 966e656..0000000 --- a/solution-ui/src/layout/components/Sidebar/Logo.vue +++ /dev/null @@ -1,95 +0,0 @@ - - - - - diff --git a/solution-ui/src/layout/components/Sidebar/SidebarItem.vue b/solution-ui/src/layout/components/Sidebar/SidebarItem.vue deleted file mode 100644 index bddb65f..0000000 --- a/solution-ui/src/layout/components/Sidebar/SidebarItem.vue +++ /dev/null @@ -1,99 +0,0 @@ - - - diff --git a/solution-ui/src/layout/components/Sidebar/index.vue b/solution-ui/src/layout/components/Sidebar/index.vue deleted file mode 100644 index cd86ea6..0000000 --- a/solution-ui/src/layout/components/Sidebar/index.vue +++ /dev/null @@ -1,57 +0,0 @@ - - - diff --git a/solution-ui/src/layout/components/TagsView/ScrollPane.vue b/solution-ui/src/layout/components/TagsView/ScrollPane.vue deleted file mode 100644 index bb753a1..0000000 --- a/solution-ui/src/layout/components/TagsView/ScrollPane.vue +++ /dev/null @@ -1,94 +0,0 @@ - - - - - diff --git a/solution-ui/src/layout/components/TagsView/index.vue b/solution-ui/src/layout/components/TagsView/index.vue deleted file mode 100644 index f0b0837..0000000 --- a/solution-ui/src/layout/components/TagsView/index.vue +++ /dev/null @@ -1,337 +0,0 @@ - - - - - - - diff --git a/solution-ui/src/layout/components/TopBar/index.vue b/solution-ui/src/layout/components/TopBar/index.vue deleted file mode 100644 index 698419b..0000000 --- a/solution-ui/src/layout/components/TopBar/index.vue +++ /dev/null @@ -1,98 +0,0 @@ - - - - - - diff --git a/solution-ui/src/layout/components/index.js b/solution-ui/src/layout/components/index.js deleted file mode 100644 index 104bd3a..0000000 --- a/solution-ui/src/layout/components/index.js +++ /dev/null @@ -1,5 +0,0 @@ -export { default as AppMain } from './AppMain' -export { default as Navbar } from './Navbar' -export { default as Settings } from './Settings' -export { default as Sidebar } from './Sidebar/index.vue' -export { default as TagsView } from './TagsView/index.vue' diff --git a/solution-ui/src/layout/index.vue b/solution-ui/src/layout/index.vue deleted file mode 100644 index e8b7c38..0000000 --- a/solution-ui/src/layout/index.vue +++ /dev/null @@ -1,115 +0,0 @@ - - - - - diff --git a/solution-ui/src/layout/mixin/ResizeHandler.js b/solution-ui/src/layout/mixin/ResizeHandler.js deleted file mode 100644 index e8d0df8..0000000 --- a/solution-ui/src/layout/mixin/ResizeHandler.js +++ /dev/null @@ -1,45 +0,0 @@ -import store from '@/store' - -const { body } = document -const WIDTH = 992 // refer to Bootstrap's responsive design - -export default { - watch: { - $route(route) { - if (this.device === 'mobile' && this.sidebar.opened) { - store.dispatch('app/closeSideBar', { withoutAnimation: false }) - } - } - }, - beforeMount() { - window.addEventListener('resize', this.$_resizeHandler) - }, - beforeDestroy() { - window.removeEventListener('resize', this.$_resizeHandler) - }, - mounted() { - const isMobile = this.$_isMobile() - if (isMobile) { - store.dispatch('app/toggleDevice', 'mobile') - store.dispatch('app/closeSideBar', { withoutAnimation: true }) - } - }, - methods: { - // use $_ for mixins properties - // https://vuejs.org/v2/style-guide/index.html#Private-property-names-essential - $_isMobile() { - const rect = body.getBoundingClientRect() - return rect.width - 1 < WIDTH - }, - $_resizeHandler() { - if (!document.hidden) { - const isMobile = this.$_isMobile() - store.dispatch('app/toggleDevice', isMobile ? 'mobile' : 'desktop') - - if (isMobile) { - store.dispatch('app/closeSideBar', { withoutAnimation: true }) - } - } - } - } -} diff --git a/solution-ui/src/main.js b/solution-ui/src/main.js deleted file mode 100644 index da01750..0000000 --- a/solution-ui/src/main.js +++ /dev/null @@ -1,83 +0,0 @@ -import Vue from 'vue' - -import Cookies from 'js-cookie' - -import Element from 'element-ui' -import './assets/styles/element-variables.scss' - -import '@/assets/styles/index.scss' // global css -import '@/assets/styles/ruoyi.scss' // ruoyi css -import App from './App' -import store from './store' -import router from './router' -import directive from './directive' // directive -import plugins from './plugins' // plugins -import { download } from '@/utils/request' - -import './assets/icons' // icon -import './permission' // permission control -import { getDicts } from "@/api/system/dict/data" -import { getConfigKey } from "@/api/system/config" -import { parseTime, resetForm, addDateRange, selectDictLabel, selectDictLabels, handleTree } from "@/utils/ruoyi" -// 分页组件 -import Pagination from "@/components/Pagination" -// 自定义表格工具组件 -import RightToolbar from "@/components/RightToolbar" -// 富文本组件 -import Editor from "@/components/Editor" -// 文件上传组件 -import FileUpload from "@/components/FileUpload" -// 图片上传组件 -import ImageUpload from "@/components/ImageUpload" -// 图片预览组件 -import ImagePreview from "@/components/ImagePreview" -// 字典标签组件 -import DictTag from '@/components/DictTag' -// 字典数据组件 -import DictData from '@/components/DictData' - -// 全局方法挂载 -Vue.prototype.getDicts = getDicts -Vue.prototype.getConfigKey = getConfigKey -Vue.prototype.parseTime = parseTime -Vue.prototype.resetForm = resetForm -Vue.prototype.addDateRange = addDateRange -Vue.prototype.selectDictLabel = selectDictLabel -Vue.prototype.selectDictLabels = selectDictLabels -Vue.prototype.download = download -Vue.prototype.handleTree = handleTree - -// 全局组件挂载 -Vue.component('DictTag', DictTag) -Vue.component('Pagination', Pagination) -Vue.component('RightToolbar', RightToolbar) -Vue.component('Editor', Editor) -Vue.component('FileUpload', FileUpload) -Vue.component('ImageUpload', ImageUpload) -Vue.component('ImagePreview', ImagePreview) - -Vue.use(directive) -Vue.use(plugins) -DictData.install() - -/** - * If you don't want to use mock-server - * you want to use MockJs for mock api - * you can execute: mockXHR() - * - * Currently MockJs will be used in the production environment, - * please remove it before going online! ! ! - */ - -Vue.use(Element, { - size: Cookies.get('size') || 'medium' // set element-ui default size -}) - -Vue.config.productionTip = false - -new Vue({ - el: '#app', - router, - store, - render: h => h(App) -}) diff --git a/solution-ui/src/permission.js b/solution-ui/src/permission.js deleted file mode 100644 index b66190b..0000000 --- a/solution-ui/src/permission.js +++ /dev/null @@ -1,63 +0,0 @@ -import router from './router' -import store from './store' -import { Message } from 'element-ui' -import NProgress from 'nprogress' -import 'nprogress/nprogress.css' -import { getToken } from '@/utils/auth' -import { isPathMatch } from '@/utils/validate' -import { isRelogin } from '@/utils/request' - -NProgress.configure({ showSpinner: false }) - -const whiteList = ['/login', '/register'] - -const isWhiteList = (path) => { - return whiteList.some(pattern => isPathMatch(pattern, path)) -} - -router.beforeEach((to, from, next) => { - NProgress.start() - if (getToken()) { - to.meta.title && store.dispatch('settings/setTitle', to.meta.title) - /* has token*/ - if (to.path === '/login') { - next({ path: '/' }) - NProgress.done() - } else if (isWhiteList(to.path)) { - next() - } else { - if (store.getters.roles.length === 0) { - isRelogin.show = true - // 判断当前用户是否已拉取完user_info信息 - store.dispatch('GetInfo').then(() => { - isRelogin.show = false - store.dispatch('GenerateRoutes').then(accessRoutes => { - // 根据roles权限生成可访问的路由表 - router.addRoutes(accessRoutes) // 动态添加可访问路由表 - next({ ...to, replace: true }) // hack方法 确保addRoutes已完成 - }) - }).catch(err => { - store.dispatch('LogOut').then(() => { - Message.error(err) - next({ path: '/' }) - }) - }) - } else { - next() - } - } - } else { - // 没有token - if (isWhiteList(to.path)) { - // 在免登录白名单,直接进入 - next() - } else { - next(`/login?redirect=${encodeURIComponent(to.fullPath)}`) // 否则全部重定向到登录页 - NProgress.done() - } - } -}) - -router.afterEach(() => { - NProgress.done() -}) diff --git a/solution-ui/src/plugins/auth.js b/solution-ui/src/plugins/auth.js deleted file mode 100644 index 3b91c14..0000000 --- a/solution-ui/src/plugins/auth.js +++ /dev/null @@ -1,60 +0,0 @@ -import store from '@/store' - -function authPermission(permission) { - const all_permission = "*:*:*" - const permissions = store.getters && store.getters.permissions - if (permission && permission.length > 0) { - return permissions.some(v => { - return all_permission === v || v === permission - }) - } else { - return false - } -} - -function authRole(role) { - const super_admin = "admin" - const roles = store.getters && store.getters.roles - if (role && role.length > 0) { - return roles.some(v => { - return super_admin === v || v === role - }) - } else { - return false - } -} - -export default { - // 验证用户是否具备某权限 - hasPermi(permission) { - return authPermission(permission) - }, - // 验证用户是否含有指定权限,只需包含其中一个 - hasPermiOr(permissions) { - return permissions.some(item => { - return authPermission(item) - }) - }, - // 验证用户是否含有指定权限,必须全部拥有 - hasPermiAnd(permissions) { - return permissions.every(item => { - return authPermission(item) - }) - }, - // 验证用户是否具备某角色 - hasRole(role) { - return authRole(role) - }, - // 验证用户是否含有指定角色,只需包含其中一个 - hasRoleOr(roles) { - return roles.some(item => { - return authRole(item) - }) - }, - // 验证用户是否含有指定角色,必须全部拥有 - hasRoleAnd(roles) { - return roles.every(item => { - return authRole(item) - }) - } -} diff --git a/solution-ui/src/plugins/cache.js b/solution-ui/src/plugins/cache.js deleted file mode 100644 index ea8a53f..0000000 --- a/solution-ui/src/plugins/cache.js +++ /dev/null @@ -1,79 +0,0 @@ -const sessionCache = { - set (key, value) { - if (!sessionStorage) { - return - } - if (key != null && value != null) { - sessionStorage.setItem(key, value) - } - }, - get (key) { - if (!sessionStorage) { - return null - } - if (key == null) { - return null - } - return sessionStorage.getItem(key) - }, - setJSON (key, jsonValue) { - if (jsonValue != null) { - this.set(key, JSON.stringify(jsonValue)) - } - }, - getJSON (key) { - const value = this.get(key) - if (value != null) { - return JSON.parse(value) - } - return null - }, - remove (key) { - sessionStorage.removeItem(key) - } -} -const localCache = { - set (key, value) { - if (!localStorage) { - return - } - if (key != null && value != null) { - localStorage.setItem(key, value) - } - }, - get (key) { - if (!localStorage) { - return null - } - if (key == null) { - return null - } - return localStorage.getItem(key) - }, - setJSON (key, jsonValue) { - if (jsonValue != null) { - this.set(key, JSON.stringify(jsonValue)) - } - }, - getJSON (key) { - const value = this.get(key) - if (value != null) { - return JSON.parse(value) - } - return null - }, - remove (key) { - localStorage.removeItem(key) - } -} - -export default { - /** - * 会话级缓存 - */ - session: sessionCache, - /** - * 本地缓存 - */ - local: localCache -} diff --git a/solution-ui/src/plugins/download.js b/solution-ui/src/plugins/download.js deleted file mode 100644 index 8dc83ea..0000000 --- a/solution-ui/src/plugins/download.js +++ /dev/null @@ -1,79 +0,0 @@ -import axios from 'axios' -import {Loading, Message} from 'element-ui' -import { saveAs } from 'file-saver' -import { getToken } from '@/utils/auth' -import errorCode from '@/utils/errorCode' -import { blobValidate } from "@/utils/ruoyi" - -const baseURL = process.env.VUE_APP_BASE_API -let downloadLoadingInstance - -export default { - name(name, isDelete = true) { - var url = baseURL + "/common/download?fileName=" + encodeURIComponent(name) + "&delete=" + isDelete - axios({ - method: 'get', - url: url, - responseType: 'blob', - headers: { 'Authorization': 'Bearer ' + getToken() } - }).then((res) => { - const isBlob = blobValidate(res.data) - if (isBlob) { - const blob = new Blob([res.data]) - this.saveAs(blob, decodeURIComponent(res.headers['download-filename'])) - } else { - this.printErrMsg(res.data) - } - }) - }, - resource(resource) { - var url = baseURL + "/common/download/resource?resource=" + encodeURIComponent(resource) - axios({ - method: 'get', - url: url, - responseType: 'blob', - headers: { 'Authorization': 'Bearer ' + getToken() } - }).then((res) => { - const isBlob = blobValidate(res.data) - if (isBlob) { - const blob = new Blob([res.data]) - this.saveAs(blob, decodeURIComponent(res.headers['download-filename'])) - } else { - this.printErrMsg(res.data) - } - }) - }, - zip(url, name) { - var url = baseURL + url - downloadLoadingInstance = Loading.service({ text: "正在下载数据,请稍候", spinner: "el-icon-loading", background: "rgba(0, 0, 0, 0.7)", }) - axios({ - method: 'get', - url: url, - responseType: 'blob', - headers: { 'Authorization': 'Bearer ' + getToken() } - }).then((res) => { - const isBlob = blobValidate(res.data) - if (isBlob) { - const blob = new Blob([res.data], { type: 'application/zip' }) - this.saveAs(blob, name) - } else { - this.printErrMsg(res.data) - } - downloadLoadingInstance.close() - }).catch((r) => { - console.error(r) - Message.error('下载文件出现错误,请联系管理员!') - downloadLoadingInstance.close() - }) - }, - saveAs(text, name, opts) { - saveAs(text, name, opts) - }, - async printErrMsg(data) { - const resText = await data.text() - const rspObj = JSON.parse(resText) - const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode['default'] - Message.error(errMsg) - } -} - diff --git a/solution-ui/src/plugins/index.js b/solution-ui/src/plugins/index.js deleted file mode 100644 index d000f2d..0000000 --- a/solution-ui/src/plugins/index.js +++ /dev/null @@ -1,20 +0,0 @@ -import tab from './tab' -import auth from './auth' -import cache from './cache' -import modal from './modal' -import download from './download' - -export default { - install(Vue) { - // 页签操作 - Vue.prototype.$tab = tab - // 认证对象 - Vue.prototype.$auth = auth - // 缓存对象 - Vue.prototype.$cache = cache - // 模态框对象 - Vue.prototype.$modal = modal - // 下载文件 - Vue.prototype.$download = download - } -} diff --git a/solution-ui/src/plugins/modal.js b/solution-ui/src/plugins/modal.js deleted file mode 100644 index 92bc1ef..0000000 --- a/solution-ui/src/plugins/modal.js +++ /dev/null @@ -1,83 +0,0 @@ -import { Message, MessageBox, Notification, Loading } from 'element-ui' - -let loadingInstance - -export default { - // 消息提示 - msg(content) { - Message.info(content) - }, - // 错误消息 - msgError(content) { - Message.error(content) - }, - // 成功消息 - msgSuccess(content) { - Message.success(content) - }, - // 警告消息 - msgWarning(content) { - Message.warning(content) - }, - // 弹出提示 - alert(content) { - MessageBox.alert(content, "系统提示") - }, - // 错误提示 - alertError(content) { - MessageBox.alert(content, "系统提示", { type: 'error' }) - }, - // 成功提示 - alertSuccess(content) { - MessageBox.alert(content, "系统提示", { type: 'success' }) - }, - // 警告提示 - alertWarning(content) { - MessageBox.alert(content, "系统提示", { type: 'warning' }) - }, - // 通知提示 - notify(content) { - Notification.info(content) - }, - // 错误通知 - notifyError(content) { - Notification.error(content) - }, - // 成功通知 - notifySuccess(content) { - Notification.success(content) - }, - // 警告通知 - notifyWarning(content) { - Notification.warning(content) - }, - // 确认窗体 - confirm(content) { - return MessageBox.confirm(content, "系统提示", { - confirmButtonText: '确定', - cancelButtonText: '取消', - type: "warning", - }) - }, - // 提交内容 - prompt(content) { - return MessageBox.prompt(content, "系统提示", { - confirmButtonText: '确定', - cancelButtonText: '取消', - type: "warning", - }) - }, - // 打开遮罩层 - loading(content) { - loadingInstance = Loading.service({ - lock: true, - text: content, - spinner: "el-icon-loading", - background: "rgba(0, 0, 0, 0.7)", - }) - }, - // 关闭遮罩层 - closeLoading() { - loadingInstance.close() - } -} diff --git a/solution-ui/src/plugins/tab.js b/solution-ui/src/plugins/tab.js deleted file mode 100644 index f21467d..0000000 --- a/solution-ui/src/plugins/tab.js +++ /dev/null @@ -1,71 +0,0 @@ -import store from '@/store' -import router from '@/router' - -export default { - // 刷新当前tab页签 - refreshPage(obj) { - const { path, query, matched } = router.currentRoute - if (obj === undefined) { - matched.forEach((m) => { - if (m.components && m.components.default && m.components.default.name) { - if (!['Layout', 'ParentView'].includes(m.components.default.name)) { - obj = { name: m.components.default.name, path: path, query: query } - } - } - }) - } - return store.dispatch('tagsView/delCachedView', obj).then(() => { - const { path, query } = obj - router.replace({ - path: '/redirect' + path, - query: query - }) - }) - }, - // 关闭当前tab页签,打开新页签 - closeOpenPage(obj) { - store.dispatch("tagsView/delView", router.currentRoute) - if (obj !== undefined) { - return router.push(obj) - } - }, - // 关闭指定tab页签 - closePage(obj) { - if (obj === undefined) { - return store.dispatch('tagsView/delView', router.currentRoute).then(({ visitedViews }) => { - const latestView = visitedViews.slice(-1)[0] - if (latestView) { - return router.push(latestView.fullPath) - } - return router.push('/') - }) - } - return store.dispatch('tagsView/delView', obj) - }, - // 关闭所有tab页签 - closeAllPage() { - return store.dispatch('tagsView/delAllViews') - }, - // 关闭左侧tab页签 - closeLeftPage(obj) { - return store.dispatch('tagsView/delLeftTags', obj || router.currentRoute) - }, - // 关闭右侧tab页签 - closeRightPage(obj) { - return store.dispatch('tagsView/delRightTags', obj || router.currentRoute) - }, - // 关闭其他tab页签 - closeOtherPage(obj) { - return store.dispatch('tagsView/delOthersViews', obj || router.currentRoute) - }, - // 添加tab页签 - openPage(title, url, params) { - const obj = { path: url, meta: { title: title } } - store.dispatch('tagsView/addView', obj) - return router.push({ path: url, query: params }) - }, - // 修改tab页签 - updatePage(obj) { - return store.dispatch('tagsView/updateVisitedView', obj) - } -} diff --git a/solution-ui/src/router/index.js b/solution-ui/src/router/index.js deleted file mode 100644 index bbfd237..0000000 --- a/solution-ui/src/router/index.js +++ /dev/null @@ -1,183 +0,0 @@ -import Vue from 'vue' -import Router from 'vue-router' - -Vue.use(Router) - -/* Layout */ -import Layout from '@/layout' - -/** - * Note: 路由配置项 - * - * hidden: true // 当设置 true 的时候该路由不会再侧边栏出现 如401,login等页面,或者如一些编辑页面/edit/1 - * alwaysShow: true // 当你一个路由下面的 children 声明的路由大于1个时,自动会变成嵌套的模式--如组件页面 - * // 只有一个时,会将那个子路由当做根路由显示在侧边栏--如引导页面 - * // 若你想不管路由下面的 children 声明的个数都显示你的根路由 - * // 你可以设置 alwaysShow: true,这样它就会忽略之前定义的规则,一直显示根路由 - * redirect: noRedirect // 当设置 noRedirect 的时候该路由在面包屑导航中不可被点击 - * name:'router-name' // 设定路由的名字,一定要填写不然使用时会出现各种问题 - * query: '{"id": 1, "name": "ry"}' // 访问路由的默认传递参数 - * roles: ['admin', 'common'] // 访问路由的角色权限 - * permissions: ['a:a:a', 'b:b:b'] // 访问路由的菜单权限 - * meta : { - noCache: true // 如果设置为true,则不会被 缓存(默认 false) - title: 'title' // 设置该路由在侧边栏和面包屑中展示的名字 - icon: 'svg-name' // 设置该路由的图标,对应路径src/assets/icons/svg - breadcrumb: false // 如果设置为false,则不会在breadcrumb面包屑中显示 - activeMenu: '/system/user' // 当路由设置了该属性,则会高亮相对应的侧边栏。 - } - */ - -// 公共路由 -export const constantRoutes = [ - { - path: '/redirect', - component: Layout, - hidden: true, - children: [ - { - path: '/redirect/:path(.*)', - component: () => import('@/views/redirect') - } - ] - }, - { - path: '/login', - component: () => import('@/views/login'), - hidden: true - }, - { - path: '/register', - component: () => import('@/views/register'), - hidden: true - }, - { - path: '/404', - component: () => import('@/views/error/404'), - hidden: true - }, - { - path: '/401', - component: () => import('@/views/error/401'), - hidden: true - }, - { - path: '', - component: Layout, - redirect: 'index', - children: [ - { - path: 'index', - component: () => import('@/views/index'), - name: 'Index', - meta: { title: '首页', icon: 'dashboard', affix: true } - } - ] - }, - { - path: '/user', - component: Layout, - hidden: true, - redirect: 'noredirect', - children: [ - { - path: 'profile', - component: () => import('@/views/system/user/profile/index'), - name: 'Profile', - meta: { title: '个人中心', icon: 'user' } - } - ] - } -] - -// 动态路由,基于用户权限动态去加载 -export const dynamicRoutes = [ - { - path: '/system/user-auth', - component: Layout, - hidden: true, - permissions: ['system:user:edit'], - children: [ - { - path: 'role/:userId(\\d+)', - component: () => import('@/views/system/user/authRole'), - name: 'AuthRole', - meta: { title: '分配角色', activeMenu: '/system/user' } - } - ] - }, - { - path: '/system/role-auth', - component: Layout, - hidden: true, - permissions: ['system:role:edit'], - children: [ - { - path: 'user/:roleId(\\d+)', - component: () => import('@/views/system/role/authUser'), - name: 'AuthUser', - meta: { title: '分配用户', activeMenu: '/system/role' } - } - ] - }, - { - path: '/system/dict-data', - component: Layout, - hidden: true, - permissions: ['system:dict:list'], - children: [ - { - path: 'index/:dictId(\\d+)', - component: () => import('@/views/system/dict/data'), - name: 'Data', - meta: { title: '字典数据', activeMenu: '/system/dict' } - } - ] - }, - { - path: '/monitor/job-log', - component: Layout, - hidden: true, - permissions: ['monitor:job:list'], - children: [ - { - path: 'index/:jobId(\\d+)', - component: () => import('@/views/monitor/job/log'), - name: 'JobLog', - meta: { title: '调度日志', activeMenu: '/monitor/job' } - } - ] - }, - { - path: '/tool/gen-edit', - component: Layout, - hidden: true, - permissions: ['tool:gen:edit'], - children: [ - { - path: 'index/:tableId(\\d+)', - component: () => import('@/views/tool/gen/editTable'), - name: 'GenEdit', - meta: { title: '修改生成配置', activeMenu: '/tool/gen' } - } - ] - } -] - -// 防止连续点击多次路由报错 -let routerPush = Router.prototype.push -let routerReplace = Router.prototype.replace -// push -Router.prototype.push = function push(location) { - return routerPush.call(this, location).catch(err => err) -} -// replace -Router.prototype.replace = function push(location) { - return routerReplace.call(this, location).catch(err => err) -} - -export default new Router({ - mode: 'history', // 去掉url中的# - scrollBehavior: () => ({ y: 0 }), - routes: constantRoutes -}) diff --git a/solution-ui/src/settings.js b/solution-ui/src/settings.js deleted file mode 100644 index eb1efa8..0000000 --- a/solution-ui/src/settings.js +++ /dev/null @@ -1,56 +0,0 @@ -module.exports = { - /** - * 网页标题 - */ - title: process.env.VUE_APP_TITLE, - - /** - * 侧边栏主题 深色主题theme-dark,浅色主题theme-light - */ - sideTheme: 'theme-dark', - - /** - * 系统布局配置 - */ - showSettings: true, - - /** - * 菜单导航模式 1、纯左侧 2、混合(左侧+顶部) 3、纯顶部 - */ - navType: 1, - - /** - * 是否显示 tagsView - */ - tagsView: true, - - /** - * 显示页签图标 - */ - tagsIcon: false, - - /** - * 是否固定头部 - */ - fixedHeader: true, - - /** - * 是否显示logo - */ - sidebarLogo: true, - - /** - * 是否显示动态标题 - */ - dynamicTitle: false, - - /** - * 是否显示底部版权 - */ - footerVisible: false, - - /** - * 底部版权文本内容 - */ - footerContent: 'Copyright © 2018-2026 RuoYi. All Rights Reserved.' -} diff --git a/solution-ui/src/store/getters.js b/solution-ui/src/store/getters.js deleted file mode 100644 index 3680f95..0000000 --- a/solution-ui/src/store/getters.js +++ /dev/null @@ -1,21 +0,0 @@ -const getters = { - sidebar: state => state.app.sidebar, - size: state => state.app.size, - device: state => state.app.device, - dict: state => state.dict.dict, - visitedViews: state => state.tagsView.visitedViews, - cachedViews: state => state.tagsView.cachedViews, - token: state => state.user.token, - avatar: state => state.user.avatar, - id: state => state.user.id, - name: state => state.user.name, - nickName: state => state.user.nickName, - introduction: state => state.user.introduction, - roles: state => state.user.roles, - permissions: state => state.user.permissions, - permission_routes: state => state.permission.routes, - topbarRouters: state => state.permission.topbarRouters, - defaultRoutes: state => state.permission.defaultRoutes, - sidebarRouters: state => state.permission.sidebarRouters -} -export default getters diff --git a/solution-ui/src/store/index.js b/solution-ui/src/store/index.js deleted file mode 100644 index 97aaef8..0000000 --- a/solution-ui/src/store/index.js +++ /dev/null @@ -1,25 +0,0 @@ -import Vue from 'vue' -import Vuex from 'vuex' -import app from './modules/app' -import dict from './modules/dict' -import user from './modules/user' -import tagsView from './modules/tagsView' -import permission from './modules/permission' -import settings from './modules/settings' -import getters from './getters' - -Vue.use(Vuex) - -const store = new Vuex.Store({ - modules: { - app, - dict, - user, - tagsView, - permission, - settings - }, - getters -}) - -export default store diff --git a/solution-ui/src/store/modules/app.js b/solution-ui/src/store/modules/app.js deleted file mode 100644 index 9f99f39..0000000 --- a/solution-ui/src/store/modules/app.js +++ /dev/null @@ -1,66 +0,0 @@ -import Cookies from 'js-cookie' - -const state = { - sidebar: { - opened: Cookies.get('sidebarStatus') ? !!+Cookies.get('sidebarStatus') : true, - withoutAnimation: false, - hide: false - }, - device: 'desktop', - size: Cookies.get('size') || 'medium' -} - -const mutations = { - TOGGLE_SIDEBAR: state => { - if (state.sidebar.hide) { - return false - } - state.sidebar.opened = !state.sidebar.opened - state.sidebar.withoutAnimation = false - if (state.sidebar.opened) { - Cookies.set('sidebarStatus', 1) - } else { - Cookies.set('sidebarStatus', 0) - } - }, - CLOSE_SIDEBAR: (state, withoutAnimation) => { - Cookies.set('sidebarStatus', 0) - state.sidebar.opened = false - state.sidebar.withoutAnimation = withoutAnimation - }, - TOGGLE_DEVICE: (state, device) => { - state.device = device - }, - SET_SIZE: (state, size) => { - state.size = size - Cookies.set('size', size) - }, - SET_SIDEBAR_HIDE: (state, status) => { - state.sidebar.hide = status - } -} - -const actions = { - toggleSideBar({ commit }) { - commit('TOGGLE_SIDEBAR') - }, - closeSideBar({ commit }, { withoutAnimation }) { - commit('CLOSE_SIDEBAR', withoutAnimation) - }, - toggleDevice({ commit }, device) { - commit('TOGGLE_DEVICE', device) - }, - setSize({ commit }, size) { - commit('SET_SIZE', size) - }, - toggleSideBarHide({ commit }, status) { - commit('SET_SIDEBAR_HIDE', status) - } -} - -export default { - namespaced: true, - state, - mutations, - actions -} diff --git a/solution-ui/src/store/modules/dict.js b/solution-ui/src/store/modules/dict.js deleted file mode 100644 index 7a1b2f0..0000000 --- a/solution-ui/src/store/modules/dict.js +++ /dev/null @@ -1,50 +0,0 @@ -const state = { - dict: new Array() -} -const mutations = { - SET_DICT: (state, { key, value }) => { - if (key !== null && key !== "") { - state.dict.push({ - key: key, - value: value - }) - } - }, - REMOVE_DICT: (state, key) => { - try { - for (let i = 0; i < state.dict.length; i++) { - if (state.dict[i].key == key) { - state.dict.splice(i, 1) - return true - } - } - } catch (e) { - } - }, - CLEAN_DICT: (state) => { - state.dict = new Array() - } -} - -const actions = { - // 设置字典 - setDict({ commit }, data) { - commit('SET_DICT', data) - }, - // 删除字典 - removeDict({ commit }, key) { - commit('REMOVE_DICT', key) - }, - // 清空字典 - cleanDict({ commit }) { - commit('CLEAN_DICT') - } -} - -export default { - namespaced: true, - state, - mutations, - actions -} - diff --git a/solution-ui/src/store/modules/permission.js b/solution-ui/src/store/modules/permission.js deleted file mode 100644 index b549ef0..0000000 --- a/solution-ui/src/store/modules/permission.js +++ /dev/null @@ -1,122 +0,0 @@ -import auth from '@/plugins/auth' -import router, { constantRoutes, dynamicRoutes } from '@/router' -import { getRouters } from '@/api/menu' -import Layout from '@/layout/index' -import ParentView from '@/components/ParentView' -import InnerLink from '@/layout/components/InnerLink' - -const permission = { - state: { - routes: [], - addRoutes: [], - defaultRoutes: [], - topbarRouters: [], - sidebarRouters: [] - }, - mutations: { - SET_ROUTES: (state, routes) => { - state.addRoutes = routes - state.routes = constantRoutes.concat(routes) - }, - SET_DEFAULT_ROUTES: (state, routes) => { - state.defaultRoutes = constantRoutes.concat(routes) - }, - SET_TOPBAR_ROUTES: (state, routes) => { - state.topbarRouters = routes - }, - SET_SIDEBAR_ROUTERS: (state, routes) => { - state.sidebarRouters = routes - }, - }, - actions: { - // 生成路由 - GenerateRoutes({ commit }) { - return new Promise(resolve => { - // 向后端请求路由数据 - getRouters().then(res => { - const sdata = JSON.parse(JSON.stringify(res.data)) - const rdata = JSON.parse(JSON.stringify(res.data)) - const sidebarRoutes = filterAsyncRouter(sdata) - const rewriteRoutes = filterAsyncRouter(rdata, false, true) - const asyncRoutes = filterDynamicRoutes(dynamicRoutes) - rewriteRoutes.push({ path: '*', redirect: '/404', hidden: true }) - router.addRoutes(asyncRoutes) - commit('SET_ROUTES', rewriteRoutes) - commit('SET_SIDEBAR_ROUTERS', constantRoutes.concat(sidebarRoutes)) - commit('SET_DEFAULT_ROUTES', sidebarRoutes) - commit('SET_TOPBAR_ROUTES', sidebarRoutes) - resolve(rewriteRoutes) - }) - }) - } - } -} - -// 遍历后台传来的路由字符串,转换为组件对象 -function filterAsyncRouter(asyncRouterMap, lastRouter = false, type = false) { - return asyncRouterMap.filter(route => { - if (type && route.children) { - route.children = filterChildren(route.children) - } - if (route.component) { - // Layout ParentView 组件特殊处理 - if (route.component === 'Layout') { - route.component = Layout - } else if (route.component === 'ParentView') { - route.component = ParentView - } else if (route.component === 'InnerLink') { - route.component = InnerLink - } else { - route.component = loadView(route.component) - } - } - if (route.children != null && route.children && route.children.length) { - route.children = filterAsyncRouter(route.children, route, type) - } else { - delete route['children'] - delete route['redirect'] - } - return true - }) -} - -function filterChildren(childrenMap, lastRouter = false) { - var children = [] - childrenMap.forEach(el => { - el.path = lastRouter ? lastRouter.path + '/' + el.path : el.path - if (el.children && el.children.length && el.component === 'ParentView') { - children = children.concat(filterChildren(el.children, el)) - } else { - children.push(el) - } - }) - return children -} - -// 动态路由遍历,验证是否具备权限 -export function filterDynamicRoutes(routes) { - const res = [] - routes.forEach(route => { - if (route.permissions) { - if (auth.hasPermiOr(route.permissions)) { - res.push(route) - } - } else if (route.roles) { - if (auth.hasRoleOr(route.roles)) { - res.push(route) - } - } - }) - return res -} - -export const loadView = (view) => { - if (process.env.NODE_ENV === 'development') { - return (resolve) => require([`@/views/${view}`], resolve) - } else { - // 使用 import 实现生产环境的路由懒加载 - return () => import(`@/views/${view}`) - } -} - -export default permission diff --git a/solution-ui/src/store/modules/settings.js b/solution-ui/src/store/modules/settings.js deleted file mode 100644 index 1e37148..0000000 --- a/solution-ui/src/store/modules/settings.js +++ /dev/null @@ -1,50 +0,0 @@ -import defaultSettings from '@/settings' -import { useDynamicTitle } from '@/utils/dynamicTitle' - -const { sideTheme, showSettings, navType, tagsView, tagsIcon, fixedHeader, sidebarLogo, dynamicTitle, footerVisible, footerContent } = defaultSettings - -const storageSetting = JSON.parse(localStorage.getItem('layout-setting')) || '' -const state = { - title: '', - theme: storageSetting.theme || '#409EFF', - sideTheme: storageSetting.sideTheme || sideTheme, - showSettings: showSettings, - navType: storageSetting.navType === undefined ? navType : storageSetting.navType, - tagsView: storageSetting.tagsView === undefined ? tagsView : storageSetting.tagsView, - tagsIcon: storageSetting.tagsIcon === undefined ? tagsIcon : storageSetting.tagsIcon, - fixedHeader: storageSetting.fixedHeader === undefined ? fixedHeader : storageSetting.fixedHeader, - sidebarLogo: storageSetting.sidebarLogo === undefined ? sidebarLogo : storageSetting.sidebarLogo, - dynamicTitle: storageSetting.dynamicTitle === undefined ? dynamicTitle : storageSetting.dynamicTitle, - footerVisible: storageSetting.footerVisible === undefined ? footerVisible : storageSetting.footerVisible, - footerContent: footerContent -} -const mutations = { - CHANGE_SETTING: (state, { key, value }) => { - if (state.hasOwnProperty(key)) { - state[key] = value - } - }, - SET_TITLE: (state, title) => { - state.title = title - } -} - -const actions = { - // 修改布局设置 - changeSetting({ commit }, data) { - commit('CHANGE_SETTING', data) - }, - // 设置网页标题 - setTitle({ commit }, title) { - commit('SET_TITLE', title) - useDynamicTitle() - } -} - -export default { - namespaced: true, - state, - mutations, - actions -} - diff --git a/solution-ui/src/store/modules/tagsView.js b/solution-ui/src/store/modules/tagsView.js deleted file mode 100644 index 5fc011c..0000000 --- a/solution-ui/src/store/modules/tagsView.js +++ /dev/null @@ -1,228 +0,0 @@ -const state = { - visitedViews: [], - cachedViews: [], - iframeViews: [] -} - -const mutations = { - ADD_IFRAME_VIEW: (state, view) => { - if (state.iframeViews.some(v => v.path === view.path)) return - state.iframeViews.push( - Object.assign({}, view, { - title: view.meta.title || 'no-name' - }) - ) - }, - ADD_VISITED_VIEW: (state, view) => { - if (state.visitedViews.some(v => v.path === view.path)) return - state.visitedViews.push( - Object.assign({}, view, { - title: view.meta.title || 'no-name' - }) - ) - }, - ADD_CACHED_VIEW: (state, view) => { - if (state.cachedViews.includes(view.name)) return - if (view.meta && !view.meta.noCache) { - state.cachedViews.push(view.name) - } - }, - DEL_VISITED_VIEW: (state, view) => { - for (const [i, v] of state.visitedViews.entries()) { - if (v.path === view.path) { - state.visitedViews.splice(i, 1) - break - } - } - state.iframeViews = state.iframeViews.filter(item => item.path !== view.path) - }, - DEL_IFRAME_VIEW: (state, view) => { - state.iframeViews = state.iframeViews.filter(item => item.path !== view.path) - }, - DEL_CACHED_VIEW: (state, view) => { - const index = state.cachedViews.indexOf(view.name) - index > -1 && state.cachedViews.splice(index, 1) - }, - - DEL_OTHERS_VISITED_VIEWS: (state, view) => { - state.visitedViews = state.visitedViews.filter(v => { - return v.meta.affix || v.path === view.path - }) - state.iframeViews = state.iframeViews.filter(item => item.path === view.path) - }, - DEL_OTHERS_CACHED_VIEWS: (state, view) => { - const index = state.cachedViews.indexOf(view.name) - if (index > -1) { - state.cachedViews = state.cachedViews.slice(index, index + 1) - } else { - state.cachedViews = [] - } - }, - DEL_ALL_VISITED_VIEWS: state => { - // keep affix tags - const affixTags = state.visitedViews.filter(tag => tag.meta.affix) - state.visitedViews = affixTags - state.iframeViews = [] - }, - DEL_ALL_CACHED_VIEWS: state => { - state.cachedViews = [] - }, - UPDATE_VISITED_VIEW: (state, view) => { - for (let v of state.visitedViews) { - if (v.path === view.path) { - v = Object.assign(v, view) - break - } - } - }, - DEL_RIGHT_VIEWS: (state, view) => { - const index = state.visitedViews.findIndex(v => v.path === view.path) - if (index === -1) { - return - } - state.visitedViews = state.visitedViews.filter((item, idx) => { - if (idx <= index || (item.meta && item.meta.affix)) { - return true - } - const i = state.cachedViews.indexOf(item.name) - if (i > -1) { - state.cachedViews.splice(i, 1) - } - if(item.meta.link) { - const fi = state.iframeViews.findIndex(v => v.path === item.path) - state.iframeViews.splice(fi, 1) - } - return false - }) - }, - DEL_LEFT_VIEWS: (state, view) => { - const index = state.visitedViews.findIndex(v => v.path === view.path) - if (index === -1) { - return - } - state.visitedViews = state.visitedViews.filter((item, idx) => { - if (idx >= index || (item.meta && item.meta.affix)) { - return true - } - const i = state.cachedViews.indexOf(item.name) - if (i > -1) { - state.cachedViews.splice(i, 1) - } - if(item.meta.link) { - const fi = state.iframeViews.findIndex(v => v.path === item.path) - state.iframeViews.splice(fi, 1) - } - return false - }) - } -} - -const actions = { - addView({ dispatch }, view) { - dispatch('addVisitedView', view) - dispatch('addCachedView', view) - }, - addIframeView({ commit }, view) { - commit('ADD_IFRAME_VIEW', view) - }, - addVisitedView({ commit }, view) { - commit('ADD_VISITED_VIEW', view) - }, - addCachedView({ commit }, view) { - commit('ADD_CACHED_VIEW', view) - }, - delView({ dispatch, state }, view) { - return new Promise(resolve => { - dispatch('delVisitedView', view) - dispatch('delCachedView', view) - resolve({ - visitedViews: [...state.visitedViews], - cachedViews: [...state.cachedViews] - }) - }) - }, - delVisitedView({ commit, state }, view) { - return new Promise(resolve => { - commit('DEL_VISITED_VIEW', view) - resolve([...state.visitedViews]) - }) - }, - delIframeView({ commit, state }, view) { - return new Promise(resolve => { - commit('DEL_IFRAME_VIEW', view) - resolve([...state.iframeViews]) - }) - }, - delCachedView({ commit, state }, view) { - return new Promise(resolve => { - commit('DEL_CACHED_VIEW', view) - resolve([...state.cachedViews]) - }) - }, - delOthersViews({ dispatch, state }, view) { - return new Promise(resolve => { - dispatch('delOthersVisitedViews', view) - dispatch('delOthersCachedViews', view) - resolve({ - visitedViews: [...state.visitedViews], - cachedViews: [...state.cachedViews] - }) - }) - }, - delOthersVisitedViews({ commit, state }, view) { - return new Promise(resolve => { - commit('DEL_OTHERS_VISITED_VIEWS', view) - resolve([...state.visitedViews]) - }) - }, - delOthersCachedViews({ commit, state }, view) { - return new Promise(resolve => { - commit('DEL_OTHERS_CACHED_VIEWS', view) - resolve([...state.cachedViews]) - }) - }, - delAllViews({ dispatch, state }, view) { - return new Promise(resolve => { - dispatch('delAllVisitedViews', view) - dispatch('delAllCachedViews', view) - resolve({ - visitedViews: [...state.visitedViews], - cachedViews: [...state.cachedViews] - }) - }) - }, - delAllVisitedViews({ commit, state }) { - return new Promise(resolve => { - commit('DEL_ALL_VISITED_VIEWS') - resolve([...state.visitedViews]) - }) - }, - delAllCachedViews({ commit, state }) { - return new Promise(resolve => { - commit('DEL_ALL_CACHED_VIEWS') - resolve([...state.cachedViews]) - }) - }, - updateVisitedView({ commit }, view) { - commit('UPDATE_VISITED_VIEW', view) - }, - delRightTags({ commit }, view) { - return new Promise(resolve => { - commit('DEL_RIGHT_VIEWS', view) - resolve([...state.visitedViews]) - }) - }, - delLeftTags({ commit }, view) { - return new Promise(resolve => { - commit('DEL_LEFT_VIEWS', view) - resolve([...state.visitedViews]) - }) - }, -} - -export default { - namespaced: true, - state, - mutations, - actions -} diff --git a/solution-ui/src/store/modules/user.js b/solution-ui/src/store/modules/user.js deleted file mode 100644 index 6a7b710..0000000 --- a/solution-ui/src/store/modules/user.js +++ /dev/null @@ -1,125 +0,0 @@ -import router from '@/router' -import { MessageBox, } from 'element-ui' -import { login, logout, getInfo } from '@/api/login' -import { getToken, setToken, removeToken } from '@/utils/auth' -import { isHttp, isEmpty } from "@/utils/validate" -import defAva from '@/assets/images/profile.jpg' - -const user = { - state: { - token: getToken(), - id: '', - name: '', - nickName: '', - avatar: '', - roles: [], - permissions: [] - }, - - mutations: { - SET_TOKEN: (state, token) => { - state.token = token - }, - SET_ID: (state, id) => { - state.id = id - }, - SET_NAME: (state, name) => { - state.name = name - }, - SET_NICK_NAME: (state, nickName) => { - state.nickName = nickName - }, - SET_AVATAR: (state, avatar) => { - state.avatar = avatar - }, - SET_ROLES: (state, roles) => { - state.roles = roles - }, - SET_PERMISSIONS: (state, permissions) => { - state.permissions = permissions - } - }, - - actions: { - // 登录 - Login({ commit }, userInfo) { - const username = userInfo.username.trim() - const password = userInfo.password - const code = userInfo.code - const uuid = userInfo.uuid - return new Promise((resolve, reject) => { - login(username, password, code, uuid).then(res => { - setToken(res.token) - commit('SET_TOKEN', res.token) - resolve() - }).catch(error => { - reject(error) - }) - }) - }, - - // 获取用户信息 - GetInfo({ commit, state }) { - return new Promise((resolve, reject) => { - getInfo().then(res => { - const user = res.user - let avatar = user.avatar || "" - if (!isHttp(avatar)) { - avatar = (isEmpty(avatar)) ? defAva : process.env.VUE_APP_BASE_API + avatar - } - if (res.roles && res.roles.length > 0) { // 验证返回的roles是否是一个非空数组 - commit('SET_ROLES', res.roles) - commit('SET_PERMISSIONS', res.permissions) - } else { - commit('SET_ROLES', ['ROLE_DEFAULT']) - } - commit('SET_ID', user.userId) - commit('SET_NAME', user.userName) - commit('SET_NICK_NAME', user.nickName) - commit('SET_AVATAR', avatar) - /* 初始密码提示 */ - if(res.isDefaultModifyPwd) { - MessageBox.confirm('您的密码还是初始密码,请修改密码!', '安全提示', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' }).then(() => { - router.push({ name: 'Profile', params: { activeTab: 'resetPwd' } }) - }).catch(() => {}) - } - /* 过期密码提示 */ - if(!res.isDefaultModifyPwd && res.isPasswordExpired) { - MessageBox.confirm('您的密码已过期,请尽快修改密码!', '安全提示', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' }).then(() => { - router.push({ name: 'Profile', params: { activeTab: 'resetPwd' } }) - }).catch(() => {}) - } - resolve(res) - }).catch(error => { - reject(error) - }) - }) - }, - - // 退出系统 - LogOut({ commit, state }) { - return new Promise((resolve, reject) => { - logout(state.token).then(() => { - commit('SET_TOKEN', '') - commit('SET_ROLES', []) - commit('SET_PERMISSIONS', []) - removeToken() - resolve() - }).catch(error => { - reject(error) - }) - }) - }, - - // 前端 登出 - FedLogOut({ commit }) { - return new Promise(resolve => { - commit('SET_TOKEN', '') - removeToken() - resolve() - }) - } - } -} - -export default user diff --git a/solution-ui/src/utils/auth.js b/solution-ui/src/utils/auth.js deleted file mode 100644 index 08a43d6..0000000 --- a/solution-ui/src/utils/auth.js +++ /dev/null @@ -1,15 +0,0 @@ -import Cookies from 'js-cookie' - -const TokenKey = 'Admin-Token' - -export function getToken() { - return Cookies.get(TokenKey) -} - -export function setToken(token) { - return Cookies.set(TokenKey, token) -} - -export function removeToken() { - return Cookies.remove(TokenKey) -} diff --git a/solution-ui/src/utils/dict/Dict.js b/solution-ui/src/utils/dict/Dict.js deleted file mode 100644 index 994f6f7..0000000 --- a/solution-ui/src/utils/dict/Dict.js +++ /dev/null @@ -1,82 +0,0 @@ -import Vue from 'vue' -import { mergeRecursive } from "@/utils/ruoyi" -import DictMeta from './DictMeta' -import DictData from './DictData' - -const DEFAULT_DICT_OPTIONS = { - types: [], -} - -/** - * @classdesc 字典 - * @property {Object} label 标签对象,内部属性名为字典类型名称 - * @property {Object} dict 字段数组,内部属性名为字典类型名称 - * @property {Array.} _dictMetas 字典元数据数组 - */ -export default class Dict { - constructor() { - this.owner = null - this.label = {} - this.type = {} - } - - init(options) { - if (options instanceof Array) { - options = { types: options } - } - const opts = mergeRecursive(DEFAULT_DICT_OPTIONS, options) - if (opts.types === undefined) { - throw new Error('need dict types') - } - const ps = [] - this._dictMetas = opts.types.map(t => DictMeta.parse(t)) - this._dictMetas.forEach(dictMeta => { - const type = dictMeta.type - Vue.set(this.label, type, {}) - Vue.set(this.type, type, []) - if (dictMeta.lazy) { - return - } - ps.push(loadDict(this, dictMeta)) - }) - return Promise.all(ps) - } - - /** - * 重新加载字典 - * @param {String} type 字典类型 - */ - reloadDict(type) { - const dictMeta = this._dictMetas.find(e => e.type === type) - if (dictMeta === undefined) { - return Promise.reject(`the dict meta of ${type} was not found`) - } - return loadDict(this, dictMeta) - } -} - -/** - * 加载字典 - * @param {Dict} dict 字典 - * @param {DictMeta} dictMeta 字典元数据 - * @returns {Promise} - */ -function loadDict(dict, dictMeta) { - return dictMeta.request(dictMeta) - .then(response => { - const type = dictMeta.type - let dicts = dictMeta.responseConverter(response, dictMeta) - if (!(dicts instanceof Array)) { - console.error('the return of responseConverter must be Array.') - dicts = [] - } else if (dicts.filter(d => d instanceof DictData).length !== dicts.length) { - console.error('the type of elements in dicts must be DictData') - dicts = [] - } - dict.type[type].splice(0, Number.MAX_SAFE_INTEGER, ...dicts) - dicts.forEach(d => { - Vue.set(dict.label[type], d.value, d.label) - }) - return dicts - }) -} diff --git a/solution-ui/src/utils/dict/DictConverter.js b/solution-ui/src/utils/dict/DictConverter.js deleted file mode 100644 index 0cf5df8..0000000 --- a/solution-ui/src/utils/dict/DictConverter.js +++ /dev/null @@ -1,17 +0,0 @@ -import DictOptions from './DictOptions' -import DictData from './DictData' - -export default function(dict, dictMeta) { - const label = determineDictField(dict, dictMeta.labelField, ...DictOptions.DEFAULT_LABEL_FIELDS) - const value = determineDictField(dict, dictMeta.valueField, ...DictOptions.DEFAULT_VALUE_FIELDS) - return new DictData(dict[label], dict[value], dict) -} - -/** - * 确定字典字段 - * @param {DictData} dict - * @param {...String} fields - */ -function determineDictField(dict, ...fields) { - return fields.find(f => Object.prototype.hasOwnProperty.call(dict, f)) -} diff --git a/solution-ui/src/utils/dict/DictData.js b/solution-ui/src/utils/dict/DictData.js deleted file mode 100644 index afc763e..0000000 --- a/solution-ui/src/utils/dict/DictData.js +++ /dev/null @@ -1,13 +0,0 @@ -/** - * @classdesc 字典数据 - * @property {String} label 标签 - * @property {*} value 标签 - * @property {Object} raw 原始数据 - */ -export default class DictData { - constructor(label, value, raw) { - this.label = label - this.value = value - this.raw = raw - } -} diff --git a/solution-ui/src/utils/dict/DictMeta.js b/solution-ui/src/utils/dict/DictMeta.js deleted file mode 100644 index 617cc00..0000000 --- a/solution-ui/src/utils/dict/DictMeta.js +++ /dev/null @@ -1,38 +0,0 @@ -import { mergeRecursive } from "@/utils/ruoyi" -import DictOptions from './DictOptions' - -/** - * @classdesc 字典元数据 - * @property {String} type 类型 - * @property {Function} request 请求 - * @property {String} label 标签字段 - * @property {String} value 值字段 - */ -export default class DictMeta { - constructor(options) { - this.type = options.type - this.request = options.request - this.responseConverter = options.responseConverter - this.labelField = options.labelField - this.valueField = options.valueField - this.lazy = options.lazy === true - } -} - - -/** - * 解析字典元数据 - * @param {Object} options - * @returns {DictMeta} - */ -DictMeta.parse= function(options) { - let opts = null - if (typeof options === 'string') { - opts = DictOptions.metas[options] || {} - opts.type = options - } else if (typeof options === 'object') { - opts = options - } - opts = mergeRecursive(DictOptions.metas['*'], opts) - return new DictMeta(opts) -} diff --git a/solution-ui/src/utils/dict/DictOptions.js b/solution-ui/src/utils/dict/DictOptions.js deleted file mode 100644 index 5fd1425..0000000 --- a/solution-ui/src/utils/dict/DictOptions.js +++ /dev/null @@ -1,51 +0,0 @@ -import { mergeRecursive } from "@/utils/ruoyi" -import dictConverter from './DictConverter' - -export const options = { - metas: { - '*': { - /** - * 字典请求,方法签名为function(dictMeta: DictMeta): Promise - */ - request: (dictMeta) => { - console.log(`load dict ${dictMeta.type}`) - return Promise.resolve([]) - }, - /** - * 字典响应数据转换器,方法签名为function(response: Object, dictMeta: DictMeta): DictData - */ - responseConverter, - labelField: 'label', - valueField: 'value', - }, - }, - /** - * 默认标签字段 - */ - DEFAULT_LABEL_FIELDS: ['label', 'name', 'title'], - /** - * 默认值字段 - */ - DEFAULT_VALUE_FIELDS: ['value', 'id', 'uid', 'key'], -} - -/** - * 映射字典 - * @param {Object} response 字典数据 - * @param {DictMeta} dictMeta 字典元数据 - * @returns {DictData} - */ -function responseConverter(response, dictMeta) { - const dicts = response.content instanceof Array ? response.content : response - if (dicts === undefined) { - console.warn(`no dict data of "${dictMeta.type}" found in the response`) - return [] - } - return dicts.map(d => dictConverter(d, dictMeta)) -} - -export function mergeOptions(src) { - mergeRecursive(options, src) -} - -export default options diff --git a/solution-ui/src/utils/dict/index.js b/solution-ui/src/utils/dict/index.js deleted file mode 100644 index 215eb9e..0000000 --- a/solution-ui/src/utils/dict/index.js +++ /dev/null @@ -1,33 +0,0 @@ -import Dict from './Dict' -import { mergeOptions } from './DictOptions' - -export default function(Vue, options) { - mergeOptions(options) - Vue.mixin({ - data() { - if (this.$options === undefined || this.$options.dicts === undefined || this.$options.dicts === null) { - return {} - } - const dict = new Dict() - dict.owner = this - return { - dict - } - }, - created() { - if (!(this.dict instanceof Dict)) { - return - } - options.onCreated && options.onCreated(this.dict) - this.dict.init(this.$options.dicts).then(() => { - options.onReady && options.onReady(this.dict) - this.$nextTick(() => { - this.$emit('dictReady', this.dict) - if (this.$options.methods && this.$options.methods.onDictReady instanceof Function) { - this.$options.methods.onDictReady.call(this, this.dict) - } - }) - }) - }, - }) -} diff --git a/solution-ui/src/utils/dynamicTitle.js b/solution-ui/src/utils/dynamicTitle.js deleted file mode 100644 index 1b57efb..0000000 --- a/solution-ui/src/utils/dynamicTitle.js +++ /dev/null @@ -1,13 +0,0 @@ -import store from '@/store' -import defaultSettings from '@/settings' - -/** - * 动态修改标题 - */ -export function useDynamicTitle() { - if (store.state.settings.dynamicTitle) { - document.title = store.state.settings.title + ' - ' + defaultSettings.title - } else { - document.title = defaultSettings.title - } -} \ No newline at end of file diff --git a/solution-ui/src/utils/errorCode.js b/solution-ui/src/utils/errorCode.js deleted file mode 100644 index d2111ee..0000000 --- a/solution-ui/src/utils/errorCode.js +++ /dev/null @@ -1,6 +0,0 @@ -export default { - '401': '认证失败,无法访问系统资源', - '403': '当前操作没有权限', - '404': '访问资源不存在', - 'default': '系统未知错误,请反馈给管理员' -} diff --git a/solution-ui/src/utils/generator/config.js b/solution-ui/src/utils/generator/config.js deleted file mode 100644 index 7abf227..0000000 --- a/solution-ui/src/utils/generator/config.js +++ /dev/null @@ -1,438 +0,0 @@ -export const formConf = { - formRef: 'elForm', - formModel: 'formData', - size: 'medium', - labelPosition: 'right', - labelWidth: 100, - formRules: 'rules', - gutter: 15, - disabled: false, - span: 24, - formBtns: true -} - -export const inputComponents = [ - { - label: '单行文本', - tag: 'el-input', - tagIcon: 'input', - placeholder: '请输入', - defaultValue: undefined, - span: 24, - labelWidth: null, - style: { width: '100%' }, - clearable: true, - prepend: '', - append: '', - 'prefix-icon': '', - 'suffix-icon': '', - maxlength: null, - 'show-word-limit': false, - readonly: false, - disabled: false, - required: true, - regList: [], - changeTag: true, - document: 'https://element.eleme.cn/#/zh-CN/component/input' - }, - { - label: '多行文本', - tag: 'el-input', - tagIcon: 'textarea', - type: 'textarea', - placeholder: '请输入', - defaultValue: undefined, - span: 24, - labelWidth: null, - autosize: { - minRows: 4, - maxRows: 4 - }, - style: { width: '100%' }, - maxlength: null, - 'show-word-limit': false, - readonly: false, - disabled: false, - required: true, - regList: [], - changeTag: true, - document: 'https://element.eleme.cn/#/zh-CN/component/input' - }, - { - label: '密码', - tag: 'el-input', - tagIcon: 'password', - placeholder: '请输入', - defaultValue: undefined, - span: 24, - 'show-password': true, - labelWidth: null, - style: { width: '100%' }, - clearable: true, - prepend: '', - append: '', - 'prefix-icon': '', - 'suffix-icon': '', - maxlength: null, - 'show-word-limit': false, - readonly: false, - disabled: false, - required: true, - regList: [], - changeTag: true, - document: 'https://element.eleme.cn/#/zh-CN/component/input' - }, - { - label: '计数器', - tag: 'el-input-number', - tagIcon: 'number', - placeholder: '', - defaultValue: undefined, - span: 24, - labelWidth: null, - min: undefined, - max: undefined, - step: undefined, - 'step-strictly': false, - precision: undefined, - 'controls-position': '', - disabled: false, - required: true, - regList: [], - changeTag: true, - document: 'https://element.eleme.cn/#/zh-CN/component/input-number' - } -] - -export const selectComponents = [ - { - label: '下拉选择', - tag: 'el-select', - tagIcon: 'select', - placeholder: '请选择', - defaultValue: undefined, - span: 24, - labelWidth: null, - style: { width: '100%' }, - clearable: true, - disabled: false, - required: true, - filterable: false, - multiple: false, - options: [{ - label: '选项一', - value: 1 - }, { - label: '选项二', - value: 2 - }], - regList: [], - changeTag: true, - document: 'https://element.eleme.cn/#/zh-CN/component/select' - }, - { - label: '级联选择', - tag: 'el-cascader', - tagIcon: 'cascader', - placeholder: '请选择', - defaultValue: [], - span: 24, - labelWidth: null, - style: { width: '100%' }, - props: { - props: { - multiple: false - } - }, - 'show-all-levels': true, - disabled: false, - clearable: true, - filterable: false, - required: true, - options: [{ - id: 1, - value: 1, - label: '选项1', - children: [{ - id: 2, - value: 2, - label: '选项1-1' - }] - }], - dataType: 'dynamic', - labelKey: 'label', - valueKey: 'value', - childrenKey: 'children', - separator: '/', - regList: [], - changeTag: true, - document: 'https://element.eleme.cn/#/zh-CN/component/cascader' - }, - { - label: '单选框组', - tag: 'el-radio-group', - tagIcon: 'radio', - defaultValue: undefined, - span: 24, - labelWidth: null, - style: {}, - optionType: 'default', - border: false, - size: 'medium', - disabled: false, - required: true, - options: [{ - label: '选项一', - value: 1 - }, { - label: '选项二', - value: 2 - }], - regList: [], - changeTag: true, - document: 'https://element.eleme.cn/#/zh-CN/component/radio' - }, - { - label: '多选框组', - tag: 'el-checkbox-group', - tagIcon: 'checkbox', - defaultValue: [], - span: 24, - labelWidth: null, - style: {}, - optionType: 'default', - border: false, - size: 'medium', - disabled: false, - required: true, - options: [{ - label: '选项一', - value: 1 - }, { - label: '选项二', - value: 2 - }], - regList: [], - changeTag: true, - document: 'https://element.eleme.cn/#/zh-CN/component/checkbox' - }, - { - label: '开关', - tag: 'el-switch', - tagIcon: 'switch', - defaultValue: false, - span: 24, - labelWidth: null, - style: {}, - disabled: false, - required: true, - 'active-text': '', - 'inactive-text': '', - 'active-color': null, - 'inactive-color': null, - 'active-value': true, - 'inactive-value': false, - regList: [], - changeTag: true, - document: 'https://element.eleme.cn/#/zh-CN/component/switch' - }, - { - label: '滑块', - tag: 'el-slider', - tagIcon: 'slider', - defaultValue: null, - span: 24, - labelWidth: null, - disabled: false, - required: true, - min: 0, - max: 100, - step: 1, - 'show-stops': false, - range: false, - regList: [], - changeTag: true, - document: 'https://element.eleme.cn/#/zh-CN/component/slider' - }, - { - label: '时间选择', - tag: 'el-time-picker', - tagIcon: 'time', - placeholder: '请选择', - defaultValue: null, - span: 24, - labelWidth: null, - style: { width: '100%' }, - disabled: false, - clearable: true, - required: true, - 'picker-options': { - selectableRange: '00:00:00-23:59:59' - }, - format: 'HH:mm:ss', - 'value-format': 'HH:mm:ss', - regList: [], - changeTag: true, - document: 'https://element.eleme.cn/#/zh-CN/component/time-picker' - }, - { - label: '时间范围', - tag: 'el-time-picker', - tagIcon: 'time-range', - defaultValue: null, - span: 24, - labelWidth: null, - style: { width: '100%' }, - disabled: false, - clearable: true, - required: true, - 'is-range': true, - 'range-separator': '至', - 'start-placeholder': '开始时间', - 'end-placeholder': '结束时间', - format: 'HH:mm:ss', - 'value-format': 'HH:mm:ss', - regList: [], - changeTag: true, - document: 'https://element.eleme.cn/#/zh-CN/component/time-picker' - }, - { - label: '日期选择', - tag: 'el-date-picker', - tagIcon: 'date', - placeholder: '请选择', - defaultValue: null, - type: 'date', - span: 24, - labelWidth: null, - style: { width: '100%' }, - disabled: false, - clearable: true, - required: true, - format: 'yyyy-MM-dd', - 'value-format': 'yyyy-MM-dd', - readonly: false, - regList: [], - changeTag: true, - document: 'https://element.eleme.cn/#/zh-CN/component/date-picker' - }, - { - label: '日期范围', - tag: 'el-date-picker', - tagIcon: 'date-range', - defaultValue: null, - span: 24, - labelWidth: null, - style: { width: '100%' }, - type: 'daterange', - 'range-separator': '至', - 'start-placeholder': '开始日期', - 'end-placeholder': '结束日期', - disabled: false, - clearable: true, - required: true, - format: 'yyyy-MM-dd', - 'value-format': 'yyyy-MM-dd', - readonly: false, - regList: [], - changeTag: true, - document: 'https://element.eleme.cn/#/zh-CN/component/date-picker' - }, - { - label: '评分', - tag: 'el-rate', - tagIcon: 'rate', - defaultValue: 0, - span: 24, - labelWidth: null, - style: {}, - max: 5, - 'allow-half': false, - 'show-text': false, - 'show-score': false, - disabled: false, - required: true, - regList: [], - changeTag: true, - document: 'https://element.eleme.cn/#/zh-CN/component/rate' - }, - { - label: '颜色选择', - tag: 'el-color-picker', - tagIcon: 'color', - defaultValue: null, - labelWidth: null, - 'show-alpha': false, - 'color-format': '', - disabled: false, - required: true, - size: 'medium', - regList: [], - changeTag: true, - document: 'https://element.eleme.cn/#/zh-CN/component/color-picker' - }, - { - label: '上传', - tag: 'el-upload', - tagIcon: 'upload', - action: 'https://jsonplaceholder.typicode.com/posts/', - defaultValue: null, - labelWidth: null, - disabled: false, - required: true, - accept: '', - name: 'file', - 'auto-upload': true, - showTip: false, - buttonText: '点击上传', - fileSize: 2, - sizeUnit: 'MB', - 'list-type': 'text', - multiple: false, - regList: [], - changeTag: true, - document: 'https://element.eleme.cn/#/zh-CN/component/upload' - } -] - -export const layoutComponents = [ - { - layout: 'rowFormItem', - tagIcon: 'row', - type: 'default', - justify: 'start', - align: 'top', - label: '行容器', - layoutTree: true, - children: [], - document: 'https://element.eleme.cn/#/zh-CN/component/layout' - }, - { - layout: 'colFormItem', - label: '按钮', - changeTag: true, - labelWidth: null, - tag: 'el-button', - tagIcon: 'button', - span: 24, - default: '主要按钮', - type: 'primary', - icon: 'el-icon-search', - size: 'medium', - disabled: false, - document: 'https://element.eleme.cn/#/zh-CN/component/button' - } -] - -// 组件rule的触发方式,无触发方式的组件不生成rule -export const trigger = { - 'el-input': 'blur', - 'el-input-number': 'blur', - 'el-select': 'change', - 'el-radio-group': 'change', - 'el-checkbox-group': 'change', - 'el-cascader': 'change', - 'el-time-picker': 'change', - 'el-date-picker': 'change', - 'el-rate': 'change' -} diff --git a/solution-ui/src/utils/generator/css.js b/solution-ui/src/utils/generator/css.js deleted file mode 100644 index c1c62e6..0000000 --- a/solution-ui/src/utils/generator/css.js +++ /dev/null @@ -1,18 +0,0 @@ -const styles = { - 'el-rate': '.el-rate{display: inline-block; vertical-align: text-top;}', - 'el-upload': '.el-upload__tip{line-height: 1.2;}' -} - -function addCss(cssList, el) { - const css = styles[el.tag] - css && cssList.indexOf(css) === -1 && cssList.push(css) - if (el.children) { - el.children.forEach(el2 => addCss(cssList, el2)) - } -} - -export function makeUpCss(conf) { - const cssList = [] - conf.fields.forEach(el => addCss(cssList, el)) - return cssList.join('\n') -} diff --git a/solution-ui/src/utils/generator/drawingDefault.js b/solution-ui/src/utils/generator/drawingDefault.js deleted file mode 100644 index 18017a2..0000000 --- a/solution-ui/src/utils/generator/drawingDefault.js +++ /dev/null @@ -1,37 +0,0 @@ -export const drawingDefaultValue = [] - -export function initDrawingDefaultValue() { - if (drawingDefaultValue.length === 0) { - drawingDefaultValue.push({ - layout: 'colFormItem', - tagIcon: 'input', - label: '手机号', - vModel: 'mobile', - formId: 6, - tag: 'el-input', - placeholder: '请输入手机号', - defaultValue: '', - span: 24, - style: {width: '100%'}, - clearable: true, - prepend: '', - append: '', - 'prefix-icon': 'el-icon-mobile', - 'suffix-icon': '', - maxlength: 11, - 'show-word-limit': true, - readonly: false, - disabled: false, - required: true, - changeTag: true, - regList: [{ - pattern: '/^1(3|4|5|7|8|9)\\d{9}$/', - message: '手机号格式错误' - }] - }) - } -} - -export function cleanDrawingDefaultValue() { - drawingDefaultValue.splice(0, drawingDefaultValue.length) -} diff --git a/solution-ui/src/utils/generator/html.js b/solution-ui/src/utils/generator/html.js deleted file mode 100644 index 3b3388d..0000000 --- a/solution-ui/src/utils/generator/html.js +++ /dev/null @@ -1,358 +0,0 @@ -import { trigger } from './config' - -let confGlobal -let someSpanIsNot24 - -export function dialogWrapper(str) { - return ` - ${str} -
- 取消 - 确定 -
-
` -} - -export function vueTemplate(str) { - return `` -} - -export function vueScript(str) { - return `` -} - -export function cssStyle(cssStr) { - return `` -} - -function buildFormTemplate(conf, child, type) { - let labelPosition = '' - if (conf.labelPosition !== 'right') { - labelPosition = `label-position="${conf.labelPosition}"` - } - const disabled = conf.disabled ? `:disabled="${conf.disabled}"` : '' - let str = ` - ${child} - ${buildFromBtns(conf, type)} - ` - if (someSpanIsNot24) { - str = ` - ${str} - ` - } - return str -} - -function buildFromBtns(conf, type) { - let str = '' - if (conf.formBtns && type === 'file') { - str = ` - 提交 - 重置 - ` - if (someSpanIsNot24) { - str = ` - ${str} - ` - } - } - return str -} - -// span不为24的用el-col包裹 -function colWrapper(element, str) { - if (someSpanIsNot24 || element.span !== 24) { - return ` - ${str} - ` - } - return str -} - -const layouts = { - colFormItem(element) { - let labelWidth = '' - if (element.labelWidth && element.labelWidth !== confGlobal.labelWidth) { - labelWidth = `label-width="${element.labelWidth}px"` - } - const required = !trigger[element.tag] && element.required ? 'required' : '' - const tagDom = tags[element.tag] ? tags[element.tag](element) : null - let str = ` - ${tagDom} - ` - str = colWrapper(element, str) - return str - }, - rowFormItem(element) { - const type = element.type === 'default' ? '' : `type="${element.type}"` - const justify = element.type === 'default' ? '' : `justify="${element.justify}"` - const align = element.type === 'default' ? '' : `align="${element.align}"` - const gutter = element.gutter ? `gutter="${element.gutter}"` : '' - const children = element.children.map(el => layouts[el.layout](el)) - let str = ` - ${children.join('\n')} - ` - str = colWrapper(element, str) - return str - } -} - -const tags = { - 'el-button': el => { - const { - tag, disabled - } = attrBuilder(el) - const type = el.type ? `type="${el.type}"` : '' - const icon = el.icon ? `icon="${el.icon}"` : '' - const size = el.size ? `size="${el.size}"` : '' - let child = buildElButtonChild(el) - - if (child) child = `\n${child}\n` // 换行 - return `<${el.tag} ${type} ${icon} ${size} ${disabled}>${child}` - }, - 'el-input': el => { - const { - disabled, vModel, clearable, placeholder, width - } = attrBuilder(el) - const maxlength = el.maxlength ? `:maxlength="${el.maxlength}"` : '' - const showWordLimit = el['show-word-limit'] ? 'show-word-limit' : '' - const readonly = el.readonly ? 'readonly' : '' - const prefixIcon = el['prefix-icon'] ? `prefix-icon='${el['prefix-icon']}'` : '' - const suffixIcon = el['suffix-icon'] ? `suffix-icon='${el['suffix-icon']}'` : '' - const showPassword = el['show-password'] ? 'show-password' : '' - const type = el.type ? `type="${el.type}"` : '' - const autosize = el.autosize && el.autosize.minRows - ? `:autosize="{minRows: ${el.autosize.minRows}, maxRows: ${el.autosize.maxRows}}"` - : '' - let child = buildElInputChild(el) - - if (child) child = `\n${child}\n` // 换行 - return `<${el.tag} ${vModel} ${type} ${placeholder} ${maxlength} ${showWordLimit} ${readonly} ${disabled} ${clearable} ${prefixIcon} ${suffixIcon} ${showPassword} ${autosize} ${width}>${child}` - }, - 'el-input-number': el => { - const { disabled, vModel, placeholder } = attrBuilder(el) - const controlsPosition = el['controls-position'] ? `controls-position=${el['controls-position']}` : '' - const min = el.min ? `:min='${el.min}'` : '' - const max = el.max ? `:max='${el.max}'` : '' - const step = el.step ? `:step='${el.step}'` : '' - const stepStrictly = el['step-strictly'] ? 'step-strictly' : '' - const precision = el.precision ? `:precision='${el.precision}'` : '' - - return `<${el.tag} ${vModel} ${placeholder} ${step} ${stepStrictly} ${precision} ${controlsPosition} ${min} ${max} ${disabled}>` - }, - 'el-select': el => { - const { - disabled, vModel, clearable, placeholder, width - } = attrBuilder(el) - const filterable = el.filterable ? 'filterable' : '' - const multiple = el.multiple ? 'multiple' : '' - let child = buildElSelectChild(el) - - if (child) child = `\n${child}\n` // 换行 - return `<${el.tag} ${vModel} ${placeholder} ${disabled} ${multiple} ${filterable} ${clearable} ${width}>${child}` - }, - 'el-radio-group': el => { - const { disabled, vModel } = attrBuilder(el) - const size = `size="${el.size}"` - let child = buildElRadioGroupChild(el) - - if (child) child = `\n${child}\n` // 换行 - return `<${el.tag} ${vModel} ${size} ${disabled}>${child}` - }, - 'el-checkbox-group': el => { - const { disabled, vModel } = attrBuilder(el) - const size = `size="${el.size}"` - const min = el.min ? `:min="${el.min}"` : '' - const max = el.max ? `:max="${el.max}"` : '' - let child = buildElCheckboxGroupChild(el) - - if (child) child = `\n${child}\n` // 换行 - return `<${el.tag} ${vModel} ${min} ${max} ${size} ${disabled}>${child}` - }, - 'el-switch': el => { - const { disabled, vModel } = attrBuilder(el) - const activeText = el['active-text'] ? `active-text="${el['active-text']}"` : '' - const inactiveText = el['inactive-text'] ? `inactive-text="${el['inactive-text']}"` : '' - const activeColor = el['active-color'] ? `active-color="${el['active-color']}"` : '' - const inactiveColor = el['inactive-color'] ? `inactive-color="${el['inactive-color']}"` : '' - const activeValue = el['active-value'] !== true ? `:active-value='${JSON.stringify(el['active-value'])}'` : '' - const inactiveValue = el['inactive-value'] !== false ? `:inactive-value='${JSON.stringify(el['inactive-value'])}'` : '' - - return `<${el.tag} ${vModel} ${activeText} ${inactiveText} ${activeColor} ${inactiveColor} ${activeValue} ${inactiveValue} ${disabled}>` - }, - 'el-cascader': el => { - const { - disabled, vModel, clearable, placeholder, width - } = attrBuilder(el) - const options = el.options ? `:options="${el.vModel}Options"` : '' - const props = el.props ? `:props="${el.vModel}Props"` : '' - const showAllLevels = el['show-all-levels'] ? '' : ':show-all-levels="false"' - const filterable = el.filterable ? 'filterable' : '' - const separator = el.separator === '/' ? '' : `separator="${el.separator}"` - - return `<${el.tag} ${vModel} ${options} ${props} ${width} ${showAllLevels} ${placeholder} ${separator} ${filterable} ${clearable} ${disabled}>` - }, - 'el-slider': el => { - const { disabled, vModel } = attrBuilder(el) - const min = el.min ? `:min='${el.min}'` : '' - const max = el.max ? `:max='${el.max}'` : '' - const step = el.step ? `:step='${el.step}'` : '' - const range = el.range ? 'range' : '' - const showStops = el['show-stops'] ? `:show-stops="${el['show-stops']}"` : '' - - return `<${el.tag} ${min} ${max} ${step} ${vModel} ${range} ${showStops} ${disabled}>` - }, - 'el-time-picker': el => { - const { - disabled, vModel, clearable, placeholder, width - } = attrBuilder(el) - const startPlaceholder = el['start-placeholder'] ? `start-placeholder="${el['start-placeholder']}"` : '' - const endPlaceholder = el['end-placeholder'] ? `end-placeholder="${el['end-placeholder']}"` : '' - const rangeSeparator = el['range-separator'] ? `range-separator="${el['range-separator']}"` : '' - const isRange = el['is-range'] ? 'is-range' : '' - const format = el.format ? `format="${el.format}"` : '' - const valueFormat = el['value-format'] ? `value-format="${el['value-format']}"` : '' - const pickerOptions = el['picker-options'] ? `:picker-options='${JSON.stringify(el['picker-options'])}'` : '' - - return `<${el.tag} ${vModel} ${isRange} ${format} ${valueFormat} ${pickerOptions} ${width} ${placeholder} ${startPlaceholder} ${endPlaceholder} ${rangeSeparator} ${clearable} ${disabled}>` - }, - 'el-date-picker': el => { - const { - disabled, vModel, clearable, placeholder, width - } = attrBuilder(el) - const startPlaceholder = el['start-placeholder'] ? `start-placeholder="${el['start-placeholder']}"` : '' - const endPlaceholder = el['end-placeholder'] ? `end-placeholder="${el['end-placeholder']}"` : '' - const rangeSeparator = el['range-separator'] ? `range-separator="${el['range-separator']}"` : '' - const format = el.format ? `format="${el.format}"` : '' - const valueFormat = el['value-format'] ? `value-format="${el['value-format']}"` : '' - const type = el.type === 'date' ? '' : `type="${el.type}"` - const readonly = el.readonly ? 'readonly' : '' - - return `<${el.tag} ${type} ${vModel} ${format} ${valueFormat} ${width} ${placeholder} ${startPlaceholder} ${endPlaceholder} ${rangeSeparator} ${clearable} ${readonly} ${disabled}>` - }, - 'el-rate': el => { - const { disabled, vModel } = attrBuilder(el) - const max = el.max ? `:max='${el.max}'` : '' - const allowHalf = el['allow-half'] ? 'allow-half' : '' - const showText = el['show-text'] ? 'show-text' : '' - const showScore = el['show-score'] ? 'show-score' : '' - - return `<${el.tag} ${vModel} ${allowHalf} ${showText} ${showScore} ${disabled}>` - }, - 'el-color-picker': el => { - const { disabled, vModel } = attrBuilder(el) - const size = `size="${el.size}"` - const showAlpha = el['show-alpha'] ? 'show-alpha' : '' - const colorFormat = el['color-format'] ? `color-format="${el['color-format']}"` : '' - - return `<${el.tag} ${vModel} ${size} ${showAlpha} ${colorFormat} ${disabled}>` - }, - 'el-upload': el => { - const disabled = el.disabled ? ':disabled=\'true\'' : '' - const action = el.action ? `:action="${el.vModel}Action"` : '' - const multiple = el.multiple ? 'multiple' : '' - const listType = el['list-type'] !== 'text' ? `list-type="${el['list-type']}"` : '' - const accept = el.accept ? `accept="${el.accept}"` : '' - const name = el.name !== 'file' ? `name="${el.name}"` : '' - const autoUpload = el['auto-upload'] === false ? ':auto-upload="false"' : '' - const beforeUpload = `:before-upload="${el.vModel}BeforeUpload"` - const fileList = `:file-list="${el.vModel}fileList"` - const ref = `ref="${el.vModel}"` - let child = buildElUploadChild(el) - - if (child) child = `\n${child}\n` // 换行 - return `<${el.tag} ${ref} ${fileList} ${action} ${autoUpload} ${multiple} ${beforeUpload} ${listType} ${accept} ${name} ${disabled}>${child}` - } -} - -function attrBuilder(el) { - return { - vModel: `v-model="${confGlobal.formModel}.${el.vModel}"`, - clearable: el.clearable ? 'clearable' : '', - placeholder: el.placeholder ? `placeholder="${el.placeholder}"` : '', - width: el.style && el.style.width ? ':style="{width: \'100%\'}"' : '', - disabled: el.disabled ? ':disabled=\'true\'' : '' - } -} - -// el-buttin 子级 -function buildElButtonChild(conf) { - const children = [] - if (conf.default) { - children.push(conf.default) - } - return children.join('\n') -} - -// el-input innerHTML -function buildElInputChild(conf) { - const children = [] - if (conf.prepend) { - children.push(``) - } - if (conf.append) { - children.push(``) - } - return children.join('\n') -} - -function buildElSelectChild(conf) { - const children = [] - if (conf.options && conf.options.length) { - children.push(``) - } - return children.join('\n') -} - -function buildElRadioGroupChild(conf) { - const children = [] - if (conf.options && conf.options.length) { - const tag = conf.optionType === 'button' ? 'el-radio-button' : 'el-radio' - const border = conf.border ? 'border' : '' - children.push(`<${tag} v-for="(item, index) in ${conf.vModel}Options" :key="index" :label="item.value" :disabled="item.disabled" ${border}>{{item.label}}`) - } - return children.join('\n') -} - -function buildElCheckboxGroupChild(conf) { - const children = [] - if (conf.options && conf.options.length) { - const tag = conf.optionType === 'button' ? 'el-checkbox-button' : 'el-checkbox' - const border = conf.border ? 'border' : '' - children.push(`<${tag} v-for="(item, index) in ${conf.vModel}Options" :key="index" :label="item.value" :disabled="item.disabled" ${border}>{{item.label}}`) - } - return children.join('\n') -} - -function buildElUploadChild(conf) { - const list = [] - if (conf['list-type'] === 'picture-card') list.push('') - else list.push(`${conf.buttonText}`) - if (conf.showTip) list.push(`
只能上传不超过 ${conf.fileSize}${conf.sizeUnit} 的${conf.accept}文件
`) - return list.join('\n') -} - -export function makeUpHtml(conf, type) { - const htmlList = [] - confGlobal = conf - someSpanIsNot24 = conf.fields.some(item => item.span !== 24) - conf.fields.forEach(el => { - htmlList.push(layouts[el.layout](el)) - }) - const htmlStr = htmlList.join('\n') - - let temp = buildFormTemplate(conf, htmlStr, type) - if (type === 'dialog') { - temp = dialogWrapper(temp) - } - confGlobal = null - return temp -} diff --git a/solution-ui/src/utils/generator/icon.json b/solution-ui/src/utils/generator/icon.json deleted file mode 100644 index 2d9999a..0000000 --- a/solution-ui/src/utils/generator/icon.json +++ /dev/null @@ -1 +0,0 @@ -["platform-eleme","eleme","delete-solid","delete","s-tools","setting","user-solid","user","phone","phone-outline","more","more-outline","star-on","star-off","s-goods","goods","warning","warning-outline","question","info","remove","circle-plus","success","error","zoom-in","zoom-out","remove-outline","circle-plus-outline","circle-check","circle-close","s-help","help","minus","plus","check","close","picture","picture-outline","picture-outline-round","upload","upload2","download","camera-solid","camera","video-camera-solid","video-camera","message-solid","bell","s-cooperation","s-order","s-platform","s-fold","s-unfold","s-operation","s-promotion","s-home","s-release","s-ticket","s-management","s-open","s-shop","s-marketing","s-flag","s-comment","s-finance","s-claim","s-custom","s-opportunity","s-data","s-check","s-grid","menu","share","d-caret","caret-left","caret-right","caret-bottom","caret-top","bottom-left","bottom-right","back","right","bottom","top","top-left","top-right","arrow-left","arrow-right","arrow-down","arrow-up","d-arrow-left","d-arrow-right","video-pause","video-play","refresh","refresh-right","refresh-left","finished","sort","sort-up","sort-down","rank","loading","view","c-scale-to-original","date","edit","edit-outline","folder","folder-opened","folder-add","folder-remove","folder-delete","folder-checked","tickets","document-remove","document-delete","document-copy","document-checked","document","document-add","printer","paperclip","takeaway-box","search","monitor","attract","mobile","scissors","umbrella","headset","brush","mouse","coordinate","magic-stick","reading","data-line","data-board","pie-chart","data-analysis","collection-tag","film","suitcase","suitcase-1","receiving","collection","files","notebook-1","notebook-2","toilet-paper","office-building","school","table-lamp","house","no-smoking","smoking","shopping-cart-full","shopping-cart-1","shopping-cart-2","shopping-bag-1","shopping-bag-2","sold-out","sell","present","box","bank-card","money","coin","wallet","discount","price-tag","news","guide","male","female","thumb","cpu","link","connection","open","turn-off","set-up","chat-round","chat-line-round","chat-square","chat-dot-round","chat-dot-square","chat-line-square","message","postcard","position","turn-off-microphone","microphone","close-notification","bangzhu","time","odometer","crop","aim","switch-button","full-screen","copy-document","mic","stopwatch","medal-1","medal","trophy","trophy-1","first-aid-kit","discover","place","location","location-outline","location-information","add-location","delete-location","map-location","alarm-clock","timer","watch-1","watch","lock","unlock","key","service","mobile-phone","bicycle","truck","ship","basketball","football","soccer","baseball","wind-power","light-rain","lightning","heavy-rain","sunrise","sunrise-1","sunset","sunny","cloudy","partly-cloudy","cloudy-and-sunny","moon","moon-night","dish","dish-1","food","chicken","fork-spoon","knife-fork","burger","tableware","sugar","dessert","ice-cream","hot-water","water-cup","coffee-cup","cold-drink","goblet","goblet-full","goblet-square","goblet-square-full","refrigerator","grape","watermelon","cherry","apple","pear","orange","coffee","ice-tea","ice-drink","milk-tea","potato-strips","lollipop","ice-cream-square","ice-cream-round"] \ No newline at end of file diff --git a/solution-ui/src/utils/generator/js.js b/solution-ui/src/utils/generator/js.js deleted file mode 100644 index ee8668d..0000000 --- a/solution-ui/src/utils/generator/js.js +++ /dev/null @@ -1,235 +0,0 @@ -import { exportDefault, titleCase } from '@/utils/index' -import { trigger } from './config' - -const units = { - KB: '1024', - MB: '1024 / 1024', - GB: '1024 / 1024 / 1024' -} -let confGlobal -const inheritAttrs = { - file: '', - dialog: 'inheritAttrs: false,' -} - - -export function makeUpJs(conf, type) { - confGlobal = conf = JSON.parse(JSON.stringify(conf)) - const dataList = [] - const ruleList = [] - const optionsList = [] - const propsList = [] - const methodList = mixinMethod(type) - const uploadVarList = [] - - conf.fields.forEach(el => { - buildAttributes(el, dataList, ruleList, optionsList, methodList, propsList, uploadVarList) - }) - - const script = buildexport( - conf, - type, - dataList.join('\n'), - ruleList.join('\n'), - optionsList.join('\n'), - uploadVarList.join('\n'), - propsList.join('\n'), - methodList.join('\n') - ) - confGlobal = null - return script -} - -function buildAttributes(el, dataList, ruleList, optionsList, methodList, propsList, uploadVarList) { - buildData(el, dataList) - buildRules(el, ruleList) - - if (el.options && el.options.length) { - buildOptions(el, optionsList) - if (el.dataType === 'dynamic') { - const model = `${el.vModel}Options` - const options = titleCase(model) - buildOptionMethod(`get${options}`, model, methodList) - } - } - - if (el.props && el.props.props) { - buildProps(el, propsList) - } - - if (el.action && el.tag === 'el-upload') { - uploadVarList.push( - `${el.vModel}Action: '${el.action}', - ${el.vModel}fileList: [],` - ) - methodList.push(buildBeforeUpload(el)) - if (!el['auto-upload']) { - methodList.push(buildSubmitUpload(el)) - } - } - - if (el.children) { - el.children.forEach(el2 => { - buildAttributes(el2, dataList, ruleList, optionsList, methodList, propsList, uploadVarList) - }) - } -} - -function mixinMethod(type) { - const list = []; const - minxins = { - file: confGlobal.formBtns ? { - submitForm: `submitForm() { - this.$refs['${confGlobal.formRef}'].validate(valid => { - if(!valid) return - // TODO 提交表单 - }) - },`, - resetForm: `resetForm() { - this.$refs['${confGlobal.formRef}'].resetFields() - },` - } : null, - dialog: { - onOpen: 'onOpen() {},', - onClose: `onClose() { - this.$refs['${confGlobal.formRef}'].resetFields() - },`, - close: `close() { - this.$emit('update:visible', false) - },`, - handleConfirm: `handleConfirm() { - this.$refs['${confGlobal.formRef}'].validate(valid => { - if(!valid) return - this.close() - }) - },` - } - } - - const methods = minxins[type] - if (methods) { - Object.keys(methods).forEach(key => { - list.push(methods[key]) - }) - } - - return list -} - -function buildData(conf, dataList) { - if (conf.vModel === undefined) return - let defaultValue - if (typeof (conf.defaultValue) === 'string' && !conf.multiple) { - defaultValue = `'${conf.defaultValue}'` - } else { - defaultValue = `${JSON.stringify(conf.defaultValue)}` - } - dataList.push(`${conf.vModel}: ${defaultValue},`) -} - -function buildRules(conf, ruleList) { - if (conf.vModel === undefined) return - const rules = [] - if (trigger[conf.tag]) { - if (conf.required) { - const type = Array.isArray(conf.defaultValue) ? 'type: \'array\',' : '' - let message = Array.isArray(conf.defaultValue) ? `请至少选择一个${conf.vModel}` : conf.placeholder - if (message === undefined) message = `${conf.label}不能为空` - rules.push(`{ required: true, ${type} message: '${message}', trigger: '${trigger[conf.tag]}' }`) - } - if (conf.regList && Array.isArray(conf.regList)) { - conf.regList.forEach(item => { - if (item.pattern) { - rules.push(`{ pattern: ${eval(item.pattern)}, message: '${item.message}', trigger: '${trigger[conf.tag]}' }`) - } - }) - } - ruleList.push(`${conf.vModel}: [${rules.join(',')}],`) - } -} - -function buildOptions(conf, optionsList) { - if (conf.vModel === undefined) return - if (conf.dataType === 'dynamic') { conf.options = [] } - const str = `${conf.vModel}Options: ${JSON.stringify(conf.options)},` - optionsList.push(str) -} - -function buildProps(conf, propsList) { - if (conf.dataType === 'dynamic') { - conf.valueKey !== 'value' && (conf.props.props.value = conf.valueKey) - conf.labelKey !== 'label' && (conf.props.props.label = conf.labelKey) - conf.childrenKey !== 'children' && (conf.props.props.children = conf.childrenKey) - } - const str = `${conf.vModel}Props: ${JSON.stringify(conf.props.props)},` - propsList.push(str) -} - -function buildBeforeUpload(conf) { - const unitNum = units[conf.sizeUnit]; let rightSizeCode = ''; let acceptCode = ''; const - returnList = [] - if (conf.fileSize) { - rightSizeCode = `let isRightSize = file.size / ${unitNum} < ${conf.fileSize} - if(!isRightSize){ - this.$message.error('文件大小超过 ${conf.fileSize}${conf.sizeUnit}') - }` - returnList.push('isRightSize') - } - if (conf.accept) { - acceptCode = `let isAccept = new RegExp('${conf.accept}').test(file.type) - if(!isAccept){ - this.$message.error('应该选择${conf.accept}类型的文件') - }` - returnList.push('isAccept') - } - const str = `${conf.vModel}BeforeUpload(file) { - ${rightSizeCode} - ${acceptCode} - return ${returnList.join('&&')} - },` - return returnList.length ? str : '' -} - -function buildSubmitUpload(conf) { - const str = `submitUpload() { - this.$refs['${conf.vModel}'].submit() - },` - return str -} - -function buildOptionMethod(methodName, model, methodList) { - const str = `${methodName}() { - // TODO 发起请求获取数据 - this.${model} - },` - methodList.push(str) -} - -function buildexport(conf, type, data, rules, selectOptions, uploadVar, props, methods) { - const str = `${exportDefault}{ - ${inheritAttrs[type]} - components: {}, - props: [], - data () { - return { - ${conf.formModel}: { - ${data} - }, - ${conf.formRules}: { - ${rules} - }, - ${uploadVar} - ${selectOptions} - ${props} - } - }, - computed: {}, - watch: {}, - created () {}, - mounted () {}, - methods: { - ${methods} - } -}` - return str -} diff --git a/solution-ui/src/utils/generator/render.js b/solution-ui/src/utils/generator/render.js deleted file mode 100644 index e8640f0..0000000 --- a/solution-ui/src/utils/generator/render.js +++ /dev/null @@ -1,126 +0,0 @@ -import { makeMap } from '@/utils/index' - -// 参考https://github.com/vuejs/vue/blob/v2.6.10/src/platforms/web/server/util.js -const isAttr = makeMap( - 'accept,accept-charset,accesskey,action,align,alt,async,autocomplete,' - + 'autofocus,autoplay,autosave,bgcolor,border,buffered,challenge,charset,' - + 'checked,cite,class,code,codebase,color,cols,colspan,content,http-equiv,' - + 'name,contenteditable,contextmenu,controls,coords,data,datetime,default,' - + 'defer,dir,dirname,disabled,download,draggable,dropzone,enctype,method,for,' - + 'form,formaction,headers,height,hidden,high,href,hreflang,http-equiv,' - + 'icon,id,ismap,itemprop,keytype,kind,label,lang,language,list,loop,low,' - + 'manifest,max,maxlength,media,method,GET,POST,min,multiple,email,file,' - + 'muted,name,novalidate,open,optimum,pattern,ping,placeholder,poster,' - + 'preload,radiogroup,readonly,rel,required,reversed,rows,rowspan,sandbox,' - + 'scope,scoped,seamless,selected,shape,size,type,text,password,sizes,span,' - + 'spellcheck,src,srcdoc,srclang,srcset,start,step,style,summary,tabindex,' - + 'target,title,type,usemap,value,width,wrap' -) - -function vModel(self, dataObject, defaultValue) { - dataObject.props.value = defaultValue - - dataObject.on.input = val => { - self.$emit('input', val) - } -} - -const componentChild = { - 'el-button': { - default(h, conf, key) { - return conf[key] - }, - }, - 'el-input': { - prepend(h, conf, key) { - return - }, - append(h, conf, key) { - return - } - }, - 'el-select': { - options(h, conf, key) { - const list = [] - conf.options.forEach(item => { - list.push() - }) - return list - } - }, - 'el-radio-group': { - options(h, conf, key) { - const list = [] - conf.options.forEach(item => { - if (conf.optionType === 'button') list.push({item.label}) - else list.push({item.label}) - }) - return list - } - }, - 'el-checkbox-group': { - options(h, conf, key) { - const list = [] - conf.options.forEach(item => { - if (conf.optionType === 'button') { - list.push({item.label}) - } else { - list.push({item.label}) - } - }) - return list - } - }, - 'el-upload': { - 'list-type': (h, conf, key) => { - const list = [] - if (conf['list-type'] === 'picture-card') { - list.push() - } else { - list.push({conf.buttonText}) - } - if (conf.showTip) { - list.push(
只能上传不超过 {conf.fileSize}{conf.sizeUnit} 的{conf.accept}文件
) - } - return list - } - } -} - -export default { - render(h) { - const dataObject = { - attrs: {}, - props: {}, - on: {}, - style: {} - } - const confClone = JSON.parse(JSON.stringify(this.conf)) - const children = [] - - const childObjs = componentChild[confClone.tag] - if (childObjs) { - Object.keys(childObjs).forEach(key => { - const childFunc = childObjs[key] - if (confClone[key]) { - children.push(childFunc(h, confClone, key)) - } - }) - } - - Object.keys(confClone).forEach(key => { - const val = confClone[key] - if (key === 'vModel') { - vModel(this, dataObject, confClone.defaultValue) - } else if (dataObject[key]) { - dataObject[key] = val - } else if (!isAttr(key)) { - dataObject.props[key] = val - } else { - dataObject.attrs[key] = val - } - }) - return h(this.conf.tag, dataObject, children) - }, - props: ['conf'] -} diff --git a/solution-ui/src/utils/index.js b/solution-ui/src/utils/index.js deleted file mode 100644 index 9375db7..0000000 --- a/solution-ui/src/utils/index.js +++ /dev/null @@ -1,390 +0,0 @@ -import { parseTime } from './ruoyi' - -/** - * 表格时间格式化 - */ -export function formatDate(cellValue) { - if (cellValue == null || cellValue == "") return "" - var date = new Date(cellValue) - var year = date.getFullYear() - var month = date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1 - var day = date.getDate() < 10 ? '0' + date.getDate() : date.getDate() - var hours = date.getHours() < 10 ? '0' + date.getHours() : date.getHours() - var minutes = date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes() - var seconds = date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds() - return year + '-' + month + '-' + day + ' ' + hours + ':' + minutes + ':' + seconds -} - -/** - * @param {number} time - * @param {string} option - * @returns {string} - */ -export function formatTime(time, option) { - if (('' + time).length === 10) { - time = parseInt(time) * 1000 - } else { - time = +time - } - const d = new Date(time) - const now = Date.now() - - const diff = (now - d) / 1000 - - if (diff < 30) { - return '刚刚' - } else if (diff < 3600) { - // less 1 hour - return Math.ceil(diff / 60) + '分钟前' - } else if (diff < 3600 * 24) { - return Math.ceil(diff / 3600) + '小时前' - } else if (diff < 3600 * 24 * 2) { - return '1天前' - } - if (option) { - return parseTime(time, option) - } else { - return ( - d.getMonth() + - 1 + - '月' + - d.getDate() + - '日' + - d.getHours() + - '时' + - d.getMinutes() + - '分' - ) - } -} - -/** - * @param {string} url - * @returns {Object} - */ -export function getQueryObject(url) { - url = url == null ? window.location.href : url - const search = url.substring(url.lastIndexOf('?') + 1) - const obj = {} - const reg = /([^?&=]+)=([^?&=]*)/g - search.replace(reg, (rs, $1, $2) => { - const name = decodeURIComponent($1) - let val = decodeURIComponent($2) - val = String(val) - obj[name] = val - return rs - }) - return obj -} - -/** - * @param {string} input value - * @returns {number} output value - */ -export function byteLength(str) { - // returns the byte length of an utf8 string - let s = str.length - for (var i = str.length - 1; i >= 0; i--) { - const code = str.charCodeAt(i) - if (code > 0x7f && code <= 0x7ff) s++ - else if (code > 0x7ff && code <= 0xffff) s += 2 - if (code >= 0xDC00 && code <= 0xDFFF) i-- - } - return s -} - -/** - * @param {Array} actual - * @returns {Array} - */ -export function cleanArray(actual) { - const newArray = [] - for (let i = 0; i < actual.length; i++) { - if (actual[i]) { - newArray.push(actual[i]) - } - } - return newArray -} - -/** - * @param {Object} json - * @returns {Array} - */ -export function param(json) { - if (!json) return '' - return cleanArray( - Object.keys(json).map(key => { - if (json[key] === undefined) return '' - return encodeURIComponent(key) + '=' + encodeURIComponent(json[key]) - }) - ).join('&') -} - -/** - * @param {string} url - * @returns {Object} - */ -export function param2Obj(url) { - const search = decodeURIComponent(url.split('?')[1]).replace(/\+/g, ' ') - if (!search) { - return {} - } - const obj = {} - const searchArr = search.split('&') - searchArr.forEach(v => { - const index = v.indexOf('=') - if (index !== -1) { - const name = v.substring(0, index) - const val = v.substring(index + 1, v.length) - obj[name] = val - } - }) - return obj -} - -/** - * @param {string} val - * @returns {string} - */ -export function html2Text(val) { - const div = document.createElement('div') - div.innerHTML = val - return div.textContent || div.innerText -} - -/** - * Merges two objects, giving the last one precedence - * @param {Object} target - * @param {(Object|Array)} source - * @returns {Object} - */ -export function objectMerge(target, source) { - if (typeof target !== 'object') { - target = {} - } - if (Array.isArray(source)) { - return source.slice() - } - Object.keys(source).forEach(property => { - const sourceProperty = source[property] - if (typeof sourceProperty === 'object') { - target[property] = objectMerge(target[property], sourceProperty) - } else { - target[property] = sourceProperty - } - }) - return target -} - -/** - * @param {HTMLElement} element - * @param {string} className - */ -export function toggleClass(element, className) { - if (!element || !className) { - return - } - let classString = element.className - const nameIndex = classString.indexOf(className) - if (nameIndex === -1) { - classString += '' + className - } else { - classString = - classString.substr(0, nameIndex) + - classString.substr(nameIndex + className.length) - } - element.className = classString -} - -/** - * @param {string} type - * @returns {Date} - */ -export function getTime(type) { - if (type === 'start') { - return new Date().getTime() - 3600 * 1000 * 24 * 90 - } else { - return new Date(new Date().toDateString()) - } -} - -/** - * @param {Function} func - * @param {number} wait - * @param {boolean} immediate - * @return {*} - */ -export function debounce(func, wait, immediate) { - let timeout, args, context, timestamp, result - - const later = function() { - // 据上一次触发时间间隔 - const last = +new Date() - timestamp - - // 上次被包装函数被调用时间间隔 last 小于设定时间间隔 wait - if (last < wait && last > 0) { - timeout = setTimeout(later, wait - last) - } else { - timeout = null - // 如果设定为immediate===true,因为开始边界已经调用过了此处无需调用 - if (!immediate) { - result = func.apply(context, args) - if (!timeout) context = args = null - } - } - } - - return function(...args) { - context = this - timestamp = +new Date() - const callNow = immediate && !timeout - // 如果延时不存在,重新设定延时 - if (!timeout) timeout = setTimeout(later, wait) - if (callNow) { - result = func.apply(context, args) - context = args = null - } - - return result - } -} - -/** - * This is just a simple version of deep copy - * Has a lot of edge cases bug - * If you want to use a perfect deep copy, use lodash's _.cloneDeep - * @param {Object} source - * @returns {Object} - */ -export function deepClone(source) { - if (!source && typeof source !== 'object') { - throw new Error('error arguments', 'deepClone') - } - const targetObj = source.constructor === Array ? [] : {} - Object.keys(source).forEach(keys => { - if (source[keys] && typeof source[keys] === 'object') { - targetObj[keys] = deepClone(source[keys]) - } else { - targetObj[keys] = source[keys] - } - }) - return targetObj -} - -/** - * @param {Array} arr - * @returns {Array} - */ -export function uniqueArr(arr) { - return Array.from(new Set(arr)) -} - -/** - * @returns {string} - */ -export function createUniqueString() { - const timestamp = +new Date() + '' - const randomNum = parseInt((1 + Math.random()) * 65536) + '' - return (+(randomNum + timestamp)).toString(32) -} - -/** - * Check if an element has a class - * @param {HTMLElement} elm - * @param {string} cls - * @returns {boolean} - */ -export function hasClass(ele, cls) { - return !!ele.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)')) -} - -/** - * Add class to element - * @param {HTMLElement} elm - * @param {string} cls - */ -export function addClass(ele, cls) { - if (!hasClass(ele, cls)) ele.className += ' ' + cls -} - -/** - * Remove class from element - * @param {HTMLElement} elm - * @param {string} cls - */ -export function removeClass(ele, cls) { - if (hasClass(ele, cls)) { - const reg = new RegExp('(\\s|^)' + cls + '(\\s|$)') - ele.className = ele.className.replace(reg, ' ') - } -} - -export function makeMap(str, expectsLowerCase) { - const map = Object.create(null) - const list = str.split(',') - for (let i = 0; i < list.length; i++) { - map[list[i]] = true - } - return expectsLowerCase - ? val => map[val.toLowerCase()] - : val => map[val] -} - -export const exportDefault = 'export default ' - -export const beautifierConf = { - html: { - indent_size: '2', - indent_char: ' ', - max_preserve_newlines: '-1', - preserve_newlines: false, - keep_array_indentation: false, - break_chained_methods: false, - indent_scripts: 'separate', - brace_style: 'end-expand', - space_before_conditional: true, - unescape_strings: false, - jslint_happy: false, - end_with_newline: true, - wrap_line_length: '110', - indent_inner_html: true, - comma_first: false, - e4x: true, - indent_empty_lines: true - }, - js: { - indent_size: '2', - indent_char: ' ', - max_preserve_newlines: '-1', - preserve_newlines: false, - keep_array_indentation: false, - break_chained_methods: false, - indent_scripts: 'normal', - brace_style: 'end-expand', - space_before_conditional: true, - unescape_strings: false, - jslint_happy: true, - end_with_newline: true, - wrap_line_length: '110', - indent_inner_html: true, - comma_first: false, - e4x: true, - indent_empty_lines: true - } -} - -// 首字母大小 -export function titleCase(str) { - return str.replace(/( |^)[a-z]/g, L => L.toUpperCase()) -} - -// 下划转驼峰 -export function camelCase(str) { - return str.replace(/_[a-z]/g, str1 => str1.substr(-1).toUpperCase()) -} - -export function isNumberStr(str) { - return /^[+-]?(0|([1-9]\d*))(\.\d+)?$/g.test(str) -} - diff --git a/solution-ui/src/utils/jsencrypt.js b/solution-ui/src/utils/jsencrypt.js deleted file mode 100644 index 78d9523..0000000 --- a/solution-ui/src/utils/jsencrypt.js +++ /dev/null @@ -1,30 +0,0 @@ -import JSEncrypt from 'jsencrypt/bin/jsencrypt.min' - -// 密钥对生成 http://web.chacuo.net/netrsakeypair - -const publicKey = 'MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKoR8mX0rGKLqzcWmOzbfj64K8ZIgOdH\n' + - 'nzkXSOVOZbFu/TJhZ7rFAN+eaGkl3C4buccQd/EjEsj9ir7ijT7h96MCAwEAAQ==' - -const privateKey = 'MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAqhHyZfSsYourNxaY\n' + - '7Nt+PrgrxkiA50efORdI5U5lsW79MmFnusUA355oaSXcLhu5xxB38SMSyP2KvuKN\n' + - 'PuH3owIDAQABAkAfoiLyL+Z4lf4Myxk6xUDgLaWGximj20CUf+5BKKnlrK+Ed8gA\n' + - 'kM0HqoTt2UZwA5E2MzS4EI2gjfQhz5X28uqxAiEA3wNFxfrCZlSZHb0gn2zDpWow\n' + - 'cSxQAgiCstxGUoOqlW8CIQDDOerGKH5OmCJ4Z21v+F25WaHYPxCFMvwxpcw99Ecv\n' + - 'DQIgIdhDTIqD2jfYjPTY8Jj3EDGPbH2HHuffvflECt3Ek60CIQCFRlCkHpi7hthh\n' + - 'YhovyloRYsM+IS9h/0BzlEAuO0ktMQIgSPT3aFAgJYwKpqRYKlLDVcflZFCKY7u3\n' + - 'UP8iWi1Qw0Y=' - -// 加密 -export function encrypt(txt) { - const encryptor = new JSEncrypt() - encryptor.setPublicKey(publicKey) // 设置公钥 - return encryptor.encrypt(txt) // 对数据进行加密 -} - -// 解密 -export function decrypt(txt) { - const encryptor = new JSEncrypt() - encryptor.setPrivateKey(privateKey) // 设置私钥 - return encryptor.decrypt(txt) // 对数据进行解密 -} - diff --git a/solution-ui/src/utils/permission.js b/solution-ui/src/utils/permission.js deleted file mode 100644 index 0263bbc..0000000 --- a/solution-ui/src/utils/permission.js +++ /dev/null @@ -1,47 +0,0 @@ -import store from '@/store' - -/** - * 字符权限校验 - * @param {Array} value 校验值 - * @returns {Boolean} - */ -export function checkPermi(value) { - if (value && value instanceof Array && value.length > 0) { - const permissions = store.getters && store.getters.permissions - const permissionDatas = value - const all_permission = "*:*:*" - - const hasPermission = permissions.some(permission => { - return all_permission === permission || permissionDatas.includes(permission) - }) - - return hasPermission - - } else { - console.error(`need roles! Like checkPermi="['system:user:add','system:user:edit']"`) - return false - } -} - -/** - * 角色权限校验 - * @param {Array} value 校验值 - * @returns {Boolean} - */ -export function checkRole(value) { - if (value && value instanceof Array && value.length > 0) { - const roles = store.getters && store.getters.roles - const permissionRoles = value - const super_admin = "admin" - - const hasRole = roles.some(role => { - return super_admin === role || permissionRoles.includes(role) - }) - - return hasRole - - } else { - console.error(`need roles! Like checkRole="['admin','editor']"`) - return false - } -} \ No newline at end of file diff --git a/solution-ui/src/utils/request.js b/solution-ui/src/utils/request.js deleted file mode 100644 index 8695801..0000000 --- a/solution-ui/src/utils/request.js +++ /dev/null @@ -1,153 +0,0 @@ -import axios from 'axios' -import { Notification, MessageBox, Message, Loading } from 'element-ui' -import store from '@/store' -import { getToken } from '@/utils/auth' -import errorCode from '@/utils/errorCode' -import { tansParams, blobValidate } from "@/utils/ruoyi" -import cache from '@/plugins/cache' -import { saveAs } from 'file-saver' - -let downloadLoadingInstance -// 是否显示重新登录 -export let isRelogin = { show: false } - -axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8' -// 创建axios实例 -const service = axios.create({ - // axios中请求配置有baseURL选项,表示请求URL公共部分 - baseURL: process.env.VUE_APP_BASE_API, - // 超时 - timeout: 10000 -}) - -// request拦截器 -service.interceptors.request.use(config => { - // 是否需要设置 token - const isToken = (config.headers || {}).isToken === false - // 是否需要防止数据重复提交 - const isRepeatSubmit = (config.headers || {}).repeatSubmit === false - // 间隔时间(ms),小于此时间视为重复提交 - const interval = (config.headers || {}).interval || 1000 - if (getToken() && !isToken) { - config.headers['Authorization'] = 'Bearer ' + getToken() // 让每个请求携带自定义token 请根据实际情况自行修改 - } - // get请求映射params参数 - if (config.method === 'get' && config.params) { - let url = config.url + '?' + tansParams(config.params) - url = url.slice(0, -1) - config.params = {} - config.url = url - } - if (!isRepeatSubmit && (config.method === 'post' || config.method === 'put')) { - const requestObj = { - url: config.url, - data: typeof config.data === 'object' ? JSON.stringify(config.data) : config.data, - time: new Date().getTime() - } - const requestSize = Object.keys(JSON.stringify(requestObj)).length // 请求数据大小 - const limitSize = 5 * 1024 * 1024 // 限制存放数据5M - if (requestSize >= limitSize) { - console.warn(`[${config.url}]: ` + '请求数据大小超出允许的5M限制,无法进行防重复提交验证。') - return config - } - const sessionObj = cache.session.getJSON('sessionObj') - if (sessionObj === undefined || sessionObj === null || sessionObj === '') { - cache.session.setJSON('sessionObj', requestObj) - } else { - const s_url = sessionObj.url // 请求地址 - const s_data = sessionObj.data // 请求数据 - const s_time = sessionObj.time // 请求时间 - if (s_data === requestObj.data && requestObj.time - s_time < interval && s_url === requestObj.url) { - const message = '数据正在处理,请勿重复提交' - console.warn(`[${s_url}]: ` + message) - return Promise.reject(new Error(message)) - } else { - cache.session.setJSON('sessionObj', requestObj) - } - } - } - return config -}, error => { - console.log(error) - Promise.reject(error) -}) - -// 响应拦截器 -service.interceptors.response.use(res => { - // 未设置状态码则默认成功状态 - const code = res.data.code || 200 - // 获取错误信息 - const msg = errorCode[code] || res.data.msg || errorCode['default'] - // 二进制数据则直接返回 - if (res.request.responseType === 'blob' || res.request.responseType === 'arraybuffer') { - return res.data - } - if (code === 401) { - if (!isRelogin.show) { - isRelogin.show = true - MessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', { confirmButtonText: '重新登录', cancelButtonText: '取消', type: 'warning' }).then(() => { - isRelogin.show = false - store.dispatch('LogOut').then(() => { - location.href = '/index' - }) - }).catch(() => { - isRelogin.show = false - }) - } - return Promise.reject('无效的会话,或者会话已过期,请重新登录。') - } else if (code === 500) { - Message({ message: msg, type: 'error' }) - return Promise.reject(new Error(msg)) - } else if (code === 601) { - Message({ message: msg, type: 'warning' }) - return Promise.reject('error') - } else if (code !== 200) { - Notification.error({ title: msg }) - return Promise.reject('error') - } else { - return res.data - } - }, - error => { - console.log('err' + error) - let { message } = error - if (message == "Network Error") { - message = "后端接口连接异常" - } else if (message.includes("timeout")) { - message = "系统接口请求超时" - } else if (message.includes("Request failed with status code")) { - message = "系统接口" + message.slice(-3) + "异常" - } - Message({ message: message, type: 'error', duration: 5 * 1000 }) - return Promise.reject(error) - } -) - -// 通用下载方法 -export function download(url, params, filename, config) { - downloadLoadingInstance = Loading.service({ text: "正在下载数据,请稍候", spinner: "el-icon-loading", background: "rgba(0, 0, 0, 0.7)", }) - return service.post(url, params, { - transformRequest: [(params) => { return tansParams(params) }], - headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, - responseType: 'blob', - ...config - }).then(async (data) => { - const isBlob = blobValidate(data) - if (isBlob) { - const blob = new Blob([data]) - saveAs(blob, filename) - } else { - const resText = await data.text() - const rspObj = JSON.parse(resText) - const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode['default'] - Message.error(errMsg) - } - downloadLoadingInstance.close() - }).catch((r) => { - console.error(r) - Message.error('下载文件出现错误,请联系管理员!') - downloadLoadingInstance.close() - }) -} - -export default service diff --git a/solution-ui/src/utils/ruoyi.js b/solution-ui/src/utils/ruoyi.js deleted file mode 100644 index 3de2d98..0000000 --- a/solution-ui/src/utils/ruoyi.js +++ /dev/null @@ -1,228 +0,0 @@ -/** - * 通用js方法封装处理 - * Copyright (c) 2019 ruoyi - */ - -// 日期格式化 -export function parseTime(time, pattern) { - if (arguments.length === 0 || !time) { - return null - } - const format = pattern || '{y}-{m}-{d} {h}:{i}:{s}' - let date - if (typeof time === 'object') { - date = time - } else { - if ((typeof time === 'string') && (/^[0-9]+$/.test(time))) { - time = parseInt(time) - } else if (typeof time === 'string') { - time = time.replace(new RegExp(/-/gm), '/').replace('T', ' ').replace(new RegExp(/\.[\d]{3}/gm), '') - } - if ((typeof time === 'number') && (time.toString().length === 10)) { - time = time * 1000 - } - date = new Date(time) - } - const formatObj = { - y: date.getFullYear(), - m: date.getMonth() + 1, - d: date.getDate(), - h: date.getHours(), - i: date.getMinutes(), - s: date.getSeconds(), - a: date.getDay() - } - const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => { - let value = formatObj[key] - // Note: getDay() returns 0 on Sunday - if (key === 'a') { return ['日', '一', '二', '三', '四', '五', '六'][value] } - if (result.length > 0 && value < 10) { - value = '0' + value - } - return value || 0 - }) - return time_str -} - -// 表单重置 -export function resetForm(refName) { - if (this.$refs[refName]) { - this.$refs[refName].resetFields() - } -} - -// 添加日期范围 -export function addDateRange(params, dateRange, propName) { - let search = params - search.params = typeof (search.params) === 'object' && search.params !== null && !Array.isArray(search.params) ? search.params : {} - dateRange = Array.isArray(dateRange) ? dateRange : [] - if (typeof (propName) === 'undefined') { - search.params['beginTime'] = dateRange[0] - search.params['endTime'] = dateRange[1] - } else { - search.params['begin' + propName] = dateRange[0] - search.params['end' + propName] = dateRange[1] - } - return search -} - -// 回显数据字典 -export function selectDictLabel(datas, value) { - if (value === undefined) { - return "" - } - var actions = [] - Object.keys(datas).some((key) => { - if (datas[key].value == ('' + value)) { - actions.push(datas[key].label) - return true - } - }) - if (actions.length === 0) { - actions.push(value) - } - return actions.join('') -} - -// 回显数据字典(字符串、数组) -export function selectDictLabels(datas, value, separator) { - if (value === undefined || value.length ===0) { - return "" - } - if (Array.isArray(value)) { - value = value.join(",") - } - var actions = [] - var currentSeparator = undefined === separator ? "," : separator - var temp = value.split(currentSeparator) - Object.keys(value.split(currentSeparator)).some((val) => { - var match = false - Object.keys(datas).some((key) => { - if (datas[key].value == ('' + temp[val])) { - actions.push(datas[key].label + currentSeparator) - match = true - } - }) - if (!match) { - actions.push(temp[val] + currentSeparator) - } - }) - return actions.join('').substring(0, actions.join('').length - 1) -} - -// 字符串格式化(%s ) -export function sprintf(str) { - var args = arguments, flag = true, i = 1 - str = str.replace(/%s/g, function () { - var arg = args[i++] - if (typeof arg === 'undefined') { - flag = false - return '' - } - return arg - }) - return flag ? str : '' -} - -// 转换字符串,undefined,null等转化为"" -export function parseStrEmpty(str) { - if (!str || str == "undefined" || str == "null") { - return "" - } - return str -} - -// 数据合并 -export function mergeRecursive(source, target) { - for (var p in target) { - try { - if (target[p].constructor == Object) { - source[p] = mergeRecursive(source[p], target[p]) - } else { - source[p] = target[p] - } - } catch (e) { - source[p] = target[p] - } - } - return source -} - -/** - * 构造树型结构数据 - * @param {*} data 数据源 - * @param {*} id id字段 默认 'id' - * @param {*} parentId 父节点字段 默认 'parentId' - * @param {*} children 孩子节点字段 默认 'children' - */ -export function handleTree(data, id, parentId, children) { - let config = { - id: id || 'id', - parentId: parentId || 'parentId', - childrenList: children || 'children' - } - - var childrenListMap = {} - var tree = [] - for (let d of data) { - let id = d[config.id] - childrenListMap[id] = d - if (!d[config.childrenList]) { - d[config.childrenList] = [] - } - } - - for (let d of data) { - let parentId = d[config.parentId] - let parentObj = childrenListMap[parentId] - if (!parentObj) { - tree.push(d) - } else { - parentObj[config.childrenList].push(d) - } - } - return tree -} - -/** -* 参数处理 -* @param {*} params 参数 -*/ -export function tansParams(params) { - let result = '' - for (const propName of Object.keys(params)) { - const value = params[propName] - var part = encodeURIComponent(propName) + "=" - if (value !== null && value !== "" && typeof (value) !== "undefined") { - if (typeof value === 'object') { - for (const key of Object.keys(value)) { - if (value[key] !== null && value[key] !== "" && typeof (value[key]) !== 'undefined') { - let params = propName + '[' + key + ']' - var subPart = encodeURIComponent(params) + "=" - result += subPart + encodeURIComponent(value[key]) + "&" - } - } - } else { - result += part + encodeURIComponent(value) + "&" - } - } - } - return result -} - -// 返回项目路径 -export function getNormalPath(p) { - if (p.length === 0 || !p || p == 'undefined') { - return p - } - let res = p.replace('//', '/') - if (res[res.length - 1] === '/') { - return res.slice(0, res.length - 1) - } - return res -} - -// 验证是否为blob格式 -export function blobValidate(data) { - return data.type !== 'application/json' -} diff --git a/solution-ui/src/utils/scroll-to.js b/solution-ui/src/utils/scroll-to.js deleted file mode 100644 index c5d8e04..0000000 --- a/solution-ui/src/utils/scroll-to.js +++ /dev/null @@ -1,58 +0,0 @@ -Math.easeInOutQuad = function(t, b, c, d) { - t /= d / 2 - if (t < 1) { - return c / 2 * t * t + b - } - t-- - return -c / 2 * (t * (t - 2) - 1) + b -} - -// requestAnimationFrame for Smart Animating http://goo.gl/sx5sts -var requestAnimFrame = (function() { - return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || function(callback) { window.setTimeout(callback, 1000 / 60) } -})() - -/** - * Because it's so fucking difficult to detect the scrolling element, just move them all - * @param {number} amount - */ -function move(amount) { - document.documentElement.scrollTop = amount - document.body.parentNode.scrollTop = amount - document.body.scrollTop = amount -} - -function position() { - return document.documentElement.scrollTop || document.body.parentNode.scrollTop || document.body.scrollTop -} - -/** - * @param {number} to - * @param {number} duration - * @param {Function} callback - */ -export function scrollTo(to, duration, callback) { - const start = position() - const change = to - start - const increment = 20 - let currentTime = 0 - duration = (typeof (duration) === 'undefined') ? 500 : duration - var animateScroll = function() { - // increment the time - currentTime += increment - // find the value with the quadratic in-out easing function - var val = Math.easeInOutQuad(currentTime, start, change, duration) - // move the document.body - move(val) - // do the animation unless its over - if (currentTime < duration) { - requestAnimFrame(animateScroll) - } else { - if (callback && typeof (callback) === 'function') { - // the animation is done so lets callback - callback() - } - } - } - animateScroll() -} diff --git a/solution-ui/src/utils/validate.js b/solution-ui/src/utils/validate.js deleted file mode 100644 index 6a4c0c5..0000000 --- a/solution-ui/src/utils/validate.js +++ /dev/null @@ -1,114 +0,0 @@ -/** - * 路径匹配器 - * @param {string} pattern - * @param {string} path - * @returns {Boolean} - */ -export function isPathMatch(pattern, path) { - const regexPattern = pattern.replace(/\//g, '\\/').replace(/\*\*/g, '.*').replace(/\*/g, '[^\\/]*') - const regex = new RegExp(`^${regexPattern}$`) - return regex.test(path) -} - -/** - * 判断value字符串是否为空 - * @param {string} value - * @returns {Boolean} - */ -export function isEmpty(value) { - if (value == null || value == "" || value == undefined || value == "undefined") { - return true - } - return false -} - -/** - * 判断url是否是http或https - * @param {string} url - * @returns {Boolean} - */ -export function isHttp(url) { - return url.indexOf('http://') !== -1 || url.indexOf('https://') !== -1 -} - -/** - * 判断path是否为外链 - * @param {string} path - * @returns {Boolean} - */ -export function isExternal(path) { - return /^(https?:|mailto:|tel:)/.test(path) -} - -/** - * @param {string} str - * @returns {Boolean} - */ -export function validUsername(str) { - const valid_map = ['admin', 'editor'] - return valid_map.indexOf(str.trim()) >= 0 -} - -/** - * @param {string} url - * @returns {Boolean} - */ -export function validURL(url) { - const reg = /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/ - return reg.test(url) -} - -/** - * @param {string} str - * @returns {Boolean} - */ -export function validLowerCase(str) { - const reg = /^[a-z]+$/ - return reg.test(str) -} - -/** - * @param {string} str - * @returns {Boolean} - */ -export function validUpperCase(str) { - const reg = /^[A-Z]+$/ - return reg.test(str) -} - -/** - * @param {string} str - * @returns {Boolean} - */ -export function validAlphabets(str) { - const reg = /^[A-Za-z]+$/ - return reg.test(str) -} - -/** - * @param {string} email - * @returns {Boolean} - */ -export function validEmail(email) { - const reg = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/ - return reg.test(email) -} - -/** - * @param {string} str - * @returns {Boolean} - */ -export function isString(str) { - return typeof str === 'string' || str instanceof String -} - -/** - * @param {Array} arg - * @returns {Boolean} - */ -export function isArray(arg) { - if (typeof Array.isArray === 'undefined') { - return Object.prototype.toString.call(arg) === '[object Array]' - } - return Array.isArray(arg) -} diff --git a/solution-ui/src/views/dashboard/BarChart.vue b/solution-ui/src/views/dashboard/BarChart.vue deleted file mode 100644 index 88e7ef6..0000000 --- a/solution-ui/src/views/dashboard/BarChart.vue +++ /dev/null @@ -1,102 +0,0 @@ - - - diff --git a/solution-ui/src/views/dashboard/LineChart.vue b/solution-ui/src/views/dashboard/LineChart.vue deleted file mode 100644 index 702ff73..0000000 --- a/solution-ui/src/views/dashboard/LineChart.vue +++ /dev/null @@ -1,135 +0,0 @@ - - - diff --git a/solution-ui/src/views/dashboard/PanelGroup.vue b/solution-ui/src/views/dashboard/PanelGroup.vue deleted file mode 100644 index 1a1081f..0000000 --- a/solution-ui/src/views/dashboard/PanelGroup.vue +++ /dev/null @@ -1,181 +0,0 @@ - - - - - diff --git a/solution-ui/src/views/dashboard/PieChart.vue b/solution-ui/src/views/dashboard/PieChart.vue deleted file mode 100644 index 63f0d84..0000000 --- a/solution-ui/src/views/dashboard/PieChart.vue +++ /dev/null @@ -1,79 +0,0 @@ - - - diff --git a/solution-ui/src/views/dashboard/RaddarChart.vue b/solution-ui/src/views/dashboard/RaddarChart.vue deleted file mode 100644 index 312e018..0000000 --- a/solution-ui/src/views/dashboard/RaddarChart.vue +++ /dev/null @@ -1,116 +0,0 @@ - - - diff --git a/solution-ui/src/views/dashboard/mixins/resize.js b/solution-ui/src/views/dashboard/mixins/resize.js deleted file mode 100644 index b1e76e9..0000000 --- a/solution-ui/src/views/dashboard/mixins/resize.js +++ /dev/null @@ -1,56 +0,0 @@ -import { debounce } from '@/utils' - -export default { - data() { - return { - $_sidebarElm: null, - $_resizeHandler: null - } - }, - mounted() { - this.initListener() - }, - activated() { - if (!this.$_resizeHandler) { - // avoid duplication init - this.initListener() - } - - // when keep-alive chart activated, auto resize - this.resize() - }, - beforeDestroy() { - this.destroyListener() - }, - deactivated() { - this.destroyListener() - }, - methods: { - // use $_ for mixins properties - // https://vuejs.org/v2/style-guide/index.html#Private-property-names-essential - $_sidebarResizeHandler(e) { - if (e.propertyName === 'width') { - this.$_resizeHandler() - } - }, - initListener() { - this.$_resizeHandler = debounce(() => { - this.resize() - }, 100) - window.addEventListener('resize', this.$_resizeHandler) - - this.$_sidebarElm = document.getElementsByClassName('sidebar-container')[0] - this.$_sidebarElm && this.$_sidebarElm.addEventListener('transitionend', this.$_sidebarResizeHandler) - }, - destroyListener() { - window.removeEventListener('resize', this.$_resizeHandler) - this.$_resizeHandler = null - - this.$_sidebarElm && this.$_sidebarElm.removeEventListener('transitionend', this.$_sidebarResizeHandler) - }, - resize() { - const { chart } = this - chart && chart.resize() - } - } -} diff --git a/solution-ui/src/views/error/401.vue b/solution-ui/src/views/error/401.vue deleted file mode 100644 index 448b6ec..0000000 --- a/solution-ui/src/views/error/401.vue +++ /dev/null @@ -1,88 +0,0 @@ - - - - - diff --git a/solution-ui/src/views/error/404.vue b/solution-ui/src/views/error/404.vue deleted file mode 100644 index 96f075c..0000000 --- a/solution-ui/src/views/error/404.vue +++ /dev/null @@ -1,233 +0,0 @@ - - - - - diff --git a/solution-ui/src/views/index.vue b/solution-ui/src/views/index.vue deleted file mode 100644 index 42268e7..0000000 --- a/solution-ui/src/views/index.vue +++ /dev/null @@ -1,89 +0,0 @@ - - - - - - diff --git a/solution-ui/src/views/index_v1.vue b/solution-ui/src/views/index_v1.vue deleted file mode 100644 index d2d2ec6..0000000 --- a/solution-ui/src/views/index_v1.vue +++ /dev/null @@ -1,98 +0,0 @@ - - - - - diff --git a/solution-ui/src/views/login.vue b/solution-ui/src/views/login.vue deleted file mode 100644 index dde986d..0000000 --- a/solution-ui/src/views/login.vue +++ /dev/null @@ -1,223 +0,0 @@ - - - - - diff --git a/solution-ui/src/views/monitor/cache/index.vue b/solution-ui/src/views/monitor/cache/index.vue deleted file mode 100644 index f8b6648..0000000 --- a/solution-ui/src/views/monitor/cache/index.vue +++ /dev/null @@ -1,148 +0,0 @@ - - - diff --git a/solution-ui/src/views/monitor/cache/list.vue b/solution-ui/src/views/monitor/cache/list.vue deleted file mode 100644 index 9e0523e..0000000 --- a/solution-ui/src/views/monitor/cache/list.vue +++ /dev/null @@ -1,241 +0,0 @@ - - - diff --git a/solution-ui/src/views/monitor/druid/index.vue b/solution-ui/src/views/monitor/druid/index.vue deleted file mode 100644 index 8c3a257..0000000 --- a/solution-ui/src/views/monitor/druid/index.vue +++ /dev/null @@ -1,15 +0,0 @@ - - diff --git a/solution-ui/src/views/monitor/job/index.vue b/solution-ui/src/views/monitor/job/index.vue deleted file mode 100644 index 783873f..0000000 --- a/solution-ui/src/views/monitor/job/index.vue +++ /dev/null @@ -1,513 +0,0 @@ - - - diff --git a/solution-ui/src/views/monitor/job/log.vue b/solution-ui/src/views/monitor/job/log.vue deleted file mode 100644 index 22d4e31..0000000 --- a/solution-ui/src/views/monitor/job/log.vue +++ /dev/null @@ -1,295 +0,0 @@ - - - diff --git a/solution-ui/src/views/monitor/logininfor/index.vue b/solution-ui/src/views/monitor/logininfor/index.vue deleted file mode 100644 index f16a3dc..0000000 --- a/solution-ui/src/views/monitor/logininfor/index.vue +++ /dev/null @@ -1,246 +0,0 @@ - - - - diff --git a/solution-ui/src/views/monitor/online/index.vue b/solution-ui/src/views/monitor/online/index.vue deleted file mode 100644 index 048e51d..0000000 --- a/solution-ui/src/views/monitor/online/index.vue +++ /dev/null @@ -1,122 +0,0 @@ - - - - diff --git a/solution-ui/src/views/monitor/operlog/index.vue b/solution-ui/src/views/monitor/operlog/index.vue deleted file mode 100644 index 6f80177..0000000 --- a/solution-ui/src/views/monitor/operlog/index.vue +++ /dev/null @@ -1,323 +0,0 @@ - - - - diff --git a/solution-ui/src/views/monitor/server/index.vue b/solution-ui/src/views/monitor/server/index.vue deleted file mode 100644 index 36b20f8..0000000 --- a/solution-ui/src/views/monitor/server/index.vue +++ /dev/null @@ -1,207 +0,0 @@ - - - diff --git a/solution-ui/src/views/redirect.vue b/solution-ui/src/views/redirect.vue deleted file mode 100644 index db4c1d6..0000000 --- a/solution-ui/src/views/redirect.vue +++ /dev/null @@ -1,12 +0,0 @@ - diff --git a/solution-ui/src/views/register.vue b/solution-ui/src/views/register.vue deleted file mode 100644 index 65a48e5..0000000 --- a/solution-ui/src/views/register.vue +++ /dev/null @@ -1,213 +0,0 @@ - - - - - diff --git a/solution-ui/src/views/system/config/index.vue b/solution-ui/src/views/system/config/index.vue deleted file mode 100644 index a0794e1..0000000 --- a/solution-ui/src/views/system/config/index.vue +++ /dev/null @@ -1,343 +0,0 @@ - - - diff --git a/solution-ui/src/views/system/dept/index.vue b/solution-ui/src/views/system/dept/index.vue deleted file mode 100644 index 088f09d..0000000 --- a/solution-ui/src/views/system/dept/index.vue +++ /dev/null @@ -1,340 +0,0 @@ - - - diff --git a/solution-ui/src/views/system/dict/data.vue b/solution-ui/src/views/system/dict/data.vue deleted file mode 100644 index 2102e9e..0000000 --- a/solution-ui/src/views/system/dict/data.vue +++ /dev/null @@ -1,402 +0,0 @@ - - - \ No newline at end of file diff --git a/solution-ui/src/views/system/dict/index.vue b/solution-ui/src/views/system/dict/index.vue deleted file mode 100644 index ada7e07..0000000 --- a/solution-ui/src/views/system/dict/index.vue +++ /dev/null @@ -1,347 +0,0 @@ - - - \ No newline at end of file diff --git a/solution-ui/src/views/system/menu/index.vue b/solution-ui/src/views/system/menu/index.vue deleted file mode 100644 index b61cf6f..0000000 --- a/solution-ui/src/views/system/menu/index.vue +++ /dev/null @@ -1,477 +0,0 @@ - - - diff --git a/solution-ui/src/views/system/notice/index.vue b/solution-ui/src/views/system/notice/index.vue deleted file mode 100644 index 148b856..0000000 --- a/solution-ui/src/views/system/notice/index.vue +++ /dev/null @@ -1,312 +0,0 @@ - - - diff --git a/solution-ui/src/views/system/post/index.vue b/solution-ui/src/views/system/post/index.vue deleted file mode 100644 index 60a1859..0000000 --- a/solution-ui/src/views/system/post/index.vue +++ /dev/null @@ -1,309 +0,0 @@ - - - diff --git a/solution-ui/src/views/system/role/authUser.vue b/solution-ui/src/views/system/role/authUser.vue deleted file mode 100644 index 4859d59..0000000 --- a/solution-ui/src/views/system/role/authUser.vue +++ /dev/null @@ -1,199 +0,0 @@ - - - \ No newline at end of file diff --git a/solution-ui/src/views/system/role/index.vue b/solution-ui/src/views/system/role/index.vue deleted file mode 100644 index ab01a4a..0000000 --- a/solution-ui/src/views/system/role/index.vue +++ /dev/null @@ -1,605 +0,0 @@ - - - \ No newline at end of file diff --git a/solution-ui/src/views/system/role/selectUser.vue b/solution-ui/src/views/system/role/selectUser.vue deleted file mode 100644 index d2b21bf..0000000 --- a/solution-ui/src/views/system/role/selectUser.vue +++ /dev/null @@ -1,136 +0,0 @@ - - - diff --git a/solution-ui/src/views/system/user/authRole.vue b/solution-ui/src/views/system/user/authRole.vue deleted file mode 100644 index 1f862d7..0000000 --- a/solution-ui/src/views/system/user/authRole.vue +++ /dev/null @@ -1,123 +0,0 @@ - - - \ No newline at end of file diff --git a/solution-ui/src/views/system/user/index.vue b/solution-ui/src/views/system/user/index.vue deleted file mode 100644 index 14a0ab1..0000000 --- a/solution-ui/src/views/system/user/index.vue +++ /dev/null @@ -1,558 +0,0 @@ - - - \ No newline at end of file diff --git a/solution-ui/src/views/system/user/profile/index.vue b/solution-ui/src/views/system/user/profile/index.vue deleted file mode 100644 index c070cd1..0000000 --- a/solution-ui/src/views/system/user/profile/index.vue +++ /dev/null @@ -1,95 +0,0 @@ - - - diff --git a/solution-ui/src/views/system/user/profile/resetPwd.vue b/solution-ui/src/views/system/user/profile/resetPwd.vue deleted file mode 100644 index 954d341..0000000 --- a/solution-ui/src/views/system/user/profile/resetPwd.vue +++ /dev/null @@ -1,69 +0,0 @@ - - - diff --git a/solution-ui/src/views/system/user/profile/userAvatar.vue b/solution-ui/src/views/system/user/profile/userAvatar.vue deleted file mode 100644 index 59afb35..0000000 --- a/solution-ui/src/views/system/user/profile/userAvatar.vue +++ /dev/null @@ -1,184 +0,0 @@ - - - - diff --git a/solution-ui/src/views/system/user/profile/userInfo.vue b/solution-ui/src/views/system/user/profile/userInfo.vue deleted file mode 100644 index 486adfc..0000000 --- a/solution-ui/src/views/system/user/profile/userInfo.vue +++ /dev/null @@ -1,88 +0,0 @@ - - - diff --git a/solution-ui/src/views/tool/build/CodeTypeDialog.vue b/solution-ui/src/views/tool/build/CodeTypeDialog.vue deleted file mode 100644 index b5c2e2e..0000000 --- a/solution-ui/src/views/tool/build/CodeTypeDialog.vue +++ /dev/null @@ -1,106 +0,0 @@ - - diff --git a/solution-ui/src/views/tool/build/DraggableItem.vue b/solution-ui/src/views/tool/build/DraggableItem.vue deleted file mode 100644 index e881778..0000000 --- a/solution-ui/src/views/tool/build/DraggableItem.vue +++ /dev/null @@ -1,100 +0,0 @@ - diff --git a/solution-ui/src/views/tool/build/IconsDialog.vue b/solution-ui/src/views/tool/build/IconsDialog.vue deleted file mode 100644 index 958be50..0000000 --- a/solution-ui/src/views/tool/build/IconsDialog.vue +++ /dev/null @@ -1,123 +0,0 @@ - - - diff --git a/solution-ui/src/views/tool/build/RightPanel.vue b/solution-ui/src/views/tool/build/RightPanel.vue deleted file mode 100644 index c2760eb..0000000 --- a/solution-ui/src/views/tool/build/RightPanel.vue +++ /dev/null @@ -1,946 +0,0 @@ - - - - - diff --git a/solution-ui/src/views/tool/build/TreeNodeDialog.vue b/solution-ui/src/views/tool/build/TreeNodeDialog.vue deleted file mode 100644 index e913d0f..0000000 --- a/solution-ui/src/views/tool/build/TreeNodeDialog.vue +++ /dev/null @@ -1,148 +0,0 @@ - - diff --git a/solution-ui/src/views/tool/build/index.vue b/solution-ui/src/views/tool/build/index.vue deleted file mode 100644 index 889422b..0000000 --- a/solution-ui/src/views/tool/build/index.vue +++ /dev/null @@ -1,775 +0,0 @@ - - - - - diff --git a/solution-ui/src/views/tool/gen/basicInfoForm.vue b/solution-ui/src/views/tool/gen/basicInfoForm.vue deleted file mode 100644 index 3a6e2ed..0000000 --- a/solution-ui/src/views/tool/gen/basicInfoForm.vue +++ /dev/null @@ -1,60 +0,0 @@ - - - diff --git a/solution-ui/src/views/tool/gen/createTable.vue b/solution-ui/src/views/tool/gen/createTable.vue deleted file mode 100644 index e71996c..0000000 --- a/solution-ui/src/views/tool/gen/createTable.vue +++ /dev/null @@ -1,45 +0,0 @@ - - - diff --git a/solution-ui/src/views/tool/gen/editTable.vue b/solution-ui/src/views/tool/gen/editTable.vue deleted file mode 100644 index 512f66e..0000000 --- a/solution-ui/src/views/tool/gen/editTable.vue +++ /dev/null @@ -1,229 +0,0 @@ - - - diff --git a/solution-ui/src/views/tool/gen/genInfoForm.vue b/solution-ui/src/views/tool/gen/genInfoForm.vue deleted file mode 100644 index 60d9e87..0000000 --- a/solution-ui/src/views/tool/gen/genInfoForm.vue +++ /dev/null @@ -1,312 +0,0 @@ - - - diff --git a/solution-ui/src/views/tool/gen/importTable.vue b/solution-ui/src/views/tool/gen/importTable.vue deleted file mode 100644 index cb080ce..0000000 --- a/solution-ui/src/views/tool/gen/importTable.vue +++ /dev/null @@ -1,120 +0,0 @@ - - - diff --git a/solution-ui/src/views/tool/gen/index.vue b/solution-ui/src/views/tool/gen/index.vue deleted file mode 100644 index 9859722..0000000 --- a/solution-ui/src/views/tool/gen/index.vue +++ /dev/null @@ -1,348 +0,0 @@ - - - diff --git a/solution-ui/src/views/tool/swagger/index.vue b/solution-ui/src/views/tool/swagger/index.vue deleted file mode 100644 index dd6b4a2..0000000 --- a/solution-ui/src/views/tool/swagger/index.vue +++ /dev/null @@ -1,15 +0,0 @@ - - diff --git a/solution-ui/vue.config.js b/solution-ui/vue.config.js deleted file mode 100644 index e6d30d7..0000000 --- a/solution-ui/vue.config.js +++ /dev/null @@ -1,136 +0,0 @@ -'use strict' -const path = require('path') - -function resolve(dir) { - return path.join(__dirname, dir) -} - -const CompressionPlugin = require('compression-webpack-plugin') - -const name = process.env.VUE_APP_TITLE || '自动化生成系统' // 网页标题 - -const baseUrl = 'http://localhost:1777' // 后端接口 - -const port = process.env.port || process.env.npm_config_port || 1776 // 端口 - -// vue.config.js 配置说明 -//官方vue.config.js 参考文档 https://cli.vuejs.org/zh/config/#css-loaderoptions -// 这里只列一部分,具体配置参考文档 -module.exports = { - // 部署生产环境和开发环境下的URL。 - // 默认情况下,Vue CLI 会假设你的应用是被部署在一个域名的根路径上 - // 例如 https://www.ruoyi.vip/。如果应用被部署在一个子路径上,你就需要用这个选项指定这个子路径。例如,如果你的应用被部署在 https://www.ruoyi.vip/admin/,则设置 baseUrl 为 /admin/。 - publicPath: process.env.NODE_ENV === "production" ? "/" : "/", - // 在npm run build 或 yarn build 时 ,生成文件的目录名称(要和baseUrl的生产环境路径一致)(默认dist) - outputDir: 'dist', - // 用于放置生成的静态资源 (js、css、img、fonts) 的;(项目打包之后,静态资源会放在这个文件夹下) - assetsDir: 'static', - // 如果你不需要生产环境的 source map,可以将其设置为 false 以加速生产环境构建。 - productionSourceMap: false, - transpileDependencies: ['quill'], - // webpack-dev-server 相关配置 - devServer: { - host: '0.0.0.0', - port: port, - open: true, - proxy: { - // detail: https://cli.vuejs.org/config/#devserver-proxy - [process.env.VUE_APP_BASE_API]: { - target: baseUrl, - changeOrigin: true, - pathRewrite: { - ['^' + process.env.VUE_APP_BASE_API]: '' - } - }, - // springdoc proxy - '^/v3/api-docs/(.*)': { - target: baseUrl, - changeOrigin: true - } - }, - disableHostCheck: true - }, - css: { - loaderOptions: { - sass: { - sassOptions: { outputStyle: "expanded" } - } - } - }, - configureWebpack: { - name: name, - resolve: { - alias: { - '@': resolve('src') - } - }, - plugins: [ - // http://doc.ruoyi.vip/ruoyi-vue/other/faq.html#使用gzip解压缩静态文件 - new CompressionPlugin({ - cache: false, // 不启用文件缓存 - test: /\.(js|css|html|jpe?g|png|gif|svg)?$/i, // 压缩文件格式 - filename: '[path][base].gz[query]', // 压缩后的文件名 - algorithm: 'gzip', // 使用gzip压缩 - minRatio: 0.8, // 压缩比例,小于 80% 的文件不会被压缩 - deleteOriginalAssets: false // 压缩后删除原文件 - }) - ], - }, - chainWebpack(config) { - config.plugins.delete('preload') // TODO: need test - config.plugins.delete('prefetch') // TODO: need test - - // set svg-sprite-loader - config.module - .rule('svg') - .exclude.add(resolve('src/assets/icons')) - .end() - config.module - .rule('icons') - .test(/\.svg$/) - .include.add(resolve('src/assets/icons')) - .end() - .use('svg-sprite-loader') - .loader('svg-sprite-loader') - .options({ - symbolId: 'icon-[name]' - }) - .end() - - config.when(process.env.NODE_ENV !== 'development', config => { - config - .plugin('ScriptExtHtmlWebpackPlugin') - .after('html') - .use('script-ext-html-webpack-plugin', [{ - // `runtime` must same as runtimeChunk name. default is `runtime` - inline: /runtime\..*\.js$/ - }]) - .end() - - config.optimization.splitChunks({ - chunks: 'all', - cacheGroups: { - libs: { - name: 'chunk-libs', - test: /[\\/]node_modules[\\/]/, - priority: 10, - chunks: 'initial' // only package third parties that are initially dependent - }, - elementUI: { - name: 'chunk-elementUI', // split elementUI into a single package - test: /[\\/]node_modules[\\/]_?element-ui(.*)/, // in order to adapt to cnpm - priority: 20 // the weight needs to be larger than libs and app or it will be packaged into libs or app - }, - commons: { - name: 'chunk-commons', - test: resolve('src/components'), // can customize your rules - minChunks: 3, // minimum common number - priority: 5, - reuseExistingChunk: true - } - } - }) - config.optimization.runtimeChunk('single') - }) - } -}