From b7e0b87cd90b1dfa0b458d6aeea9b433343d36b2 Mon Sep 17 00:00:00 2001 From: gaoxq <376340421@qq.com> Date: Sat, 24 Jan 2026 17:56:15 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=9F=A5=E7=9C=8B=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/pom.xml | 12 ++ .../jeesite/modules/app/Api/web/cApiJob.java | 10 + .../modules/app/Api/web/cApiStart.java | 2 + .../com/jeesite/modules/app/appStart.java | 12 +- .../jeesite/modules/app/dao/DailyWeather.java | 43 ++++ .../modules/app/dao/DailyWeatherMap.java | 31 +++ .../jeesite/modules/app/dao/MyWorkInfo.java | 5 +- .../modules/app/dao/RealTimeWeather.java | 43 ++++ .../modules/app/service/MsgService.java | 22 --- .../modules/app/utils/WeatherUtils.java | 186 ++++++++++++++++++ .../biz/service/BizMyfilesService.java | 2 - .../web/BizCalendarScheduleController.java | 5 - .../modules/biz/web/BizMyfilesController.java | 7 +- web-vue/packages/biz/api/biz/myWork.ts | 1 + .../analysis/components/WorkbenchHeader.vue | 2 +- 15 files changed, 346 insertions(+), 37 deletions(-) create mode 100644 web-api/src/main/java/com/jeesite/modules/app/Api/web/cApiJob.java create mode 100644 web-api/src/main/java/com/jeesite/modules/app/dao/DailyWeather.java create mode 100644 web-api/src/main/java/com/jeesite/modules/app/dao/DailyWeatherMap.java create mode 100644 web-api/src/main/java/com/jeesite/modules/app/dao/RealTimeWeather.java delete mode 100644 web-api/src/main/java/com/jeesite/modules/app/service/MsgService.java create mode 100644 web-api/src/main/java/com/jeesite/modules/app/utils/WeatherUtils.java diff --git a/common/pom.xml b/common/pom.xml index b95774d4..7eda23eb 100644 --- a/common/pom.xml +++ b/common/pom.xml @@ -26,6 +26,18 @@ provided + + com.squareup.okhttp3 + okhttp + 4.12.0 + + + + com.google.code.gson + gson + 2.10.1 + + cn.hutool hutool-all diff --git a/web-api/src/main/java/com/jeesite/modules/app/Api/web/cApiJob.java b/web-api/src/main/java/com/jeesite/modules/app/Api/web/cApiJob.java new file mode 100644 index 00000000..0f5150b8 --- /dev/null +++ b/web-api/src/main/java/com/jeesite/modules/app/Api/web/cApiJob.java @@ -0,0 +1,10 @@ +package com.jeesite.modules.app.Api.web; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +@RequestMapping(value = "/cApi/myJob") +public class cApiJob { + +} diff --git a/web-api/src/main/java/com/jeesite/modules/app/Api/web/cApiStart.java b/web-api/src/main/java/com/jeesite/modules/app/Api/web/cApiStart.java index 04f74f74..88bec5f7 100644 --- a/web-api/src/main/java/com/jeesite/modules/app/Api/web/cApiStart.java +++ b/web-api/src/main/java/com/jeesite/modules/app/Api/web/cApiStart.java @@ -5,6 +5,8 @@ import com.jeesite.modules.app.Api.model.ApiResult; import com.jeesite.modules.app.Api.model.ResultCodeEnum; import com.jeesite.modules.biz.entity.BizAreaSource; import com.jeesite.modules.biz.service.BizAreaSourceService; +import com.jeesite.modules.file.entity.FileUpload; +import com.jeesite.modules.file.service.FileUploadService; import com.jeesite.modules.sys.entity.DictData; import com.jeesite.modules.sys.utils.DictUtils; import jakarta.annotation.Resource; diff --git a/web-api/src/main/java/com/jeesite/modules/app/appStart.java b/web-api/src/main/java/com/jeesite/modules/app/appStart.java index 21fecba5..919e3f7e 100644 --- a/web-api/src/main/java/com/jeesite/modules/app/appStart.java +++ b/web-api/src/main/java/com/jeesite/modules/app/appStart.java @@ -1,7 +1,11 @@ package com.jeesite.modules.app; +import com.jeesite.common.config.Global; import com.jeesite.modules.app.dao.MyWorkInfo; +import com.jeesite.modules.app.dao.RealTimeWeather; +import com.jeesite.modules.app.utils.MyUtils; +import com.jeesite.modules.app.utils.WeatherUtils; import com.jeesite.modules.biz.entity.BizCalendarSchedule; import com.jeesite.modules.biz.entity.BizListItem; import com.jeesite.modules.biz.entity.BizProjectInfo; @@ -36,6 +40,9 @@ public class appStart { @Resource private BizCalendarScheduleService bizCalendarScheduleService; + String API_KEY = "7e6a6422c4b949dd90a5ad3302137b76"; + + private String LOCATION = Global.getConfig("biz.weather.Loc", "101010100"); /** * 首页 @@ -44,6 +51,9 @@ public class appStart { @ResponseBody public MyWorkInfo list() { User user = UserUtils.getUser(); + WeatherUtils weather = new WeatherUtils(API_KEY); + RealTimeWeather timeWeather = weather.getRealTimeWeather(LOCATION); + String weatherText = MyUtils.concatParams("今日", timeWeather.getText(), ",温度:{", timeWeather.getTemp(), "℃-", timeWeather.getHumidity(), "℃},", timeWeather.getWindDir()); // 日程 BizCalendarSchedule schedule = new BizCalendarSchedule(); schedule.setParticipantUser(user.getLoginCode()); @@ -69,7 +79,7 @@ public class appStart { .map(Long::intValue) .orElse(0); List employees = bizResumeEmployeeService.findList(new BizResumeEmployee()); - MyWorkInfo workInfo = new MyWorkInfo(notifyNums, listItems.size(), projectNums, projectInfos.size(), calendarNums, schedules.size(), employees.size()); + MyWorkInfo workInfo = new MyWorkInfo(weatherText, notifyNums, listItems.size(), projectNums, projectInfos.size(), calendarNums, schedules.size(), employees.size()); return workInfo; } diff --git a/web-api/src/main/java/com/jeesite/modules/app/dao/DailyWeather.java b/web-api/src/main/java/com/jeesite/modules/app/dao/DailyWeather.java new file mode 100644 index 00000000..c13a9887 --- /dev/null +++ b/web-api/src/main/java/com/jeesite/modules/app/dao/DailyWeather.java @@ -0,0 +1,43 @@ +package com.jeesite.modules.app.dao; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class DailyWeather implements Serializable { + + // 预报日期(yyyy-MM-dd) + private String date; + // 最低温度(℃) + private String tempMin; + // 最高温度(℃) + private String tempMax; + // 白天天气状况(如:晴、多云) + private String textDay; + // 夜间天气状况(如:多云、雨) + private String textNight; + // 白天风向(如:东风、南风) + private String windDirDay; + // 白天风力等级(如:2、3) + private String windScaleDay; + + /** + * 无参构造方法(框架/反射实例化必备) + */ + public DailyWeather() { + } + + /** + * 全参构造方法(快速创建对象) + */ + public DailyWeather(String date, String tempMin, String tempMax, String textDay, String textNight, String windDirDay, String windScaleDay) { + this.date = date; + this.tempMin = tempMin; + this.tempMax = tempMax; + this.textDay = textDay; + this.textNight = textNight; + this.windDirDay = windDirDay; + this.windScaleDay = windScaleDay; + } +} diff --git a/web-api/src/main/java/com/jeesite/modules/app/dao/DailyWeatherMap.java b/web-api/src/main/java/com/jeesite/modules/app/dao/DailyWeatherMap.java new file mode 100644 index 00000000..20ff3abe --- /dev/null +++ b/web-api/src/main/java/com/jeesite/modules/app/dao/DailyWeatherMap.java @@ -0,0 +1,31 @@ +package com.jeesite.modules.app.dao; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +@Data +public class DailyWeatherMap implements Serializable { + // 天气详情链接 + private String location; + // 数据更新时间 + private String updateTime; + // 每日预报列表 + private List daily; + + /** + * 无参构造方法 + */ + public DailyWeatherMap() { + } + + /** + * 全参构造方法 + */ + public DailyWeatherMap(String location, String updateTime, List daily) { + this.location = location; + this.updateTime = updateTime; + this.daily = daily; + } +} diff --git a/web-api/src/main/java/com/jeesite/modules/app/dao/MyWorkInfo.java b/web-api/src/main/java/com/jeesite/modules/app/dao/MyWorkInfo.java index 048de05f..b1c4a576 100644 --- a/web-api/src/main/java/com/jeesite/modules/app/dao/MyWorkInfo.java +++ b/web-api/src/main/java/com/jeesite/modules/app/dao/MyWorkInfo.java @@ -7,6 +7,8 @@ import java.io.Serializable; @Data public class MyWorkInfo implements Serializable { + private String weatherText; + private Integer notifyNums; private Integer notifyAllNums; @@ -25,7 +27,8 @@ public class MyWorkInfo implements Serializable { } - public MyWorkInfo(Integer notifyNums, Integer notifyAllNums, Integer projectNums, Integer projectAllNums,Integer calendarNums,Integer calendarAllNums, Integer teamNums) { + public MyWorkInfo(String weatherText, Integer notifyNums, Integer notifyAllNums, Integer projectNums, Integer projectAllNums, Integer calendarNums, Integer calendarAllNums, Integer teamNums) { + this.weatherText = weatherText; this.notifyNums = notifyNums; this.notifyAllNums = notifyAllNums; this.projectNums = projectNums; diff --git a/web-api/src/main/java/com/jeesite/modules/app/dao/RealTimeWeather.java b/web-api/src/main/java/com/jeesite/modules/app/dao/RealTimeWeather.java new file mode 100644 index 00000000..19f38be8 --- /dev/null +++ b/web-api/src/main/java/com/jeesite/modules/app/dao/RealTimeWeather.java @@ -0,0 +1,43 @@ +package com.jeesite.modules.app.dao; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class RealTimeWeather implements Serializable { + + // 温度(℃) + private String temp; + // 体感温度(℃) + private String feelsLike; + // 天气状况(如:晴、多云、雨) + private String text; + // 风向(如:南风、东风) + private String windDir; + // 风力等级(如:3、5) + private String windScale; + // 相对湿度(%) + private String humidity; + // 更新时间(格式:2026-01-24T12:00+08:00) + private String updateTime; + + /** + * 无参构造方法(框架/反射实例化时需要) + */ + public RealTimeWeather() { + } + + /** + * 全参构造方法(快速创建对象) + */ + public RealTimeWeather(String temp, String feelsLike, String text, String windDir, String windScale, String humidity, String updateTime) { + this.temp = temp; + this.feelsLike = feelsLike; + this.text = text; + this.windDir = windDir; + this.windScale = windScale; + this.humidity = humidity; + this.updateTime = updateTime; + } +} diff --git a/web-api/src/main/java/com/jeesite/modules/app/service/MsgService.java b/web-api/src/main/java/com/jeesite/modules/app/service/MsgService.java deleted file mode 100644 index 1a9d4e6d..00000000 --- a/web-api/src/main/java/com/jeesite/modules/app/service/MsgService.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.jeesite.modules.app.service; - -import com.jeesite.common.config.Global; -import com.jeesite.modules.app.utils.MyUtils; -import com.jeesite.modules.biz.entity.BizCalendarSchedule; -import com.jeesite.modules.biz.entity.BizListItem; -import com.jeesite.modules.biz.service.BizListItemService; -import com.jeesite.modules.sys.entity.User; -import com.jeesite.modules.sys.utils.UserUtils; -import jakarta.annotation.Resource; -import org.springframework.stereotype.Service; - -import java.util.List; - -@Service -public class MsgService { - - @Resource - private BizListItemService bizListItemService; - - private static final String HTTP_URL = Global.getConfig("biz.http.url", ""); -} diff --git a/web-api/src/main/java/com/jeesite/modules/app/utils/WeatherUtils.java b/web-api/src/main/java/com/jeesite/modules/app/utils/WeatherUtils.java new file mode 100644 index 00000000..ffd890e9 --- /dev/null +++ b/web-api/src/main/java/com/jeesite/modules/app/utils/WeatherUtils.java @@ -0,0 +1,186 @@ +package com.jeesite.modules.app.utils; + +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; +import com.jeesite.modules.app.dao.DailyWeather; +import com.jeesite.modules.app.dao.DailyWeatherMap; +import com.jeesite.modules.app.dao.RealTimeWeather; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; + +import java.io.IOException; +import java.lang.reflect.Type; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * 和风天气API工具类(V7版本) + */ +public class WeatherUtils { + // 和风天气API基础地址 + private static final String BASE_URL = "https://mt6r6ujk6c.re.qweatherapi.com/v7"; + private static final OkHttpClient OK_HTTP_CLIENT = new OkHttpClient.Builder() + .connectTimeout(10, TimeUnit.SECONDS) // 连接超时 + .readTimeout(10, TimeUnit.SECONDS) // 读取超时 + .build(); + private static final Gson GSON = new Gson(); + private static final Type MAP_TYPE = new TypeToken>() { + }.getType(); + + // 和风天气API Key + private final String apiKey; + + /** + * 初始化工具类 + * + * @param apiKey 和风天气开发者平台获取的API Key + * @throws IllegalArgumentException API Key为空时抛出 + */ + public WeatherUtils(String apiKey) { + if (apiKey == null || apiKey.trim().isEmpty()) { + throw new IllegalArgumentException("API Key不能为空,请前往和风天气开发者平台申请"); + } + this.apiKey = apiKey; + } + + /** + * 发送HTTP GET请求(内部通用方法) + * + * @param path API接口路径(如/weather/now) + * @param location 位置(城市ID/经纬度,如101010100) + * @return API原始响应的Map,失败返回null + */ + private Map sendRequest(String path, String location) { + // 拼接请求URL(带参数) + String url = String.format("%s%s?location=%s&lang=zh&key=%s", + BASE_URL, path, location, apiKey); + // 构建请求 + Request request = new Request.Builder() + .url(url) + .get() + .build(); + try (Response response = OK_HTTP_CLIENT.newCall(request).execute()) { + // 检查HTTP响应状态 + if (!response.isSuccessful()) { + System.err.println("HTTP请求失败,状态码:" + response.code()); + return null; + } + // 读取响应体并解析为Map + String responseBody = response.body().string(); + Map responseMap = GSON.fromJson(responseBody, MAP_TYPE); + + // 校验API返回的状态码 + String code = (String) responseMap.get("code"); + if (!"200".equals(code)) { + String errorMsg = getErrorMsg(code); + System.err.println("API返回错误:" + code + " - " + errorMsg); + return null; + } + + return responseMap; + + } catch (IOException e) { + System.err.println("网络请求异常:" + e.getMessage()); + return null; + } + } + + /** + * 解析和风天气API错误码含义 + * + * @param code 错误码 + * @return 错误描述 + */ + private String getErrorMsg(String code) { + return switch (code) { + case "400" -> "请求参数错误"; + case "401" -> "API Key错误或过期"; + case "403" -> "API Key无权限访问该接口"; + case "404" -> "请求的接口不存在"; + case "429" -> "API调用频率超限"; + case "500" -> "服务器内部错误"; + default -> "未知错误"; + }; + } + + /** + * 查询实时天气 + * + * @param location 位置(城市ID/经纬度,如101010100=北京) + */ + public RealTimeWeather getRealTimeWeather(String location) { + if (location == null || location.trim().isEmpty()) { + System.err.println("位置参数不能为空"); + return null; + } + // 调用实时天气接口 + Map responseMap = sendRequest("/weather/now", location); + if (responseMap == null || !responseMap.containsKey("now")) { + return null; + } + // 提取实时天气核心字段 + Map nowMap = (Map) responseMap.get("now"); + RealTimeWeather timeWeather = new RealTimeWeather( + (String) nowMap.get("temp"), // 温度 + (String) nowMap.get("feelsLike"), // 体感温度 + (String) nowMap.get("text"), // 天气状况 + (String) nowMap.get("windDir"), // 风向 + (String) nowMap.get("windScale"), // 风力等级 + (String) nowMap.get("humidity"), // 相对湿度 + (String) responseMap.get("updateTime") // 更新时间 + ); + return timeWeather; + } + + /** + * 查询未来几天的天气预报(免费版默认最多3天) + * + * @param location 位置(城市ID/经纬度) + * @param days 查询天数(1-15,免费版建议≤3) + * @return 封装后的预报Map,失败返回null + */ + public DailyWeatherMap getDailyWeather(String location, int days) { + if (location == null || location.trim().isEmpty()) { + System.err.println("位置参数不能为空"); + return null; + } + if (days < 1 || days > 15) { + System.err.println("查询天数需在1-15之间"); + return null; + } + + // 选择对应接口路径 + String path = switch (days) { + case 1, 2, 3 -> "/weather/3d"; + case 4, 5, 6, 7 -> "/weather/7d"; + default -> "/weather/15d"; + }; + + // 调用预报接口 + Map responseMap = sendRequest(path, location); + if (responseMap == null || !responseMap.containsKey("daily")) { + return null; + } + // 提取每日预报列表并截断到指定天数 + List> originalDailyList = (List>) responseMap.get("daily"); + List dailyList = originalDailyList.stream() + .limit(days) + .map(map -> new DailyWeather( + (String) map.get("fxDate"), + (String) map.get("tempMin"), + (String) map.get("tempMax"), + (String) map.get("textDay"), + (String) map.get("textNight"), + (String) map.get("windDirDay"), + (String) map.get("windScaleDay") + )) + .toList(); + return new DailyWeatherMap( + (String) responseMap.get("fxLink"), + (String) responseMap.get("updateTime"), + dailyList + ); + } +} diff --git a/web-api/src/main/java/com/jeesite/modules/biz/service/BizMyfilesService.java b/web-api/src/main/java/com/jeesite/modules/biz/service/BizMyfilesService.java index abe923e2..00a40baa 100644 --- a/web-api/src/main/java/com/jeesite/modules/biz/service/BizMyfilesService.java +++ b/web-api/src/main/java/com/jeesite/modules/biz/service/BizMyfilesService.java @@ -61,8 +61,6 @@ public class BizMyfilesService extends CrudService { @Transactional public void save(BizMyfiles bizMyfiles) { super.save(bizMyfiles); - // 保存上传附件 - FileUploadUtils.saveFileUpload(bizMyfiles, bizMyfiles.getId(), "bizMyfiles_file"); } /** diff --git a/web-api/src/main/java/com/jeesite/modules/biz/web/BizCalendarScheduleController.java b/web-api/src/main/java/com/jeesite/modules/biz/web/BizCalendarScheduleController.java index 536c36dd..2195c1d5 100644 --- a/web-api/src/main/java/com/jeesite/modules/biz/web/BizCalendarScheduleController.java +++ b/web-api/src/main/java/com/jeesite/modules/biz/web/BizCalendarScheduleController.java @@ -2,7 +2,6 @@ package com.jeesite.modules.biz.web; import java.util.List; -import com.jeesite.modules.app.service.MsgService; import com.jeesite.modules.app.utils.vDate; import com.jeesite.modules.biz.entity.BizCalendarFlow; import com.jeesite.modules.biz.entity.BizListItem; @@ -49,10 +48,6 @@ public class BizCalendarScheduleController extends BaseController { @Resource private BizCalendarFlowService flowService; - - @Resource - private MsgService msgService; - private final BizCalendarScheduleService bizCalendarScheduleService; diff --git a/web-api/src/main/java/com/jeesite/modules/biz/web/BizMyfilesController.java b/web-api/src/main/java/com/jeesite/modules/biz/web/BizMyfilesController.java index 4f04c424..bf109a56 100644 --- a/web-api/src/main/java/com/jeesite/modules/biz/web/BizMyfilesController.java +++ b/web-api/src/main/java/com/jeesite/modules/biz/web/BizMyfilesController.java @@ -3,18 +3,16 @@ package com.jeesite.modules.biz.web; import java.util.Date; import java.util.List; -import cn.hutool.core.net.multipart.UploadFile; import com.jeesite.modules.app.utils.FileDownloadUtils; import com.jeesite.modules.app.utils.MyFileUtils; import com.jeesite.modules.app.utils.vId; -import com.jeesite.modules.biz.entity.BizMailAttachments; -import com.jeesite.modules.file.entity.FileEntity; import com.jeesite.modules.file.entity.FileUpload; +import com.jeesite.modules.file.service.FileEntityService; import com.jeesite.modules.file.utils.FileUploadUtils; +import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; -import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.annotation.Validated; @@ -43,7 +41,6 @@ import com.jeesite.modules.biz.service.BizMyfilesService; @Controller @RequestMapping(value = "${adminPath}/biz/myfiles") public class BizMyfilesController extends BaseController { - private static final String FILE_PATH = "/ogsapp/files"; private final BizMyfilesService bizMyfilesService; diff --git a/web-vue/packages/biz/api/biz/myWork.ts b/web-vue/packages/biz/api/biz/myWork.ts index af220771..77e2a325 100644 --- a/web-vue/packages/biz/api/biz/myWork.ts +++ b/web-vue/packages/biz/api/biz/myWork.ts @@ -9,6 +9,7 @@ import { BasicModel } from '@jeesite/core/api/model/baseModel'; const { adminPath } = useGlobSetting(); export interface MyWorkInfo extends BasicModel { + weatherText?: string; notifyNums?: number; notifyAllNums?: number; projectNums?: number; diff --git a/web-vue/packages/core/layouts/views/desktop/analysis/components/WorkbenchHeader.vue b/web-vue/packages/core/layouts/views/desktop/analysis/components/WorkbenchHeader.vue index 59b5b2d2..42a1d467 100644 --- a/web-vue/packages/core/layouts/views/desktop/analysis/components/WorkbenchHeader.vue +++ b/web-vue/packages/core/layouts/views/desktop/analysis/components/WorkbenchHeader.vue @@ -3,7 +3,7 @@

您好, {{ userinfo.userName }}, 开始您一天的工作吧!

- 今日晴,20℃ - 32℃! + {{ workInfo?.weatherText }}