- P1 通道:view-ui-plus 锁 1.3.24(A 类 loader + vite /static dev 代理核验,五档/断源降级走查) - P2 回收:删本地 layout.css/icons.css(+bak) 并清 main.ts import;骨架六类对齐 + 品牌色 var(--brand) 化;index CSS 779→393kB - P3 操作列:新增 utils/tableActions.ts(同构 UserBase,7 函数+2 表,无 AUTO_MODE);7 页迁 actionColumn text 形态;旧 operatingHandle/operatingTextHandle 薄封装保留、签名不变 - P4 外观:接入三态头像 avatar.ts+UserAvatar.vue(同步自 YschTheme),顶栏裸 img 替换;外观三键红线零写 - 失效注释订正(layout.vue/def-editor)
This commit is contained in:
@@ -7,6 +7,7 @@ import { Message } from "view-ui-plus";
|
||||
import MyConfirm from "@/components/MyConfirm";
|
||||
import UserSelectInput from "@/components/UserSelectInput.vue";
|
||||
import { flowApi } from "@/api/module/flow";
|
||||
import { actionColumn } from "@/utils/tableActions";
|
||||
import Utils from "@/utils";
|
||||
|
||||
const tab = ref("apps");
|
||||
@@ -91,22 +92,16 @@ const deptColumns = [
|
||||
h("Tag", { props: { color: p.row.status === 0 ? "green" : "gray" } },
|
||||
() => (p.row.status === 0 ? "启用" : "停用")),
|
||||
},
|
||||
{
|
||||
title: "操作",
|
||||
width: 260,
|
||||
align: "center",
|
||||
render: (h: any, p: any) => [
|
||||
Utils.operatingHandle(h, "成员", "icon-yonghu", () => onMembers(p.row)),
|
||||
h("span", { style: "display:inline-block;width:10px" }),
|
||||
Utils.operatingHandle(h, "改名", "icon-edit", () => onRename(p.row)),
|
||||
h("span", { style: "display:inline-block;width:10px" }),
|
||||
p.row.status === 0
|
||||
? Utils.operatingHandle(h, "停用", "icon-stop", () => onDeptStatus(p.row, false))
|
||||
: Utils.operatingHandle(h, "启用", "icon-play", () => onDeptStatus(p.row, true)),
|
||||
h("span", { style: "display:inline-block;width:10px" }),
|
||||
Utils.operatingHandle(h, "删除", "icon-shanchu", () => onDelete(p.row)),
|
||||
actionColumn(
|
||||
[
|
||||
{ key: "members", label: "成员", icon: "icon-yonghu", on: (r: any) => onMembers(r) },
|
||||
{ key: "rename", label: "改名", icon: "icon-edit", on: (r: any) => onRename(r) },
|
||||
{ key: "disable", label: "停用", icon: "icon-stop", on: (r: any) => onDeptStatus(r, false), when: (r: any) => r.status === 0, danger: true },
|
||||
{ key: "enable", label: "启用", icon: "icon-play", on: (r: any) => onDeptStatus(r, true), when: (r: any) => r.status !== 0 },
|
||||
{ key: "del", label: "删除", icon: "icon-shanchu", on: (r: any) => onDelete(r), danger: true },
|
||||
],
|
||||
},
|
||||
{ mode: "text", width: 180 },
|
||||
),
|
||||
];
|
||||
|
||||
async function loadDepts() {
|
||||
@@ -361,7 +356,7 @@ onMounted(() => {
|
||||
<Table :columns="[
|
||||
{ title: '用户ID', key: 'userId', width: 100 },
|
||||
{ title: '姓名', key: 'userName' },
|
||||
{ title: '操作', width: 90, align: 'center', render: (h, p) => Utils.operatingHandle(h, '移除', 'icon-shanchu', () => onMemberRemove(p.row)) },
|
||||
actionColumn([{ key: 'remove', label: '移除', icon: 'icon-shanchu', on: (r: any) => onMemberRemove(r), danger: true }], { mode: 'text', width: 90 }),
|
||||
]" :data="members" :loading="memberLoading" size="small" max-height="360" no-data-text="暂无成员" />
|
||||
<template #footer>
|
||||
<Button @click="memberVisible = false">关闭</Button>
|
||||
|
||||
@@ -7,6 +7,7 @@ import MyConfirm from "@/components/MyConfirm";
|
||||
import TablePageAlovaNew from "@/components/TablePageAlovaNew.vue";
|
||||
import { OperatorEnum } from "@/types";
|
||||
import { flowApi } from "@/api/module/flow";
|
||||
import { actionColumn } from "@/utils/tableActions";
|
||||
import Utils from "@/utils";
|
||||
|
||||
const LOG_STATUS: Record<number, string> = { 0: "待推/重试中", 1: "成功", 2: "死信" };
|
||||
@@ -29,10 +30,14 @@ const regColumns = [
|
||||
{ title: "回调地址", key: "callbackUrl", minWidth: 240 },
|
||||
{ title: "订阅事件", key: "eventTypes", width: 200, render: (h: any, p: any) => h("span", p.row.eventTypes || "全部") },
|
||||
{ title: "状态", width: 80, align: "center", render: (h: any, p: any) => h("Tag", { color: p.row.status === 0 ? "green" : "gray" }, () => (p.row.status === 0 ? "启用" : "停用")) },
|
||||
{ title: "操作", width: 140, align: "center", fixed: "right", render: (h: any, p: any) => [
|
||||
Utils.operatingHandle(h, p.row.status === 0 ? "停用" : "启用", p.row.status === 0 ? "icon-stop" : "icon-shiyong", () => onRegStatus(p.row, p.row.status === 0)),
|
||||
Utils.operatingHandle(h, "重置secret", "icon-shezhi", () => onResetSecret(p.row)),
|
||||
] },
|
||||
actionColumn(
|
||||
[
|
||||
{ key: "disable", label: "停用", icon: "icon-stop", on: (r: any) => onRegStatus(r, true), when: (r: any) => r.status === 0, danger: true },
|
||||
{ key: "enable", label: "启用", icon: "icon-shiyong", on: (r: any) => onRegStatus(r, false), when: (r: any) => r.status !== 0 },
|
||||
{ key: "resetSecret", label: "重置secret", icon: "icon-shezhi", on: (r: any) => onResetSecret(r) },
|
||||
],
|
||||
{ mode: "text", width: 140, fixed: "right" },
|
||||
),
|
||||
];
|
||||
|
||||
// ---- 推送日志 ----
|
||||
@@ -64,8 +69,7 @@ const hungColumns = [
|
||||
{ title: "重试", key: "retryCount", width: 70, align: "center", render: (h: any, p: any) => h("Tag", { color: "orange" }, () => `${p.row.retryCount} 次`) },
|
||||
{ title: "末次结果", key: "lastError", minWidth: 220, render: (h: any, p: any) => h("span", p.row.lastError || p.row.lastHttpStatus || "-") },
|
||||
{ title: "下次重推", width: 160, render: (h: any, p: any) => h("span", (p.row.nextRetryTime || "").replace("T", " ") || "-") },
|
||||
{ title: "操作", width: 120, align: "center", fixed: "right", render: (h: any, p: any) =>
|
||||
Utils.operatingHandle(h, "标记死信", "icon-ashbin", () => onMarkDead(p.row)) },
|
||||
actionColumn([{ key: "markDead", label: "标记死信", icon: "icon-ashbin", on: (r: any) => onMarkDead(r), danger: true }], { mode: "text", width: 120, fixed: "right" }),
|
||||
];
|
||||
|
||||
async function loadRegs() {
|
||||
|
||||
@@ -8,6 +8,7 @@ import { Message } from "view-ui-plus";
|
||||
import MyConfirm from "@/components/MyConfirm";
|
||||
import SourceDrawer from "@/views/flow/components/SourceDrawer.vue";
|
||||
import { flowApi } from "@/api/module/flow";
|
||||
import { actionColumn } from "@/utils/tableActions";
|
||||
import Utils from "@/utils";
|
||||
|
||||
const router = useRouter();
|
||||
@@ -40,26 +41,24 @@ const columns = [
|
||||
} },
|
||||
{ title: "GUID", key: "flowGuid", width: 200 },
|
||||
{ title: "发布时间", width: 160, render: (h: any, p: any) => h("span", (p.row.publishTime || "").replace("T", " ") || "-") },
|
||||
{ title: "操作", width: 310, align: "center", fixed: "right", render: (h: any, p: any) => {
|
||||
const btns: any[] = [];
|
||||
if (p.row.status === 0) {
|
||||
btns.push(Utils.operatingHandle(h, "编辑", "icon-edit", () => onEdit(p.row)));
|
||||
btns.push(Utils.operatingHandle(h, "发布", "icon-fasong", () => onPublish(p.row)));
|
||||
} else if (p.row.status === 1) {
|
||||
btns.push(Utils.operatingHandle(h, "升版本", "icon-tianjia", () => onNewVersion(p.row)));
|
||||
btns.push(Utils.operatingHandle(h, "停用", "icon-stop", () => onOffline(p.row)));
|
||||
} else if (p.row.status === 2) {
|
||||
actionColumn(
|
||||
[
|
||||
{ key: "edit", label: "编辑", icon: "icon-edit", on: (r: any) => onEdit(r), when: (r: any) => r.status === 0 },
|
||||
{ key: "publish", label: "发布", icon: "icon-fasong", on: (r: any) => onPublish(r), when: (r: any) => r.status === 0 },
|
||||
{ key: "newVersion", label: "升版本", icon: "icon-tianjia", on: (r: any) => onNewVersion(r), when: (r: any) => r.status === 1 },
|
||||
// 停用:破坏性动作(已发布→停用),danger 沉底并进「更多」
|
||||
{ key: "offline", label: "停用", icon: "icon-stop", on: (r: any) => onOffline(r), when: (r: any) => r.status === 1, danger: true },
|
||||
// 与「停用」对称的专用启用通道(后端 /def/enable:仅停用版→已发布,重跑发布校验;
|
||||
// 草稿不走这里,草稿用「发布」)
|
||||
btns.push(Utils.operatingHandle(h, "启用", "icon-play", () => onEnable(p.row)));
|
||||
}
|
||||
// 元数据原地编辑(2026-10-10 议题2):改名称/归属应用不升版本(含已发布/停用)
|
||||
btns.push(Utils.operatingHandle(h, "编辑信息", "icon-bianji", () => onEditMeta(p.row)));
|
||||
btns.push(Utils.operatingHandle(h, "图示", "icon-tupian", () => onDiagram(p.row)));
|
||||
btns.push(Utils.operatingHandle(h, "源码", "icon-liebiao", () => onSource(p.row)));
|
||||
btns.push(Utils.operatingHandle(h, "版本历史", "icon-shijian", () => onVersions(p.row)));
|
||||
return btns;
|
||||
} },
|
||||
{ key: "enable", label: "启用", icon: "icon-play", on: (r: any) => onEnable(r), when: (r: any) => r.status === 2 },
|
||||
// 元数据原地编辑(2026-10-10 议题2):改名称/归属应用不升版本(含已发布/停用)
|
||||
{ key: "editMeta", label: "编辑信息", icon: "icon-bianji", on: (r: any) => onEditMeta(r) },
|
||||
{ key: "diagram", label: "图示", icon: "icon-tupian", on: (r: any) => onDiagram(r) },
|
||||
{ key: "source", label: "源码", icon: "icon-liebiao", on: (r: any) => onSource(r) },
|
||||
{ key: "versions", label: "版本历史", icon: "icon-shijian", on: (r: any) => onVersions(r) },
|
||||
],
|
||||
{ mode: "text", width: 180, fixed: "right" },
|
||||
),
|
||||
];
|
||||
|
||||
async function load() {
|
||||
|
||||
@@ -7,6 +7,7 @@ import MyConfirm from "@/components/MyConfirm";
|
||||
import { OperatorEnum } from "@/types";
|
||||
import TablePageAlovaNew from "@/components/TablePageAlovaNew.vue";
|
||||
import { flowApi, INSTANCE_STATUS, INSTANCE_STATUS_COLOR } from "@/api/module/flow";
|
||||
import { actionColumn } from "@/utils/tableActions";
|
||||
import Utils from "@/utils";
|
||||
|
||||
const router = useRouter();
|
||||
@@ -22,14 +23,14 @@ const columns = [
|
||||
h("Tag", { color: INSTANCE_STATUS_COLOR[p.row.status] || "gray" }, () => INSTANCE_STATUS[p.row.status] || p.row.status) },
|
||||
{ title: "提交人", key: "submitterName", width: 100 },
|
||||
{ title: "提交时间", width: 160, render: (h: any, p: any) => h("span", (p.row.submitTime || "").replace("T", " ")) },
|
||||
{ title: "操作", width: 170, align: "center", fixed: "right", render: (h: any, p: any) => [
|
||||
Utils.operatingHandle(h, "详情", "icon-browse", () => router.push(`/instance/${p.row.id}?pid=102`)),
|
||||
h("span", { style: "display:inline-block;width:10px" }),
|
||||
// 仅审批中的办件可能挂在条件分支节点(重跑入口对非挂起办件会得到业务错提示)
|
||||
p.row.status === 10
|
||||
? Utils.operatingHandle(h, "重跑路由", "icon-play", () => onReroute(p.row))
|
||||
: h("span"),
|
||||
] },
|
||||
actionColumn(
|
||||
[
|
||||
{ key: "detail", label: "详情", icon: "icon-browse", on: (r: any) => router.push(`/instance/${r.id}?pid=102`) },
|
||||
// 仅审批中的办件可能挂在条件分支节点(重跑入口对非挂起办件会得到业务错提示)
|
||||
{ key: "reroute", label: "重跑路由", icon: "icon-play", on: (r: any) => onReroute(r), when: (r: any) => r.status === 10 },
|
||||
],
|
||||
{ mode: "text", width: 170, fixed: "right" },
|
||||
),
|
||||
];
|
||||
|
||||
/** 重跑路由(2026-09-24 §4.4):重新调判断服务,成功即按出口续走;仍失败回业务错(办件继续挂起) */
|
||||
|
||||
@@ -6,6 +6,7 @@ import { ref, onMounted } from "vue";
|
||||
import { Message } from "view-ui-plus";
|
||||
import MyConfirm from "@/components/MyConfirm";
|
||||
import { flowApi } from "@/api/module/flow";
|
||||
import { actionColumn } from "@/utils/tableActions";
|
||||
import Utils from "@/utils";
|
||||
|
||||
const loading = ref(false);
|
||||
@@ -30,19 +31,14 @@ const columns = [
|
||||
render: (h: any, p: any) =>
|
||||
h("Tag", { color: p.row.status === 1 ? "green" : "gray" }, () => (p.row.status === 1 ? "启用" : "停用")),
|
||||
},
|
||||
{
|
||||
title: "操作",
|
||||
width: 150,
|
||||
align: "center",
|
||||
fixed: "right",
|
||||
render: (h: any, p: any) => [
|
||||
Utils.operatingHandle(h, "编辑", "icon-edit", () => onEdit(p.row)),
|
||||
h("span", { style: "display:inline-block;width:10px" }),
|
||||
p.row.status === 1
|
||||
? Utils.operatingHandle(h, "停用", "icon-stop", () => onDisable(p.row))
|
||||
: Utils.operatingHandle(h, "启用", "icon-play", () => onEnable(p.row)),
|
||||
actionColumn(
|
||||
[
|
||||
{ key: "edit", label: "编辑", icon: "icon-edit", on: (r: any) => onEdit(r) },
|
||||
{ key: "disable", label: "停用", icon: "icon-stop", on: (r: any) => onDisable(r), when: (r: any) => r.status === 1, danger: true },
|
||||
{ key: "enable", label: "启用", icon: "icon-play", on: (r: any) => onEnable(r), when: (r: any) => r.status !== 1 },
|
||||
],
|
||||
},
|
||||
{ mode: "text", width: 150, fixed: "right" },
|
||||
),
|
||||
];
|
||||
|
||||
async function load() {
|
||||
|
||||
@@ -55,7 +55,7 @@ function onOpen(e: MouseEvent): void {
|
||||
transition: all 0.15s;
|
||||
}
|
||||
.node-card:hover {
|
||||
border-color: #2d8cf0;
|
||||
border-color: var(--brand);
|
||||
}
|
||||
.node-card.error {
|
||||
border-color: #ed4014;
|
||||
@@ -72,7 +72,7 @@ function onOpen(e: MouseEvent): void {
|
||||
height: 26px;
|
||||
border-radius: 6px;
|
||||
background: #e8f3ff;
|
||||
color: #2d8cf0;
|
||||
color: var(--brand);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
|
||||
@@ -90,7 +90,7 @@ function renameOutlet(i: number, v: string): void {
|
||||
}
|
||||
.ol-title {
|
||||
text-align: center;
|
||||
color: #2d8cf0;
|
||||
color: var(--brand);
|
||||
font-weight: 600;
|
||||
font-size: 13px;
|
||||
cursor: pointer;
|
||||
@@ -139,7 +139,7 @@ function renameOutlet(i: number, v: string): void {
|
||||
}
|
||||
.ol-col-no {
|
||||
flex: none;
|
||||
color: #2d8cf0;
|
||||
color: var(--brand);
|
||||
font-weight: 600;
|
||||
font-size: 13px;
|
||||
}
|
||||
@@ -150,12 +150,12 @@ function renameOutlet(i: number, v: string): void {
|
||||
border-radius: 6px;
|
||||
padding: 2px 8px;
|
||||
font-size: 12px;
|
||||
color: #2d8cf0;
|
||||
color: var(--brand);
|
||||
font-weight: 600;
|
||||
}
|
||||
.ol-outlet:focus {
|
||||
outline: none;
|
||||
border-color: #2d8cf0;
|
||||
border-color: var(--brand);
|
||||
}
|
||||
.ol-col-del {
|
||||
flex: none;
|
||||
@@ -170,8 +170,8 @@ function renameOutlet(i: number, v: string): void {
|
||||
.ol-add {
|
||||
margin-top: 12px;
|
||||
border-style: dashed;
|
||||
color: #2d8cf0;
|
||||
border-color: #2d8cf0;
|
||||
color: var(--brand);
|
||||
border-color: var(--brand);
|
||||
background: transparent;
|
||||
width: auto;
|
||||
padding: 0 16px;
|
||||
@@ -182,7 +182,7 @@ function renameOutlet(i: number, v: string): void {
|
||||
.ol-add:hover {
|
||||
background: #f0faff;
|
||||
color: #2b85e4;
|
||||
border-color: #2d8cf0;
|
||||
border-color: var(--brand);
|
||||
}
|
||||
.ol-issue {
|
||||
text-align: center;
|
||||
|
||||
@@ -75,8 +75,8 @@ function pick(kind: "approval" | "parallel" | "notify" | "condition"): void {
|
||||
height: 22px;
|
||||
border-radius: 50%;
|
||||
background: #fff;
|
||||
border: 1px solid #2d8cf0;
|
||||
color: #2d8cf0;
|
||||
border: 1px solid var(--brand);
|
||||
color: var(--brand);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
@@ -90,7 +90,7 @@ function pick(kind: "approval" | "parallel" | "notify" | "condition"): void {
|
||||
}
|
||||
.plus-wrap:hover .plus-btn {
|
||||
opacity: 1;
|
||||
background: #2d8cf0;
|
||||
background: var(--brand);
|
||||
color: #fff;
|
||||
box-shadow: 0 0 0 4px rgba(45, 140, 240, 0.15);
|
||||
}
|
||||
@@ -117,7 +117,7 @@ function pick(kind: "approval" | "parallel" | "notify" | "condition"): void {
|
||||
font-size: 12px;
|
||||
}
|
||||
.mi-icon.approval {
|
||||
background: #2d8cf0;
|
||||
background: var(--brand);
|
||||
}
|
||||
.mi-icon.notify {
|
||||
background: #13a8a8;
|
||||
|
||||
@@ -536,7 +536,7 @@ onUnmounted(() => window.removeEventListener("beforeunload", onBeforeUnload));
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
/* 撑满布局壳可视区:100vh − 56(顶栏) − 56(面包屑 .path-nav) − 24(main-container 下内边距)
|
||||
(实测值,见 layout.css .header-container/.path-nav/.base-wrap-main .main-container) */
|
||||
(实测值,见通道 base.layout.css .header-container/.path-nav/.base-wrap-main .main-container) */
|
||||
height: calc(100vh - 136px);
|
||||
background: #f5f7fa;
|
||||
}
|
||||
@@ -562,7 +562,7 @@ onUnmounted(() => window.removeEventListener("beforeunload", onBeforeUnload));
|
||||
font-size: 18px;
|
||||
}
|
||||
.hd-back:hover {
|
||||
color: #2d8cf0;
|
||||
color: var(--brand);
|
||||
}
|
||||
.hd-title {
|
||||
font-size: 15px;
|
||||
|
||||
Reference in New Issue
Block a user