feat: Add weather and flow control switches

This commit is contained in:
xiaozzzi 2025-06-05 15:21:20 +08:00
parent 6cc8a66243
commit 79ee94941f
8 changed files with 134 additions and 15 deletions

View File

@ -28,11 +28,17 @@ public enum ParamEnum {
* 和风天气KEY * 和风天气KEY
*/ */
HEFENG_KEY(true, 20,""), HEFENG_KEY(true, 20,""),
/** /**
* 和风天气KEY * 和风天气 HOST
*/ */
HEFENG_HOST(false, 100,""), HEFENG_HOST(false, 100,""),
/**
* 开启和风天气
*/
HEFENG_ENABLED(false, 5,""),
/** /**
* GITEE key * GITEE key
*/ */
@ -58,6 +64,11 @@ public enum ParamEnum {
*/ */
SERVER_JWT_SECRET(true, 9999,""), SERVER_JWT_SECRET(true, 9999,""),
/**
* 开启首页流量监控
*/
SENTINEL_ENABLED(false, 5,""),
/** /**
* 过期时间 - 服务器 * 过期时间 - 服务器
*/ */

View File

@ -67,7 +67,9 @@ public class WeatherManager {
} }
log.info("[BLOSSOM] refresh weather: {}", location); log.info("[BLOSSOM] refresh weather: {}", location);
HeFengReq params = initParam(location); HeFengReq params = initParam(location);
if (params == null) {
// 无返回或关闭
if (params == null || !params.getEnabled()) {
log.info("未配置天气信息, 忽略天气查询"); log.info("未配置天气信息, 忽略天气查询");
WeatherRes weather = new WeatherRes(); WeatherRes weather = new WeatherRes();
CityRes.Location l = new CityRes.Location(); CityRes.Location l = new CityRes.Location();
@ -75,6 +77,7 @@ public class WeatherManager {
weather.setLocation(l); weather.setLocation(l);
return weather; return weather;
} }
String cityStr, nowStr, dailyStr, hourlyStr; String cityStr, nowStr, dailyStr, hourlyStr;
CityRes city = null; CityRes city = null;
NowRes now = null; NowRes now = null;
@ -160,13 +163,17 @@ public class WeatherManager {
* @return 返回查询参数 * @return 返回查询参数
*/ */
public HeFengReq initParam(String location) { public HeFengReq initParam(String location) {
Map<String, String> paramMap = paramService.selectMap(false, ParamEnum.HEFENG_KEY, ParamEnum.HEFENG_HOST); Map<String, String> paramMap = paramService.selectMap(false,
ParamEnum.HEFENG_KEY,
ParamEnum.HEFENG_HOST,
ParamEnum.HEFENG_ENABLED);
if (MapUtil.isNotEmpty(paramMap) if (MapUtil.isNotEmpty(paramMap)
&& StrUtil.isNotBlank(paramMap.get(ParamEnum.HEFENG_KEY.name())) && StrUtil.isNotBlank(paramMap.get(ParamEnum.HEFENG_KEY.name()))
&& StrUtil.isNotBlank(paramMap.get(ParamEnum.HEFENG_HOST.name())) && StrUtil.isNotBlank(paramMap.get(ParamEnum.HEFENG_HOST.name()))
) { ) {
HeFengReq req = new HeFengReq(); HeFengReq req = new HeFengReq();
req.setHost(paramMap.get(ParamEnum.HEFENG_HOST.name())); req.setHost(paramMap.get(ParamEnum.HEFENG_HOST.name()));
req.setEnabled("1".equals(paramMap.getOrDefault(ParamEnum.HEFENG_ENABLED.name(),"0")));
Map<String, String> map = new HashMap<>(2); Map<String, String> map = new HashMap<>(2);
map.put("location", location); map.put("location", location);

View File

@ -10,6 +10,7 @@ import java.util.Map;
@Data @Data
public class HeFengReq { public class HeFengReq {
private Boolean enabled;
/** /**
* 和风用户域名 * 和风用户域名
*/ */

View File

@ -90,6 +90,19 @@ WHERE NOT EXISTS(SELECT 1
-- --
INSERT INTO base_sys_param (id, param_name, param_value, param_desc, open_state, cre_time, upd_time) INSERT INTO base_sys_param (id, param_name, param_value, param_desc, open_state, cre_time, upd_time)
SELECT * SELECT *
FROM (select 19 as id,
'HEFENG_ENABLED' as param_name,
'0' as param_value,
'和风天气开启' as param_desc,
1 as open_state,
CURRENT_TIMESTAMP as cre_time,
CURRENT_TIMESTAMP as upd_time) as temp
WHERE NOT EXISTS(SELECT 1
FROM base_sys_param
WHERE id = 19);
--
INSERT INTO base_sys_param (id, param_name, param_value, param_desc, open_state, cre_time, upd_time)
SELECT *
FROM (select 21 as id, FROM (select 21 as id,
'GITEE_ACCESS_TOKEN' as param_name, 'GITEE_ACCESS_TOKEN' as param_name,
'' as param_value, '' as param_value,
@ -192,8 +205,18 @@ WHERE NOT EXISTS(SELECT 1
FROM base_sys_param FROM base_sys_param
WHERE id = 904); WHERE id = 904);
INSERT INTO base_sys_param (id, param_name, param_value, param_desc, open_state, cre_time, upd_time)
SELECT *
FROM (select 1001 as id,
'SENTINEL_ENABLED' as param_name,
'1' as param_value,
'流量监控开启' as param_desc,
1 as open_state,
CURRENT_TIMESTAMP as cre_time,
CURRENT_TIMESTAMP as upd_time) as temp
WHERE NOT EXISTS(SELECT 1
FROM base_sys_param
WHERE id = 1001);
-- ---------------------------- -- ----------------------------
-- since: 1.12.0 -- since: 1.12.0
-- ---------------------------- -- ----------------------------

View File

@ -1,5 +1,10 @@
<template> <template>
<div class="weather-root"> <div v-if="userStore.sysParams.HEFENG_ENABLED === '0'" class="weather-root">
<div class="placeholder">
<div class="remark">未启用天气</div>
</div>
</div>
<div v-else class="weather-root">
<bl-row class="location" just="flex-end"> <bl-row class="location" just="flex-end">
{{ weather.location.name }} {{ weather.location.name }}
<el-tooltip placement="top" effect="light" :show-after="1000" :hide-after="0" :auto-close="3000"> <el-tooltip placement="top" effect="light" :show-after="1000" :hide-after="0" :auto-close="3000">
@ -349,4 +354,38 @@ const refreshWeatherTask = () => {
box-shadow: 0 2px 10px 3px rgba(0, 0, 0, 0.3); box-shadow: 0 2px 10px 3px rgba(0, 0, 0, 0.3);
} }
} }
.weather-root .placeholder {
@include flex(column, center, center);
width: 440px;
height: 200px;
margin-left: 10px;
border-radius: 10px;
background-color: var(--el-color-primary-light-7);
position: relative;
overflow: hidden;
&::before {
content: '';
position: absolute;
top: 0;
left: 0;
width: 200%;
height: 100%;
background: repeating-linear-gradient(
-45deg,
transparent 0,
transparent 20px,
var(--el-color-primary-light-5) 20px,
var(--el-color-primary-light-5) 40px
);
}
.remark {
z-index: 1;
padding: 10px;
border-radius: 10px;
background-color: var(--el-color-primary-light-3);
}
}
</style> </style>

View File

@ -79,7 +79,10 @@ export const DEFAULT_USER_INFO = {
ARTICLE_LOG_EXP_DAYS: '', ARTICLE_LOG_EXP_DAYS: '',
ARTICLE_RECYCLE_EXP_DAYS: '', ARTICLE_RECYCLE_EXP_DAYS: '',
HEFENG_KEY: '', HEFENG_KEY: '',
HEFENG_HOST: '',
HEFENG_ENABLED: '1',
BLOSSOM_OBJECT_STORAGE_DOMAIN: '', BLOSSOM_OBJECT_STORAGE_DOMAIN: '',
SENTINEL_ENABLED: '1',
SERVER_MACHINE_EXPIRE: '', SERVER_MACHINE_EXPIRE: '',
SERVER_DATABASE_EXPIRE: '', SERVER_DATABASE_EXPIRE: '',
SERVER_HTTPS_EXPIRE: '', SERVER_HTTPS_EXPIRE: '',

View File

@ -36,14 +36,16 @@
</bl-row> </bl-row>
<!-- 流量统计 --> <!-- 流量统计 -->
<bl-row class="container-name">请求流量</bl-row> <!-- <div > -->
<bl-row class="container-sub-name"> <bl-row v-if="userStore.sysParams.SENTINEL_ENABLED === '1'" class="container-name">请求流量</bl-row>
<bl-row v-if="userStore.sysParams.SENTINEL_ENABLED === '1'" class="container-sub-name">
Flow Statistic / Requests & Average Response Time(ms) Flow Statistic / Requests & Average Response Time(ms)
<span class="iconbl bl-refresh-smile" @click="loadSentinlLine"></span> <span class="iconbl bl-refresh-smile" @click="loadSentinlLine"></span>
</bl-row> </bl-row>
<bl-row width="880px" height="250px"> <bl-row v-if="userStore.sysParams.SENTINEL_ENABLED === '1'" width="880px" height="250px">
<SentinelChartLine ref="SentinelChartLineRef"></SentinelChartLine> <SentinelChartLine ref="SentinelChartLineRef"></SentinelChartLine>
</bl-row> </bl-row>
<!-- </div> -->
<!-- 热力图 --> <!-- 热力图 -->
<bl-row class="container-name">编辑热力图</bl-row> <bl-row class="container-name">编辑热力图</bl-row>
@ -51,13 +53,13 @@
每日编辑文章数 (每5分钟更新) 每日编辑文章数 (每5分钟更新)
<span class="iconbl bl-refresh-smile" @click="loadArticleHeapmap"></span> <span class="iconbl bl-refresh-smile" @click="loadArticleHeapmap"></span>
</bl-row> </bl-row>
<bl-row width="870px" height="270px"> <bl-row width="870px" height="260px">
<ChartHeatmap ref="ChartHeatmapRef"></ChartHeatmap> <ChartHeatmap ref="ChartHeatmapRef"></ChartHeatmap>
</bl-row> </bl-row>
</div> </div>
</div> </div>
<!-- <!--
======================================================= =======================================================
middle middle
======================================================= =======================================================
@ -85,7 +87,7 @@
</bl-col> </bl-col>
</div> </div>
<!-- <!--
======================================================= =======================================================
right right
======================================================= =======================================================
@ -145,10 +147,18 @@ const ChartLineWordsRef = ref()
const SentinelChartLineRef = ref() const SentinelChartLineRef = ref()
const ChartHeatmapRef = ref() const ChartHeatmapRef = ref()
onActivated(() => (now.value = nowWhen())) onActivated(() => {
now.value = nowWhen()
loadSentinlLine()
})
const loadWordLine = () => ChartLineWordsRef.value.reload() const loadWordLine = () => ChartLineWordsRef.value.reload()
const loadArticleHeapmap = () => ChartHeatmapRef.value.reload() const loadArticleHeapmap = () => ChartHeatmapRef.value.reload()
const loadSentinlLine = () => SentinelChartLineRef.value.reload() const loadSentinlLine = () => {
if (userStore.sysParams.SENTINEL_ENABLED === '1') {
SentinelChartLineRef.value.reload()
SentinelChartLineRef.value.windowResize()
}
}
const now = ref(nowWhen()) const now = ref(nowWhen())
//#region ----------------------------------------< >-------------------------------------- //#region ----------------------------------------< >--------------------------------------
const isShowWordsInfoDialog = ref(false) const isShowWordsInfoDialog = ref(false)

View File

@ -70,6 +70,16 @@
</div> </div>
</el-form-item> </el-form-item>
<el-form-item label="开启天气功能">
<bl-row>
<el-switch
size="default"
v-model="serverParamForm.HEFENG_ENABLED"
@change="(cur: boolean) => updParam('HEFENG_ENABLED', cur ? '1' : '0')" />
</bl-row>
<div class="conf-tip">是否开启和风天气功能</div>
</el-form-item>
<el-form-item label="和风天气 Host"> <el-form-item label="和风天气 Host">
<el-input size="default" v-model="serverParamForm.HEFENG_HOST" @change="(cur: any) => updParam('HEFENG_HOST', cur)"></el-input> <el-input size="default" v-model="serverParamForm.HEFENG_HOST" @change="(cur: any) => updParam('HEFENG_HOST', cur)"></el-input>
</el-form-item> </el-form-item>
@ -82,6 +92,17 @@
</div> </div>
</el-form-item> </el-form-item>
<el-form-item label="开启首页流量统计">
<bl-row>
<el-switch
size="default"
v-model="serverParamForm.SENTINEL_ENABLED"
@change="(cur: boolean) => updParam('SENTINEL_ENABLED', cur ? '1' : '0')" />
</bl-row>
<div class="conf-tip">是否开启首页流量统计</div>
</el-form-item>
<!-- -->
<el-form-item label="服务器到期时间"> <el-form-item label="服务器到期时间">
<div class="conf-tip">如果你使用云服务器或其他有时限的环境可在此配置到期提示其他环境可无视(<code>yyyy-MM-dd</code>格式)</div> <div class="conf-tip">如果你使用云服务器或其他有时限的环境可在此配置到期提示其他环境可无视(<code>yyyy-MM-dd</code>格式)</div>
<el-input size="default" v-model="serverParamForm.SERVER_MACHINE_EXPIRE" @change="(cur: any) => updParam('SERVER_MACHINE_EXPIRE', cur)"> <el-input size="default" v-model="serverParamForm.SERVER_MACHINE_EXPIRE" @change="(cur: any) => updParam('SERVER_MACHINE_EXPIRE', cur)">
@ -134,7 +155,9 @@ const serverParamForm = ref({
BACKUP_EXP_DAYS: 0, BACKUP_EXP_DAYS: 0,
HEFENG_HOST: '', HEFENG_HOST: '',
HEFENG_KEY: '', HEFENG_KEY: '',
HEFENG_ENABLED: false,
BLOSSOM_OBJECT_STORAGE_DOMAIN: '', BLOSSOM_OBJECT_STORAGE_DOMAIN: '',
SENTINEL_ENABLED: true,
SERVER_MACHINE_EXPIRE: '', SERVER_MACHINE_EXPIRE: '',
SERVER_DATABASE_EXPIRE: '', SERVER_DATABASE_EXPIRE: '',
SERVER_DOMAIN_EXPIRE: '', SERVER_DOMAIN_EXPIRE: '',
@ -177,7 +200,9 @@ const getParamList = () => {
...{ ...{
ARTICLE_LOG_EXP_DAYS: Number(resp.data.ARTICLE_LOG_EXP_DAYS), ARTICLE_LOG_EXP_DAYS: Number(resp.data.ARTICLE_LOG_EXP_DAYS),
ARTICLE_RECYCLE_EXP_DAYS: Number(resp.data.ARTICLE_RECYCLE_EXP_DAYS), ARTICLE_RECYCLE_EXP_DAYS: Number(resp.data.ARTICLE_RECYCLE_EXP_DAYS),
BACKUP_EXP_DAYS: Number(resp.data.BACKUP_EXP_DAYS) BACKUP_EXP_DAYS: Number(resp.data.BACKUP_EXP_DAYS),
HEFENG_ENABLED: resp.data.HEFENG_ENABLED === '1',
SENTINEL_ENABLED: resp.data.SENTINEL_ENABLED === '1'
} }
} }
}) })