Compare commits

..

10 Commits

Author SHA1 Message Date
悲伤的橘子树
9a6e0bfabd Update README.md 2025-10-17 10:08:56 +08:00
悲伤的橘子树
490af83cc6 Update README.md 2025-09-03 09:38:59 +08:00
Fankekeke
348ca7050f Merge remote-tracking branch 'origin/main' 2025-04-01 23:17:24 +08:00
Fankekeke
5169f9331b fix - 添加气象预警
安全评价
2025-04-01 23:17:14 +08:00
悲伤的橘子树
b138e680a0 Update README.md 2025-01-23 14:37:19 +08:00
悲伤的橘子树
6244da0380 Update README.md 2024-12-12 10:48:46 +08:00
悲伤的橘子树
8161ffee88 Update README.md 2024-12-07 21:21:39 +08:00
悲伤的橘子树
442f8b18a0 Update README.md 2024-07-16 11:40:57 +08:00
悲伤的橘子树
edc52316f7 Update README.md 2024-06-09 07:09:17 +08:00
悲伤的橘子树
71607ee738 Update README.md 2024-04-11 00:29:58 +08:00
31 changed files with 1390 additions and 1096 deletions

View File

@@ -60,9 +60,8 @@ caigou
|![](https://fank-bucket-oss.oss-cn-beijing.aliyuncs.com/img/1701952526360.jpg) | ![](https://fank-bucket-oss.oss-cn-beijing.aliyuncs.com/img/1701952665885.jpg) |
|![](https://fank-bucket-oss.oss-cn-beijing.aliyuncs.com/img/1701952516122.jpg) | ![](https://fank-bucket-oss.oss-cn-beijing.aliyuncs.com/img/1701952653458.jpg) |
|![](https://fank-bucket-oss.oss-cn-beijing.aliyuncs.com/img/1701952499591.jpg) | ![](https://fank-bucket-oss.oss-cn-beijing.aliyuncs.com/img/1701952623374.jpg) |
|![](https://fank-bucket-oss.oss-cn-beijing.aliyuncs.com/img/1701952462356.jpg) | ![](https://fank-bucket-oss.oss-cn-beijing.aliyuncs.com/img/1701952612158.jpg) |
|![](https://fank-bucket-oss.oss-cn-beijing.aliyuncs.com/img/1701952769086.jpg) | ![](https://fank-bucket-oss.oss-cn-beijing.aliyuncs.com/img/1701952601194.jpg)
|![](https://fank-bucket-oss.oss-cn-beijing.aliyuncs.com/img/1701952601194.jpg) | ![](https://fank-bucket-oss.oss-cn-beijing.aliyuncs.com/img/1701952612158.jpg) |
|![](https://fank-bucket-oss.oss-cn-beijing.aliyuncs.com/img/1701952769086.jpg) | ![](https://fank-bucket-oss.oss-cn-beijing.aliyuncs.com/work/936e9baf53eb9a217af4f89c616dc19.png) |
#### 演示视频
@@ -74,13 +73,21 @@ Email: fan1ke2ke@gmail.com
WeChat: `Storm_Berserker`
`附带部署与讲解服务,因为要恰饭资源非免费,伸手党勿扰,谢谢理解`
`附带部署与讲解服务,因为要恰饭资源非免费,伸手党勿扰,谢谢理解😭`
> 1.项目纯原创,不做二手贩子 2.一次购买终身有效 3.项目讲解持续到答辩结束 4.非常负责的答辩指导 5.**黑奴价格**
> 项目部署调试不好包退!功能逻辑没讲明白包退!
#### 其它资源
[2023年答辩顺利通过](https://berserker287.github.io/2023/06/14/2023%E5%B9%B4%E7%AD%94%E8%BE%A9%E9%A1%BA%E5%88%A9%E9%80%9A%E8%BF%87/)
[2025年-答辩顺利通过-客户评价🍜](https://berserker287.github.io/2025/06/18/2025%E5%B9%B4%E7%AD%94%E8%BE%A9%E9%A1%BA%E5%88%A9%E9%80%9A%E8%BF%87/)
[2022年答辩通过率100%](https://berserker287.github.io/2022/05/25/%E9%A1%B9%E7%9B%AE%E4%BA%A4%E6%98%93%E8%AE%B0%E5%BD%95/)
[2024年-答辩顺利通过-客户评价👻](https://berserker287.github.io/2024/06/06/2024%E5%B9%B4%E7%AD%94%E8%BE%A9%E9%A1%BA%E5%88%A9%E9%80%9A%E8%BF%87/)
[2023年-答辩顺利通过-客户评价🐢](https://berserker287.github.io/2023/06/14/2023%E5%B9%B4%E7%AD%94%E8%BE%A9%E9%A1%BA%E5%88%A9%E9%80%9A%E8%BF%87/)
[2022年-答辩通过率100%-客户评价🐣](https://berserker287.github.io/2022/05/25/%E9%A1%B9%E7%9B%AE%E4%BA%A4%E6%98%93%E8%AE%B0%E5%BD%95/)
[毕业答辩导师提问的高频问题](https://berserker287.github.io/2023/06/13/%E6%AF%95%E4%B8%9A%E7%AD%94%E8%BE%A9%E5%AF%BC%E5%B8%88%E6%8F%90%E9%97%AE%E7%9A%84%E9%AB%98%E9%A2%91%E9%97%AE%E9%A2%98/)
@@ -93,4 +100,6 @@ WeChat: `Storm_Berserker`
#### 接JAVAWEB毕设纯原创价格公道诚信第一
`网站建设、小程序、H5、APP、各种系统 选题+开题报告+任务书+程序定制+安装调试+项目讲解+论文+答辩PPT`
More info: [悲伤的橘子树](https://berserker287.github.io/)

View File

@@ -1,14 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
<component name="FacetManager">
<facet type="Spring" name="Spring">
<configuration />
</facet>
<facet type="web" name="Web">
<configuration>
<webroots />
</configuration>
</facet>
<facet type="Spring" name="Spring">
<configuration />
</facet>
</component>
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
<output url="file://$MODULE_DIR$/target/classes" />

View File

@@ -30,7 +30,7 @@ public class FebsConstant {
public static final String TYPE_MENU = "0";
// 网络资源 Url
public static final String MEIZU_WEATHER_URL = "http://aider.meizu.com/app/weather/listWeather";
public static final String MEIZU_WEATHER_URL = "https://aider.meizu.com/app/weather/listWeather";
public static final String MRYW_TODAY_URL = "https://interface.meiriyiwen.com/article/today";
public static final String MRYW_DAY_URL = "https://interface.meiriyiwen.com/article/day";
public static final String TIME_MOVIE_HOT_URL = "https://api-m.mtime.cn/Showtime/LocationMovies.api";

View File

@@ -0,0 +1,92 @@
package cc.mrbird.febs.cos.controller;
import cc.mrbird.febs.common.utils.R;
import cc.mrbird.febs.cos.entity.ScoreInfo;
import cc.mrbird.febs.cos.service.IScoreInfoService;
import cn.hutool.core.date.DateUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.Date;
import java.util.List;
/**
* @author FanK
*/
@RestController
@RequestMapping("/cos/score-info")
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class ScoreInfoController {
private final IScoreInfoService scoreInfoService;
/**
* 分页获取安全评分信息
*
* @param page 分页对象
* @param scoreInfo 安全评分信息
* @return 结果
*/
@GetMapping("/page")
public R page(Page<ScoreInfo> page, ScoreInfo scoreInfo) {
return R.ok(scoreInfoService.queryScorePage(page, scoreInfo));
}
/**
* 获取安全评分信息
*
* @return 结果
*/
@GetMapping("/list")
public R list() {
return R.ok(scoreInfoService.list());
}
/**
* 获取安全评分详细信息
*
* @param id ID
* @return 结果
*/
@GetMapping("/detail/{id}")
public R detail(@PathVariable("id") Integer id) {
return R.ok(scoreInfoService.getById(id));
}
/**
* 新增安全评分信息
*
* @param scoreInfo 安全评分信息
* @return 结果
*/
@PostMapping
public R save(ScoreInfo scoreInfo) {
scoreInfo.setCreateDate(DateUtil.formatDateTime(new Date()));
return R.ok(scoreInfoService.save(scoreInfo));
}
/**
* 修改安全评分信息
*
* @param scoreInfo 安全评分信息
* @return 结果
*/
@PutMapping
public R edit(ScoreInfo scoreInfo) {
return R.ok(scoreInfoService.updateById(scoreInfo));
}
/**
* 删除安全评分信息
*
* @param ids 主键IDS
* @return 结果
*/
@DeleteMapping("/{ids}")
public R deleteByIds(@PathVariable("ids") List<Integer> ids) {
return R.ok(scoreInfoService.removeByIds(ids));
}
}

View File

@@ -0,0 +1,24 @@
package cc.mrbird.febs.cos.dao;
import cc.mrbird.febs.cos.entity.ScoreInfo;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param;
import java.util.LinkedHashMap;
/**
* @author FanK
*/
public interface ScoreInfoMapper extends BaseMapper<ScoreInfo> {
/**
* 分页获取安全评分信息
*
* @param page 分页对象
* @param scoreInfo 安全评分信息
* @return 结果
*/
IPage<LinkedHashMap<String, Object>> queryScorePage(Page<ScoreInfo> page, @Param("scoreInfo") ScoreInfo scoreInfo);
}

View File

@@ -0,0 +1,66 @@
package cc.mrbird.febs.cos.entity;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.io.Serializable;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* 安全评分
*
* @author FanK
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class ScoreInfo implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "ID", type = IdType.AUTO)
private Integer id;
/**
* 员工编号
*/
private String staffCode;
/**
* 工作得分
*/
private BigDecimal workScore;
/**
* 评价人
*/
private String appraiser;
/**
* 备注
*/
private String remark;
/**
* 评价时间
*/
private String createDate;
/**
* 所属安全教育
*/
private Integer safeId;
@TableField(exist = false)
private String staffName;
@TableField(exist = false)
private String title;
}

View File

@@ -0,0 +1,24 @@
package cc.mrbird.febs.cos.service;
import cc.mrbird.febs.cos.entity.ScoreInfo;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import org.apache.ibatis.annotations.Param;
import java.util.LinkedHashMap;
/**
* @author FanK
*/
public interface IScoreInfoService extends IService<ScoreInfo> {
/**
* 分页获取安全评分信息
*
* @param page 分页对象
* @param scoreInfo 安全评分信息
* @return 结果
*/
IPage<LinkedHashMap<String, Object>> queryScorePage(Page<ScoreInfo> page, ScoreInfo scoreInfo);
}

View File

@@ -0,0 +1,30 @@
package cc.mrbird.febs.cos.service.impl;
import cc.mrbird.febs.cos.entity.ScoreInfo;
import cc.mrbird.febs.cos.dao.ScoreInfoMapper;
import cc.mrbird.febs.cos.service.IScoreInfoService;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import java.util.LinkedHashMap;
/**
* @author FanK
*/
@Service
public class ScoreInfoServiceImpl extends ServiceImpl<ScoreInfoMapper, ScoreInfo> implements IScoreInfoService {
/**
* 分页获取安全评分信息
*
* @param page 分页对象
* @param scoreInfo 安全评分信息
* @return 结果
*/
@Override
public IPage<LinkedHashMap<String, Object>> queryScorePage(Page<ScoreInfo> page, ScoreInfo scoreInfo) {
return baseMapper.queryScorePage(page, scoreInfo);
}
}

View File

@@ -1,53 +0,0 @@
package cc.mrbird.febs.job.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import javax.sql.DataSource;
import java.util.Properties;
/**
* 定时任务配置
*
*/
@Configuration
public class ScheduleConfig {
@Bean
public SchedulerFactoryBean schedulerFactoryBean(DataSource dataSource) {
SchedulerFactoryBean factory = new SchedulerFactoryBean();
factory.setDataSource(dataSource);
// quartz参数
Properties prop = new Properties();
prop.put("org.quartz.scheduler.instanceName", "MyScheduler");
prop.put("org.quartz.scheduler.instanceId", "AUTO");
// 线程池配置
prop.put("org.quartz.threadPool.class", "org.quartz.simpl.SimpleThreadPool");
prop.put("org.quartz.threadPool.threadCount", "20");
prop.put("org.quartz.threadPool.threadPriority", "5");
// JobStore配置
prop.put("org.quartz.jobStore.class", "org.quartz.impl.jdbcjobstore.JobStoreTX");
// 集群配置
prop.put("org.quartz.jobStore.isClustered", "true");
prop.put("org.quartz.jobStore.clusterCheckinInterval", "15000");
prop.put("org.quartz.jobStore.maxMisfiresToHandleAtATime", "1");
prop.put("org.quartz.jobStore.misfireThreshold", "12000");
prop.put("org.quartz.jobStore.tablePrefix", "QRTZ_");
factory.setQuartzProperties(prop);
factory.setSchedulerName("MyScheduler");
// 延时启动
factory.setStartupDelay(1);
factory.setApplicationContextSchedulerContextKey("applicationContextKey");
// 可选QuartzScheduler
// 启动时更新己存在的 Job
factory.setOverwriteExistingJobs(true);
// 设置自动启动,默认为 true
factory.setAutoStartup(true);
return factory;
}
}

View File

@@ -1,141 +0,0 @@
package cc.mrbird.febs.job.controller;
import cc.mrbird.febs.common.annotation.Log;
import cc.mrbird.febs.common.controller.BaseController;
import cc.mrbird.febs.common.domain.QueryRequest;
import cc.mrbird.febs.common.exception.FebsException;
import cc.mrbird.febs.job.domain.Job;
import cc.mrbird.febs.job.service.JobService;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.wuwenze.poi.ExcelKit;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.quartz.CronExpression;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import java.util.List;
import java.util.Map;
@Slf4j
@Validated
@RestController
@RequestMapping("job")
public class JobController extends BaseController {
private String message;
@Autowired
private JobService jobService;
@GetMapping
@RequiresPermissions("job:view")
public Map<String, Object> jobList(QueryRequest request, Job job) {
return getDataTable(this.jobService.findJobs(request, job));
}
@GetMapping("cron/check")
public boolean checkCron(String cron) {
try {
return CronExpression.isValidExpression(cron);
} catch (Exception e) {
return false;
}
}
@Log("新增定时任务")
@PostMapping
@RequiresPermissions("job:add")
public void addJob(@Valid Job job) throws FebsException {
try {
this.jobService.createJob(job);
} catch (Exception e) {
message = "新增定时任务失败";
log.error(message, e);
throw new FebsException(message);
}
}
@Log("删除定时任务")
@DeleteMapping("/{jobIds}")
@RequiresPermissions("job:delete")
public void deleteJob(@NotBlank(message = "{required}") @PathVariable String jobIds) throws FebsException {
try {
String[] ids = jobIds.split(StringPool.COMMA);
this.jobService.deleteJobs(ids);
} catch (Exception e) {
message = "删除定时任务失败";
log.error(message, e);
throw new FebsException(message);
}
}
@Log("修改定时任务")
@PutMapping
@RequiresPermissions("job:update")
public void updateJob(@Valid Job job) throws FebsException {
try {
this.jobService.updateJob(job);
} catch (Exception e) {
message = "修改定时任务失败";
log.error(message, e);
throw new FebsException(message);
}
}
@Log("执行定时任务")
@GetMapping("run/{jobId}")
@RequiresPermissions("job:run")
public void runJob(@NotBlank(message = "{required}") @PathVariable String jobId) throws FebsException {
try {
this.jobService.run(jobId);
} catch (Exception e) {
message = "执行定时任务失败";
log.error(message, e);
throw new FebsException(message);
}
}
@Log("暂停定时任务")
@GetMapping("pause/{jobId}")
@RequiresPermissions("job:pause")
public void pauseJob(@NotBlank(message = "{required}") @PathVariable String jobId) throws FebsException {
try {
this.jobService.pause(jobId);
} catch (Exception e) {
message = "暂停定时任务失败";
log.error(message, e);
throw new FebsException(message);
}
}
@Log("恢复定时任务")
@GetMapping("resume/{jobId}")
@RequiresPermissions("job:resume")
public void resumeJob(@NotBlank(message = "{required}") @PathVariable String jobId) throws FebsException {
try {
this.jobService.resume(jobId);
} catch (Exception e) {
message = "恢复定时任务失败";
log.error(message, e);
throw new FebsException(message);
}
}
@PostMapping("excel")
@RequiresPermissions("job:export")
public void export(QueryRequest request, Job job, HttpServletResponse response) throws FebsException {
try {
List<Job> jobs = this.jobService.findJobs(request, job).getRecords();
ExcelKit.$Export(Job.class, response).downXlsx(jobs, false);
} catch (Exception e) {
message = "导出Excel失败";
log.error(message, e);
throw new FebsException(message);
}
}
}

View File

@@ -1,63 +0,0 @@
package cc.mrbird.febs.job.controller;
import cc.mrbird.febs.common.controller.BaseController;
import cc.mrbird.febs.common.domain.QueryRequest;
import cc.mrbird.febs.common.exception.FebsException;
import cc.mrbird.febs.job.domain.JobLog;
import cc.mrbird.febs.job.service.JobLogService;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.wuwenze.poi.ExcelKit;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.NotBlank;
import java.util.List;
import java.util.Map;
@Slf4j
@Validated
@RestController
@RequestMapping("job/log")
public class JobLogController extends BaseController {
private String message;
@Autowired
private JobLogService jobLogService;
@GetMapping
@RequiresPermissions("jobLog:view")
public Map<String, Object> jobLogList(QueryRequest request, JobLog log) {
return getDataTable(this.jobLogService.findJobLogs(request, log));
}
@DeleteMapping("/{jobIds}")
@RequiresPermissions("jobLog:delete")
public void deleteJobLog(@NotBlank(message = "{required}") @PathVariable String jobIds) throws FebsException {
try {
String[] ids = jobIds.split(StringPool.COMMA);
this.jobLogService.deleteJobLogs(ids);
} catch (Exception e) {
message = "删除调度日志失败";
log.error(message, e);
throw new FebsException(message);
}
}
@PostMapping("excel")
@RequiresPermissions("jobLog:export")
public void export(QueryRequest request, JobLog jobLog, HttpServletResponse response) throws FebsException {
try {
List<JobLog> jobLogs = this.jobLogService.findJobLogs(request, jobLog).getRecords();
ExcelKit.$Export(JobLog.class, response).downXlsx(jobLogs, false);
} catch (Exception e) {
message = "导出Excel失败";
log.error(message, e);
throw new FebsException(message);
}
}
}

View File

@@ -1,8 +0,0 @@
package cc.mrbird.febs.job.dao;
import cc.mrbird.febs.job.domain.JobLog;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
public interface JobLogMapper extends BaseMapper<JobLog> {
}

View File

@@ -1,12 +0,0 @@
package cc.mrbird.febs.job.dao;
import cc.mrbird.febs.job.domain.Job;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import java.util.List;
public interface JobMapper extends BaseMapper<Job> {
List<Job> queryList();
}

View File

@@ -1,86 +0,0 @@
package cc.mrbird.febs.job.domain;
import cc.mrbird.febs.common.annotation.IsCron;
import cc.mrbird.febs.common.converter.TimeConverter;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.wuwenze.poi.annotation.Excel;
import com.wuwenze.poi.annotation.ExcelField;
import lombok.Data;
import lombok.ToString;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
import java.io.Serializable;
import java.util.Date;
@Data
@TableName("t_job")
@Excel("定时任务信息表")
public class Job implements Serializable {
private static final long serialVersionUID = 400066840871805700L;
/**
* 任务调度参数 key
*/
public static final String JOB_PARAM_KEY = "JOB_PARAM_KEY";
public enum ScheduleStatus {
/**
* 正常
*/
NORMAL("0"),
/**
* 暂停
*/
PAUSE("1");
private String value;
ScheduleStatus(String value) {
this.value = value;
}
public String getValue() {
return value;
}
}
@TableId(value = "JOB_ID", type = IdType.AUTO)
private Long jobId;
@NotBlank(message = "{required}")
@Size(max = 50, message = "{noMoreThan}")
@ExcelField(value = "Bean名称")
private String beanName;
@NotBlank(message = "{required}")
@Size(max = 50, message = "{noMoreThan}")
@ExcelField(value = "方法名称")
private String methodName;
@Size(max = 50, message = "{noMoreThan}")
@ExcelField(value = "方法参数")
private String params;
@NotBlank(message = "{required}")
@IsCron(message = "{invalid}")
@ExcelField(value = "Cron表达式")
private String cronExpression;
@ExcelField(value = "状态", writeConverterExp = "0=正常,1=暂停")
private String status;
@Size(max = 100, message = "{noMoreThan}")
@ExcelField(value = "备注")
private String remark;
@ExcelField(value = "创建时间", writeConverter = TimeConverter.class)
private Date createTime;
private transient String createTimeFrom;
private transient String createTimeTo;
}

View File

@@ -1,56 +0,0 @@
package cc.mrbird.febs.job.domain;
import cc.mrbird.febs.common.converter.TimeConverter;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.wuwenze.poi.annotation.Excel;
import com.wuwenze.poi.annotation.ExcelField;
import lombok.Data;
import lombok.ToString;
import java.io.Serializable;
import java.util.Date;
@Data
@TableName("t_job_log")
@Excel("调度日志信息表")
public class JobLog implements Serializable {
private static final long serialVersionUID = -7114915445674333148L;
// 任务执行成功
public static final String JOB_SUCCESS = "0";
// 任务执行失败
public static final String JOB_FAIL = "1";
@TableId(value = "LOG_ID", type = IdType.AUTO)
private Long logId;
private Long jobId;
@ExcelField(value = "Bean名称")
private String beanName;
@ExcelField(value = "方法名称")
private String methodName;
@ExcelField(value = "方法参数")
private String params;
@ExcelField(value = "状态", writeConverterExp = "0=成功,1=失败")
private String status;
@ExcelField(value = "异常信息")
private String error;
@ExcelField(value = "耗时(毫秒)")
private Long times;
@ExcelField(value = "执行时间", writeConverter = TimeConverter.class)
private Date createTime;
private transient String createTimeFrom;
private transient String createTimeTo;
}

View File

@@ -1,16 +0,0 @@
package cc.mrbird.febs.job.service;
import cc.mrbird.febs.common.domain.QueryRequest;
import cc.mrbird.febs.job.domain.JobLog;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
public interface JobLogService extends IService<JobLog> {
IPage<JobLog> findJobLogs(QueryRequest request, JobLog jobLog);
void saveJobLog(JobLog log);
void deleteJobLogs(String[] jobLogIds);
}

View File

@@ -1,29 +0,0 @@
package cc.mrbird.febs.job.service;
import cc.mrbird.febs.common.domain.QueryRequest;
import cc.mrbird.febs.job.domain.Job;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
public interface JobService extends IService<Job> {
Job findJob(Long jobId);
IPage<Job> findJobs(QueryRequest request, Job job);
void createJob(Job job);
void updateJob(Job job);
void deleteJobs(String[] jobIds);
int updateBatch(String jobIds, String status);
void run(String jobIds);
void pause(String jobIds);
void resume(String jobIds);
}

View File

@@ -1,72 +0,0 @@
package cc.mrbird.febs.job.service.impl;
import cc.mrbird.febs.common.domain.FebsConstant;
import cc.mrbird.febs.common.domain.QueryRequest;
import cc.mrbird.febs.common.utils.SortUtil;
import cc.mrbird.febs.job.dao.JobLogMapper;
import cc.mrbird.febs.job.domain.JobLog;
import cc.mrbird.febs.job.service.JobLogService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.util.Arrays;
import java.util.List;
@Slf4j
@Service("JobLogService")
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
public class JobLogServiceImpl extends ServiceImpl<JobLogMapper, JobLog> implements JobLogService {
@Override
public IPage<JobLog> findJobLogs(QueryRequest request, JobLog jobLog) {
try {
LambdaQueryWrapper<JobLog> queryWrapper = new LambdaQueryWrapper<>();
if (StringUtils.isNotBlank(jobLog.getBeanName())) {
queryWrapper.eq(JobLog::getBeanName, jobLog.getBeanName());
}
if (StringUtils.isNotBlank(jobLog.getMethodName())) {
queryWrapper.eq(JobLog::getMethodName, jobLog.getMethodName());
}
if (StringUtils.isNotBlank(jobLog.getParams())) {
queryWrapper.like(JobLog::getParams, jobLog.getParams());
}
if (StringUtils.isNotBlank(jobLog.getStatus())) {
queryWrapper.eq(JobLog::getStatus, jobLog.getStatus());
}
if (StringUtils.isNotBlank(jobLog.getCreateTimeFrom()) && StringUtils.isNotBlank(jobLog.getCreateTimeTo())) {
queryWrapper
.ge(JobLog::getCreateTime, jobLog.getCreateTimeFrom())
.le(JobLog::getCreateTime, jobLog.getCreateTimeTo());
}
Page<JobLog> page = new Page<>(request.getPageNum(), request.getPageSize());
SortUtil.handlePageSort(request, page, "createTime", FebsConstant.ORDER_DESC, true);
return this.page(page, queryWrapper);
} catch (Exception e) {
log.error("获取调度日志信息失败", e);
return null;
}
}
@Override
@Transactional
public void saveJobLog(JobLog log) {
this.save(log);
}
@Override
@Transactional
public void deleteJobLogs(String[] jobLogIds) {
List<String> list = Arrays.asList(jobLogIds);
this.baseMapper.deleteBatchIds(list);
}
}

View File

@@ -1,150 +0,0 @@
package cc.mrbird.febs.job.service.impl;
import cc.mrbird.febs.common.domain.FebsConstant;
import cc.mrbird.febs.common.domain.QueryRequest;
import cc.mrbird.febs.common.utils.SortUtil;
import cc.mrbird.febs.job.dao.JobMapper;
import cc.mrbird.febs.job.domain.Job;
import cc.mrbird.febs.job.service.JobService;
import cc.mrbird.febs.job.util.ScheduleUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.quartz.CronTrigger;
import org.quartz.Scheduler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.PostConstruct;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
@Slf4j
@Service("JobService")
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
public class JobServiceImpl extends ServiceImpl<JobMapper, Job> implements JobService {
@Autowired
private Scheduler scheduler;
/**
* 项目启动时,初始化定时器
*/
@PostConstruct
public void init() {
List<Job> scheduleJobList = this.baseMapper.queryList();
// 如果不存在,则创建
scheduleJobList.forEach(scheduleJob -> {
CronTrigger cronTrigger = ScheduleUtils.getCronTrigger(scheduler, scheduleJob.getJobId());
if (cronTrigger == null) {
ScheduleUtils.createScheduleJob(scheduler, scheduleJob);
} else {
ScheduleUtils.updateScheduleJob(scheduler, scheduleJob);
}
});
}
@Override
public Job findJob(Long jobId) {
return this.getById(jobId);
}
@Override
public IPage<Job> findJobs(QueryRequest request, Job job) {
try {
LambdaQueryWrapper<Job> queryWrapper = new LambdaQueryWrapper<>();
if (StringUtils.isNotBlank(job.getBeanName())) {
queryWrapper.eq(Job::getBeanName, job.getBeanName());
}
if (StringUtils.isNotBlank(job.getMethodName())) {
queryWrapper.eq(Job::getMethodName, job.getMethodName());
}
if (StringUtils.isNotBlank(job.getParams())) {
queryWrapper.like(Job::getParams, job.getParams());
}
if (StringUtils.isNotBlank(job.getRemark())) {
queryWrapper.like(Job::getRemark, job.getRemark());
}
if (StringUtils.isNotBlank(job.getStatus())) {
queryWrapper.eq(Job::getStatus, job.getStatus());
}
if (StringUtils.isNotBlank(job.getCreateTimeFrom()) && StringUtils.isNotBlank(job.getCreateTimeTo())) {
queryWrapper
.ge(Job::getCreateTime, job.getCreateTimeFrom())
.le(Job::getCreateTime, job.getCreateTimeTo());
}
Page<Job> page = new Page<>(request.getPageNum(), request.getPageSize());
SortUtil.handlePageSort(request, page, "createTime", FebsConstant.ORDER_DESC, true);
return this.page(page, queryWrapper);
} catch (Exception e) {
log.error("获取任务失败", e);
return null;
}
}
@Override
@Transactional
public void createJob(Job job) {
job.setCreateTime(new Date());
job.setStatus(Job.ScheduleStatus.PAUSE.getValue());
this.save(job);
ScheduleUtils.createScheduleJob(scheduler, job);
}
@Override
@Transactional
public void updateJob(Job job) {
ScheduleUtils.updateScheduleJob(scheduler, job);
this.baseMapper.updateById(job);
}
@Override
@Transactional
public void deleteJobs(String[] jobIds) {
List<String> list = Arrays.asList(jobIds);
list.forEach(jobId -> ScheduleUtils.deleteScheduleJob(scheduler, Long.valueOf(jobId)));
this.baseMapper.deleteBatchIds(list);
}
@Override
@Transactional
public int updateBatch(String jobIds, String status) {
List<String> list = Arrays.asList(jobIds.split(StringPool.COMMA));
Job job = new Job();
job.setStatus(status);
return this.baseMapper.update(job, new LambdaQueryWrapper<Job>().in(Job::getJobId, list));
}
@Override
@Transactional
public void run(String jobIds) {
String[] list = jobIds.split(StringPool.COMMA);
Arrays.stream(list).forEach(jobId -> ScheduleUtils.run(scheduler, this.findJob(Long.valueOf(jobId))));
}
@Override
@Transactional
public void pause(String jobIds) {
String[] list = jobIds.split(StringPool.COMMA);
Arrays.stream(list).forEach(jobId -> ScheduleUtils.pauseJob(scheduler, Long.valueOf(jobId)));
this.updateBatch(jobIds, Job.ScheduleStatus.PAUSE.getValue());
}
@Override
@Transactional
public void resume(String jobIds) {
String[] list = jobIds.split(StringPool.COMMA);
Arrays.stream(list).forEach(jobId -> ScheduleUtils.resumeJob(scheduler, Long.valueOf(jobId)));
this.updateBatch(jobIds, Job.ScheduleStatus.NORMAL.getValue());
}
}

View File

@@ -1,17 +0,0 @@
package cc.mrbird.febs.job.task;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class TestTask {
public void test(String params) {
log.info("我是带参数的test方法正在被执行参数为{}" , params);
}
public void test1() {
log.info("我是不带参数的test1方法正在被执行");
}
}

View File

@@ -1,65 +0,0 @@
package cc.mrbird.febs.job.util;
import cc.mrbird.febs.common.utils.SpringContextUtil;
import cc.mrbird.febs.job.domain.Job;
import cc.mrbird.febs.job.domain.JobLog;
import cc.mrbird.febs.job.service.JobLogService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.quartz.JobExecutionContext;
import org.springframework.scheduling.quartz.QuartzJobBean;
import java.util.Date;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
/**
* 定时任务
*/
@Slf4j
public class ScheduleJob extends QuartzJobBean {
private ExecutorService service = Executors.newSingleThreadExecutor();
@Override
protected void executeInternal(JobExecutionContext context) {
Job scheduleJob = (Job) context.getMergedJobDataMap().get(Job.JOB_PARAM_KEY);
// 获取spring bean
JobLogService scheduleJobLogService = SpringContextUtil.getBean(JobLogService.class);
JobLog jobLog = new JobLog();
jobLog.setJobId(scheduleJob.getJobId());
jobLog.setBeanName(scheduleJob.getBeanName());
jobLog.setMethodName(scheduleJob.getMethodName());
jobLog.setParams(scheduleJob.getParams());
jobLog.setCreateTime(new Date());
long startTime = System.currentTimeMillis();
try {
// 执行任务
log.info("任务准备执行任务ID{}", scheduleJob.getJobId());
ScheduleRunnable task = new ScheduleRunnable(scheduleJob.getBeanName(), scheduleJob.getMethodName(),
scheduleJob.getParams());
Future<?> future = service.submit(task);
future.get();
long times = System.currentTimeMillis() - startTime;
jobLog.setTimes(times);
// 任务状态 0成功 1失败
jobLog.setStatus(JobLog.JOB_SUCCESS);
log.info("任务执行完毕任务ID{} 总共耗时:{} 毫秒", scheduleJob.getJobId(), times);
} catch (Exception e) {
log.error("任务执行失败任务ID" + scheduleJob.getJobId(), e);
long times = System.currentTimeMillis() - startTime;
jobLog.setTimes(times);
// 任务状态 0成功 1失败
jobLog.setStatus(JobLog.JOB_FAIL);
jobLog.setError(StringUtils.substring(e.toString(), 0, 2000));
} finally {
scheduleJobLogService.saveJobLog(jobLog);
}
}
}

View File

@@ -1,45 +0,0 @@
package cc.mrbird.febs.job.util;
import cc.mrbird.febs.common.utils.SpringContextUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.util.ReflectionUtils;
import java.lang.reflect.Method;
/**
* 执行定时任务
*/
@Slf4j
public class ScheduleRunnable implements Runnable {
private Object target;
private Method method;
private String params;
ScheduleRunnable(String beanName, String methodName, String params) throws NoSuchMethodException, SecurityException {
this.target = SpringContextUtil.getBean(beanName);
this.params = params;
if (StringUtils.isNotBlank(params)) {
this.method = target.getClass().getDeclaredMethod(methodName, String.class);
} else {
this.method = target.getClass().getDeclaredMethod(methodName);
}
}
@Override
public void run() {
try {
ReflectionUtils.makeAccessible(method);
if (StringUtils.isNotBlank(params)) {
method.invoke(target, params);
} else {
method.invoke(target);
}
} catch (Exception e) {
log.error("执行定时任务失败", e);
}
}
}

View File

@@ -1,157 +0,0 @@
package cc.mrbird.febs.job.util;
import cc.mrbird.febs.job.domain.Job;
import lombok.extern.slf4j.Slf4j;
import org.quartz.*;
/**
* 定时任务工具类
*/
@Slf4j
public class ScheduleUtils {
protected ScheduleUtils() {
}
private static final String JOB_NAME_PREFIX = "TASK_";
/**
* 获取触发器key
*/
private static TriggerKey getTriggerKey(Long jobId) {
return TriggerKey.triggerKey(JOB_NAME_PREFIX + jobId);
}
/**
* 获取jobKey
*/
private static JobKey getJobKey(Long jobId) {
return JobKey.jobKey(JOB_NAME_PREFIX + jobId);
}
/**
* 获取表达式触发器
*/
public static CronTrigger getCronTrigger(Scheduler scheduler, Long jobId) {
try {
return (CronTrigger) scheduler.getTrigger(getTriggerKey(jobId));
} catch (SchedulerException e) {
log.error("获取Cron表达式失败", e);
}
return null;
}
/**
* 创建定时任务
*/
public static void createScheduleJob(Scheduler scheduler, Job scheduleJob) {
try {
// 构建job信息
JobDetail jobDetail = JobBuilder.newJob(ScheduleJob.class).withIdentity(getJobKey(scheduleJob.getJobId()))
.build();
// 表达式调度构建器
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(scheduleJob.getCronExpression())
.withMisfireHandlingInstructionDoNothing();
// 按新的cronExpression表达式构建一个新的trigger
CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(getTriggerKey(scheduleJob.getJobId()))
.withSchedule(scheduleBuilder).build();
// 放入参数,运行时的方法可以获取
jobDetail.getJobDataMap().put(Job.JOB_PARAM_KEY, scheduleJob);
scheduler.scheduleJob(jobDetail, trigger);
// 暂停任务
if (scheduleJob.getStatus().equals(Job.ScheduleStatus.PAUSE.getValue())) {
pauseJob(scheduler, scheduleJob.getJobId());
}
} catch (SchedulerException e) {
log.error("创建定时任务失败", e);
}
}
/**
* 更新定时任务
*/
public static void updateScheduleJob(Scheduler scheduler, Job scheduleJob) {
try {
TriggerKey triggerKey = getTriggerKey(scheduleJob.getJobId());
// 表达式调度构建器
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(scheduleJob.getCronExpression())
.withMisfireHandlingInstructionDoNothing();
CronTrigger trigger = getCronTrigger(scheduler, scheduleJob.getJobId());
if (trigger == null) {
throw new SchedulerException("获取Cron表达式失败");
} else {
// 按新的cronExpression表达式重新构建trigger
trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build();
// 参数
trigger.getJobDataMap().put(Job.JOB_PARAM_KEY, scheduleJob);
}
scheduler.rescheduleJob(triggerKey, trigger);
// 暂停任务
if (scheduleJob.getStatus().equals(Job.ScheduleStatus.PAUSE.getValue())) {
pauseJob(scheduler, scheduleJob.getJobId());
}
} catch (SchedulerException e) {
log.error("更新定时任务失败", e);
}
}
/**
* 立即执行任务
*/
public static void run(Scheduler scheduler, Job scheduleJob) {
try {
// 参数
JobDataMap dataMap = new JobDataMap();
dataMap.put(Job.JOB_PARAM_KEY, scheduleJob);
scheduler.triggerJob(getJobKey(scheduleJob.getJobId()), dataMap);
} catch (SchedulerException e) {
log.error("执行定时任务失败", e);
}
}
/**
* 暂停任务
*/
public static void pauseJob(Scheduler scheduler, Long jobId) {
try {
scheduler.pauseJob(getJobKey(jobId));
} catch (SchedulerException e) {
log.error("暂停定时任务失败", e);
}
}
/**
* 恢复任务
*/
public static void resumeJob(Scheduler scheduler, Long jobId) {
try {
scheduler.resumeJob(getJobKey(jobId));
} catch (SchedulerException e) {
log.error("恢复定时任务失败", e);
}
}
/**
* 删除定时任务
*/
public static void deleteScheduleJob(Scheduler scheduler, Long jobId) {
try {
scheduler.deleteJob(getJobKey(jobId));
} catch (SchedulerException e) {
log.error("删除定时任务失败", e);
}
}
}

View File

@@ -0,0 +1,37 @@
<?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="cc.mrbird.febs.cos.dao.ScoreInfoMapper">
<!-- 分页获取安全评分信息 -->
<select id="queryScorePage" resultType="java.util.LinkedHashMap">
select
si.id,
si.staff_code,
si.work_score,
si.appraiser,
si.remark,
si.create_date,
si.safe_id,
ai.name,
ai.sex,
ai.phone,
se.title
from
score_info si
left join archives_info ai on
(ai.code = si.staff_code)
left join safe_education se on
(se.id = si.safe_id)
where
1 = 1
<if test="scoreInfo.staffName != null and scoreInfo.staffName != ''">
AND ai.name LIKE CONCAT('%',#{scoreInfo.staffName},'%')
</if>
<if test="scoreInfo.title != null and scoreInfo.title != ''">
AND se.title LIKE CONCAT('%',#{scoreInfo.title},'%')
</if>
order by
si.create_date desc
</select>
</mapper>

View File

@@ -1,30 +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="cc.mrbird.febs.job.dao.JobMapper">
<resultMap id="BaseResultMap" type="cc.mrbird.febs.job.domain.Job">
<!--
WARNING - @mbg.generated
-->
<id column="JOB_ID" jdbcType="DECIMAL" property="jobId"/>
<result column="BEAN_NAME" jdbcType="VARCHAR" property="beanName"/>
<result column="METHOD_NAME" jdbcType="VARCHAR" property="methodName"/>
<result column="PARAMS" jdbcType="VARCHAR" property="params"/>
<result column="CRON_EXPRESSION" jdbcType="VARCHAR" property="cronExpression"/>
<result column="STATUS" jdbcType="CHAR" property="status"/>
<result column="REMARK" jdbcType="VARCHAR" property="remark"/>
<result column="CREATE_TIME" jdbcType="TIMESTAMP" property="createTime"/>
</resultMap>
<select id="queryList" resultType="job">
select job_id jobId,
bean_name beanName,
method_name methodName,
params,
cron_expression cronExpression,
status,
remark,
create_time createTime
from t_job
order by job_id
</select>
</mapper>

6
frontend/.idea/vcs.xml generated Normal file
View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/.." vcs="Git" />
</component>
</project>

View File

@@ -5,86 +5,30 @@
</component>
<component name="ChangeListManager">
<list default="true" id="8d94e285-d1b0-4ce5-8593-dca4515a0d01" name="Default Changelist" comment="">
<change beforePath="$PROJECT_DIR$/../backend/src/main/java/cc/mrbird/febs/common/config/MyWebMvcConfigurerAdapter.java" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/src/main/java/cc/mrbird/febs/common/config/MyWebMvcConfigurerAdapter.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/src/main/java/cc/mrbird/febs/cos/controller/FileController.java" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/src/main/java/cc/mrbird/febs/cos/controller/FileController.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/src/main/resources/application.yml" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/src/main/resources/application.yml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/target/classes/application.yml" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/application.yml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/controller/ArchivesInfoController.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/controller/ArchivesInfoController.class" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/controller/BulletinInfoController.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/controller/BulletinInfoController.class" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/controller/ConsumableTypeController.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/controller/ConsumableTypeController.class" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/controller/GoodsBelongController.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/controller/GoodsBelongController.class" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/controller/GoodsRequestController.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/controller/GoodsRequestController.class" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/controller/RurchaseRequestController.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/controller/RurchaseRequestController.class" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/controller/SafeEducationController.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/controller/SafeEducationController.class" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/controller/SafetyInspectionController.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/controller/SafetyInspectionController.class" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/controller/SafetyTaskController.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/controller/SafetyTaskController.class" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/controller/ScheduleActualController.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/controller/ScheduleActualController.class" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/controller/SchedulePlanController.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/controller/SchedulePlanController.class" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/controller/StationInfoController.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/controller/StationInfoController.class" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/controller/StockInfoController.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/controller/StockInfoController.class" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/controller/WorkEvaluationController.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/controller/WorkEvaluationController.class" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/controller/WorkInfoController.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/controller/WorkInfoController.class" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/entity/ArchivesInfo.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/entity/ArchivesInfo.class" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/entity/SafeEducation.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/entity/SafeEducation.class" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/entity/SafetyInspection.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/entity/SafetyInspection.class" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/entity/SafetyTask.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/entity/SafetyTask.class" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/entity/ScheduleActual.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/entity/ScheduleActual.class" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/entity/SchedulePlan.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/entity/SchedulePlan.class" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/entity/StationInfo.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/entity/StationInfo.class" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/entity/WorkEvaluation.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/entity/WorkEvaluation.class" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/entity/WorkInfo.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/entity/WorkInfo.class" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/mapper/ArchivesInfoMapper.class" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/mapper/ConsumableTypeMapper.class" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/mapper/SafeEducationMapper.class" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/mapper/SafetyInspectionMapper.class" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/mapper/SafetyTaskMapper.class" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/mapper/ScheduleActualMapper.class" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/mapper/SchedulePlanMapper.class" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/mapper/StationInfoMapper.class" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/mapper/WorkEvaluationMapper.class" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/mapper/WorkInfoMapper.class" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/mapper/xml/ArchivesInfoMapper.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/mapper/xml/ConsumableTypeMapper.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/mapper/xml/SafeEducationMapper.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/mapper/xml/SafetyInspectionMapper.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/mapper/xml/SafetyTaskMapper.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/mapper/xml/ScheduleActualMapper.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/mapper/xml/SchedulePlanMapper.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/mapper/xml/StationInfoMapper.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/mapper/xml/WorkEvaluationMapper.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/mapper/xml/WorkInfoMapper.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/service/IArchivesInfoService.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/service/IArchivesInfoService.class" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/service/ISafeEducationService.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/service/ISafeEducationService.class" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/service/ISafetyInspectionService.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/service/ISafetyInspectionService.class" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/service/ISafetyTaskService.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/service/ISafetyTaskService.class" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/service/IScheduleActualService.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/service/IScheduleActualService.class" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/service/ISchedulePlanService.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/service/ISchedulePlanService.class" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/service/IStationInfoService.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/service/IStationInfoService.class" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/service/IWorkEvaluationService.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/service/IWorkEvaluationService.class" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/service/IWorkInfoService.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/service/IWorkInfoService.class" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/service/impl/ArchivesInfoServiceImpl.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/service/impl/ArchivesInfoServiceImpl.class" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/service/impl/SafeEducationServiceImpl.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/service/impl/SafeEducationServiceImpl.class" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/service/impl/SafetyInspectionServiceImpl.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/service/impl/SafetyInspectionServiceImpl.class" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/service/impl/SafetyTaskServiceImpl.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/service/impl/SafetyTaskServiceImpl.class" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/service/impl/ScheduleActualServiceImpl.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/service/impl/ScheduleActualServiceImpl.class" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/service/impl/SchedulePlanServiceImpl.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/service/impl/SchedulePlanServiceImpl.class" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/service/impl/StationInfoServiceImpl.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/service/impl/StationInfoServiceImpl.class" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/service/impl/WorkEvaluationServiceImpl.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/service/impl/WorkEvaluationServiceImpl.class" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/service/impl/WorkInfoServiceImpl.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/service/impl/WorkInfoServiceImpl.class" afterDir="false" />
<change afterPath="$PROJECT_DIR$/.idea/vcs.xml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/views/manage/score/Score.vue" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/views/manage/score/ScoreAdd.vue" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/views/manage/score/ScoreEdit.vue" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/views/manage/weather/Weather.vue" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/febs_shiro_jwt.iml" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/febs_shiro_jwt.iml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/src/main/java/cc/mrbird/febs/common/domain/FebsConstant.java" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/src/main/java/cc/mrbird/febs/common/domain/FebsConstant.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/src/main/java/cc/mrbird/febs/job/config/ScheduleConfig.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/src/main/java/cc/mrbird/febs/job/controller/JobController.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/src/main/java/cc/mrbird/febs/job/controller/JobLogController.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/src/main/java/cc/mrbird/febs/job/dao/JobLogMapper.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/src/main/java/cc/mrbird/febs/job/dao/JobMapper.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/src/main/java/cc/mrbird/febs/job/domain/Job.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/src/main/java/cc/mrbird/febs/job/domain/JobLog.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/src/main/java/cc/mrbird/febs/job/service/JobLogService.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/src/main/java/cc/mrbird/febs/job/service/JobService.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/src/main/java/cc/mrbird/febs/job/service/impl/JobLogServiceImpl.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/src/main/java/cc/mrbird/febs/job/service/impl/JobServiceImpl.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/src/main/java/cc/mrbird/febs/job/task/TestTask.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/src/main/java/cc/mrbird/febs/job/util/ScheduleJob.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/src/main/java/cc/mrbird/febs/job/util/ScheduleRunnable.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/src/main/java/cc/mrbird/febs/job/util/ScheduleUtils.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../backend/src/main/resources/mapper/job/JobMapper.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/index.html" beforeDir="false" afterPath="$PROJECT_DIR$/index.html" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/store/modules/setting.js" beforeDir="false" afterPath="$PROJECT_DIR$/src/store/modules/setting.js" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/admin/bulletin/Bulletin.vue" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/manage/bulletin/Bulletin.vue" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/admin/bulletin/BulletinAdd.vue" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/manage/bulletin/BulletinAdd.vue" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/admin/bulletin/BulletinEdit.vue" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/manage/bulletin/BulletinEdit.vue" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/login/Login.vue" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/login/Login.vue" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/login/Regist.vue" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/login/Regist.vue" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/manage/archives/Archives.vue" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/manage/archives/Archives.vue" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/manage/education/Education.vue" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/manage/education/Education.vue" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/manage/evaluate/Evaluate.vue" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/manage/evaluate/Evaluate.vue" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/manage/plan/Plan.vue" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/manage/plan/Plan.vue" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/views/manage/work/Work.vue" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/manage/work/Work.vue" afterDir="false" />
<change beforePath="$PROJECT_DIR$/static/img/river-6968614.png" beforeDir="false" afterPath="$PROJECT_DIR$/static/img/river-6968614.png" afterDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
@@ -102,7 +46,7 @@
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$/.." />
</component>
<component name="GitToolBoxStore">
<option name="projectConfigVersion" value="2" />
<option name="projectConfigVersion" value="5" />
</component>
<component name="MarkdownSettingsMigration">
<option name="stateVersion" value="1" />
@@ -115,7 +59,7 @@
<component name="PropertiesComponent"><![CDATA[{
"keyToString": {
"WebServerToolWindowFactoryState": "false",
"last_opened_file_path": "G:/Project/工地安全预警管理系统的设计与实现/construction_cos/frontend",
"last_opened_file_path": "G:/Project/工地安全预警管理系统的设计与实现/construction_cos/frontend/src/views/manage/score",
"node.js.detected.package.eslint": "true",
"node.js.detected.package.tslint": "true",
"node.js.selected.package.eslint": "(autodetect)",
@@ -126,11 +70,11 @@
}]]></component>
<component name="RecentsManager">
<key name="CopyFile.RECENT_KEYS">
<recent name="E:\Project\实验室耗材管理系统\frontend\src\utils" />
<recent name="E:\Project\实验室耗材管理系统\frontend\src\views\admin\goods" />
<recent name="E:\Project\实验室耗材管理系统\frontend\src\views\admin\stockout" />
<recent name="E:\Project\实验室耗材管理系统\frontend\src\views\admin\stock" />
<recent name="E:\Project\实验室耗材管理系统\frontend\src\views\admin\stockput" />
<recent name="G:\Project\工地安全预警管理系统的设计与实现\construction_cos\frontend\src\views\manage\score" />
<recent name="G:\Project\工地安全预警管理系统的设计与实现\construction_cos\frontend\src\views\manage\weather" />
<recent name="G:\Project\工地安全预警管理系统的设计与实现\construction_cos\frontend\src\views\admin\enterprise" />
<recent name="G:\Project\工地安全预警管理系统的设计与实现\construction_cos\frontend\src\views\stu" />
<recent name="G:\Project\工地安全预警管理系统的设计与实现\construction_cos\frontend\src\utils" />
</key>
</component>
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
@@ -177,10 +121,51 @@
<workItem from="1673073102827" duration="46000" />
<workItem from="1673102363106" duration="182000" />
<workItem from="1694441740175" duration="2692000" />
<workItem from="1694526833351" duration="980000" />
<workItem from="1694616755580" duration="1706000" />
<workItem from="1694697431973" duration="148000" />
<workItem from="1694701907952" duration="1196000" />
<workItem from="1695048456863" duration="1316000" />
<workItem from="1695216555665" duration="3547000" />
<workItem from="1696594635203" duration="943000" />
<workItem from="1696856715192" duration="3153000" />
<workItem from="1697031546399" duration="21000" />
<workItem from="1697032604766" duration="874000" />
<workItem from="1697034274913" duration="2301000" />
<workItem from="1697118448777" duration="3974000" />
<workItem from="1697199871997" duration="2676000" />
<workItem from="1701738726338" duration="1108000" />
<workItem from="1701750952531" duration="50000" />
<workItem from="1701825248558" duration="2988000" />
<workItem from="1701923140722" duration="101000" />
<workItem from="1701947544083" duration="3081000" />
<workItem from="1704718807955" duration="989000" />
<workItem from="1708690623863" duration="364000" />
<workItem from="1708747912430" duration="2214000" />
<workItem from="1708775911626" duration="74000" />
<workItem from="1708776751334" duration="3523000" />
<workItem from="1708870938604" duration="17000" />
<workItem from="1709428199235" duration="4462000" />
<workItem from="1709534631706" duration="1255000" />
<workItem from="1709606201814" duration="1357000" />
<workItem from="1709698384159" duration="124000" />
<workItem from="1712758780004" duration="133000" />
<workItem from="1743506599927" duration="5198000" />
</task>
<servers />
</component>
<component name="TypeScriptGeneratedFilesManager">
<option name="version" value="3" />
</component>
<component name="Vcs.Log.Tabs.Properties">
<option name="TAB_STATES">
<map>
<entry key="MAIN">
<value>
<State />
</value>
</entry>
</map>
</option>
</component>
</project>

View File

@@ -0,0 +1,346 @@
<template>
<a-card :bordered="false" class="card-area">
<div :class="advanced ? 'search' : null">
<!-- 搜索区域 -->
<a-form layout="horizontal">
<a-row :gutter="15">
<div :class="advanced ? null: 'fold'">
<a-col :md="6" :sm="24">
<a-form-item
label="员工姓名"
:labelCol="{span: 4}"
:wrapperCol="{span: 18, offset: 2}">
<a-input v-model="queryParams.staffName"/>
</a-form-item>
</a-col>
<a-col :md="6" :sm="24">
<a-form-item
label="教育主题"
:labelCol="{span: 4}"
:wrapperCol="{span: 18, offset: 2}">
<a-input v-model="queryParams.title"/>
</a-form-item>
</a-col>
</div>
<span style="float: right; margin-top: 3px;">
<a-button type="primary" @click="search">查询</a-button>
<a-button style="margin-left: 8px" @click="reset">重置</a-button>
</span>
</a-row>
</a-form>
</div>
<div>
<div class="operator">
<a-button type="primary" ghost @click="add">新增</a-button>
<a-button @click="batchDelete">删除</a-button>
</div>
<!-- 表格区域 -->
<a-table ref="TableInfo"
:columns="columns"
:rowKey="record => record.id"
:dataSource="dataSource"
:pagination="pagination"
:loading="loading"
:rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
:scroll="{ x: 900 }"
@change="handleTableChange">
<template slot="titleShow" slot-scope="text, record">
<template>
<a-badge status="processing"/>
<a-tooltip>
<template slot="title">
{{ record.title }}
</template>
{{ record.title.slice(0, 8) }} ...
</a-tooltip>
</template>
</template>
<template slot="contentShow" slot-scope="text, record">
<template>
<a-tooltip>
<template slot="title">
{{ record.content }}
</template>
{{ record.content.slice(0, 30) }} ...
</a-tooltip>
</template>
</template>
<template slot="operation" slot-scope="text, record">
<a-icon type="setting" theme="twoTone" twoToneColor="#4a9ff5" @click="edit(record)" title="修 改" style="margin-right: 10px"></a-icon>
<!-- <a-icon type="bulb" @click="view(record)" title="详 情"></a-icon>-->
</template>
</a-table>
</div>
<evaluate-add
v-if="evaluateAdd.visiable"
@close="handleevaluateAddClose"
@success="handleevaluateAddSuccess"
:evaluateAddVisiable="evaluateAdd.visiable">
</evaluate-add>
<evaluate-edit
ref="evaluateEdit"
@close="handleevaluateEditClose"
@success="handleevaluateEditSuccess"
:evaluateEditVisiable="evaluateEdit.visiable">
</evaluate-edit>
</a-card>
</template>
<script>
import RangeDate from '@/components/datetime/RangeDate'
import evaluateAdd from './ScoreAdd.vue'
import evaluateEdit from './ScoreEdit.vue'
import {mapState} from 'vuex'
import moment from 'moment'
moment.locale('zh-cn')
export default {
name: 'evaluate',
components: {evaluateAdd, evaluateEdit, RangeDate},
data () {
return {
advanced: false,
evaluateAdd: {
visiable: false
},
evaluateEdit: {
visiable: false
},
evaluateView: {
visiable: false,
data: null
},
queryParams: {},
filteredInfo: null,
sortedInfo: null,
paginationInfo: null,
dataSource: [],
selectedRowKeys: [],
loading: false,
pagination: {
pageSizeOptions: ['10', '20', '30', '40', '100'],
defaultCurrent: 1,
defaultPageSize: 10,
showQuickJumper: true,
showSizeChanger: true,
showTotal: (total, range) => `显示 ${range[0]} ~ ${range[1]} 条记录,共 ${total} 条记录`
},
userList: []
}
},
computed: {
...mapState({
currentUser: state => state.account.user
}),
columns () {
return [{
title: '员工编号',
dataIndex: 'staffCode',
customRender: (text, row, index) => {
if (text !== null) {
return text
} else {
return '- -'
}
}
}, {
title: '员工姓名',
dataIndex: 'name',
customRender: (text, row, index) => {
if (text !== null) {
return text
} else {
return '- -'
}
}
}, {
title: '联系方式',
dataIndex: 'phone',
customRender: (text, row, index) => {
if (text !== null) {
return text
} else {
return '- -'
}
}
}, {
title: '安全评分',
dataIndex: 'workScore',
customRender: (text, row, index) => {
if (text !== null) {
return text + '分'
} else {
return '- -'
}
}
}, {
title: '安全教育',
dataIndex: 'title',
customRender: (text, row, index) => {
if (text !== null) {
return text
} else {
return '- -'
}
}
}, {
title: '评分时间',
dataIndex: 'createDate',
customRender: (text, row, index) => {
if (text !== null) {
return text
} else {
return '- -'
}
}
}, {
title: '操作',
dataIndex: 'operation',
scopedSlots: {customRender: 'operation'}
}]
}
},
mounted () {
this.fetch()
},
methods: {
view (record) {
this.evaluateView.data = record
this.evaluateView.visiable = true
},
onSelectChange (selectedRowKeys) {
this.selectedRowKeys = selectedRowKeys
},
toggleAdvanced () {
this.advanced = !this.advanced
},
add () {
this.evaluateAdd.visiable = true
},
handleevaluateAddClose () {
this.evaluateAdd.visiable = false
},
handleevaluateAddSuccess () {
this.evaluateAdd.visiable = false
this.$message.success('新增评分成功')
this.search()
},
edit (record) {
this.$refs.evaluateEdit.setFormValues(record)
this.evaluateEdit.visiable = true
},
handleevaluateEditClose () {
this.evaluateEdit.visiable = false
},
handleevaluateEditSuccess () {
this.evaluateEdit.visiable = false
this.$message.success('修改评分成功')
this.search()
},
handleDeptChange (value) {
this.queryParams.deptId = value || ''
},
batchDelete () {
if (!this.selectedRowKeys.length) {
this.$message.warning('请选择需要删除的记录')
return
}
let that = this
this.$confirm({
title: '确定删除所选中的记录?',
content: '当您点击确定按钮后,这些记录将会被彻底删除',
centered: true,
onOk () {
let ids = that.selectedRowKeys.join(',')
that.$delete('/cos/evaluate-info/' + ids).then(() => {
that.$message.success('删除成功')
that.selectedRowKeys = []
that.search()
})
},
onCancel () {
that.selectedRowKeys = []
}
})
},
search () {
let {sortedInfo, filteredInfo} = this
let sortField, sortOrder
// 获取当前列的排序和列的过滤规则
if (sortedInfo) {
sortField = sortedInfo.field
sortOrder = sortedInfo.order
}
this.fetch({
sortField: sortField,
sortOrder: sortOrder,
...this.queryParams,
...filteredInfo
})
},
reset () {
// 取消选中
this.selectedRowKeys = []
// 重置分页
this.$refs.TableInfo.pagination.current = this.pagination.defaultCurrent
if (this.paginationInfo) {
this.paginationInfo.current = this.pagination.defaultCurrent
this.paginationInfo.pageSize = this.pagination.defaultPageSize
}
// 重置列过滤器规则
this.filteredInfo = null
// 重置列排序规则
this.sortedInfo = null
// 重置查询参数
this.queryParams = {}
this.fetch()
},
handleTableChange (pagination, filters, sorter) {
// 将这三个参数赋值给Vue data用于后续使用
this.paginationInfo = pagination
this.filteredInfo = filters
this.sortedInfo = sorter
this.fetch({
sortField: sorter.field,
sortOrder: sorter.order,
...this.queryParams,
...filters
})
},
fetch (params = {}) {
// 显示loading
this.loading = true
if (this.paginationInfo) {
// 如果分页信息不为空,则设置表格当前第几页,每页条数,并设置查询分页参数
this.$refs.TableInfo.pagination.current = this.paginationInfo.current
this.$refs.TableInfo.pagination.pageSize = this.paginationInfo.pageSize
params.size = this.paginationInfo.pageSize
params.current = this.paginationInfo.current
} else {
// 如果分页信息为空,则设置为默认值
params.size = this.pagination.defaultPageSize
params.current = this.pagination.defaultCurrent
}
if (!params.sex) {
delete params.sex
}
this.$get('/cos/score-info/page', {
...params
}).then((r) => {
let data = r.data.data
const pagination = {...this.pagination}
pagination.total = data.total
this.dataSource = data.records
this.pagination = pagination
// 数据加载完毕关闭loading
this.loading = false
})
}
},
watch: {}
}
</script>
<style lang="less" scoped>
@import "../../../../static/less/Common";
</style>

View File

@@ -0,0 +1,157 @@
<template>
<a-modal v-model="show" title="新增评分" @cancel="onClose" :width="800">
<template slot="footer">
<a-button key="back" @click="onClose">
取消
</a-button>
<a-button key="submit" type="primary" :loading="loading" @click="handleSubmit">
提交
</a-button>
</template>
<a-form :form="form" layout="vertical">
<a-row :gutter="20">
<a-col :span="12">
<a-form-item label='选择员工' v-bind="formItemLayout">
<a-select allowClear v-decorator="[
'staffCode',
{ rules: [{ required: true, message: '请输入员工姓名!' }] }
]">
<a-select-option :value="item.code" v-for="(item, index) in staffList" :key="index">{{ item.name }}</a-select-option>
</a-select>
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label='选择安全会议' v-bind="formItemLayout">
<a-select allowClear v-decorator="[
'safeId',
{ rules: [{ required: true, message: '请选择安全会议!' }] }
]">
<a-select-option :value="item.id" v-for="(item, index) in educationList" :key="index">{{ item.title }}</a-select-option>
</a-select>
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label='工作得分' v-bind="formItemLayout">
<a-input v-decorator="[
'workScore',
{ rules: [{ required: true, message: '请输入工作得分!' }] }
]"/>
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label='备注' v-bind="formItemLayout">
<a-input v-decorator="[
'remark'
]"/>
</a-form-item>
</a-col>
</a-row>
</a-form>
</a-modal>
</template>
<script>
import {mapState} from 'vuex'
function getBase64 (file) {
return new Promise((resolve, reject) => {
const reader = new FileReader()
reader.readAsDataURL(file)
reader.onload = () => resolve(reader.result)
reader.onerror = error => reject(error)
})
}
const formItemLayout = {
labelCol: { span: 24 },
wrapperCol: { span: 24 }
}
export default {
name: 'evaluateAdd',
props: {
evaluateAddVisiable: {
default: false
}
},
computed: {
...mapState({
currentUser: state => state.account.user
}),
show: {
get: function () {
return this.evaluateAddVisiable
},
set: function () {
}
}
},
data () {
return {
formItemLayout,
form: this.$form.createForm(this),
loading: false,
fileList: [],
previewVisible: false,
previewImage: '',
staffList: [],
educationList: [],
stationList: []
}
},
mounted () {
this.getStaff()
this.getSafe()
},
methods: {
getSafe () {
this.$get('/cos/safe-education/list').then((r) => {
this.educationList = r.data.data
})
},
getStaff () {
this.$get('/cos/archives-info/list').then((r) => {
this.staffList = r.data.data
})
},
handleCancel () {
this.previewVisible = false
},
async handlePreview (file) {
if (!file.url && !file.preview) {
file.preview = await getBase64(file.originFileObj)
}
this.previewImage = file.url || file.preview
this.previewVisible = true
},
picHandleChange ({ fileList }) {
this.fileList = fileList
},
reset () {
this.loading = false
this.form.resetFields()
},
onClose () {
this.reset()
this.$emit('close')
},
handleSubmit () {
this.form.validateFields((err, values) => {
if (!err) {
values.publisher = this.currentUser.userId
this.loading = true
this.$post('/cos/score-info', {
...values
}).then((r) => {
this.reset()
this.$emit('success')
}).catch(() => {
this.loading = false
})
}
})
}
}
}
</script>
<style scoped>
</style>

View File

@@ -0,0 +1,186 @@
<template>
<a-modal v-model="show" title="修改评分" @cancel="onClose" :width="800">
<template slot="footer">
<a-button key="back" @click="onClose">
取消
</a-button>
<a-button key="submit" type="primary" :loading="loading" @click="handleSubmit">
修改
</a-button>
</template>
<a-form :form="form" layout="vertical">
<a-row :gutter="20">
<a-col :span="12">
<a-form-item label='选择员工' v-bind="formItemLayout">
<a-select allowClear v-decorator="[
'staffCode',
{ rules: [{ required: true, message: '请输入员工姓名!' }] }
]">
<a-select-option :value="item.code" v-for="(item, index) in staffList" :key="index">{{ item.name }}</a-select-option>
</a-select>
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label='选择安全会议' v-bind="formItemLayout">
<a-select allowClear v-decorator="[
'safeId',
{ rules: [{ required: true, message: '请选择安全会议!' }] }
]">
<a-select-option :value="item.id" v-for="(item, index) in educationList" :key="index">{{ item.title }}</a-select-option>
</a-select>
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label='工作得分' v-bind="formItemLayout">
<a-input v-decorator="[
'workScore',
{ rules: [{ required: true, message: '请输入工作得分!' }] }
]"/>
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label='备注' v-bind="formItemLayout">
<a-input v-decorator="[
'remark'
]"/>
</a-form-item>
</a-col>
</a-row>
</a-form>
</a-modal>
</template>
<script>
import {mapState} from 'vuex'
function getBase64 (file) {
return new Promise((resolve, reject) => {
const reader = new FileReader()
reader.readAsDataURL(file)
reader.onload = () => resolve(reader.result)
reader.onerror = error => reject(error)
})
}
const formItemLayout = {
labelCol: { span: 24 },
wrapperCol: { span: 24 }
}
export default {
name: 'evaluateEdit',
props: {
evaluateEditVisiable: {
default: false
}
},
computed: {
...mapState({
currentUser: state => state.account.user
}),
show: {
get: function () {
return this.evaluateEditVisiable
},
set: function () {
}
}
},
data () {
return {
rowId: null,
formItemLayout,
form: this.$form.createForm(this),
loading: false,
fileList: [],
previewVisible: false,
previewImage: '',
staffList: [],
stationList: []
}
},
mounted () {
this.getStaff()
},
methods: {
getStaff () {
this.$get('/cos/archives-info/list').then((r) => {
this.staffList = r.data.data
})
},
handleCancel () {
this.previewVisible = false
},
async handlePreview (file) {
if (!file.url && !file.preview) {
file.preview = await getBase64(file.originFileObj)
}
this.previewImage = file.url || file.preview
this.previewVisible = true
},
picHandleChange ({ fileList }) {
this.fileList = fileList
},
imagesInit (images) {
if (images !== null && images !== '') {
let imageList = []
images.split(',').forEach((image, index) => {
imageList.push({uid: index, name: image, status: 'done', url: 'http://127.0.0.1:9527/imagesWeb/' + image})
})
this.fileList = imageList
}
},
setFormValues ({...evaluate}) {
this.rowId = evaluate.id
let fields = ['staffCode', 'attendanceScore', 'workScore', 'qualityScore', 'year', 'month', 'appraiser', 'remark', 'safeId']
let obj = {}
Object.keys(evaluate).forEach((key) => {
if (key === 'images') {
this.fileList = []
this.imagesInit(evaluate['images'])
}
if (fields.indexOf(key) !== -1) {
this.form.getFieldDecorator(key)
obj[key] = evaluate[key]
}
})
this.form.setFieldsValue(obj)
},
reset () {
this.loading = false
this.form.resetFields()
},
onClose () {
this.reset()
this.$emit('close')
},
handleSubmit () {
// 获取图片List
let images = []
this.fileList.forEach(image => {
if (image.response !== undefined) {
images.push(image.response)
} else {
images.push(image.name)
}
})
this.form.validateFields((err, values) => {
values.id = this.rowId
values.images = images.length > 0 ? images.join(',') : null
if (!err) {
this.loading = true
this.$put('/cos/score-info', {
...values
}).then((r) => {
this.reset()
this.$emit('success')
}).catch(() => {
this.loading = false
})
}
})
}
}
}
</script>
<style scoped>
</style>

View File

@@ -0,0 +1,332 @@
<template>
<div style="width: 100%; padding: 0 1rem">
<div class="global-search-main">
<div class="global-search-wrapper">
<a-auto-complete
:dataSource="dataSource"
class="global-search"
@select="onSelect"
@search="handleSearch"
placeholder="请输入城市名">
<a-input>
<a-button slot="suffix" class="search-btn" type="primary" @click.stop="searchWeather">
<a-icon type="search"/>
</a-button>
</a-input>
</a-auto-complete>
</div>
</div>
<div class="weather-area" v-show="!loading">
<div class="weather-chart-info">
<apexchart ref="seven" height="350" type=line :options="seven.chartOptions" :series="seven.series" />
</div>
<div class="weather-chart-info">
<apexchart ref="future" height="350" type=area :options="future.chartOptions" :series="future.series" />
</div>
</div>
<div class="weather-area">
<div class="weather-info">
<a-card :loading="loading" :title="this.weather.countyName + ' 当前天气'">
<a-row>
<a-col :span="8"><p>天气{{this.weather.realtime.weather}}</p></a-col>
<a-col :span="8"><p>风向{{this.weather.realtime.wD}}</p></a-col>
<a-col :span="8"><p>风力大小{{this.weather.realtime.wS}}</p></a-col>
</a-row>
<a-row>
<a-col :span="8"><p>温度{{this.weather.realtime.temp}}</p></a-col>
<a-col :span="8"><p>体感温度{{this.weather.realtime.sendibleTemp}}</p></a-col>
<a-col :span="8"><p>空气湿度{{this.weather.realtime.sD}}%</p></a-col>
</a-row>
<a-row>
<a-col :span="8"><p>更新时间{{this.weather.realtime.time}}</p></a-col>
</a-row>
</a-card>
</div>
<div class="weather-info">
<a-card :loading="loading" :title="this.weather.countyName + ' 未来天气'">
<a-row>
<a-col :span="24" v-for="(w, index) in this.weather.weathers" :key="index">
<template v-if="index !== 6">
<p>{{w.date}}{{w.week}}日出时间 --- {{w.sun_rise_time}} 日落时间 --- {{w.sun_down_time}} 天气 --- {{w.weather}}</p>
</template>
</a-col>
</a-row>
</a-card>
</div>
<div class="weather-info">
<a-card :loading="loading" :title="this.weather.countyName + ' 生活指数'">
<a-row>
<a-col :span="24" v-for="(i, index) in this.weather.indexes" :key="index">
<p>{{i.name}} --- {{i.content}}</p>
</a-col>
</a-row>
</a-card>
</div>
<div class="weather-info" v-if="this.weather.alarms.length">
<a-card :loading="loading" :title="this.weather.countyName + ' 预警信息'">
<a-col :span="24">
<p>预警标题 --- {{this.weather.alarms[0].alarmDesc}}</p>
<p>预警类型 --- {{this.weather.alarms[0].alarmTypeDesc}}</p>
<p>预警等级 --- {{this.weather.alarms[0].alarmLevelNoDesc}}</p>
<p>发布时间 --- {{this.weather.alarms[0].publishTime}}</p>
<p>预防措施 --- {{this.weather.alarms[0].precaution}}</p>
<a-popover title="预警详情">
<template slot="content">
<div style="max-width: 360px">{{this.weather.alarms[0].alarmContent}}</div>
</template>
<p>预警详情 --- {{this.weather.alarms[0].alarmContent}}</p>
</a-popover>
</a-col>
</a-card>
</div>
</div>
</div>
</template>
<script>
import axios from 'axios'
export default {
data () {
return {
loading: true,
seven: {
series: [],
chartOptions: {
chart: {
shadow: {
enabled: true,
color: '#000',
top: 18,
left: 7,
blur: 10,
opacity: 1
},
toolbar: {
show: false
}
},
colors: ['#f5564e', '#35d0ba'],
dataLabels: {
enabled: true
},
stroke: {
curve: 'smooth'
},
markers: {
size: 4
},
xaxis: {},
yaxis: {}
}
},
future: {
series: [],
chartOptions: {
chart: {
toolbar: {
show: false
}
},
dataLabels: {
enabled: false
},
stroke: {
curve: 'smooth'
},
xaxis: {}
}
},
dataSource: [],
storage: [],
citys: [],
areaId: 101090101,
weather: {
provinceName: '',
countyName: '',
weathers: [],
day_c: [],
night_c: [],
hours_c: [],
dateArr: [],
timeArr: [],
publishTime: '',
alarms: [],
realtime: {},
indexes: []
}
}
},
mounted () {
axios.get('../../../static/file/city.json').then((r) => {
this.citys = r.data
})
this.searchWeather()
},
methods: {
handleSearch (value) {
this.dataSource = []
this.storage = []
this.areaId = ''
if (!value) {
return
}
for (let i = 0; i < this.citys.length; i++) {
let currentCity = this.citys[i]
if (currentCity.countyname.indexOf(value) !== -1) {
this.dataSource.push(currentCity.countyname)
this.storage.push(currentCity.areaid)
}
}
},
onSelect (value) {
let index = this.dataSource.indexOf(value)
this.areaId = this.storage[index]
},
searchWeather () {
if (!this.areaId) {
this.$message.warning('请选择城市')
} else {
this.$get('weather?areaId=' + this.areaId).then((r) => {
let data = JSON.parse(r.data.data)
if (data.code === '200') {
this.weather = {
countyName: '',
weathers: [],
day_c: [],
night_c: [],
hours_c: [],
dateArr: [],
timeArr: [],
publishTime: ''
}
this.loading = false
this.weather.provinceName = data.value[0].provinceName
this.weather.countyName = data.value[0].city
this.weather.weathers = data.value[0].weathers
this.weather.alarms = data.value[0].alarms
this.weather.realtime = data.value[0].realtime
this.weather.indexes = data.value[0].indexes
let weathers = this.weather.weathers
let min = 0
let max = 0
for (let i = 0; i < weathers.length; i++) {
if (i === weathers.length - 1) {
this.weather.day_c.unshift(parseFloat(weathers[i].temp_day_c))
this.weather.night_c.unshift(parseFloat(weathers[i].temp_night_c))
this.weather.dateArr.unshift(weathers[i].date.split('-')[1] + '-' + weathers[i].date.split('-')[2])
} else {
this.weather.day_c.push(parseFloat(weathers[i].temp_day_c))
this.weather.night_c.push(parseFloat(weathers[i].temp_night_c))
this.weather.dateArr.push(weathers[i].date.split('-')[1] + '-' + weathers[i].date.split('-')[2])
}
if (i === 0) {
max = this.weather.day_c[0]
min = this.weather.night_c[0]
} else {
if (this.weather.day_c[i] > max) {
max = this.weather.day_c[i]
}
if (this.weather.night_c[i] < min) {
min = this.weather.night_c[i]
}
}
}
let weather3HoursDetailsInfos = data.value[0].weatherDetailsInfo.weather3HoursDetailsInfos
this.weather.publishTime = data.value[0].weatherDetailsInfo.publishTime
for (let i = 0; i < weather3HoursDetailsInfos.length; i++) {
let time = weather3HoursDetailsInfos[i].endTime.split(' ')[1].split(':')
this.weather.hours_c.push(parseFloat(weather3HoursDetailsInfos[i].highestTemperature))
this.weather.timeArr.push(time[0] + ':' + time[1])
}
this.$refs.seven.updateSeries([
{
name: '最高温',
data: this.weather.day_c
},
{
name: '最低温',
data: this.weather.night_c
}
], true)
this.$refs.future.updateSeries([
{
name: '未来气温',
data: this.weather.hours_c
}
])
this.$refs.seven.updateOptions({
xaxis: {
categories: this.weather.dateArr
},
yaxis: {
min: min - 5,
max: max + 5
},
title: {
text: `${this.weather.provinceName} - ${this.weather.countyName}未来七日气温`,
align: 'center'
}
}, true, true)
this.$refs.future.updateOptions({
xaxis: {
categories: this.weather.timeArr
},
title: {
text: `${this.weather.provinceName} - ${this.weather.countyName}未来气温细节`,
align: 'center'
}
}, true, true)
}
}).catch((r) => {
console.error(r)
this.$message.error('天气查询失败')
})
}
}
}
}
</script>
<style lang="less">
.global-search-main {
margin-bottom: 2.5rem;
.global-search-wrapper {
width: 300px;
margin:0 auto;
.global-search {
width: 100%;
}
}
}
.weather-area {
display: inline;
.weather-chart-info {
width: 49%;
display:inline-block;
}
.weather-info {
margin: .5rem 0;
width: 100%;
display: inline-block;
p {
margin-bottom: .4rem !important;
}
}
}
.global-search.ant-select-auto-complete {
.ant-select-selection--single {
margin-right: -46px;
}
.ant-input-affix-wrapper {
.ant-input:not(:last-child) {
padding-right: 62px;
}
.ant-input-suffix {
right: 0;
}
.ant-input-suffix button {
border-top-left-radius: 0;
border-bottom-left-radius: 0;
}
}
}
</style>