Compare commits

..

7 Commits

@ -1,95 +0,0 @@
<p align="center">
<img alt="logo" src="https://oscimg.oschina.net/oscnet/up-d3d0a9303e11d522a06cd263f3079027715.png">
</p>
<h1 align="center" style="margin: 30px 0 30px; font-weight: bold;">RuoYi v3.8.9</h1>
<h4 align="center">基于SpringBoot+Vue前后端分离的Java快速开发框架</h4>
<p align="center">
<a href="https://gitee.com/y_project/RuoYi-Vue/stargazers"><img src="https://gitee.com/y_project/RuoYi-Vue/badge/star.svg?theme=dark"></a>
<a href="https://gitee.com/y_project/RuoYi-Vue"><img src="https://img.shields.io/badge/RuoYi-v3.8.9-brightgreen.svg"></a>
<a href="https://gitee.com/y_project/RuoYi-Vue/blob/master/LICENSE"><img src="https://img.shields.io/github/license/mashape/apistatus.svg"></a>
</p>
## 平台简介
若依是一套全部开源的快速开发平台,毫无保留给个人及企业免费使用。
* 前端采用Vue、Element UI。
* 后端采用Spring Boot、Spring Security、Redis & Jwt。
* 权限认证使用Jwt支持多终端认证系统。
* 支持加载动态权限菜单,多方式轻松权限控制。
* 高效率开发,使用代码生成器可以一键生成前后端代码。
* 提供了技术栈([Vue3](https://v3.cn.vuejs.org) [Element Plus](https://element-plus.org/zh-CN) [Vite](https://cn.vitejs.dev))版本[RuoYi-Vue3](https://gitcode.com/yangzongzhuan/RuoYi-Vue3),保持同步更新。
* 提供了单应用版本[RuoYi-Vue-fast](https://gitcode.com/yangzongzhuan/RuoYi-Vue-fast)Oracle版本[RuoYi-Vue-Oracle](https://gitcode.com/yangzongzhuan/RuoYi-Vue-Oracle),保持同步更新。
* 不分离版本,请移步[RuoYi](https://gitee.com/y_project/RuoYi),微服务版本,请移步[RuoYi-Cloud](https://gitee.com/y_project/RuoYi-Cloud)
* 阿里云折扣场:[点我进入](http://aly.ruoyi.vip),腾讯云秒杀场:[点我进入](http://txy.ruoyi.vip)&nbsp;&nbsp;
## 内置功能
1. 用户管理:用户是系统操作者,该功能主要完成系统用户配置。
2. 部门管理:配置系统组织机构(公司、部门、小组),树结构展现支持数据权限。
3. 岗位管理:配置系统用户所属担任职务。
4. 菜单管理:配置系统菜单,操作权限,按钮权限标识等。
5. 角色管理:角色菜单权限分配、设置角色按机构进行数据范围权限划分。
6. 字典管理:对系统中经常使用的一些较为固定的数据进行维护。
7. 参数管理:对系统动态配置常用参数。
8. 通知公告:系统通知公告信息发布维护。
9. 操作日志:系统正常操作日志记录和查询;系统异常信息日志记录和查询。
10. 登录日志:系统登录日志记录查询包含登录异常。
11. 在线用户:当前系统中活跃用户状态监控。
12. 定时任务:在线(添加、修改、删除)任务调度包含执行结果日志。
13. 代码生成前后端代码的生成java、html、xml、sql支持CRUD下载 。
14. 系统接口根据业务代码自动生成相关的api接口文档。
15. 服务监控监视当前系统CPU、内存、磁盘、堆栈等相关信息。
16. 缓存监控:对系统的缓存信息查询,命令统计等。
17. 在线构建器拖动表单元素生成相应的HTML代码。
18. 连接池监视监视当前系统数据库连接池状态可进行分析SQL找出系统性能瓶颈。
## 在线体验
- admin/admin123
- 陆陆续续收到一些打赏,为了更好的体验已用于演示服务器升级。谢谢各位小伙伴。
演示地址http://vue.ruoyi.vip
文档地址http://doc.ruoyi.vip
## 演示图
<table>
<tr>
<td><img src="https://oscimg.oschina.net/oscnet/cd1f90be5f2684f4560c9519c0f2a232ee8.jpg"/></td>
<td><img src="https://oscimg.oschina.net/oscnet/1cbcf0e6f257c7d3a063c0e3f2ff989e4b3.jpg"/></td>
</tr>
<tr>
<td><img src="https://oscimg.oschina.net/oscnet/up-8074972883b5ba0622e13246738ebba237a.png"/></td>
<td><img src="https://oscimg.oschina.net/oscnet/up-9f88719cdfca9af2e58b352a20e23d43b12.png"/></td>
</tr>
<tr>
<td><img src="https://oscimg.oschina.net/oscnet/up-39bf2584ec3a529b0d5a3b70d15c9b37646.png"/></td>
<td><img src="https://oscimg.oschina.net/oscnet/up-936ec82d1f4872e1bc980927654b6007307.png"/></td>
</tr>
<tr>
<td><img src="https://oscimg.oschina.net/oscnet/up-b2d62ceb95d2dd9b3fbe157bb70d26001e9.png"/></td>
<td><img src="https://oscimg.oschina.net/oscnet/up-d67451d308b7a79ad6819723396f7c3d77a.png"/></td>
</tr>
<tr>
<td><img src="https://oscimg.oschina.net/oscnet/5e8c387724954459291aafd5eb52b456f53.jpg"/></td>
<td><img src="https://oscimg.oschina.net/oscnet/644e78da53c2e92a95dfda4f76e6d117c4b.jpg"/></td>
</tr>
<tr>
<td><img src="https://oscimg.oschina.net/oscnet/up-8370a0d02977eebf6dbf854c8450293c937.png"/></td>
<td><img src="https://oscimg.oschina.net/oscnet/up-49003ed83f60f633e7153609a53a2b644f7.png"/></td>
</tr>
<tr>
<td><img src="https://oscimg.oschina.net/oscnet/up-d4fe726319ece268d4746602c39cffc0621.png"/></td>
<td><img src="https://oscimg.oschina.net/oscnet/up-c195234bbcd30be6927f037a6755e6ab69c.png"/></td>
</tr>
<tr>
<td><img src="https://oscimg.oschina.net/oscnet/b6115bc8c31de52951982e509930b20684a.jpg"/></td>
<td><img src="https://oscimg.oschina.net/oscnet/up-5e4daac0bb59612c5038448acbcef235e3a.png"/></td>
</tr>
</table>
## 若依前后端分离交流群
QQ群 [![加入QQ群](https://img.shields.io/badge/已满-937441-blue.svg)](https://jq.qq.com/?_wv=1027&k=5bVB1og) [![加入QQ群](https://img.shields.io/badge/已满-887144332-blue.svg)](https://jq.qq.com/?_wv=1027&k=5eiA4DH) [![加入QQ群](https://img.shields.io/badge/已满-180251782-blue.svg)](https://jq.qq.com/?_wv=1027&k=5AxMKlC) [![加入QQ群](https://img.shields.io/badge/已满-104180207-blue.svg)](https://jq.qq.com/?_wv=1027&k=51G72yr) [![加入QQ群](https://img.shields.io/badge/已满-186866453-blue.svg)](https://jq.qq.com/?_wv=1027&k=VvjN2nvu) [![加入QQ群](https://img.shields.io/badge/已满-201396349-blue.svg)](https://jq.qq.com/?_wv=1027&k=5vYAqA05) [![加入QQ群](https://img.shields.io/badge/已满-101456076-blue.svg)](https://jq.qq.com/?_wv=1027&k=kOIINEb5) [![加入QQ群](https://img.shields.io/badge/已满-101539465-blue.svg)](https://jq.qq.com/?_wv=1027&k=UKtX5jhs) [![加入QQ群](https://img.shields.io/badge/已满-264312783-blue.svg)](https://jq.qq.com/?_wv=1027&k=EI9an8lJ) [![加入QQ群](https://img.shields.io/badge/已满-167385320-blue.svg)](https://jq.qq.com/?_wv=1027&k=SWCtLnMz) [![加入QQ群](https://img.shields.io/badge/已满-104748341-blue.svg)](https://jq.qq.com/?_wv=1027&k=96Dkdq0k) [![加入QQ群](https://img.shields.io/badge/已满-160110482-blue.svg)](https://jq.qq.com/?_wv=1027&k=0fsNiYZt) [![加入QQ群](https://img.shields.io/badge/已满-170801498-blue.svg)](https://jq.qq.com/?_wv=1027&k=7xw4xUG1) [![加入QQ群](https://img.shields.io/badge/已满-108482800-blue.svg)](https://jq.qq.com/?_wv=1027&k=eCx8eyoJ) [![加入QQ群](https://img.shields.io/badge/已满-101046199-blue.svg)](https://jq.qq.com/?_wv=1027&k=SpyH2875) [![加入QQ群](https://img.shields.io/badge/已满-136919097-blue.svg)](https://jq.qq.com/?_wv=1027&k=tKEt51dz) [![加入QQ群](https://img.shields.io/badge/已满-143961921-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=0vBbSb0ztbBgVtn3kJS-Q4HUNYwip89G&authKey=8irq5PhutrZmWIvsUsklBxhj57l%2F1nOZqjzigkXZVoZE451GG4JHPOqW7AW6cf0T&noverify=0&group_code=143961921) [![加入QQ群](https://img.shields.io/badge/已满-174951577-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=ZFAPAbp09S2ltvwrJzp7wGlbopsc0rwi&authKey=HB2cxpxP2yspk%2Bo3WKTBfktRCccVkU26cgi5B16u0KcAYrVu7sBaE7XSEqmMdFQp&noverify=0&group_code=174951577) [![加入QQ群](https://img.shields.io/badge/已满-161281055-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=Fn2aF5IHpwsy8j6VlalNJK6qbwFLFHat&authKey=uyIT%2B97x2AXj3odyXpsSpVaPMC%2Bidw0LxG5MAtEqlrcBcWJUA%2FeS43rsF1Tg7IRJ&noverify=0&group_code=161281055) [![加入QQ群](https://img.shields.io/badge/已满-138988063-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=XIzkm_mV2xTsUtFxo63bmicYoDBA6Ifm&authKey=dDW%2F4qsmw3x9govoZY9w%2FoWAoC4wbHqGal%2BbqLzoS6VBarU8EBptIgPKN%2FviyC8j&noverify=0&group_code=138988063) [![加入QQ群](https://img.shields.io/badge/已满-151450850-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=DkugnCg68PevlycJSKSwjhFqfIgrWWwR&authKey=pR1Pa5lPIeGF%2FFtIk6d%2FGB5qFi0EdvyErtpQXULzo03zbhopBHLWcuqdpwY241R%2F&noverify=0&group_code=151450850) [![加入QQ群](https://img.shields.io/badge/已满-224622315-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=F58bgRa-Dp-rsQJThiJqIYv8t4-lWfXh&authKey=UmUs4CVG5OPA1whvsa4uSespOvyd8%2FAr9olEGaWAfdLmfKQk%2FVBp2YU3u2xXXt76&noverify=0&group_code=224622315) [![加入QQ群](https://img.shields.io/badge/已满-287842588-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=Nxb2EQ5qozWa218Wbs7zgBnjLSNk_tVT&authKey=obBKXj6SBKgrFTJZx0AqQnIYbNOvBB2kmgwWvGhzxR67RoRr84%2Bus5OadzMcdJl5&noverify=0&group_code=287842588) [![加入QQ群](https://img.shields.io/badge/187944233-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=numtK1M_I4eVd2Gvg8qtbuL8JgX42qNh&authKey=giV9XWMaFZTY%2FqPlmWbkB9g3fi0Ev5CwEtT9Tgei0oUlFFCQLDp4ozWRiVIzubIm&noverify=0&group_code=187944233) 点击按钮入群。

@ -20,9 +20,14 @@
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext7-core</artifactId>
<version>8.0.4</version> <!-- 2023年最新版本 -->
<version>7.2.5</version> <!-- 2023年最新版本 -->
<type>pom</type>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>font-asian</artifactId>
<version>7.1.13</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>html2pdf</artifactId>
@ -62,22 +67,22 @@
</dependency>
<!-- https://mvnrepository.com/artifact/com.itextpdf/itext-asian -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
<!--富文本转pdfhtml转pdfitext转pdf-->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13</version>
</dependency>
<dependency>
<groupId>com.itextpdf.tool</groupId>
<artifactId>xmlworker</artifactId>
<version>5.5.13</version>
</dependency>
<!-- <dependency>-->
<!-- <groupId>com.itextpdf</groupId>-->
<!-- <artifactId>itext-asian</artifactId>-->
<!-- <version>5.2.0</version>-->
<!-- </dependency>-->
<!-- &lt;!&ndash;富文本转pdfhtml转pdfitext转pdf&ndash;&gt;-->
<!-- <dependency>-->
<!-- <groupId>com.itextpdf</groupId>-->
<!-- <artifactId>itextpdf</artifactId>-->
<!-- <version>5.5.13</version>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>com.itextpdf.tool</groupId>-->
<!-- <artifactId>xmlworker</artifactId>-->
<!-- <version>5.5.13</version>-->
<!-- </dependency>-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>

@ -39,6 +39,8 @@ public class TimingRemindImpl implements TimingRemindService {
private UserService userService;
@Resource
private SysUserMapper sysUserMapper;
/**
@ -47,15 +49,18 @@ public class TimingRemindImpl implements TimingRemindService {
public void enterpriseTiming(String t, Long id) {
//模拟企业人员数据
//给所有的企业都要添加一条智能提醒数据
List<String> allEnterprise = new ArrayList<>();
allEnterprise.add("9144030071526726XG");
List<SysUser> sysUsers = sysUserMapper.selectUserList(new SysUser());
//获取到所有的符合条件的政务用户
List<SysUser> collect = sysUsers.stream().filter(x -> "0".equals(x.getDelFlag()) && "0".equals(x.getStatus()))
.filter(y -> CreditCodeUtil.isCreditCode(y.getUserName()))
.collect(Collectors.toList());
List<SmartDeclaration> listAdd = new ArrayList<>();
allEnterprise.forEach(x -> {
collect.forEach(x -> {
SmartDeclaration sd = new SmartDeclaration();
sd.setAlertTime(LocalDateTime.parse(t));
sd.setIsRead(1);
sd.setSmartRemindersId(id);
sd.setTyshxydm(x);
sd.setTyshxydm(x.getUserName());
listAdd.add(sd);
});
smartDeclarationService.saveBatch(listAdd);

@ -1,44 +0,0 @@
package com.ruoyi.docking.controller;
import com.ruoyi.common.annotation.DataSource;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.DataSourceType;
import com.ruoyi.docking.service.ProjectService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
* (Project)
*
* @author makejava
* @since 2025-03-25 14:47:53
*/
@Api(tags = "项目(对接数据)")
@RestController
@RequestMapping("/gysl/project")
public class ProjectController extends BaseController {
// /**
// * 服务对象
// */
// @Resource
// private ProjectService projectService;
//
// /**
// * 查询所有数据
// * @return 所有数据
// */
// @ApiOperation("查询所有数据")
// @GetMapping("/list")
// @DataSource(value = DataSourceType.SLAVE)
// public AjaxResult selectAll() {
// return success(projectService.list());
// }
}

@ -1,10 +1,8 @@
package com.ruoyi.docking.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.docking.entity.ProjectProgress;
import com.ruoyi.docking.service.ProjectProgressService;
import com.ruoyi.gysl.entity.request.ZwIdPageReq;
@ -13,9 +11,7 @@ import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.Serializable;
import java.util.List;
/**
@ -36,16 +32,15 @@ public class ProjectProgressController extends BaseController {
/**
*
*
*
* @param page
* @param zwIdPageReq
* @return
*/
@ApiOperation(value = "分页查询所有数据", response = ProjectProgress.class)
@ApiOperation(value = "查询所有数据", response = ProjectProgress.class)
@GetMapping("/page")
public AjaxResult selectAll(Page<ProjectProgress> page, @Valid ZwIdPageReq zwIdPageReq) {
return success(projectProgressService.page(page, zwIdPageReq));
public AjaxResult selectAll(ZwIdPageReq zwIdPageReq) {
return success(projectProgressService.page( zwIdPageReq));
}
@ -57,32 +52,10 @@ public class ProjectProgressController extends BaseController {
*/
@ApiOperation("新增数据")
@PostMapping("/add")
public AjaxResult insert(@RequestBody ProjectProgress projectMonthInfo) {
public AjaxResult insert(@RequestBody @Valid ProjectProgress projectMonthInfo) {
return success(projectProgressService.save(projectMonthInfo));
}
// /**
// * 测试
// */
// @GetMapping("/test")
// @ApiOperation(value = "测试", response = ProjectProgress.class)
// public AjaxResult test() {
// return success(projectProgressService.djList());
// }
/**
*
*
* @param id
* @return
*/
@GetMapping("/{id}")
@ApiOperation(value = "通过主键查询单条数据", response = ProjectProgress.class)
public AjaxResult selectOne(@PathVariable Serializable id) {
return success(projectProgressService.getById(id));
}
/**
*
@ -93,7 +66,11 @@ public class ProjectProgressController extends BaseController {
@ApiOperation("修改数据")
@PutMapping("/edit")
public AjaxResult update(@RequestBody ProjectProgress projectProgress) {
return success(projectProgressService.updateById(projectProgress));
if(projectProgress.getId()!=null){
return AjaxResult.success(projectProgressService.updateById(projectProgress));
}else {
return AjaxResult.success(projectProgressService.save(projectProgress));
}
}
/**
@ -107,16 +84,5 @@ public class ProjectProgressController extends BaseController {
public AjaxResult delete(@RequestParam("idList") List<Long> idList) {
return success(projectProgressService.removeByIds(idList));
}
/**
*
*/
@ApiOperation(value = "根据条件导出月度进展详情")
@PostMapping(value = "/export")
public void export(HttpServletResponse response, ZwIdPageReq zwIdPageReq) throws Exception {
List<ProjectProgress> filteredList = projectProgressService.page(zwIdPageReq);
ExcelUtil<ProjectProgress> util = new ExcelUtil<>(ProjectProgress.class);
util.exportExcel(response, filteredList, "月度进展详情");
}
}

@ -9,6 +9,8 @@ import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.NotBlank;
/**
* (ProjectProgress)
*
@ -18,10 +20,16 @@ import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("project_progress")
@ApiModel(value="项目月度进度",description = "对接数据")
@ApiModel(value="项目月度进度")
public class ProjectProgress {
@TableId(type = IdType.AUTO)
@ApiModelProperty(value ="项目进度ID" )
private Integer id;
@ApiModelProperty(value ="项目id" )
private Integer xmId;
@ApiModelProperty(value ="项目进度ID" )
private Integer progressId;
@ -31,6 +39,7 @@ public class ProjectProgress {
@ApiModelProperty(value ="月份" )
@NotBlank(message = "请填写月份")
private String month;
@ -124,5 +133,11 @@ public class ProjectProgress {
@ApiModelProperty(value ="下一年税收" )
private Float nextTax;
//---------------
@ApiModelProperty(value ="截止目前累计建成面积(平方米)" )
private String jzmqjc;
@ApiModelProperty(value ="项目进展详情" )
private String xmjzxq;
}

@ -1,15 +0,0 @@
package com.ruoyi.docking.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.docking.entity.Project;
/**
* (Project)访
*
* @author makejava
* @since 2025-03-25 14:47:57
*/
public interface ProjectMapper extends BaseMapper<Project> {
}

@ -2,6 +2,8 @@ package com.ruoyi.docking.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.annotation.DataSource;
import com.ruoyi.common.enums.DataSourceType;
import com.ruoyi.docking.entity.ProjectProgress;
import com.ruoyi.gysl.entity.request.ZwIdPageReq;
import org.apache.ibatis.annotations.Param;
@ -20,11 +22,10 @@ public interface ProjectProgressMapper extends BaseMapper<ProjectProgress> {
/**
*
*
* @param page
* @param zwIdPageReq
* @param name
* @return
*/
Page<ProjectProgress> page(Page<ProjectProgress> page,@Param("req") ZwIdPageReq zwIdPageReq);
List<ProjectProgress> page( @Param("req") ZwIdPageReq zwIdPageReq);
@DataSource(value = DataSourceType.SLAVE)
List<ProjectProgress> page( @Param("name") String name);
}

@ -17,19 +17,11 @@ import java.util.List;
public interface ProjectProgressService extends IService<ProjectProgress> {
/**
*
*
*
* @param page
* @param zwIdPageReq
* @return
*/
Page<ProjectProgress> page(Page<ProjectProgress> page, ZwIdPageReq zwIdPageReq);
List<ProjectProgress> page( ZwIdPageReq zwIdPageReq);
/**
*
*/
List<ProjectProgress> djList();
}

@ -1,22 +0,0 @@
package com.ruoyi.docking.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.docking.entity.Project;
import java.util.List;
/**
* (Project)
*
* @author makejava
* @since 2025-03-25 14:47:59
*/
public interface ProjectService extends IService<Project> {
/**
*
*/
List<Project> djList();
}

@ -1,18 +1,23 @@
package com.ruoyi.docking.service.impl;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.annotation.DataSource;
import com.ruoyi.common.enums.DataSourceType;
import com.ruoyi.docking.entity.ProjectProgress;
import com.ruoyi.docking.mapper.ProjectProgressMapper;
import com.ruoyi.docking.service.ProjectProgressService;
import com.ruoyi.gysl.entity.BasicInformation;
import com.ruoyi.gysl.entity.request.ZwIdPageReq;
import com.ruoyi.gysl.service.BasicInformationService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* (ProjectProgress)
@ -23,41 +28,31 @@ import java.util.List;
@Service("projectProgressService")
public class ProjectProgressServiceImpl extends ServiceImpl<ProjectProgressMapper, ProjectProgress> implements ProjectProgressService {
@Resource
private BasicInformationService basicInformationService;
@Resource
private ProjectProgressMapper projectProgressMapper;
/**
*
*
*
* @param page
* @param zwIdPageReq
* @return
*/
@Override
public Page<ProjectProgress> page(Page<ProjectProgress> page, ZwIdPageReq zwIdPageReq) {
return baseMapper.page(page, zwIdPageReq);
}
@Override
public List<ProjectProgress> page(ZwIdPageReq zwIdPageReq) {
return baseMapper.page(zwIdPageReq);
}
/**
*
*/
@DataSource(value = DataSourceType.SLAVE)
@Override
public List<ProjectProgress> djList() {
//获取当前时间的上一个月的秒级时间戳
// 获取当前时间(带时区)
ZonedDateTime now = ZonedDateTime.now(ZoneId.systemDefault());
// 计算上个月同一时间(自动处理跨月边界)
ZonedDateTime lastMonth = now.minusMonths(1);
// 上个月的时间转换为秒级时间戳
long timestamp = lastMonth.toEpochSecond();
// 当前的时间转换为秒级时间戳
long nowTime = now.toEpochSecond();
return lambdaQuery().ge(ProjectProgress::getCreatedAt, timestamp)
.lt(ProjectProgress::getCreatedAt, nowTime).list();
//查询对应的项目基础信息数据
BasicInformation byId = basicInformationService.getById(zwIdPageReq.getXmId());
//获取对接的数据
List<ProjectProgress> page = projectProgressMapper.page(byId.getName());
List<ProjectProgress> list = lambdaQuery().eq(ProjectProgress::getXmId, byId.getId()).list();
return new ArrayList<>(Stream.concat(list.stream(), page.stream())
.collect(Collectors.toMap(
ProjectProgress::getMonth,
v -> v,
(existing, replacement) -> existing // 冲突时保留现有值即list中的值
))
.values());
}
}

@ -1,45 +0,0 @@
package com.ruoyi.docking.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.annotation.DataSource;
import com.ruoyi.common.enums.DataSourceType;
import com.ruoyi.docking.entity.ProjectProgress;
import com.ruoyi.docking.mapper.ProjectMapper;
import com.ruoyi.docking.entity.Project;
import com.ruoyi.docking.service.ProjectService;
import org.springframework.stereotype.Service;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.List;
/**
* (Project)
*
* @author makejava
* @since 2025-03-25 14:47:59
*/
@Service("projectService")
public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> implements ProjectService {
/**
*
*/
@DataSource(value = DataSourceType.SLAVE)
@Override
public List<Project> djList() {
//获取当前时间的上一个月的秒级时间戳
// 获取当前时间(带时区)
ZonedDateTime now = ZonedDateTime.now(ZoneId.systemDefault());
// 计算上个月同一时间(自动处理跨月边界)
ZonedDateTime lastMonth = now.minusMonths(1);
// 上个月的时间转换为秒级时间戳
long timestamp = lastMonth.toEpochSecond();
// 当前的时间转换为秒级时间戳
long nowTime = now.toEpochSecond();
return lambdaQuery().ge(Project::getCreatedAt, timestamp)
.lt(Project::getCreatedAt, nowTime).list();
}
}

@ -14,6 +14,7 @@ import com.ruoyi.docking.mapper.SmartRemindersMapper;
import com.ruoyi.docking.service.SmartRemindersService;
import com.ruoyi.quartz.domain.SysJob;
import com.ruoyi.quartz.service.ISysJobService;
import com.ruoyi.system.mapper.SysUserMapper;
import org.quartz.SchedulerException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@ -34,6 +35,8 @@ public class SmartRemindersServiceImpl extends ServiceImpl<SmartRemindersMapper,
@Resource
private ISysJobService jobService;
@Resource
private SysUserMapper sysUserMapper;
/**
*
@ -98,13 +101,15 @@ public class SmartRemindersServiceImpl extends ServiceImpl<SmartRemindersMapper,
sysJob.setCronExpression(generateCron(jSmartReminders.getAlertTime()));//生成cron表达式
if (jSmartReminders.getAlertRecipients() == 1) {
//如果是企业的定时提醒(调用这个方法)
sysJob.setInvokeTarget("timingRemind.enterpriseTiming(" + "'" + jSmartReminders.getAlertTime() + "'" + "," + jSmartReminders.getId() + "L" + ")");
sysJob.setInvokeTarget("timingRemind.enterpriseTiming("
+ "'" + jSmartReminders.getAlertTime() + "'" + ","
+ jSmartReminders.getId() + "L" + ")");
} else {
//如果是政务端的定时提醒
sysJob.setInvokeTarget("timingRemind.chiefTiming(" + "'"
+ jSmartReminders.getAlertTime() + "'" + ","
+ jSmartReminders.getId() + "L," + "'"
+ jSmartReminders.getProjectId() + "'"+"'"
+ jSmartReminders.getProjectId() + "'"+","+ "'"
+ jSmartReminders.getAlertContent() + "'" + ")");
}
sysJob.setJobGroup("DEFAULT");

@ -7,7 +7,6 @@ import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.gysl.entity.Dpclgl;
import com.ruoyi.gysl.entity.request.DpclglPageReq;
import com.ruoyi.gysl.service.DpclglService;
import com.ruoyi.gysl.utils.HtmlToPdfConverter;
import com.ruoyi.web.controller.common.CommonController;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@ -101,17 +100,6 @@ public class DpclglController extends BaseController {
}
/**
*
*
* @return
*/
@ApiOperation(value = "副编辑器内容生成pdf文件url")
@GetMapping("/unloadPdf")
public AjaxResult unloadPdf(@RequestParam(defaultValue = "文章标题") String htmlArticleTitle, @RequestParam(defaultValue = "文章内容") String htmlContent) throws Exception {
MultipartFile multipartFile = HtmlToPdfConverter.convertHtmlToPdf(htmlArticleTitle, htmlContent);
return AjaxResult.success(commonController.uploadFile(multipartFile));
}
}

@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.gysl.entity.GyslProjectHandbook;
import com.ruoyi.gysl.entity.request.HandbookRequest;
import com.ruoyi.gysl.service.GyslProjectHandbookService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@ -14,6 +15,7 @@ import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.Serializable;
import java.util.List;
import static com.ruoyi.common.core.domain.AjaxResult.success;
@ -39,14 +41,16 @@ public class GyslProjectHandbookController {
/**
*
*
* @param page
* @param gyslProjectHandbook
* @param g
* @return
*/
@GetMapping("/page")
@ApiOperation(value = "分页查询所有数据", response = GyslProjectHandbook.class)
public AjaxResult selectAll(Page<GyslProjectHandbook> page, GyslProjectHandbook gyslProjectHandbook) {
return success(gyslProjectHandbookService.page(page, new QueryWrapper<>(gyslProjectHandbook)));
public AjaxResult selectAll(HandbookRequest g) {
Page<GyslProjectHandbook> a1 = new Page<>();
a1.setCurrent(g.getCurrent());
a1.setSize(g.getSize());
return success(gyslProjectHandbookService.page(a1,g));
}
/**
@ -58,7 +62,7 @@ public class GyslProjectHandbookController {
@GetMapping("/{id}")
@ApiOperation(value = "通过主键查询单条数据", response = GyslProjectHandbook.class)
public AjaxResult selectOne(@PathVariable Serializable id) {
return success(gyslProjectHandbookService.getById(id));
return success(gyslProjectHandbookService.getData(id));
}
/**

@ -4,15 +4,20 @@ package com.ruoyi.gysl.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.gysl.entity.Xmzsk;
import com.ruoyi.gysl.entity.request.XmzskPageReq;
import com.ruoyi.gysl.service.XmzskService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.Serializable;
import java.util.List;
@ -92,5 +97,49 @@ public class XmzskController extends BaseController {
public AjaxResult delete(@RequestParam("idList") List<Long> idList) {
return success(xmzskService.removeByIds(idList));
}
/**
*
*/
// @PreAuthorize("@ss.hasAnyRoles('admin,common')")
@ApiOperation("导出项目数据")
@PostMapping("/exportInfo")
public void exportInfo(HttpServletResponse response,XmzskPageReq req) {
List<Xmzsk> pE = xmzskService.page(req);
ExcelUtil<Xmzsk> util = new ExcelUtil<>(Xmzsk.class);
util.exportExcel(response, pE, "项目知识库数据");
}
/**
*
*/
@ApiOperation("导出基本信息模板")
@PostMapping("/importTemplate")
public void importTemplate(HttpServletResponse response) {
ExcelUtil<Xmzsk> util = new ExcelUtil<>(Xmzsk.class);
util.importTemplateExcel(response, "项目知识库数据");
}
/**
*
*/
@ApiOperation(value = "项目知识库信息批量导入")
// @PreAuthorize("@ss.hasAnyRoles('admin,common')")
@PostMapping(value = "/import", consumes = "multipart/form-data")
@Transactional(rollbackFor = Exception.class)
public AjaxResult importTemplateProject(@RequestPart("file") MultipartFile file) throws Exception {
ExcelUtil<Xmzsk> util = new ExcelUtil<>(Xmzsk.class);
List<Xmzsk> proList = util.importExcel(file.getInputStream());
StringBuilder successMsg = new StringBuilder();
if (proList == null || proList.isEmpty()) {
throw new ServiceException("项目知识库导入数据不能为空");
} else {
xmzskService.saveBatch(proList);
successMsg.append("导入成功");
}
return AjaxResult.success(successMsg);
}
}

@ -137,6 +137,27 @@ public class BuildingInformation implements Serializable {
@TableField("sfydzk")
private Integer sfydzk;
/**
*
*/
@Excel(name = "地基基础等级")
@ApiModelProperty(value = "地基基础等级")
private String djjcdj;
/**
*
*/
@Excel(name = "吊车情况")
@ApiModelProperty(value = "吊车情况")
private String dcqk;
/**
*
*/
@Excel(name = "货梯情况")
@ApiModelProperty(value = "货梯情况")
private String htqk;
/**
*
*/

@ -1,9 +1,6 @@
package com.ruoyi.gysl.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.gysl.entity.baseModel.BaseModel;
@ -74,4 +71,65 @@ public class Enterprise extends BaseModel implements Serializable {
@TableField("zjjg")
@Excel(name = "租金价格")
private Integer zjjg;
/**
*
*/
@ApiModelProperty(value = "注册地址")
@Excel(name = "注册地址")
private String zcdz;
/**
*
*/
@ApiModelProperty(value = "成立日期 yyyy-MM-dd HH:mm:ss")
@Excel(name = "成立日期",dateFormat = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime clrq;
/**
*
*/
@ApiModelProperty(value = "注册资本")
@Excel(name = "注册资本")
private String zczb;
/**
*
*/
@ApiModelProperty(value = "法定代表人")
@Excel(name = "注册地址")
private String fddbr;
/**
*
*/
@ApiModelProperty(value = "企业类型")
@Excel(name = "企业类型")
private String qylx;
/**
*
*/
@ApiModelProperty(value = "经营范围")
@Excel(name = "经营范围")
private String jyfw;
/**
*
*/
@ApiModelProperty(value = "组织机构代码")
@Excel(name = "组织机构代码")
private String zzjgdm;
/**
*
*/
@ApiModelProperty(value = "税务登记号码")
@Excel(name = "税务登记号码")
private String swdjhm;
}

@ -2,6 +2,7 @@ package com.ruoyi.gysl.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ruoyi.gysl.entity.baseModel.BaseModel;
@ -11,6 +12,7 @@ import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.NotBlank;
import java.util.List;
/**
* (GyslProjectHandbook)
@ -32,7 +34,6 @@ public class GyslProjectHandbook extends BaseModel {
private String name;
@ApiModelProperty(value ="副标题" )
@NotBlank(message = "副标题不能为空!")
private String subtitle;
@ -52,7 +53,10 @@ public class GyslProjectHandbook extends BaseModel {
@ApiModelProperty(value ="封尾标题" )
@NotBlank(message = "封尾图片不能为空!")
private String tail;
@ApiModelProperty(value ="项目名称数组" )
@TableField(exist = false)
private List<BasicInformation> projectName;
}

@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.gysl.entity.baseModel.BaseModel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@ -38,12 +39,14 @@ public class Xmzsk extends BaseModel implements Serializable {
*/
@ApiModelProperty(value = "文件名称")
@TableField("name")
@Excel(name = "文件名称")
private String name;
/**
*
*/
@ApiModelProperty(value = "类型")
@Excel(name = "类型")
@TableField("lx")
private String lx;
@ -51,6 +54,7 @@ public class Xmzsk extends BaseModel implements Serializable {
*
*/
@ApiModelProperty(value = "网址")
@Excel(name = "网址")
@TableField("wz")
private String wz;
@ -66,6 +70,7 @@ public class Xmzsk extends BaseModel implements Serializable {
*/
@ApiModelProperty(value = "上传用户")
@TableField("scyh")
@Excel(name = "上传用户")
private String scyh;
/**
@ -73,6 +78,7 @@ public class Xmzsk extends BaseModel implements Serializable {
*/
@ApiModelProperty(value = "上传时间")
@TableField("scsj")
@Excel(name = "上传时间")
private Date scsj;
}

@ -38,4 +38,7 @@ public class BasicInformationPageReq {
@ApiModelProperty("0非负面清单 1是负面清单")
private Integer isFmqd;
@ApiModelProperty("状态")
private Integer status;
}

@ -0,0 +1,37 @@
package com.ruoyi.gysl.entity.request;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
/**
*
* @author du
* @since 2025/4/17 17:18
*/
@Data
public class HandbookRequest {
@ApiModelProperty(value ="手册名称" )
private String name;
@ApiModelProperty(value = "开始时间 yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime startTime;
@ApiModelProperty(value = "结束时间 yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime endTime;
@ApiModelProperty(value = "页数")
private Integer current = 1;
@ApiModelProperty(value = "页码s")
private Integer size = 10;
}

@ -29,6 +29,15 @@ public class AllProjectResponse {
@ApiModelProperty("拟建数量")
private Integer allBuilding3;
@ApiModelProperty("总投资额")
private BigDecimal allInvest1;
@ApiModelProperty("计划投资额")
private BigDecimal allInvest2;
@ApiModelProperty("占地面积")
private BigDecimal allInvest3;
@ApiModelProperty("当年_新开工项目数")
private Integer currentYearProject;
@ -44,4 +53,13 @@ public class AllProjectResponse {
@ApiModelProperty("当年_拟建数量")
private Integer currentBuilding3;
@ApiModelProperty("总投资额")
private BigDecimal currentAllInvest1;
@ApiModelProperty("计划投资额")
private BigDecimal currentAllInvest2;
@ApiModelProperty("占地面积")
private BigDecimal currentAllInvest3;
}

@ -31,6 +31,8 @@ public interface BasicInformationMapper extends BaseMapper<BasicInformation> {
* @return
*/
Page<BasicInformation> page(Page<BasicInformation> page, @Param("req") BasicInformationPageReq req);
/**
*
*/

@ -1,7 +1,14 @@
package com.ruoyi.gysl.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.gysl.entity.BasicInformation;
import com.ruoyi.gysl.entity.GyslProjectHandbook;
import com.ruoyi.gysl.entity.request.HandbookRequest;
import org.apache.ibatis.annotations.Param;
import java.io.Serializable;
import java.util.List;
/**
* (gysl_project_handbook)访
@ -11,5 +18,17 @@ import com.ruoyi.gysl.entity.GyslProjectHandbook;
*/
public interface ProjectHandBookMapper extends BaseMapper<GyslProjectHandbook> {
/**
*
*
* @param g
* @return
*/
Page<GyslProjectHandbook> page(Page<GyslProjectHandbook> a1,@Param("req") HandbookRequest g);
/**
* id
*/
List<BasicInformation> getProjectName(@Param("id") List<String> id);
}

@ -6,6 +6,8 @@ import com.ruoyi.gysl.entity.Xmzsk;
import com.ruoyi.gysl.entity.request.XmzskPageReq;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* (Xmzsk)访
*
@ -22,5 +24,6 @@ public interface XmzskMapper extends BaseMapper<Xmzsk> {
* @return
*/
Page<Xmzsk> page(Page<Xmzsk> page,@Param("req") XmzskPageReq req);
List<Xmzsk> page( @Param("req") XmzskPageReq req);
}

@ -31,8 +31,7 @@ public class NoticeTiming {
@Resource
private ProjectProgressService projectProgressService;
@Resource
private ProjectService projectService;
@Resource
private SmartRemindersService smartRemindersService;
@ -56,7 +55,7 @@ public class NoticeTiming {
"年" +
LocalDate.now().getMonth().getValue() +
"月" +
"项目进展未填写", null, null, null);
"项目进展未填写", null, null, String.valueOf(LocalDate.now().getMonth().getValue()));
}
/**

@ -1,13 +1,18 @@
package com.ruoyi.gysl.service;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.itextpdf.layout.Document;
import com.ruoyi.gysl.entity.GyslProjectHandbook;
import com.ruoyi.gysl.entity.request.HandbookRequest;
import com.ruoyi.gysl.entity.response.BasicInformationResponse;
import javax.servlet.http.HttpServletResponse;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.Serializable;
import java.net.MalformedURLException;
import java.util.List;
/**
* (GyslProjectHandbook)
@ -17,6 +22,15 @@ import java.net.MalformedURLException;
*/
public interface GyslProjectHandbookService extends IService<GyslProjectHandbook> {
/**
*
*
* @param
* @param g
* @return
*/
Page<GyslProjectHandbook> page(Page<GyslProjectHandbook> a1, HandbookRequest g);
/**
* pdf
@ -24,9 +38,14 @@ public interface GyslProjectHandbookService extends IService<GyslProjectHandbook
void generatePdfs(HttpServletResponse response,Integer id) throws IOException;
/**
*
*
*/
String changeData(String s, BasicInformationResponse b) ;
/**
*
*/
void addCoverPage(Document document, GyslProjectHandbook gyslProjectHandbook) throws MalformedURLException;
GyslProjectHandbook getData(Serializable id);
}

@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.gysl.entity.Xmzsk;
import com.ruoyi.gysl.entity.request.XmzskPageReq;
import java.util.List;
/**
* (Xmzsk)
*
@ -20,5 +22,6 @@ public interface XmzskService extends IService<Xmzsk> {
* @return
*/
Page<Xmzsk> page(Page<Xmzsk> page, XmzskPageReq req);
List<Xmzsk> page(XmzskPageReq req);
}

@ -29,6 +29,7 @@ import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
import java.util.Objects;
@ -190,12 +191,13 @@ public class BasicInformationServiceImpl extends ServiceImpl<BasicInformationMap
if (status == 2) {
if (oldStatus == 1) {
userService.getAllZwUser("关于" + req.getBasicInformation().getName() + "项目,待审核的通知", req.getBasicInformation().getId(), null, null);
userService.getAllZwUser("关于" + req.getBasicInformation().getName() + "项目,待审核的通知", req.getBasicInformation().getId(), null, String.valueOf(LocalDateTime.now()));
}
}
if (status == 3) {
if (oldStatus == 2) {
SmartDeclaration sd = new SmartDeclaration();
sd.setAlertTime(LocalDateTime.now());
sd.setTyshxydm((req.getBasicInformation().getTyshxydm()));
sd.setProjectId(req.getBasicInformation().getId());
sd.setContent("关于" + req.getBasicInformation().getName() + "项目,审核通过的通知");

@ -1,47 +1,39 @@
package com.ruoyi.gysl.service.impl;
import cn.hutool.core.io.FileUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itextpdf.html2pdf.ConverterProperties;
import com.itextpdf.html2pdf.HtmlConverter;
import com.itextpdf.io.image.ImageData;
import com.itextpdf.io.image.ImageDataFactory;
import com.itextpdf.kernel.colors.ColorConstants;
import com.itextpdf.kernel.geom.PageSize;
import com.itextpdf.io.font.PdfEncodings;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfReader;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.kernel.utils.PdfMerger;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.AreaBreak;
import com.itextpdf.layout.element.Image;
import com.itextpdf.layout.element.Paragraph;
import com.itextpdf.layout.properties.HorizontalAlignment;
import com.itextpdf.layout.properties.TextAlignment;
import com.itextpdf.layout.font.FontProvider;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.config.RuoYiConfig;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysDictData;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.file.FileUtils;
import com.ruoyi.gysl.entity.GyslProjectHandbook;
import com.ruoyi.gysl.entity.request.HandbookRequest;
import com.ruoyi.gysl.entity.response.BasicInformationResponse;
import com.ruoyi.gysl.mapper.BasicInformationMapper;
import com.ruoyi.gysl.mapper.ProjectHandBookMapper;
import com.ruoyi.gysl.service.BasicInformationService;
import com.ruoyi.gysl.service.GyslProjectHandbookService;
import com.ruoyi.system.mapper.SysDictDataMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.MalformedURLException;
import java.nio.file.Files;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.nio.file.Paths;
import java.rmi.ServerError;
import java.util.Arrays;
import java.util.List;
import java.util.*;
/**
* (GyslProjectHandbook)
@ -49,12 +41,30 @@ import java.util.List;
* @author makejava
* @since 2025-04-14 13:56:59
*/
@Slf4j
@Service("gyslProjectHandbookService")
public class GyslProjectHandbookServiceImpl extends ServiceImpl<ProjectHandBookMapper, GyslProjectHandbook> implements GyslProjectHandbookService {
@Resource
private BasicInformationMapper basicInformationMapper;
@Resource
private BasicInformationService basicInformationService;
@Resource
private SysDictDataMapper sysDictDataMapper;
/**
*
*
* @param g
* @return
*/
@Override
public Page<GyslProjectHandbook> page(Page<GyslProjectHandbook> a1, HandbookRequest g) {
return baseMapper.page(a1, g);
}
@Override
public void generatePdfs(HttpServletResponse response, Integer id) throws IOException {
@ -62,74 +72,157 @@ public class GyslProjectHandbookServiceImpl extends ServiceImpl<ProjectHandBookM
GyslProjectHandbook handbook = getById(id);
List<BasicInformationResponse> basicInfoList = basicInformationMapper.idListToProject(
Arrays.asList(handbook.getXmId().split(",")));
List<String> hbpdf = new ArrayList<>();
// 配置中文字体
String fontPath = RuoYiConfig.getProfile() + "/Alibaba-PuHuiTi-Regular.ttf";
FontProvider fontProvider = new FontProvider();
fontProvider.addFont(fontPath, PdfEncodings.IDENTITY_H);
// 转换参数
ConverterProperties props = new ConverterProperties();
props.setFontProvider(fontProvider);
//封面
String htmlHead = RuoYiConfig.getProfile() + "/head.txt";
String s = getHtml(htmlHead);
s = s.replace("{{scname}}", handbook.getName() != null ? handbook.getName() : "/");
s = s.replace("{{fmbt}}", handbook.getSubtitle() != null ? handbook.getSubtitle() : "/");
s = s.replace("{{fmimgurl}}", handbook.getCoverImg() != null ?
Paths.get(RuoYiConfig.getProfile() + StringUtils.substringAfter(handbook.getCoverImg(), Constants.RESOURCE_PREFIX)).toUri().toString()
: Paths.get(RuoYiConfig.getProfile() + "/OIP-C.jpg").toUri().toString());
String headPdf = RuoYiConfig.getProfile() + "/pdfml" + "/head" + ".pdf";
hbpdf.add(headPdf);
FileUtil.touch(headPdf);
try (PdfWriter writer = new PdfWriter(headPdf);
PdfDocument pdf = new PdfDocument(writer)) {
HtmlConverter.convertToPdf(s, pdf, props);
}
//内容目录
String htmlUrl = RuoYiConfig.getProfile() + "/gysl.txt";
for (int i = 0; i < basicInfoList.size(); i++) {
//获取当前的信息并替换为可用html
String htmlNew = changeData(getHtml(htmlUrl), basicInfoList.get(i));
//新建pdf
String newPdf = "/pdfml" + "/p" + i + ".pdf";
String outputPath = RuoYiConfig.getProfile() + newPdf;
hbpdf.add(outputPath);
FileUtil.touch(outputPath);
try (PdfWriter writer = new PdfWriter(outputPath);
PdfDocument pdf = new PdfDocument(writer)) {
HtmlConverter.convertToPdf(htmlNew, pdf, props);
}
}
//封尾
String htmlFoot = RuoYiConfig.getProfile() + "/foot.txt";
String a = getHtml(htmlFoot);
a = a.replace("{{fwbt}}", handbook.getTail() != null ? handbook.getTail() : "/");
a = a.replace("{{fmimgurl}}", handbook.getTailingImg() != null ?
Paths.get(RuoYiConfig.getProfile() + StringUtils.substringAfter(handbook.getTailingImg(), Constants.RESOURCE_PREFIX)).toUri().toString()
: Paths.get(RuoYiConfig.getProfile() + "/OIP-C.jpg").toUri().toString());
String foodPdf = RuoYiConfig.getProfile() + "/pdfml" + "/food" + ".pdf";
hbpdf.add(foodPdf);
FileUtil.touch(foodPdf);
try (PdfWriter writer = new PdfWriter(foodPdf); PdfDocument pdf = new PdfDocument(writer)) {
HtmlConverter.convertToPdf(a, pdf, props);
}
// 创建内存输出流替代写入ceshi.pdf文件
ByteArrayOutputStream mergedPdfStream = new ByteArrayOutputStream();
// 初始化PdfWriter指向内存流
PdfWriter writer = new PdfWriter(mergedPdfStream);
PdfDocument mergedPdfDoc = new PdfDocument(writer);
PdfMerger merger = new PdfMerger(mergedPdfDoc);
// 合并所有PDF
for (String src : hbpdf) {
try (PdfDocument srcDoc = new PdfDocument(new PdfReader(src))) {
merger.merge(srcDoc, 1, srcDoc.getNumberOfPages());
}
}
merger.close();
mergedPdfDoc.close(); // 关闭合并的PDF文档
//删除临时生成的pdfml文件夹及其内容
String pdfmlDirPath = RuoYiConfig.getProfile() + "/pdfml";
try {
FileUtil.del(pdfmlDirPath); // Hutool工具类删除文件夹含内部文件
} catch (Exception e) {
log.error("删除临时文件夹失败: {}");
// 可根据需要决定是否抛出异常或仅记录日志
}
// 设置响应头
response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "attachment; filename=\"product_catalog.pdf\"");
response.setContentLength(mergedPdfStream.size());
// 将内存流写入HTTP响应
try (OutputStream out = response.getOutputStream()) {
mergedPdfStream.writeTo(out);
out.flush();
}
}
try (OutputStream outputStream = response.getOutputStream();
PdfWriter writer = new PdfWriter(outputStream);
PdfDocument mergedPdf = new PdfDocument(writer)) { // 主文档生命周期由外部try控制
// ========== 封面页 ==========
Document coverDoc = new Document(mergedPdf);
addCoverPage(coverDoc, handbook);
coverDoc.close(); // 关闭封面Document但不关闭PdfDocument
// ========== 动态内容合并 ==========
String htmlContent = "<!DOCTYPE html><html><body style='font-family: SimSun;'>动态内容</body></html>";
try (ByteArrayOutputStream tempStream = new ByteArrayOutputStream()) {
// HTML转PDF
HtmlConverter.convertToPdf(htmlContent, tempStream);
// 合并到主文档
try (PdfReader tempReader = new PdfReader(new ByteArrayInputStream(tempStream.toByteArray()));
PdfDocument tempPdf = new PdfDocument(tempReader)) {
PdfMerger merger = new PdfMerger(mergedPdf);
merger.merge(tempPdf, 1, tempPdf.getNumberOfPages());
}
/**
* htmlstring
*/
public static String getHtml(String htmlUrl) {
StringBuilder html = new StringBuilder();
try (Scanner scanner = new Scanner(
new File(htmlUrl),
StandardCharsets.UTF_8.name()) // 显式指定UTF-8
) {
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
html.append(line);
}
} catch (Exception e) {
response.reset();
response.setContentType("application/json");
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
throw new ServiceException("错误!");
} catch (IOException e) {
throw new ServiceException("读取HTML文件失败!");
}
return html.toString();
}
@Override
public void addCoverPage(Document document, GyslProjectHandbook handbook) throws MalformedURLException {
// 标题
Paragraph title = new Paragraph(handbook.getName())
.setFontSize(30).setBold().setFontColor(ColorConstants.BLUE)
.setTextAlignment(TextAlignment.CENTER)
.setMarginTop(60);
document.add(title);
// 副标题
Paragraph subtitle = new Paragraph(handbook.getSubtitle())
.setFontSize(22).setFontColor(ColorConstants.BLUE)
.setTextAlignment(TextAlignment.RIGHT)
.setMarginTop(70);
document.add(subtitle);
// 封面图片
String imgPath = RuoYiConfig.getProfile() +
StringUtils.substringAfter(handbook.getCoverImg(), Constants.RESOURCE_PREFIX);
if (!FileUtils.checkAllowDownload(imgPath)) {
throw new ServiceException("非法文件路径: " + imgPath);
public String changeData(String handbook, BasicInformationResponse b) {
List<SysDictData> sysDictData = sysDictDataMapper.selectDictDataList(new SysDictData());
Map<String, Object> dt = new HashMap<>();
dt.put("{{fj}}", b.getBasicInformation().getFj() == null ?
Paths.get(RuoYiConfig.getProfile() + "/OIP-C.jpg").toUri().toString()
: Paths.get(RuoYiConfig.getProfile() + b.getBasicInformation().getFj()).toUri().toString());
dt.put("{{name}}", b.getBasicInformation().getName());
dt.put("{{ztze}}", b.getBasicInformation().getZtze());
dt.put("{{xmbq}}", b.getBasicInformation().getLabel());
dt.put("{{prioritize}}", b.getBasicInformation().getPrioritize());
dt.put("{{xzfl}}", basicInformationService.getDictLabel("xzfl", String.valueOf(b.getBasicInformation().getXzfl()), sysDictData));
dt.put("{{jsms}}", basicInformationService.getDictLabel("jsms", String.valueOf(b.getBasicInformation().getJsms()), sysDictData));
dt.put("{{ssgnq}}", basicInformationService.getDictLabel("ssgnq", String.valueOf(b.getBasicInformation().getSsgnq()), sysDictData));
dt.put("{{zjzmj}}", b.getPlanInformation().getZjzmj());
dt.put("{{zydmj}}", b.getPlanInformation().getZydmj());
dt.put("{{bzcjzmj}}", b.getPlanInformation().getBzcjzmj());
dt.put("{{zgjzgd}}", b.getPlanInformation().getZgjzgd());
dt.put("{{jzds}}", b.getPlanInformation().getJzds());
dt.put("{{zgjzcs}}", b.getPlanInformation().getZgjzcs());
dt.put("{{fhdj}}", b.getPlanInformation().getFhdj());
dt.put("{{jdctcw}}", b.getPlanInformation().getJdctcw());
dt.put("{{fjdctcw}}", b.getPlanInformation().getFjdctcw());
dt.put("{{yczmj}}", b.getQyrzInformation().getYczmj());
dt.put("{{kzczmj}}", b.getQyrzInformation().getKzczmj());
dt.put("{{gycfpjzj}}", b.getQyrzInformation().getGycfpjzj());
dt.put("{{pjwyf}}", b.getQyrzInformation().getGycfpjwyf());
// 动态替换所有模板变量
for (Map.Entry<String, Object> entry : dt.entrySet()) {
if (handbook.contains(entry.getKey())) {
handbook = handbook.replace(entry.getKey(), entry.getValue() != null ? entry.getValue().toString() : "/");
}
}
return handbook;
}
ImageData imageData = ImageDataFactory.create(imgPath);
Image image = new Image(imageData)
.setWidth(400)
.setMarginTop(85)
.setHorizontalAlignment(HorizontalAlignment.CENTER);
document.add(image);
// 分页控制关键修改直接操作PdfDocument
document.getPdfDocument().addNewPage();
/**
*
*/
@Override
public GyslProjectHandbook getData(Serializable id) {
GyslProjectHandbook byId = getById(id);
byId.setProjectName(baseMapper.getProjectName(Arrays.asList(byId.getXmId().split(","))));
return byId;
}
}

@ -8,6 +8,8 @@ import com.ruoyi.gysl.entity.Xmzsk;
import com.ruoyi.gysl.service.XmzskService;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* (Xmzsk)
*
@ -28,5 +30,10 @@ public class XmzskServiceImpl extends ServiceImpl<XmzskMapper, Xmzsk> implements
public Page<Xmzsk> page(Page<Xmzsk> page, XmzskPageReq req) {
return baseMapper.page(page,req);
}
@Override
public List<Xmzsk> page(XmzskPageReq req) {
return baseMapper.page(req);
}
}

@ -1,232 +0,0 @@
package com.ruoyi.gysl.utils;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Image;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.tool.xml.XMLWorkerFontProvider;
import com.itextpdf.tool.xml.XMLWorkerHelper;
import com.ruoyi.common.utils.http.HttpUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Base64;
import java.util.Date;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class HtmlToPdfConverter {
private static final Logger log = LoggerFactory.getLogger(HttpUtils.class);
public static MultipartFile convertHtmlToPdf(String htmlArticleTitle, String htmlContent) throws IOException {
String ht = content2Html(htmlContent);
String path = System.getProperty("user.dir");
// 根据日期建文件夹
String format = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
String[] split = format.split("-");
Path dirPath = Paths.get(path, "temporary", split[0], split[1], split[2]);
try {
// clearTemporaryDirectory(Paths.get(path, "temporary")); // 清理目录
Files.createDirectories(dirPath);
} catch (IOException e) {
throw new RuntimeException("创建文件夹失败: " + e.getMessage(), e);
}
File pdfFile = new File(dirPath.toFile(), "pdf-" + System.currentTimeMillis() + ".pdf");
// 创建PDF文档
Document document = new Document();
FileOutputStream fos = null;
InputStream is = null;
try {
fos = new FileOutputStream(pdfFile);
PdfWriter writer = PdfWriter.getInstance(document, fos);
XMLWorkerFontProvider fontProvider = new XMLWorkerFontProvider(XMLWorkerFontProvider.DONTLOOKFORFONTS);
fontProvider.register("C:/Windows/Fonts/simsun.ttc");
document.open();
// 添加标题
Paragraph paragraph = new Paragraph(htmlArticleTitle); // 设置你自定义的字体格式
document.add(paragraph);
String updatedHtmlContent = "";
if (htmlContent.contains("img")) {
updatedHtmlContent = replaceImgSrcWithBase64(ht);
if (updatedHtmlContent != null) {
is = new ByteArrayInputStream(updatedHtmlContent.getBytes(StandardCharsets.UTF_8));
XMLWorkerHelper.getInstance().parseXHtml(writer, document, is, StandardCharsets.UTF_8, fontProvider);
// 添加图片
Elements imgElements = Jsoup.parse(updatedHtmlContent).select("img");
for (Element img : imgElements) {
String imgSrc = img.attr("src");
if (imgSrc.startsWith("data:image/jpeg;base64,")) {
String base64Data = imgSrc.substring("data:image/jpeg;base64,".length());
byte[] imageBytes = Base64.getDecoder().decode(base64Data);
Image image = Image.getInstance(imageBytes);
document.add(image); // 添加图片到 PDF
}
}
}
} else {
is = new ByteArrayInputStream(ht.getBytes(StandardCharsets.UTF_8));
XMLWorkerHelper.getInstance().parseXHtml(writer, document, is, StandardCharsets.UTF_8, fontProvider);
}
} catch (DocumentException | IOException e) {
throw new RuntimeException("转换PDF失败: " + e.getMessage(), e);
} finally {
if (document.isOpen()) {
document.close(); // 确保Document关闭
}
if (fos != null) {
try {
fos.close(); // 关闭文件输出流
} catch (IOException e) {
e.printStackTrace();
}
}
if (is != null) {
try {
is.close(); // 关闭输入流
} catch (IOException e) {
e.printStackTrace();
}
}
}
MultipartFile multipartFile = getMultipartFile(pdfFile);
// 在此处删除创建的 PDF 文件
boolean deleted = pdfFile.delete();
if (!deleted) {
log.error("删除文件失败: " + pdfFile.getAbsolutePath());
}
return multipartFile;
}
private static MultipartFile getMultipartFile(File file) throws IOException {
try (FileInputStream fileInputStream = new FileInputStream(file)) {
return new MockMultipartFile(file.getName(), file.getName(), "application/pdf", fileInputStream);
}
}
public static String content2Html(String htmlContent) {
String COMPLETE_CONTENT = "<html><head></head><body style=\"font-family: SimSun;\">" + htmlContent + "</body></html>";
return COMPLETE_CONTENT.replace("<br>", "<br/>");
}
private static String replaceImgSrcWithBase64(String htmlContent) {
List<String> imgSrcs = new ArrayList<>();
String regex = "<img[^>]+src=\"([^\"]+)\"[^>]*>"; // 正确的正则表达式
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(htmlContent);
String baseUrl = "http://39.101.188.84:7071";
// 使用 StringBuilder 来构建新的 HTML
StringBuilder updatedHtml = new StringBuilder(htmlContent);
// 定义要替换的起始位置
int offset = 0;
while (matcher.find()) {
String imgSrc = matcher.group(1); // 捕获组返回 img src 的值
String imgUrl = baseUrl + imgSrc;
// 将 URL 转化为 Base64
try {
URL url = new URL(imgUrl);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestProperty("User-Agent", "Mozilla/5.0"); // 添加 User-Agent
connection.setDoInput(true);
connection.connect();
InputStream inputStream = connection.getInputStream();
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
inputStream.close();
byte[] imageBytes = outputStream.toByteArray();
String base64 = Base64.getEncoder().encodeToString(imageBytes);
// 替换 img 标签的 src 属性为 Base64 数据
String base64ImgTag = "<img src=\"data:image/jpeg;base64," + base64 + "\" />";
int start = matcher.start() + offset; // 累计偏移量
int end = matcher.end();
// 替换原来的 img 标签
updatedHtml.replace(start, end, base64ImgTag);
//System.out.println(updatedHtml.toString());
// 更新偏移量
offset += base64ImgTag.length() - (end - start);
} catch (Exception e) {
e.printStackTrace();
return null; // 处理异常或返回特定的错误值
}
}
return updatedHtml.toString();
}
public String convertImageToBase64(String imgUrl) {
try {
// String encodedImgUrl = URLEncoder.encode(imgUrl, StandardCharsets.UTF_8.toString());
URL url = new URL(imgUrl);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestProperty("User-Agent", "Mozilla/5.0"); // 添加 User-Agent
connection.setDoInput(true);
connection.connect();
InputStream inputStream = connection.getInputStream();
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
inputStream.close();
byte[] imageBytes = outputStream.toByteArray();
String base64 = Base64.getEncoder().encodeToString(imageBytes);
return "data:image/jpeg;base64," + base64; // 根据实际情况修改 MIME 类型
} catch (Exception e) {
e.printStackTrace();
return null; // 处理异常或返回特定的错误值
}
}
private static void clearTemporaryDirectory(Path directory) {
File dir = directory.toFile();
if (dir.exists() && dir.isDirectory()) {
for (File file : dir.listFiles()) {
if (!file.isDirectory()) {
file.delete(); // 删除文件
}
}
}
}
}

@ -1,168 +0,0 @@
package com.ruoyi.gysl.utils;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Font;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.tool.xml.XMLWorkerFontProvider;
import com.itextpdf.tool.xml.XMLWorkerHelper;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.util.Date;
public class PdfUtils {
// 定义全局的字体静态变量
private static Font titlefont;
private static Font headfont;
private static Font keyfont;
private static Font textfont;
// 最大宽度
private static int maxWidth = 520;
// 静态代码块
static {
try {
// 不同字体这里定义为同一种字体包含不同字号、不同style
BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
titlefont = new Font(bfChinese, 16, Font.BOLD);
headfont = new Font(bfChinese, 14, Font.BOLD);
keyfont = new Font(bfChinese, 10, Font.BOLD);
textfont = new Font(bfChinese, 10, Font.NORMAL);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* htmlpdf
*
* @param htmlContent
* @throws Exception
*/
public MultipartFile html2Pdf(String htmlArticleTitle, String htmlContent) throws Exception {
htmlContent = this.content2Html(htmlContent);
String path = System.getProperty("user.dir");
//根据日期建文件夹
Date date = new Date();
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
String format = formatter.format(date);
String[] split = format.split("-");
File dir = new File(path + "/temporary");
if (!dir.exists()) {
dir.mkdir();
}
File dir2 = new File(path + "/temporary" + "/" + split[0]);
if (!dir2.exists()) {
dir2.mkdir();
}
File dir3 = new File(path + "/temporary" + "/" + split[0] + "/" + split[1]);
if (!dir3.exists()) {
dir3.mkdir();
}
File dir4 = new File(path + "/temporary" + "/" + split[0] + "/" + split[1] + "/" + split[2]);
if (!dir4.exists()) {
dir4.mkdir();
}
File pdfFile = new File(dir4 + "/pdf" + "-" + System.currentTimeMillis() + ".pdf");
//1 打开文件流
Document document = new Document();
FileOutputStream fos = new FileOutputStream(pdfFile);
System.out.println(pdfFile);
InputStream is = new ByteArrayInputStream(htmlContent.getBytes(StandardCharsets.UTF_8));
//InputStream cssIs = new ByteArrayInputStream(getCssFile());
PdfWriter writer = null;
try {
writer = PdfWriter.getInstance(document, fos);
//3. 设置字体
XMLWorkerFontProvider fontProvider1 = new XMLWorkerFontProvider(XMLWorkerFontProvider.DONTLOOKFORFONTS);
//fontProvider1.register(path+"\\simsun.ttc");//本地
fontProvider1.register(path + "/simsun.ttc");//部署服务器
//3 打开文档
document.open();
// 段落
Paragraph paragraph = new Paragraph(htmlArticleTitle, titlefont);
paragraph.setAlignment(1); //设置文字居中 0靠左 1居中 2靠右
paragraph.setIndentationLeft(12); //设置左缩进
paragraph.setIndentationRight(12); //设置右缩进
paragraph.setFirstLineIndent(24); //设置首行缩进
paragraph.setLeading(20f); //行间距
paragraph.setSpacingBefore(5f); //设置段落上空白
paragraph.setSpacingAfter(10f); //设置段落下空白
document.add(paragraph);
//4 html转为pdf
//XMLWorkerHelper.getInstance().parseXHtml(writer, document, is, cssIs, Charset.forName("UTF-8"), fontProvider1);
XMLWorkerHelper.getInstance().parseXHtml(writer, document, is, StandardCharsets.UTF_8, fontProvider1);
} catch (DocumentException | IOException e) {
throw new RuntimeException("转pdf失败罗~");
} finally {
if (null != writer) {
writer.flush();
}
//5 关闭文档
document.close();
fos.close();
//cssIs.close();
is.close();
writer.close();
MultipartFile multipartFile = getMulipartFiles2(pdfFile + "");
System.out.println("pdfFile = " + pdfFile);
return multipartFile;
}
}
public MultipartFile getMulipartFiles2(String filePath) throws IOException {
File file = new File(filePath);
FileInputStream fileInputStream = new FileInputStream(file);
MultipartFile multipartFile = new MockMultipartFile(file.getName(), file.getName(),
"application/sql", fileInputStream);
long size = multipartFile.getSize();
return multipartFile;
}
/**
* html
*
* @return
*/
public String content2Html(String htmlContent) {
String COMPLETE_CONTENT = "<html><head></head><body style=\"font-family: SimSun;\">" + htmlContent + "</body></html>";
String content = COMPLETE_CONTENT;
content = content.replace("<br>", "<br/>");
return content;
}
/**
*
*
* @return
* @throws Exception
*/
protected byte[] getCssFile() throws Exception {
FileInputStream fileInputStream = new FileInputStream("D:\\editor.css");
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1204];
int len = 0;
while ((len = fileInputStream.read(buffer)) != -1) {
outStream.write(buffer, 0, len);
}
fileInputStream.close();
return outStream.toByteArray();
}
}

@ -53,7 +53,7 @@ public class SwaggerConfig
// 是否启用Swagger
.enable(enabled)
//分组名称
.groupName("太仓资产核查")
.groupName("工业上楼")
// 用来创建该API的基本信息展示在文档的页面中自定义展示的信息
.apiInfo(apiInfo())
// 设置哪些接口暴露给Swagger展示

@ -1,3 +1,31 @@
# 项目相关配置
ruoyi:
# 文件路径 示例( Windows配置D:/ruoyi/uploadPathLinux配置 /home/ruoyi/uploadPath
profile: /home/ruoyi/uploadPath
# 正式环境配置
server:
# 服务器的HTTP端口默认为8080
port: 7071
servlet:
# 应用的访问路径
context-path: /api
tomcat:
# tomcat的URI编码
uri-encoding: UTF-8
# 连接数满后的排队数默认为100
accept-count: 1000
threads:
# tomcat最大线程数默认为200
max: 800
# Tomcat启动初始化的线程数默认值10
min-spare: 100
# 日志配置
logging:
level:
com.ruoyi: error
org.springframework: error
# 数据源配置
spring:
datasource:
@ -6,9 +34,9 @@ spring:
druid:
# 主库数据源
master:
url: jdbc:mysql://39.101.188.84:3307/gysl?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
url: jdbc:mysql://192.114.0.18/gysl?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: root
password: Admin123@
password: GyslMysql@1234
# 从库数据源
slave:
# 从数据源开关/默认关闭
@ -39,7 +67,7 @@ spring:
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
webStatFilter:
webStatFilter:
enabled: true
statViewServlet:
enabled: true
@ -58,4 +86,31 @@ spring:
merge-sql: true
wall:
config:
multi-statement-allow: true
multi-statement-allow: true
redis:
# 地址
host: localhost
# 端口默认为6379
port: 6379
# 数据库索引
database: 0
# 密码
password: GyslRedis@1234
# 连接超时时间
timeout: 10s
lettuce:
pool:
# 连接池中的最小空闲连接
min-idle: 0
# 连接池中的最大空闲连接
max-idle: 8
# 连接池的最大数据库连接数
max-active: 8
# #连接池最大阻塞等待时间(使用负值表示没有限制)
max-wait: -1ms
# Swagger配置
swagger:
# 是否开启swagger
enabled: false
# 请求前缀
pathMapping: /

@ -41,7 +41,7 @@ logging:
user:
password:
# 密码最大错误次数
maxRetryCount: 5
maxRetryCount: 6
# 密码锁定时间默认10分钟
lockTime: 10

@ -336,6 +336,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="req.isFmqd != null">
AND a.is_fmqd = #{req.isFmqd}
</if>
<if test="req.status != null">
AND a.status = #{req.status}
</if>
</where>
order by create_time desc
</select>

@ -2,5 +2,32 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.gysl.mapper.ProjectHandBookMapper">
<select id="page" resultType="com.ruoyi.gysl.entity.GyslProjectHandbook">
select * from gysl_project_handbook
<where>
<if test="req.name != null and req.name != '' ">
AND name like concat('%',#{req.name},'%')
</if>
<if test="req.startTime != null">
AND create_time &gt;= #{req.startTime} <!-- 大于等于 -->
</if>
<if test="req.endTime != null">
AND create_time &lt;= #{req.endTime} <!-- 小于等于 -->
</if>
</where>
</select>
<select id="getProjectName" resultType="com.ruoyi.gysl.entity.BasicInformation">
SELECT a.*
FROM gysl_basic_information a
<where>
<if test="id != null">
and a.id in
<foreach collection="id" item="item" separator="," open="(" close=")">
#{item}
</foreach>
</if>
</where>
</select>
</mapper>

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.docking.mapper.ProjectMapper">
</mapper>

@ -7,8 +7,8 @@
FROM
project_progress a
LEFT JOIN project b ON a.project_id = b.project_id
LEFT JOIN gysl_basic_information c ON b.company_id = c.tyshxydm
where c.id = #{req.xmId}
where b.project_name = #{name}
order by a.month desc
</select>
</mapper>

@ -8,6 +8,9 @@
IFNULL(SUM(CASE WHEN a.xzfl = 1 THEN 1 ELSE 0 END), 0) AS allBuilding1,
IFNULL(SUM(CASE WHEN a.xzfl = 2 THEN 1 ELSE 0 END), 0) AS allBuilding2,
IFNULL(SUM(CASE WHEN a.xzfl = 3 THEN 1 ELSE 0 END), 0) AS allBuilding3,
IFNULL(SUM(a.ztze), 0) AS allInvest1,
IFNULL(SUM(a.jhtze), 0) AS allInvest2,
IFNULL(SUM(b.zydmj), 0) AS allInvest3,
<!-- 当前新开工项目数 -->
IFNULL(SUM(
CASE WHEN LEFT(a.begain_time, 4) = YEAR(NOW()) THEN 1 ELSE 0 END
@ -27,7 +30,41 @@
<!-- 当年_拟建数量 -->
IFNULL(SUM(
CASE WHEN LEFT(a.begain_time, 4) = YEAR(NOW()) and a.xzfl = 3 THEN 1 ELSE 0 END
), 0) AS currentBuilding3
), 0) AS currentBuilding3,
<!-- 当年_总投资额 -->
IFNULL(SUM(
<choose>
<when test="years != null and years != ''">
CASE WHEN LEFT(a.begain_time, 4) = #{years} THEN a.ztze ELSE 0 END
</when>
<otherwise>
CASE WHEN LEFT(a.begain_time, 4) = YEAR(NOW()) THEN a.ztze ELSE 0 END
</otherwise>
</choose>
), 0) AS currentAllInvest1,
<!-- 当年_计划投资额 -->
IFNULL(SUM(
<choose>
<when test="years != null and years != ''">
CASE WHEN LEFT(a.begain_time, 4) = #{years} THEN a.jhtze ELSE 0 END
</when>
<otherwise>
CASE WHEN LEFT(a.begain_time, 4) = YEAR(NOW()) THEN a.jhtze ELSE 0 END
</otherwise>
</choose>
), 0) AS currentAllInvest2,
<!-- 当年_占地面积 -->
IFNULL(SUM(
<choose>
<when test="years != null and years != ''">
CASE WHEN LEFT(a.begain_time, 4) = #{years} THEN b.zydmj ELSE 0 END
</when>
<otherwise>
CASE WHEN LEFT(a.begain_time, 4) = YEAR(NOW()) THEN b.zydmj ELSE 0 END
</otherwise>
</choose>
), 0) AS currentAllInvest3
FROM gysl_basic_information a
LEFT JOIN gysl_plan_information b ON a.id = b.xm_id
where a.tyshxydm = #{userName}

@ -9,7 +9,7 @@
from gysl_smart_reminders a
<where>
<if test="req.rulesName != null and req.rulesName != '' ">
and a.rules_name = #{req.rulesName}
and a.rules_name like concat('%',#{req.rulesName},'%')
</if>
<if test="req.alertType != null and req.alertType != '' ">
and a.alert_type = #{req.alertType}

@ -73,7 +73,18 @@
AND a.end_time = #{req.endTime}
</if>
</where>
group by a.id
group by a.id,
a.name,
a.begain_time,
a.end_time,
a.xzfl,
a.xmfrdwxz,
a.ztze,
b.floor,
b.scgd,
b.two_and_four_cg ,
b.scdmhz,
b.two_and_three_lmhz
<if test="req.pjdj == 2 and req.sort == 1">
order by a.ztze asc
</if>

@ -8,6 +8,9 @@
IFNULL(SUM(CASE WHEN a.xzfl = 1 THEN 1 ELSE 0 END), 0) AS allBuilding1,
IFNULL(SUM(CASE WHEN a.xzfl = 2 THEN 1 ELSE 0 END), 0) AS allBuilding2,
IFNULL(SUM(CASE WHEN a.xzfl = 3 THEN 1 ELSE 0 END), 0) AS allBuilding3,
IFNULL(SUM(a.ztze), 0) AS allInvest1,
IFNULL(SUM(a.jhtze), 0) AS allInvest2,
IFNULL(SUM(b.zydmj), 0) AS allInvest3,
<!-- 当前新开工项目数 -->
IFNULL(SUM(
<choose>
@ -62,7 +65,41 @@
CASE WHEN LEFT(a.begain_time, 4) = YEAR(NOW()) and a.xzfl = 3 THEN 1 ELSE 0 END
</otherwise>
</choose>
), 0) AS currentBuilding3
), 0) AS currentBuilding3,
<!-- 当年_总投资额 -->
IFNULL(SUM(
<choose>
<when test="years != null and years != ''">
CASE WHEN LEFT(a.begain_time, 4) = #{years} THEN a.ztze ELSE 0 END
</when>
<otherwise>
CASE WHEN LEFT(a.begain_time, 4) = YEAR(NOW()) THEN a.ztze ELSE 0 END
</otherwise>
</choose>
), 0) AS currentAllInvest1,
<!-- 当年_计划投资额 -->
IFNULL(SUM(
<choose>
<when test="years != null and years != ''">
CASE WHEN LEFT(a.begain_time, 4) = #{years} THEN a.jhtze ELSE 0 END
</when>
<otherwise>
CASE WHEN LEFT(a.begain_time, 4) = YEAR(NOW()) THEN a.jhtze ELSE 0 END
</otherwise>
</choose>
), 0) AS currentAllInvest2,
<!-- 当年_占地面积 -->
IFNULL(SUM(
<choose>
<when test="years != null and years != ''">
CASE WHEN LEFT(a.begain_time, 4) = #{years} THEN b.zydmj ELSE 0 END
</when>
<otherwise>
CASE WHEN LEFT(a.begain_time, 4) = YEAR(NOW()) THEN b.zydmj ELSE 0 END
</otherwise>
</choose>
), 0) AS currentAllInvest3
FROM gysl_basic_information a
LEFT JOIN gysl_plan_information b ON a.id = b.xm_id
<where>

@ -201,7 +201,7 @@ public class SysJobServiceImpl implements ISysJobService
@Transactional(rollbackFor = Exception.class)
public int insertJob(SysJob job) throws SchedulerException, TaskException
{
job.setStatus(ScheduleConstants.Status.PAUSE.getValue());
// job.setStatus(ScheduleConstants.Status.PAUSE.getValue());
int rows = jobMapper.insertJob(job);
if (rows > 0)
{

@ -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

@ -1,11 +0,0 @@
# 页面标题
VUE_APP_TITLE = 若依管理系统
# 开发环境配置
ENV = 'development'
# 若依管理系统/开发环境
VUE_APP_BASE_API = '/dev-api'
# 路由懒加载
VUE_CLI_BABEL_TRANSPILE_MODULES = true

@ -1,8 +0,0 @@
# 页面标题
VUE_APP_TITLE = 若依管理系统
# 生产环境配置
ENV = 'production'
# 若依管理系统/生产环境
VUE_APP_BASE_API = '/prod-api'

@ -1,12 +0,0 @@
# 页面标题
VUE_APP_TITLE = 若依管理系统
BABEL_ENV = production
NODE_ENV = production
# 测试环境配置
ENV = 'staging'
# 若依管理系统/测试环境
VUE_APP_BASE_API = '/stage-api'

@ -1,10 +0,0 @@
# 忽略build目录下类型为js的文件的语法检查
build/*.js
# 忽略src/assets目录下文件的语法检查
src/assets
# 忽略public目录下文件的语法检查
public
# 忽略当前目录下为js的文件的语法检查
*.js
# 忽略当前目录下为vue的文件的语法检查
*.vue

@ -1,199 +0,0 @@
// ESlint 检查配置
module.exports = {
root: true,
parserOptions: {
parser: 'babel-eslint',
sourceType: 'module'
},
env: {
browser: true,
node: true,
es6: true,
},
extends: ['plugin:vue/recommended', 'eslint:recommended'],
// add your custom rules here
//it is base on https://github.com/vuejs/eslint-config-vue
rules: {
"vue/max-attributes-per-line": [2, {
"singleline": 10,
"multiline": {
"max": 1,
"allowFirstLine": false
}
}],
"vue/singleline-html-element-content-newline": "off",
"vue/multiline-html-element-content-newline":"off",
"vue/name-property-casing": ["error", "PascalCase"],
"vue/no-v-html": "off",
'accessor-pairs': 2,
'arrow-spacing': [2, {
'before': true,
'after': true
}],
'block-spacing': [2, 'always'],
'brace-style': [2, '1tbs', {
'allowSingleLine': true
}],
'camelcase': [0, {
'properties': 'always'
}],
'comma-dangle': [2, 'never'],
'comma-spacing': [2, {
'before': false,
'after': true
}],
'comma-style': [2, 'last'],
'constructor-super': 2,
'curly': [2, 'multi-line'],
'dot-location': [2, 'property'],
'eol-last': 2,
'eqeqeq': ["error", "always", {"null": "ignore"}],
'generator-star-spacing': [2, {
'before': true,
'after': true
}],
'handle-callback-err': [2, '^(err|error)$'],
'indent': [2, 2, {
'SwitchCase': 1
}],
'jsx-quotes': [2, 'prefer-single'],
'key-spacing': [2, {
'beforeColon': false,
'afterColon': true
}],
'keyword-spacing': [2, {
'before': true,
'after': true
}],
'new-cap': [2, {
'newIsCap': true,
'capIsNew': false
}],
'new-parens': 2,
'no-array-constructor': 2,
'no-caller': 2,
'no-console': 'off',
'no-class-assign': 2,
'no-cond-assign': 2,
'no-const-assign': 2,
'no-control-regex': 0,
'no-delete-var': 2,
'no-dupe-args': 2,
'no-dupe-class-members': 2,
'no-dupe-keys': 2,
'no-duplicate-case': 2,
'no-empty-character-class': 2,
'no-empty-pattern': 2,
'no-eval': 2,
'no-ex-assign': 2,
'no-extend-native': 2,
'no-extra-bind': 2,
'no-extra-boolean-cast': 2,
'no-extra-parens': [2, 'functions'],
'no-fallthrough': 2,
'no-floating-decimal': 2,
'no-func-assign': 2,
'no-implied-eval': 2,
'no-inner-declarations': [2, 'functions'],
'no-invalid-regexp': 2,
'no-irregular-whitespace': 2,
'no-iterator': 2,
'no-label-var': 2,
'no-labels': [2, {
'allowLoop': false,
'allowSwitch': false
}],
'no-lone-blocks': 2,
'no-mixed-spaces-and-tabs': 2,
'no-multi-spaces': 2,
'no-multi-str': 2,
'no-multiple-empty-lines': [2, {
'max': 1
}],
'no-native-reassign': 2,
'no-negated-in-lhs': 2,
'no-new-object': 2,
'no-new-require': 2,
'no-new-symbol': 2,
'no-new-wrappers': 2,
'no-obj-calls': 2,
'no-octal': 2,
'no-octal-escape': 2,
'no-path-concat': 2,
'no-proto': 2,
'no-redeclare': 2,
'no-regex-spaces': 2,
'no-return-assign': [2, 'except-parens'],
'no-self-assign': 2,
'no-self-compare': 2,
'no-sequences': 2,
'no-shadow-restricted-names': 2,
'no-spaced-func': 2,
'no-sparse-arrays': 2,
'no-this-before-super': 2,
'no-throw-literal': 2,
'no-trailing-spaces': 2,
'no-undef': 2,
'no-undef-init': 2,
'no-unexpected-multiline': 2,
'no-unmodified-loop-condition': 2,
'no-unneeded-ternary': [2, {
'defaultAssignment': false
}],
'no-unreachable': 2,
'no-unsafe-finally': 2,
'no-unused-vars': [2, {
'vars': 'all',
'args': 'none'
}],
'no-useless-call': 2,
'no-useless-computed-key': 2,
'no-useless-constructor': 2,
'no-useless-escape': 0,
'no-whitespace-before-property': 2,
'no-with': 2,
'one-var': [2, {
'initialized': 'never'
}],
'operator-linebreak': [2, 'after', {
'overrides': {
'?': 'before',
':': 'before'
}
}],
'padded-blocks': [2, 'never'],
'quotes': [2, 'single', {
'avoidEscape': true,
'allowTemplateLiterals': true
}],
'semi': [2, 'never'],
'semi-spacing': [2, {
'before': false,
'after': true
}],
'space-before-blocks': [2, 'always'],
'space-before-function-paren': [2, 'never'],
'space-in-parens': [2, 'never'],
'space-infix-ops': 2,
'space-unary-ops': [2, {
'words': true,
'nonwords': false
}],
'spaced-comment': [2, 'always', {
'markers': ['global', 'globals', 'eslint', 'eslint-disable', '*package', '!', ',']
}],
'template-curly-spacing': [2, 'never'],
'use-isnan': 2,
'valid-typeof': 2,
'wrap-iife': [2, 'any'],
'yield-star-spacing': [2, 'both'],
'yoda': [2, 'never'],
'prefer-const': 2,
'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0,
'object-curly-spacing': [2, 'always', {
objectsInObjects: false
}],
'array-bracket-spacing': [2, 'never']
}
}

@ -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

@ -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
```

@ -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']
}
}
}

@ -1,12 +0,0 @@
@echo off
echo.
echo [信息] 打包Web工程生成dist文件。
echo.
%~d0
cd %~dp0
cd ..
npm run build:prod
pause

@ -1,12 +0,0 @@
@echo off
echo.
echo [信息] 安装Web工程生成node_modules文件。
echo.
%~d0
cd %~dp0
cd ..
npm install --registry=https://registry.npmmirror.com
pause

@ -1,12 +0,0 @@
@echo off
echo.
echo [信息] 使用 Vue CLI 命令运行 Web 工程。
echo.
%~d0
cd %~dp0
cd ..
npm run dev
pause

@ -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}`)
}

@ -1,91 +0,0 @@
{
"name": "ruoyi",
"version": "3.8.9",
"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",
"lint": "eslint --ext .js,.vue src"
},
"husky": {
"hooks": {
"pre-commit": "lint-staged"
}
},
"lint-staged": {
"src/**/*.{js,vue}": [
"eslint --fix",
"git add"
]
},
"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-meta": "2.4.0",
"vue-router": "3.4.9",
"vuedraggable": "2.24.3",
"vuex": "3.6.0"
},
"devDependencies": {
"@vue/cli-plugin-babel": "4.4.6",
"@vue/cli-plugin-eslint": "4.4.6",
"@vue/cli-service": "4.4.6",
"babel-eslint": "10.1.0",
"babel-plugin-dynamic-import-node": "2.3.3",
"chalk": "4.1.0",
"compression-webpack-plugin": "6.1.2",
"connect": "3.6.6",
"eslint": "7.15.0",
"eslint-plugin-vue": "7.2.0",
"lint-staged": "10.5.3",
"runjs": "4.4.2",
"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"
]
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.5 KiB

File diff suppressed because one or more lines are too long

@ -1,208 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="renderer" content="webkit">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
<title><%= webpackConfig.name %></title>
<!--[if lt IE 11]><script>window.location.href='/html/ie.html';</script><![endif]-->
<style>
html,
body,
#app {
height: 100%;
margin: 0px;
padding: 0px;
}
.chromeframe {
margin: 0.2em 0;
background: #ccc;
color: #000;
padding: 0.2em 0;
}
#loader-wrapper {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 999999;
}
#loader {
display: block;
position: relative;
left: 50%;
top: 50%;
width: 150px;
height: 150px;
margin: -75px 0 0 -75px;
border-radius: 50%;
border: 3px solid transparent;
border-top-color: #FFF;
-webkit-animation: spin 2s linear infinite;
-ms-animation: spin 2s linear infinite;
-moz-animation: spin 2s linear infinite;
-o-animation: spin 2s linear infinite;
animation: spin 2s linear infinite;
z-index: 1001;
}
#loader:before {
content: "";
position: absolute;
top: 5px;
left: 5px;
right: 5px;
bottom: 5px;
border-radius: 50%;
border: 3px solid transparent;
border-top-color: #FFF;
-webkit-animation: spin 3s linear infinite;
-moz-animation: spin 3s linear infinite;
-o-animation: spin 3s linear infinite;
-ms-animation: spin 3s linear infinite;
animation: spin 3s linear infinite;
}
#loader:after {
content: "";
position: absolute;
top: 15px;
left: 15px;
right: 15px;
bottom: 15px;
border-radius: 50%;
border: 3px solid transparent;
border-top-color: #FFF;
-moz-animation: spin 1.5s linear infinite;
-o-animation: spin 1.5s linear infinite;
-ms-animation: spin 1.5s linear infinite;
-webkit-animation: spin 1.5s linear infinite;
animation: spin 1.5s linear infinite;
}
@-webkit-keyframes spin {
0% {
-webkit-transform: rotate(0deg);
-ms-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(360deg);
-ms-transform: rotate(360deg);
transform: rotate(360deg);
}
}
@keyframes spin {
0% {
-webkit-transform: rotate(0deg);
-ms-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(360deg);
-ms-transform: rotate(360deg);
transform: rotate(360deg);
}
}
#loader-wrapper .loader-section {
position: fixed;
top: 0;
width: 51%;
height: 100%;
background: #7171C6;
z-index: 1000;
-webkit-transform: translateX(0);
-ms-transform: translateX(0);
transform: translateX(0);
}
#loader-wrapper .loader-section.section-left {
left: 0;
}
#loader-wrapper .loader-section.section-right {
right: 0;
}
.loaded #loader-wrapper .loader-section.section-left {
-webkit-transform: translateX(-100%);
-ms-transform: translateX(-100%);
transform: translateX(-100%);
-webkit-transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1.000);
transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1.000);
}
.loaded #loader-wrapper .loader-section.section-right {
-webkit-transform: translateX(100%);
-ms-transform: translateX(100%);
transform: translateX(100%);
-webkit-transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1.000);
transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1.000);
}
.loaded #loader {
opacity: 0;
-webkit-transition: all 0.3s ease-out;
transition: all 0.3s ease-out;
}
.loaded #loader-wrapper {
visibility: hidden;
-webkit-transform: translateY(-100%);
-ms-transform: translateY(-100%);
transform: translateY(-100%);
-webkit-transition: all 0.3s 1s ease-out;
transition: all 0.3s 1s ease-out;
}
.no-js #loader-wrapper {
display: none;
}
.no-js h1 {
color: #222222;
}
#loader-wrapper .load_title {
font-family: 'Open Sans';
color: #FFF;
font-size: 19px;
width: 100%;
text-align: center;
z-index: 9999999999999;
position: absolute;
top: 60%;
opacity: 1;
line-height: 30px;
}
#loader-wrapper .load_title span {
font-weight: normal;
font-style: italic;
font-size: 13px;
color: #FFF;
opacity: 0.5;
}
</style>
</head>
<body>
<div id="app">
<div id="loader-wrapper">
<div id="loader"></div>
<div class="loader-section section-left"></div>
<div class="loader-section section-right"></div>
<div class="load_title">正在加载系统资源,请耐心等待</div>
</div>
</div>
</body>
</html>

@ -1,2 +0,0 @@
User-agent: *
Disallow: /

File diff suppressed because one or more lines are too long

@ -1,28 +0,0 @@
<template>
<div id="app">
<router-view />
<theme-picker />
</div>
</template>
<script>
import ThemePicker from "@/components/ThemePicker";
export default {
name: "App",
components: { ThemePicker },
metaInfo() {
return {
title: this.$store.state.settings.dynamicTitle && this.$store.state.settings.title,
titleTemplate: title => {
return title ? `${title} - ${process.env.VUE_APP_TITLE}` : process.env.VUE_APP_TITLE
}
}
}
};
</script>
<style scoped>
#app .theme-picker {
display: none;
}
</style>

@ -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
})
}

@ -1,9 +0,0 @@
import request from '@/utils/request'
// 获取路由
export const getRouters = () => {
return request({
url: '/getRouters',
method: 'get'
})
}

@ -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'
})
}

@ -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
})
}

@ -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'
})
}

@ -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'
})
}

@ -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'
})
}

@ -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'
})
}

@ -1,9 +0,0 @@
import request from '@/utils/request'
// 获取服务信息
export function getServer() {
return request({
url: '/monitor/server',
method: 'get'
})
}

@ -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'
})
}

@ -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'
})
}

@ -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'
})
}

@ -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'
})
}

@ -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'
})
}

@ -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'
})
}

@ -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'
})
}

@ -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'
})
}

@ -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'
})
}

@ -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'
})
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 160 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

@ -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)

@ -1 +0,0 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M121.718 73.272v9.953c3.957-7.584 6.199-16.05 6.199-24.995C127.917 26.079 99.273 0 63.958 0 28.644 0 0 26.079 0 58.23c0 .403.028.806.028 1.21l22.97-25.953h13.34l-19.76 27.187h6.42V53.77l13.728-19.477v49.361H22.998V73.272H2.158c5.951 20.284 23.608 36.208 45.998 41.399-1.44 3.3-5.618 11.263-12.565 12.674-8.607 1.764 23.358.428 46.163-13.178 17.519-4.611 31.938-15.849 39.77-30.513h-13.506V73.272H85.02V59.464l22.998-25.977h13.008l-19.429 27.187h6.421v-7.433l13.727-19.402v39.433h-.027zm-78.24 2.822a10.516 10.516 0 0 1-.996-4.535V44.548c0-1.613.332-3.124.996-4.535a11.66 11.66 0 0 1 2.713-3.68c1.134-1.032 2.49-1.864 4.04-2.468 1.55-.605 3.21-.908 4.982-.908h11.292c1.77 0 3.431.303 4.981.908 1.522.604 2.85 1.41 3.986 2.418l-12.26 16.303v-2.898a1.96 1.96 0 0 0-.665-1.512c-.443-.403-.996-.604-1.66-.604-.665 0-1.218.201-1.661.604a1.96 1.96 0 0 0-.664 1.512v9.071L44.364 77.606a10.556 10.556 0 0 1-.886-1.512zm35.73-4.535c0 1.613-.332 3.124-.997 4.535a11.66 11.66 0 0 1-2.712 3.68c-1.134 1.032-2.49 1.864-4.04 2.469-1.55.604-3.21.907-4.982.907H55.185c-1.77 0-3.431-.303-4.981-.907-1.55-.605-2.906-1.437-4.041-2.47a12.49 12.49 0 0 1-1.384-1.512l13.727-18.217v6.375c0 .605.222 1.109.665 1.512.442.403.996.604 1.66.604.664 0 1.218-.201 1.66-.604a1.96 1.96 0 0 0 .665-1.512V53.87L75.97 36.838c.913.932 1.66 1.99 2.214 3.175.664 1.41.996 2.922.996 4.535v27.011h.028z"/></svg>

Before

Width:  |  Height:  |  Size: 1.4 KiB

@ -1 +0,0 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M127.88 73.143c0 1.412-.506 2.635-1.518 3.669-1.011 1.033-2.209 1.55-3.592 1.55h-17.887c0 9.296-1.783 17.178-5.35 23.645l16.609 17.044c1.011 1.034 1.517 2.257 1.517 3.67 0 1.412-.506 2.635-1.517 3.668-.958 1.033-2.155 1.55-3.593 1.55-1.438 0-2.635-.517-3.593-1.55l-15.811-16.063a15.49 15.49 0 0 1-1.196 1.06c-.532.434-1.65 1.208-3.353 2.322a50.104 50.104 0 0 1-5.192 2.974c-1.758.87-3.94 1.658-6.546 2.364-2.607.706-5.189 1.06-7.748 1.06V47.044H58.89v73.062c-2.716 0-5.417-.367-8.106-1.102-2.688-.734-5.003-1.631-6.945-2.692a66.769 66.769 0 0 1-5.268-3.179c-1.571-1.057-2.73-1.94-3.476-2.65L33.9 109.34l-14.611 16.877c-1.066 1.14-2.344 1.711-3.833 1.711-1.277 0-2.422-.434-3.434-1.304-1.012-.978-1.557-2.187-1.635-3.627-.079-1.44.333-2.705 1.236-3.794l16.129-18.51c-3.087-6.197-4.63-13.644-4.63-22.342H5.235c-1.383 0-2.58-.517-3.592-1.55S.125 74.545.125 73.132c0-1.412.506-2.635 1.518-3.668 1.012-1.034 2.21-1.55 3.592-1.55h17.887V43.939L9.308 29.833c-1.012-1.033-1.517-2.256-1.517-3.669 0-1.412.505-2.635 1.517-3.668 1.012-1.034 2.21-1.55 3.593-1.55s2.58.516 3.593 1.55l13.813 14.106h67.396l13.814-14.106c1.012-1.034 2.21-1.55 3.592-1.55 1.384 0 2.581.516 3.593 1.55 1.012 1.033 1.518 2.256 1.518 3.668 0 1.413-.506 2.636-1.518 3.67l-13.814 14.105v23.975h17.887c1.383 0 2.58.516 3.593 1.55 1.011 1.033 1.517 2.256 1.517 3.668l-.005.01zM89.552 26.175H38.448c0-7.23 2.489-13.386 7.466-18.469C50.892 2.623 56.92.082 64 .082c7.08 0 13.108 2.541 18.086 7.624 4.977 5.083 7.466 11.24 7.466 18.469z"/></svg>

Before

Width:  |  Height:  |  Size: 1.5 KiB

@ -1 +0,0 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1568899741379" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2054" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M960 591.424V368.96c0-0.288 0.16-0.512 0.16-0.768S960 367.68 960 367.424V192a32 32 0 0 0-32-32H96a32 32 0 0 0-32 32v175.424c0 0.288-0.16 0.512-0.16 0.768s0.16 0.48 0.16 0.768v222.464c0 0.288-0.16 0.512-0.16 0.768s0.16 0.48 0.16 0.768V864a32 32 0 0 0 32 32h832a32 32 0 0 0 32-32v-271.04c0-0.288 0.16-0.512 0.16-0.768S960 591.68 960 591.424z m-560-31.232v-160H608v160h-208z m208 64V832h-208v-207.808H608z m-480-224h208v160H128v-160z m544 0h224v160h-224v-160zM896 224v112.192H128V224h768zM128 624.192h208V832H128v-207.808zM672 832v-207.808h224V832h-224z" p-id="2055"></path></svg>

Before

Width:  |  Height:  |  Size: 954 B

@ -1 +0,0 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1588670460195" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1314" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M230.4 307.712c13.824 0 25.088-11.264 25.088-25.088 0-100.352 81.92-182.272 182.272-182.272s182.272 81.408 182.272 182.272c0 13.824 11.264 25.088 25.088 25.088s25.088-11.264 24.576-25.088c0-127.488-103.936-231.936-231.936-231.936S205.824 154.624 205.824 282.624c-0.512 14.336 10.752 25.088 24.576 25.088z m564.736 234.496c-11.264 0-21.504 2.048-31.232 6.144 0-44.544-40.448-81.92-88.064-81.92-14.848 0-28.16 3.584-39.936 10.24-13.824-28.16-44.544-48.128-78.848-48.128-12.288 0-24.576 2.56-35.328 7.68V284.16c0-45.568-37.888-81.92-84.48-81.92s-84.48 36.864-84.48 81.92v348.672l-69.12-112.64c-18.432-28.16-58.368-36.864-91.136-19.968-26.624 14.336-46.592 47.104-30.208 88.064 3.072 8.192 76.8 205.312 171.52 311.296 0 0 28.16 24.576 43.008 58.88 4.096 9.728 13.312 15.36 22.528 15.36 3.072 0 6.656-0.512 9.728-2.048 12.288-5.12 18.432-19.968 12.8-32.256-19.456-44.544-53.76-74.752-53.76-74.752C281.6 768 209.408 573.44 208.384 570.88c-5.12-12.8-2.56-20.992 7.168-26.112 9.216-4.608 21.504-4.608 26.112 2.56l113.152 184.32c4.096 8.704 12.8 14.336 22.528 14.336 13.824 0 25.088-10.752 25.088-25.088V284.16c0-17.92 15.36-32.256 34.816-32.256s34.816 14.336 34.816 32.256v284.16c0 13.824 10.24 25.088 24.576 25.088 13.824 0 25.088-11.264 25.088-25.088v-57.344c0-17.92 15.36-32.768 34.816-32.768 19.968 0 37.376 15.36 37.376 32.768v95.232c0 7.168 3.072 13.312 7.68 17.92 4.608 4.608 10.752 7.168 17.92 7.168 13.824 0 24.576-11.264 24.576-25.088V547.84c0-18.432 13.824-32.256 32.256-32.256 20.48 0 38.912 15.36 38.912 32.256v95.232c0 13.824 11.264 25.088 25.088 25.088s24.576-11.264 25.088-25.088v-18.944c0-18.944 12.8-32.256 30.72-32.256 18.432 0 22.528 18.944 22.528 31.744 0 1.024-11.776 99.84-50.688 173.056-30.72 58.368-45.056 112.128-51.2 146.944-2.56 13.312 6.656 26.112 19.968 28.672 1.536 0 3.072 0.512 4.608 0.512 11.776 0 22.016-8.192 24.064-20.48 5.632-31.232 18.432-79.36 46.08-132.608 43.52-81.92 55.808-186.88 56.32-193.536-0.512-50.688-29.696-83.968-72.704-83.968z"></path></path></svg>

Before

Width:  |  Height:  |  Size: 2.3 KiB

@ -1 +0,0 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1576153230908" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="971" xmlns:xlink="http://www.w3.org/1999/xlink" width="81" height="81"><defs><style type="text/css"></style></defs><path d="M772.87036133 734.06115723c-43.34106445 0-80.00793458 27.93273926-93.76831055 66.57714843H475.90991211c-56.60705567 0-102.66723633-46.06018067-102.66723633-102.66723633V600.82446289h305.859375c13.76037598 38.64440918 50.42724609 66.57714844 93.76831055 66.57714844 55.12390137 0 99.94812012-44.82421875 99.94812012-99.94812012S827.9942627 467.50537109 772.87036133 467.50537109c-43.34106445 0-80.00793458 27.93273926-93.76831055 66.57714844H373.24267578V401.01062011h321.92687989c55.12390137 0 99.94812012-44.82421875 99.94812011-99.94812011V190.07312011C795.11767578 134.94921875 750.29345703 90.125 695.16955567 90.125H251.12963867C196.0057373 90.125 151.18151855 134.94921875 151.18151855 190.07312011V301.0625c0 55.12390137 44.82421875 99.94812012 99.94812012 99.94812012h55.53588867v296.96044921c0 93.35632325 75.97045898 169.32678223 169.32678224 169.32678223h203.19213866c13.76037598 38.64440918 50.42724609 66.57714844 93.76831055 66.57714844 55.12390137 0 99.94812012-44.82421875 99.94812012-99.94812012s-44.90661622-99.86572266-100.03051758-99.86572265z m0-199.89624024c18.37463379 0 33.28857422 14.91394043 33.28857422 33.28857423s-14.91394043 33.28857422-33.28857422 33.28857421-33.28857422-14.91394043-33.28857422-33.28857421 14.91394043-33.28857422 33.28857422-33.28857422zM217.75866699 301.0625V190.07312011c0-18.37463379 14.91394043-33.28857422 33.28857423-33.28857421h444.03991698c18.37463379 0 33.28857422 14.91394043 33.28857422 33.28857422V301.0625c0 18.37463379-14.91394043 33.28857422-33.28857422 33.28857422H251.12963867c-18.37463379 0-33.37097168-14.91394043-33.37097168-33.28857422z m555.11169434 566.23535156c-18.37463379 0-33.28857422-14.91394043-33.28857422-33.28857422 0-18.37463379 14.91394043-33.28857422 33.28857422-33.28857422s33.28857422 14.91394043 33.28857422 33.28857422c0.08239747 18.29223633-14.91394043 33.28857422-33.28857422 33.28857422z" p-id="972"></path></svg>

Before

Width:  |  Height:  |  Size: 2.2 KiB

@ -1 +0,0 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M0 54.857h36.571V128H0V54.857zM91.429 27.43H128V128H91.429V27.429zM45.714 0h36.572v128H45.714V0z"/></svg>

Before

Width:  |  Height:  |  Size: 179 B

@ -1 +0,0 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1575982282951" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="902" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M828.40625 90.125H195.59375C137.375 90.125 90.125 137.375 90.125 195.59375v632.8125c0 58.21875 47.25 105.46875 105.46875 105.46875h632.8125c58.21875 0 105.46875-47.25 105.46875-105.46875V195.59375c0-58.21875-47.25-105.46875-105.46875-105.46875z m52.734375 738.28125c0 29.16-23.57015625 52.734375-52.734375 52.734375H195.59375c-29.109375 0-52.734375-23.574375-52.734375-52.734375V195.59375c0-29.109375 23.625-52.734375 52.734375-52.734375h632.8125c29.16 0 52.734375 23.625 52.734375 52.734375v632.8125z" p-id="903"></path><path d="M421.52890625 709.55984375a36.28125 36.28125 0 0 1-27.55265625-12.66890625L205.17453125 476.613125a36.28546875 36.28546875 0 0 1 55.10109375-47.22890625l164.986875 192.4846875 342.16171875-298.48078125a36.2896875 36.2896875 0 0 1 47.70984375 54.68765625L445.3859375 700.6203125a36.3234375 36.3234375 0 0 1-23.85703125 8.93953125z" p-id="904"></path></svg>

Before

Width:  |  Height:  |  Size: 1.2 KiB

@ -1 +0,0 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M54.857 118.857h64V73.143H89.143c-1.902 0-3.52-.668-4.855-2.002-1.335-1.335-2.002-2.954-2.002-4.855V36.57H54.857v82.286zM73.143 16v-4.571a2.2 2.2 0 0 0-.677-1.61 2.198 2.198 0 0 0-1.609-.676H20.571c-.621 0-1.158.225-1.609.676a2.198 2.198 0 0 0-.676 1.61V16a2.2 2.2 0 0 0 .676 1.61c.451.45.988.676 1.61.676h50.285c.622 0 1.158-.226 1.61-.677.45-.45.676-.987.676-1.609zm18.286 48h21.357L91.43 42.642V64zM128 73.143v48c0 1.902-.667 3.52-2.002 4.855-1.335 1.335-2.953 2.002-4.855 2.002H52.57c-1.901 0-3.52-.667-4.854-2.002-1.335-1.335-2.003-2.953-2.003-4.855v-11.429H6.857c-1.902 0-3.52-.667-4.855-2.002C.667 106.377 0 104.759 0 102.857v-96c0-1.902.667-3.52 2.002-4.855C3.337.667 4.955 0 6.857 0h77.714c1.902 0 3.52.667 4.855 2.002 1.335 1.335 2.003 2.953 2.003 4.855V30.29c1 .622 1.856 1.29 2.569 2.003l29.147 29.147c1.335 1.335 2.478 3.145 3.429 5.43.95 2.287 1.426 4.383 1.426 6.291v-.018z"/></svg>

Before

Width:  |  Height:  |  Size: 971 B

@ -1 +0,0 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1546567861908" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2422" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M318.577778 819.2L17.066667 512l301.511111-307.2 45.511111 45.511111L96.711111 512l267.377778 261.688889zM705.422222 819.2l-45.511111-45.511111L927.288889 512l-267.377778-261.688889 45.511111-45.511111L1006.933333 512zM540.785778 221.866667l55.751111 11.150222L483.157333 802.133333l-55.751111-11.093333z" p-id="2423"></path></svg>

Before

Width:  |  Height:  |  Size: 717 B

@ -1 +0,0 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1577252187056" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2508" xmlns:xlink="http://www.w3.org/1999/xlink" width="81" height="81"><defs><style type="text/css"></style></defs><path d="M747.59340925 691.12859384c11.51396329 0.25305413 22.43746719-0.21087818 40.74171707-1.51832482 29.35428085-2.10878421 35.84933734-2.36183835 46.47761114-0.8856895 24.71495444 3.37405491 41.12129828 21.76265671 32.47528161 47.95376084-85.57447632 258.19957947-442.00123984 249.76444099-628.67084683 50.73735554-153.47733892-159.33976008-153.09775772-414.41833795 0.92786545-573.42069196 159.71934128-162.67163983 424.03439521-166.59397897 565.78689185 0.63263534 80.38686649 94.81095318 108.34934958 169.16669549 89.11723508 230.57450162-15.01454608 47.99593598-50.61082928 77.68762207-119.77896259 114.63352789-4.89237973 2.65706845-29.35428085 15.52065436-35.84933652 19.02123633-46.94154346 25.30541465-63.51659033 41.20565021-62.20914449 58.45550757 2.95229856 39.13904114 24.16667102 52.7196135 70.98168823 53.81618115z m44.41100207 50.10472101c-19.82257471 1.43397372-32.05352527 1.940082-45.63409763 1.6448519-70.34905207-1.60267593-115.98314969-30.91478165-121.38163769-101.64341492-3.45840683-46.05585397 24.7571304-73.13264758 89.24376132-107.96976837 6.7902866-3.66928501 31.37871396-16.57504688 36.06021551-19.06341229 57.69634516-30.83042972 85.15271997-53.73183005 94.76877722-84.47790866 12.77923398-40.78389304-9.10994898-98.94417051-79.24812286-181.6507002-121.17075953-142.97559219-350.14258521-139.60153647-489.2380134 2.06660824-134.49827774 138.84237405-134.79350784 362.12048163-0.42175717 501.637667 158.53842169 168.99799328 451.9968783 181.18676788 534.57688175-11.80919339-4.68150156 0.2952301-10.71262573 0.67481131-18.72600705 1.26527069z" p-id="2509"></path><path d="M346.03865637 637.18588562a78.82636652 78.82636652 0 0 0 78.32025825-79.29029883c0-43.69401562-35.005823-79.29029883-78.32025825-79.29029882a78.82636652 78.82636652 0 0 0-78.36243338 79.29029882c0 43.69401562 35.005823 79.29029883 78.36243338 79.29029883z m0-51.7495729a27.07679361 27.07679361 0 0 1-26.5706845-27.54072593c0-15.30977536 11.97789643-27.54072593 26.5706845-27.54072592 14.55061295 0 26.57068533 12.23095057 26.57068533 27.54072592a27.07679361 27.07679361 0 0 1-26.57068533 27.54072593zM475.7289063 807.11174353a78.82636652 78.82636652 0 0 0 78.3624334-79.29029882c0-43.69401562-34.96364785-79.29029883-78.32025825-79.29029883a78.82636652 78.82636652 0 0 0-78.32025742 79.29029883c0 43.69401562 34.96364785 79.29029883 78.32025742 79.29029882z m0-51.74957208a27.07679361 27.07679361 0 0 1-26.57068532-27.54072674c0-15.30977536 12.06224753-27.54072593 26.57068532-27.54072593 14.59278892 0 26.57068533 12.23095057 26.57068453 27.54072593a27.07679361 27.07679361 0 0 1-26.57068453 27.54072674zM601.24376214 377.21492718a78.82636652 78.82636652 0 0 0 78.32025742-79.29029883c0-43.69401562-34.96364785-79.29029883-78.32025742-79.29029882a78.82636652 78.82636652 0 0 0-78.32025823 79.29029883c0 43.69401562 34.96364785 79.29029883 78.32025824 79.29029883z m1e-8-51.74957208a27.07679361 27.07679361 0 0 1-26.57068534-27.54072675c0-15.30977536 11.97789643-27.54072593 26.57068534-27.54072591 14.55061295 0 26.57068533 12.23095057 26.57068451 27.54072592a27.07679361 27.07679361 0 0 1-26.57068451 27.54072674zM378.80916809 433.85687983a78.82636652 78.82636652 0 0 0 78.32025824-79.29029883c0-43.69401562-34.96364785-79.29029883-78.32025824-79.29029802a78.82636652 78.82636652 0 0 0-78.32025742 79.29029802c0 43.69401562 34.96364785 79.29029883 78.32025742 79.29029883z m0-51.74957209a27.07679361 27.07679361 0 0 1-26.57068451-27.54072674c0-15.30977536 11.97789643-27.54072593 26.57068451-27.54072593 14.55061295 0 26.57068533 12.23095057 26.57068533 27.54072593a27.07679361 27.07679361 0 0 1-26.57068533 27.54072674z" p-id="2510"></path></svg>

Before

Width:  |  Height:  |  Size: 3.9 KiB

@ -1 +0,0 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1575804206892" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3145" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M826.56 470.016c-32.896 0-64.384 12.288-89.984 35.52l0-104.96c0-62.208-50.496-112.832-112.64-113.088L623.936 287.04 519.552 287.104C541.824 262.72 554.56 230.72 554.56 197.12c0-73.536-59.904-133.44-133.504-133.44-73.472 0-133.376 59.904-133.376 133.44 0 32.896 12.224 64.256 35.52 89.984L175.232 287.104l0 0.576C113.728 288.704 64 338.88 64 400.576l0.32 0 0.32 116.48C60.864 544.896 70.592 577.728 100.8 588.48c12.736 4.608 37.632 7.488 60.864-25.28 12.992-18.368 34.24-29.248 56.64-29.248 38.336 0 69.504 31.104 69.504 69.312 0 38.4-31.168 69.504-69.504 69.504-22.656 0-44.032-11.264-57.344-30.4C138.688 610.112 112.576 615.36 102.464 619.136c-29.824 10.752-39.104 43.776-38.144 67.392l0 160.384L64 846.912C64 909.248 114.752 960 177.216 960l446.272 0c62.4 0 113.152-50.752 113.152-113.152l0-145.024c24.384 22.272 56.384 35.008 89.984 35.008 73.536 0 133.44-59.904 133.44-133.504C960 529.92 900.096 470.016 826.56 470.016zM826.56 672.896c-22.72 0-44.032-11.264-57.344-30.4-22.272-32.384-48.448-27.136-58.56-23.36-29.824 10.752-39.04 43.776-38.08 67.392l0 160.384c0 27.136-22.016 49.152-49.152 49.152L177.216 896.064C150.08 896 128 873.984 128 846.848l0.32 0 0-145.024c24.384 22.272 56.384 35.008 89.984 35.008 73.6 0 133.504-59.904 133.504-133.504 0-73.472-59.904-133.376-133.504-133.376-32.896 0-64.32 12.288-89.984 35.52l0-104.96L128 400.512c0-27.072 22.08-49.152 49.216-49.152L177.216 351.04 334.656 350.72c3.776 0.512 7.616 0.832 11.52 0.832 24.896 0 50.752-10.816 60.032-37.056 4.544-12.736 7.424-37.568-25.344-60.736C362.624 240.768 351.68 219.52 351.68 197.12c0-38.272 31.104-69.44 69.376-69.44 38.336 0 69.504 31.168 69.504 69.44 0 22.72-11.264 44.032-30.528 57.472C427.968 276.736 433.088 302.784 436.8 313.024c10.752 29.888 43.072 39.232 67.392 38.08l119.232 0 0 0.384c27.136 0 49.152 22.08 49.152 49.152l0.256 116.48c-3.776 27.84 6.016 60.736 36.224 71.488 12.736 4.608 37.632 7.488 60.8-25.28 13.056-18.368 34.24-29.248 56.704-29.248C864.832 534.016 896 565.12 896 603.392 896 641.728 864.832 672.896 826.56 672.896z" p-id="3146"></path></svg>

Before

Width:  |  Height:  |  Size: 2.4 KiB

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save