diff --git a/frontend/.env.development b/frontend/.env.development
index 5cf083ba..0eca7e7f 100644
--- a/frontend/.env.development
+++ b/frontend/.env.development
@@ -12,9 +12,9 @@ VITE_APP_BASE_API = '/dev-api'
# VITE_APP_BASE_URL = 'http://172.16.21.142:8093'
# VITE_APP_BASE_URL = 'http://172.16.21.142:8096'
# 汤伟
-VITE_APP_BASE_URL = 'http://10.84.111.235:8093'
+# VITE_APP_BASE_URL = 'http://10.84.111.235:8093'
# 李林
-# VITE_APP_BASE_URL = 'http://10.84.111.25:8093'
+VITE_APP_BASE_URL = 'http://10.84.111.25:8093'
# 测试环境线上10.84.121.122:
VITE_APP_TEST_ONLINE_URL = 'https://211.99.26.225:12122'
diff --git a/frontend/src/api/system/map/pushManagement/index.ts b/frontend/src/api/system/map/pushManagement/index.ts
new file mode 100644
index 00000000..0c12c515
--- /dev/null
+++ b/frontend/src/api/system/map/pushManagement/index.ts
@@ -0,0 +1,100 @@
+import request from '@/utils/request';
+
+// 获取列表
+export function getPushConfigList(data: any) {
+ return request({
+ url: '/system/pushConfig/getPushConfigList',
+ method: 'post',
+ data
+ });
+}
+//新增推送配置
+export function addPushConfig(data: any) {
+ return request({
+ url: '/system/pushConfig/addPushConfig',
+ method: 'post',
+ data
+ });
+}
+
+//修改新增配置
+export function deletePushConfig(data: any) {
+ return request({
+ url: '/system/pushConfig/deletePushConfig',
+ method: 'post',
+ data
+ });
+}
+//删除新增配置
+export function updatePushConfig(data: any) {
+ return request({
+ url: '/system/pushConfig/updatePushConfig',
+ method: 'post',
+ data
+ });
+}
+//推送目标配置 --用户
+export function queryUsersList(data: any) {
+ return request({
+ url: '/system/pushConfig/queryUsersList',
+ method: 'get',
+ params:data
+ });
+}
+//推送目标配置 -- 角色
+export function queryRolesList(data: any) {
+ return request({
+ url: '/system/pushConfig/queryRolesList',
+ method: 'get',
+ params:data
+ });
+}
+//查询推送目标
+export function getPushTargets(data: any) {
+ return request({
+ url: '/system/pushConfig/getPushTargets',
+ method: 'get',
+ params:data
+ });
+}
+//新增推送目标
+export function savePushTargets(data: any) {
+ return request({
+ url: '/system/pushConfig/savePushTargets',
+ method: 'post',
+ data
+ });
+}
+//短信提醒状态修改
+export function setPushConfigSmsSwitch(data: any) {
+ return request({
+ url: '/system/pushConfig/setPushConfigSmsSwitch',
+ method: 'post',
+ data
+ });
+}
+//获取推送历史列表
+export function postPushHistoryList(data: any) {
+ return request({
+ url: '/system/pushConfig/postPushHistoryList',
+ method: 'post',
+ data
+ });
+}
+
+//推送情况
+export function getPushHistoryDetailList(data: any) {
+ return request({
+ url: '/system/pushConfig/getPushHistoryDetailList',
+ method: 'post',
+ data
+ });
+}
+//s数量
+export function getPushHistoryDetailById(data: any) {
+ return request({
+ url: '/system/pushConfig/getPushHistoryDetailById',
+ method: 'get',
+ params:data
+ });
+}
\ No newline at end of file
diff --git a/frontend/src/modules/liuyu/yichangyujing/shuizhijiancegaojing/shuizhijianceshuju.vue b/frontend/src/modules/liuyu/yichangyujing/shuizhijiancegaojing/shuizhijianceshuju.vue
index 418e21dd..62fbf3f2 100644
--- a/frontend/src/modules/liuyu/yichangyujing/shuizhijiancegaojing/shuizhijianceshuju.vue
+++ b/frontend/src/modules/liuyu/yichangyujing/shuizhijiancegaojing/shuizhijianceshuju.vue
@@ -79,21 +79,21 @@ const data = ref([
name: '正常',
num: '0',
warnState: '1',
- icon: 'iconfont icon-shuidianzhan1 zhuangji',
+ icon: 'iconfont icon-map-rgszzDabiao zhuangji',
background: '#78c300',
},
{
name: '告警',
num: '0',
warnState: '2',
- icon: 'iconfont icon-shuidianzhanGaojing shebeiZhengchang',
+ icon: 'iconfont icon-map-rgszzDabiao shebeiZhengchang',
background: '#e55555',
},
{
name: '无数据',
num: '0',
warnState: '0',
- icon: 'iconfont icon-shuidianzhanWushujv shebeiLixian',
+ icon: 'iconfont icon-map-rgszzDabiao shebeiLixian',
background: '#8d8d8d',
},
]);
diff --git a/frontend/src/views/login/index.vue b/frontend/src/views/login/index.vue
index c8ab78f0..d34d8e79 100644
--- a/frontend/src/views/login/index.vue
+++ b/frontend/src/views/login/index.vue
@@ -22,7 +22,7 @@
← 返回
-
忘记密码
+
-
+
@@ -42,9 +46,10 @@
@@ -69,7 +74,8 @@
@@ -79,6 +85,19 @@
+
+
+
+
+
+
+
+
登录
-
+ 记住密码
+
+ 忘记密码
+
+
+
-
+
- -->
+
@@ -248,19 +313,23 @@
import { onMounted, reactive, ref, toRefs, watch } from "vue";
import loginImg from "@/assets/images/logo.png";
import { UserOutlined, LockOutlined, MobileOutlined } from "@ant-design/icons-vue";
-import { getCaptcha } from "@/api/auth";
+import { getCaptcha, sendSmsCode, smsLoginApi, resetPassword } from "@/api/auth";
import { message } from "ant-design-vue";
+import { setToken } from "@/utils/auth";
+import Cookies from "js-cookie";
// 组件依赖
+
import router from "@/router";
// API依赖
import { useRoute } from "vue-router";
import { LoginData } from "@/api/auth/types";
//密码加密
-import { encrypt } from "@/utils/rsaEncrypt";
+import { encrypt, decrypt } from "@/utils/rsaEncrypt";
// 状态管理依赖
import { useUserStore } from "@/store/modules/user";
+import { usePermissionStoreHook } from "@/store/modules/permission";
// 国际化
import { useI18n } from "vue-i18n";
@@ -280,6 +349,7 @@ const forgotPasswordForm = ref({
phone: "",
captcha: "",
newPassword: "",
+ confirmPassword: "",
});
// 忘记密码
const showForgotPassword = ref(false);
@@ -299,6 +369,10 @@ const state = reactive({
password: [{ required: true, trigger: "blur", message: t("login.rulesPassword") }],
code: [{ required: true, trigger: "blur", message: "请输入验证码" }],
},
+ smsLoginRules: {
+ username: [{ required: true, trigger: "blur", message: "请输入手机号" }],
+ code: [{ required: true, trigger: "blur", message: "请输入验证码" }],
+ },
loginImg: loginImg[0],
loading: false,
passwordType: "password",
@@ -320,15 +394,80 @@ const forgotPasswordRules = ref({
captcha: [{ required: true, message: "验证码不能为空", trigger: "blur" }],
newPassword: [
{ required: true, message: "新密码不能为空", trigger: "blur" },
- { min: 6, message: "密码长度不能少于6位", trigger: "blur" },
+ { min: 10, message: "密码长度不能少于10位", trigger: "blur" },
+ {
+ validator: (rule: any, value: string) => {
+ if (!value) return Promise.resolve();
+
+ // 检查密码复杂度:至少包含四类字符中的三类
+ const hasUpperCase = /[A-Z]/.test(value);
+ const hasLowerCase = /[a-z]/.test(value);
+ const hasNumber = /\d/.test(value);
+ const hasSpecialChar = /[!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?]/.test(value);
+
+ const typeCount = [hasUpperCase, hasLowerCase, hasNumber, hasSpecialChar].filter(
+ Boolean
+ ).length;
+
+ if (typeCount < 3) {
+ return Promise.reject(
+ new Error("密码必须包含大写字母、小写字母、数字、特殊字符中的至少三种")
+ );
+ }
+
+ // 检查连续重复字符
+ if (/(.)\1{1,}/.test(value)) {
+ return Promise.reject(new Error("密码不能包含连续重复字符"));
+ }
+
+ // 检查连续递增/递减数字
+ for (let i = 0; i < value.length - 1; i++) {
+ if (/\d/.test(value[i]) && /\d/.test(value[i + 1])) {
+ const diff = value.charCodeAt(i + 1) - value.charCodeAt(i);
+ if (Math.abs(diff) === 1) {
+ return Promise.reject(new Error("密码不能包含连续递增或递减的数字"));
+ }
+ }
+ }
+
+ // 检查连续递增/递减字母
+ for (let i = 0; i < value.length - 1; i++) {
+ if (/[a-zA-Z]/.test(value[i]) && /[a-zA-Z]/.test(value[i + 1])) {
+ const diff = value.charCodeAt(i + 1) - value.charCodeAt(i);
+ if (Math.abs(diff) === 1) {
+ return Promise.reject(new Error("密码不能包含连续递增或递减的字母"));
+ }
+ }
+ }
+
+ return Promise.resolve();
+ },
+ trigger: "blur",
+ },
+ ],
+ confirmPassword: [
+ // { required: true, message: "请再次输入密码", trigger: "blur" },
+ {
+ validator: (rule: any, value: string) => {
+ if (!value) {
+ return Promise.reject(new Error("请再次输入密码"));
+ }
+ if (value !== forgotPasswordForm.value.newPassword) {
+ return Promise.reject(new Error("两次输入的密码不一致"));
+ }
+ return Promise.resolve();
+ },
+ trigger: "blur",
+ },
],
});
-const { loginData, loginRules, loading,
- // passwordType, capslockTooltipDisabled
- } = toRefs(
- state
-);
+const {
+ loginData,
+ loginRules,
+ loading,
+ // passwordType, capslockTooltipDisabled
+} = toRefs(state);
// function checkCapslock(e: any) {
// const { key } = e;
@@ -364,8 +503,19 @@ function onFinish() {
userStore
.login(user)
.then(() => {
+ if (remember.value == true) {
+ Cookies.set("username", user.username, { expires: 30 });
+ Cookies.set("password", user.password, { expires: 30 });
+ Cookies.set("rememberMe", String(remember.value), { expires: 30 });
+ } else {
+ // 如果用户取消勾选记住密码,应该移除 cookie
+ Cookies.remove("username");
+ Cookies.remove("password");
+ Cookies.remove("rememberMe");
+ }
router.push({ path: "/" });
state.loading = false;
+ message.success("登录成功");
})
.catch(() => {
getCode();
@@ -373,6 +523,93 @@ function onFinish() {
});
}
+/**
+ * 短信验证码登录
+ */
+const onSmsLogin = async () => {
+ try {
+ // ========== 第一部分:表单验证 ==========
+ const phoneRegex = /^1[3-9]\d{9}$/;
+ if (!loginData.value.username || !phoneRegex.test(loginData.value.username)) {
+ message.error("请输入正确的手机号");
+ return;
+ }
+
+ if (!loginData.value.code || loginData.value.code.trim() === "") {
+ message.error("请输入验证码");
+ return;
+ }
+
+ // ========== 第二部分:设置加载状态 ==========
+ state.loading = true;
+
+ // ========== 第三部分:调用短信登录 API ==========
+ console.log("开始调用短信登录API, 手机号:", loginData.value.username);
+ const res: any = await smsLoginApi(
+ loginData.value.username, // 手机号
+ loginData.value.code // 短信验证码
+ );
+ console.log("短信登录API响应:", res);
+
+ // ========== 第四部分:检查响应结果 ==========
+ console.log("检查响应结果, res.code:", res.code, "类型:", typeof res.code);
+
+ // 注意:code 可能是字符串 "0" 或数字 0,需要兼容处理
+ if (res.code !== 0 && res.code !== "0") {
+ console.error("短信登录失败, 错误码:", res.code, "错误信息:", res.msg);
+ message.error(res.msg || "登录失败");
+ return;
+ }
+
+ // ========== 第五部分:提取并存储 Token ==========
+ console.log("开始提取Token, res.data:", res.data);
+ const token = res.data?.token || res.data; // 兼容两种结构
+
+ if (!token) {
+ console.error("Token为空, res.data结构:", JSON.stringify(res.data));
+ message.error("登录失败:未获取到Token");
+ return;
+ }
+
+ console.log("Token获取成功:", token);
+ // 存储到 Cookie
+ setToken(token);
+
+ // 更新 Store 状态(注意是大写 Token)
+ userStore.Token = token;
+ console.log("Token已存储到Store");
+
+ // ========== 第六部分:获取用户信息和角色 ==========
+ console.log("开始获取用户信息...");
+ const userInfo = await userStore.getInfo();
+ console.log("用户信息获取成功:", userInfo);
+ const roles = userInfo.roles;
+ console.log("用户角色:", roles);
+
+ // ========== 第七部分:生成路由(获取菜单)==========
+ console.log("开始生成路由...");
+ const permissionStore = usePermissionStoreHook();
+ const accessRoutes: any = await permissionStore.generateRoutes(roles);
+ console.log("路由生成成功, 路由数量:", accessRoutes.length);
+
+ // ========== 第八部分:动态添加路由 ==========
+ accessRoutes.forEach((route: any) => {
+ router.addRoute(route);
+ });
+
+ // ========== 第九部分:设置路径并跳转 ==========
+ router.push({ path: accessRoutes[0].children[0].opturl });
+ message.success("登录成功");
+ } catch (error: any) {
+ // ========== 第十部分:错误处理 ==========
+ console.error("短信登录失败", error);
+ message.error(error.message || "登录失败,请重试");
+ } finally {
+ // ========== 第十一部分:关闭加载状态 ==========
+ state.loading = false;
+ }
+};
+
watch(
route,
() => {
@@ -395,6 +632,22 @@ function getOtherQuery(query: any) {
return acc;
}, {});
}
+function getCookie() {
+ const username = Cookies.get("username");
+ let password = Cookies.get("password");
+ const rememberMe = Cookies.get("rememberMe");
+ rememberMe == "true" ? (remember.value = Boolean(rememberMe)) : false;
+ // 保存cookie里面的加密后的密码
+ state.cookiePass = password === undefined ? "" : password;
+ password = password === undefined ? state.loginData.password : password;
+ state.loginData = {
+ username: username === undefined ? state.loginData.username : username,
+ password: decrypt(password),
+ code: "",
+ uuid: "",
+ };
+ remember.value = rememberMe === undefined ? false : Boolean(rememberMe);
+}
function getCode() {
getCaptcha().then((result: any) => {
codeUrl.value = result.data.img;
@@ -420,7 +673,10 @@ const startCountdown = () => {
const showForgotPasswordPage = () => {
showForgotPassword.value = true;
};
-
+//注册用户页面
+const goRegister = () => {
+ router.push({ path: "/register" });
+};
// 返回登录页面
const backToLogin = () => {
showForgotPassword.value = false;
@@ -429,6 +685,7 @@ const backToLogin = () => {
phone: "",
captcha: "",
newPassword: "",
+ confirmPassword: "",
};
};
@@ -456,10 +713,13 @@ const sendSms = async () => {
smsButtonDisabled.value = true;
try {
- // 模拟发送短信验证码接口
- // await axios.post('/sms/send', { phone: loginForm.value.username })
-
- // 模拟发送成功
+ // 调用发送短信验证码接口,type默认为1(注册类型)
+ const res: any = await sendSmsCode(loginData.value.username, 3);
+ if (res.code == 1) {
+ message.success(res.msg);
+ return;
+ }
+ // 发送成功
message.success("验证码发送成功");
// 开始倒计时
@@ -496,17 +756,23 @@ const sendForgotPasswordSms = async () => {
smsButtonDisabled.value = true;
try {
- // 模拟发送短信验证码接口
- // await axios.post('/sms/forgot-password', { phone: forgotPasswordForm.value.phone })
+ // 调用发送短信验证码接口,type=3表示找回密码类型
+ const res: any = await sendSmsCode(forgotPasswordForm.value.phone, 2);
- // 模拟发送成功
+ if (res.code == 1) {
+ message.error(res.msg);
+ smsButtonDisabled.value = false;
+ return;
+ }
+
+ // 发送成功
message.success("验证码发送成功");
// 开始倒计时
startCountdown();
- } catch (error) {
- console.error("发送验证码失败", error);
- message.error("验证码发送失败,请重试");
+ } catch (error: any) {
+ // console.error("发送验证码失败", error);
+ // message.error(error.message || "验证码发送失败,请重试");
smsButtonDisabled.value = false;
} finally {
loading.value = false;
@@ -514,23 +780,117 @@ const sendForgotPasswordSms = async () => {
};
// 处理密码重置
const handleResetPassword = async () => {
- loading.value = true;
+ // 先进行表单验证
try {
- // 2. 模拟接口请求 (实际替换为真实重置密码接口)
- // await axios.post('/user/reset-password', {
- // phone: forgotPasswordForm.value.phone,
- // captcha: forgotPasswordForm.value.captcha,
- // newPassword: forgotPasswordForm.value.newPassword
- // })
+ // 手动验证各个字段
+ const phoneRegex = /^1[3-9]\d{9}$/;
+ if (
+ !forgotPasswordForm.value.phone ||
+ !phoneRegex.test(forgotPasswordForm.value.phone)
+ ) {
+ message.error("请输入正确的手机号");
+ return;
+ }
- // 3. 模拟重置成功
- message.success("密码重置成功");
+ if (!forgotPasswordForm.value.captcha) {
+ message.error("请输入验证码");
+ return;
+ }
- // 4. 返回登录页面
- backToLogin();
+ if (!forgotPasswordForm.value.newPassword) {
+ message.error("请输入新密码");
+ return;
+ }
+
+ // 验证确认密码
+ if (!forgotPasswordForm.value.confirmPassword) {
+ message.error("请再次输入密码");
+ return;
+ }
+
+ // 验证两次密码是否一致
+ if (
+ forgotPasswordForm.value.newPassword !== forgotPasswordForm.value.confirmPassword
+ ) {
+ message.error("两次输入的密码不一致");
+ return;
+ }
+
+ // 密码复杂度校验
+ const password = forgotPasswordForm.value.newPassword;
+ if (password.length < 10) {
+ message.error("密码长度不能少于10位");
+ return;
+ }
+
+ const hasUpperCase = /[A-Z]/.test(password);
+ const hasLowerCase = /[a-z]/.test(password);
+ const hasNumber = /\d/.test(password);
+ const hasSpecialChar = /[!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?]/.test(password);
+
+ const typeCount = [hasUpperCase, hasLowerCase, hasNumber, hasSpecialChar].filter(
+ Boolean
+ ).length;
+ if (typeCount < 3) {
+ message.error("密码必须包含大写字母、小写字母、数字、特殊字符中的至少三种");
+ return;
+ }
+
+ // 检查连续重复字符
+ if (/(.)\1{1,}/.test(password)) {
+ message.error("密码不能包含连续重复字符");
+ return;
+ }
+
+ // 检查连续递增/递减数字
+ for (let i = 0; i < password.length - 1; i++) {
+ if (/\d/.test(password[i]) && /\d/.test(password[i + 1])) {
+ const diff = password.charCodeAt(i + 1) - password.charCodeAt(i);
+ if (Math.abs(diff) === 1) {
+ message.error("密码不能包含连续递增或递减的数字");
+ return;
+ }
+ }
+ }
+
+ // 检查连续递增/递减字母
+ for (let i = 0; i < password.length - 1; i++) {
+ if (/[a-zA-Z]/.test(password[i]) && /[a-zA-Z]/.test(password[i + 1])) {
+ const diff = password.charCodeAt(i + 1) - password.charCodeAt(i);
+ if (Math.abs(diff) === 1) {
+ message.error("密码不能包含连续递增或递减的字母");
+ return;
+ }
+ }
+ }
} catch (error) {
- console.error("密码重置失败", error);
- message.error("密码重置失败,请重试");
+ console.error("表单验证失败", error);
+ return;
+ }
+
+ loading.value = true;
+
+ try {
+ // 对密码进行 RSA 加密
+ const encryptedPassword = encrypt(forgotPasswordForm.value.newPassword);
+
+ // 调用重置密码接口,使用加密后的密码
+ const res: any = await resetPassword(
+ forgotPasswordForm.value.phone,
+ forgotPasswordForm.value.captcha,
+ encryptedPassword
+ );
+
+ if (res.code == 0) {
+ message.success("密码重置成功");
+ // 返回登录页面
+ backToLogin();
+ } else {
+ message.error(res.msg || "密码重置失败");
+ }
+ } catch (error: any) {
+ // console.error("密码重置失败", error);
+ // message.error(error.message || "密码重置失败,请重试");
} finally {
loading.value = false;
}
@@ -538,6 +898,7 @@ const handleResetPassword = async () => {
onMounted(() => {
getCode();
+ getCookie();
});
@@ -592,7 +953,7 @@ onMounted(() => {
}
.login-wrapper {
- position: relative;
+ position: relative;
width: 100%;
height: 72%;
min-height: 600px;
@@ -603,7 +964,7 @@ onMounted(() => {
// 左侧背景区域
.left-section {
- .slogan {
+ .slogan {
position: absolute;
top: 28%;
left: 18%;
@@ -635,10 +996,12 @@ onMounted(() => {
/* 验证码布局 */
.captcha-row {
display: flex;
+
.ant-row {
display: flex;
align-items: start;
}
+
/* gap: 12px;
align-items: center; */
diff --git a/frontend/src/views/system/pushManagement/components/ConfigManagement/ConfigManagementForm.vue b/frontend/src/views/system/pushManagement/components/ConfigManagement/ConfigManagementForm.vue
index 4835ade9..dba298b1 100644
--- a/frontend/src/views/system/pushManagement/components/ConfigManagement/ConfigManagementForm.vue
+++ b/frontend/src/views/system/pushManagement/components/ConfigManagement/ConfigManagementForm.vue
@@ -1,9 +1,9 @@
-
-
+
+
-
-
-
-
-
-
+
+
-
-
-
-
-
-
-
-
-
- {{ item.stnm }}
-
-
-
- 保存
-
-
-
-
-
-
- 新增一级节点
-
-
-
-
-
-
-
+
+
+
-
- {{ item.stnm }}
-
-
-
- 保存
-
-
-
-
-
-
-
-
-
{{ getNodeTitle(dataRef) }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ v-model:value="formData.baseIdList"
+ mode="multiple"
+ style="width: 100%"
+ placeholder="请选择"
+ :options="baseIdsOption"
+ @change="handleBaseChange"
+ >
+
+
+
+
-
+
cron表达式
-
- {{ item.stnm }}
-
-
-
- 保存
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
diff --git a/frontend/src/views/system/pushManagement/components/ConfigManagement/PushTargetModal.vue b/frontend/src/views/system/pushManagement/components/ConfigManagement/PushTargetModal.vue
new file mode 100644
index 00000000..1fd92357
--- /dev/null
+++ b/frontend/src/views/system/pushManagement/components/ConfigManagement/PushTargetModal.vue
@@ -0,0 +1,198 @@
+
+
+
+
+
+
+
+
+
diff --git a/frontend/src/views/system/pushManagement/components/ConfigManagement/index.vue b/frontend/src/views/system/pushManagement/components/ConfigManagement/index.vue
index 64294dbc..01fc94ce 100644
--- a/frontend/src/views/system/pushManagement/components/ConfigManagement/index.vue
+++ b/frontend/src/views/system/pushManagement/components/ConfigManagement/index.vue
@@ -7,15 +7,30 @@
:handle-add="handleAdd"
@reset="handleReset"
@search-finish="onSearchFinish"
- />
+ /> -->
+
+
+
+
diff --git a/frontend/src/views/system/pushManagement/components/HistoryManagement/PushStatusModal/index.vue b/frontend/src/views/system/pushManagement/components/HistoryManagement/PushStatusModal/index.vue
new file mode 100644
index 00000000..bdde6844
--- /dev/null
+++ b/frontend/src/views/system/pushManagement/components/HistoryManagement/PushStatusModal/index.vue
@@ -0,0 +1,202 @@
+
+
+
+
+
+
+
+
+
+
+
+ 查询
+
+
+
+
+
+
+ {{
+ record.status === '1'
+ ? '推送成功'
+ : record.status === '2'
+ ? '推送失败'
+ : '待推送'
+ }}
+
+
+
+
+
+
+
+
+
diff --git a/frontend/src/views/system/pushManagement/components/HistoryManagement/index.vue b/frontend/src/views/system/pushManagement/components/HistoryManagement/index.vue
index 372b78b1..265111ce 100644
--- a/frontend/src/views/system/pushManagement/components/HistoryManagement/index.vue
+++ b/frontend/src/views/system/pushManagement/components/HistoryManagement/index.vue
@@ -1,208 +1,161 @@
- 推送历史
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ record.pushedCount ?? 0 }}/{{ record.successCount ?? 0 }}/{{
+ record.pendingCount ?? 0
+ }}/{{ record.failCount ?? 0 }}
+
+
+
+ {{ getname(record.status, statusOption) ?? '-' }}
+
编辑推送内容
-
编辑接口
-
新增子图层
-
删除推送情况
-
- handleEnableChange(record, checked)"
- />
-
-
- handleCheckableChange(record, checked)"
- />
-
-
-->
+
+
+
+
+ 类型:
+ {{ pushContentData.type ?? '-' }}
+
+
+ 标题:
+ {{ pushContentData.title ?? '-' }}
+
+
+ 内容:
+ {{
+ pushContentData.content ?? '-'
+ }}
+
+
+ 推送时间:
+ {{ pushContentData.planTime ?? '-' }}
+
+
+ 来源:
+ {{
+ getname(pushContentData.source, statusOption) ?? '-'
+ }}
+
+
+ 关联:
+ {{ pushContentData.relation ?? '-' }}
+
+
+
+
+