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

View File

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

View File

@ -10,6 +10,7 @@ import java.util.Map;
@Data
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)
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,
'GITEE_ACCESS_TOKEN' as param_name,
'' as param_value,
@ -192,8 +205,18 @@ WHERE NOT EXISTS(SELECT 1
FROM base_sys_param
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
-- ----------------------------

View File

@ -1,5 +1,10 @@
<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">
{{ weather.location.name }}
<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);
}
}
.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>

View File

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

View File

@ -36,14 +36,16 @@
</bl-row>
<!-- 流量统计 -->
<bl-row class="container-name">请求流量</bl-row>
<bl-row class="container-sub-name">
<!-- <div > -->
<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)
<span class="iconbl bl-refresh-smile" @click="loadSentinlLine"></span>
</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>
</bl-row>
<!-- </div> -->
<!-- 热力图 -->
<bl-row class="container-name">编辑热力图</bl-row>
@ -51,13 +53,13 @@
每日编辑文章数 (每5分钟更新)
<span class="iconbl bl-refresh-smile" @click="loadArticleHeapmap"></span>
</bl-row>
<bl-row width="870px" height="270px">
<bl-row width="870px" height="260px">
<ChartHeatmap ref="ChartHeatmapRef"></ChartHeatmap>
</bl-row>
</div>
</div>
<!--
<!--
=======================================================
middle
=======================================================
@ -85,7 +87,7 @@
</bl-col>
</div>
<!--
<!--
=======================================================
right
=======================================================
@ -145,10 +147,18 @@ const ChartLineWordsRef = ref()
const SentinelChartLineRef = ref()
const ChartHeatmapRef = ref()
onActivated(() => (now.value = nowWhen()))
onActivated(() => {
now.value = nowWhen()
loadSentinlLine()
})
const loadWordLine = () => ChartLineWordsRef.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())
//#region ----------------------------------------< >--------------------------------------
const isShowWordsInfoDialog = ref(false)

View File

@ -70,6 +70,16 @@
</div>
</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-input size="default" v-model="serverParamForm.HEFENG_HOST" @change="(cur: any) => updParam('HEFENG_HOST', cur)"></el-input>
</el-form-item>
@ -82,6 +92,17 @@
</div>
</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="服务器到期时间">
<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)">
@ -134,7 +155,9 @@ const serverParamForm = ref({
BACKUP_EXP_DAYS: 0,
HEFENG_HOST: '',
HEFENG_KEY: '',
HEFENG_ENABLED: false,
BLOSSOM_OBJECT_STORAGE_DOMAIN: '',
SENTINEL_ENABLED: true,
SERVER_MACHINE_EXPIRE: '',
SERVER_DATABASE_EXPIRE: '',
SERVER_DOMAIN_EXPIRE: '',
@ -177,7 +200,9 @@ const getParamList = () => {
...{
ARTICLE_LOG_EXP_DAYS: Number(resp.data.ARTICLE_LOG_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'
}
}
})