Files
----/后端源码/yifan.action-ai.cn/index/js/workplace.rWkFN-uT.js

727 lines
33 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { _ as _sfc_main$1 } from "./index.vue_vue_type_script_setup_true_lang.DN-P1Gi6.js";
import { C as ElAvatar, r as ElText, T as ElCard, V as ElCol, u as ElEmpty, U as ElRow, a3 as ElDescriptions, a4 as ElDescriptionsItem, t as ElLink, l as ElTooltip, _ as ElTimeline, $ as ElTimelineItem, q as ElTag, h as ElButton, i as ElIcon, a8 as circle_close_default, a9 as question_filled_default, aa as delete_default, E as ElMessage, D as ElMessageBox } from "./element-plus.CkEW9frc.js";
import { J as defineComponent, e9 as useI18n, dY as useRouter, r as ref, t as onMounted, ah as onUnmounted, S as openBlock, _ as createElementBlock, a1 as createBaseVNode, $ as createVNode, a0 as withCtx, aa as toDisplayString, o as unref, a9 as createTextVNode, T as createBlock, H as Fragment, ay as renderList, a8 as createCommentVNode, a7 as resolveDynamicComponent, a2 as normalizeStyle, a3 as normalizeClass, aw as withModifiers, ak as reactive } from "./.pnpm.BW3P1y8f.js";
import { f as useUserStore, N as NoticeAPI } from "./index.CMd5bD1r.js";
import { g as greetings } from "./common.ySZAMJjg.js";
import { q as quickStartManager } from "./quickStartManager.Dn9BdP3l.js";
import { _ as _export_sfc } from "./_plugin-vue_export-helper.1tPrXgE0.js";
import "./echarts.Cg_Ec8L-.js";
import "./codemirror.CvJAcn2d.js";
const _hoisted_1 = { class: "app-container" };
const _hoisted_2 = { class: "flex flex-wrap justify-between items-center" };
const _hoisted_3 = { class: "flex items-center md:mb-0" };
const _hoisted_4 = { class: "text-20px font-bold" };
const _hoisted_5 = { class: "statItem text-14px text-gray-600 text-right" };
const _hoisted_6 = { class: "mt-5px text-20px" };
const _hoisted_7 = { class: "mt-4" };
const _hoisted_8 = { class: "flex items-center" };
const _hoisted_9 = { class: "flex justify-between items-center" };
const _hoisted_10 = { class: "flex justify-between items-center" };
const _hoisted_11 = { class: "bg-[var(--el-fill-color-light)] rounded-lg p-4 border border-[var(--el-border-color)] hover:shadow-md transition-shadow" };
const _hoisted_12 = { class: "flex justify-between items-start mb-2" };
const _hoisted_13 = { class: "flex items-center gap-2" };
const _hoisted_14 = { class: "font-medium text-[var(--el-text-color-primary)]" };
const _hoisted_15 = { class: "text-xs text-[var(--el-text-color-regular)]" };
const _hoisted_16 = { class: "text-sm text-[var(--el-text-color-regular)] mb-3 line-clamp-2" };
const _hoisted_17 = { class: "flex justify-between items-center text-xs" };
const _hoisted_18 = { class: "text-[var(--el-text-color-regular)]" };
const _hoisted_19 = { class: "text-sm truncate text-[var(--el-text-color-regular)]" };
const _hoisted_20 = { class: "flex justify-between items-center" };
const _hoisted_21 = { class: "flex items-center gap-2" };
const welcome = "祝你开心每一天!";
const _sfc_main = /* @__PURE__ */ defineComponent({
...{
name: "Workplace",
inheritAttrs: false
},
__name: "workplace",
setup(__props) {
const userStore = useUserStore();
const timefix = greetings();
const { t } = useI18n();
const router = useRouter();
const noticeList = ref([]);
const quickLinks = ref(quickStartManager.getQuickLinks());
const formatTime = (time) => {
if (!time) return "";
const date = new Date(time);
const now = /* @__PURE__ */ new Date();
const diff = now.getTime() - date.getTime();
const minutes = Math.floor(diff / (1e3 * 60));
const hours = Math.floor(diff / (1e3 * 60 * 60));
const days = Math.floor(diff / (1e3 * 60 * 60 * 24));
if (minutes < 1) return "刚刚";
if (minutes < 60) return `${minutes}分钟前`;
if (hours < 24) return `${hours}小时前`;
if (days < 7) return `${days}天前`;
return date.toLocaleDateString();
};
const goToNotice = () => {
router.push({ name: "Notice" }).catch(() => {
ElMessage.warning(`公告通知跳转失败,请检查路由配置`);
});
};
const getNoticeTypeText = (type) => {
switch (type) {
case "1":
return "通知";
case "2":
return "公告";
default:
return "通知";
}
};
const getNoticeTypeColor = (type) => {
switch (type) {
case "1":
return "primary";
case "2":
return "success";
default:
return "primary";
}
};
const listNotice = async () => {
try {
const response = await NoticeAPI.listNotice({
page_no: 1,
page_size: 10,
status: "0"
// 只获取启用的公告
});
if (response.data.code === 0) {
noticeList.value = response.data.data.items;
}
} catch (error) {
console.error("获取通知公告失败:", error);
}
};
const handleQuickLinkClick = (item) => {
if (item.href) {
router.push(item.href).catch(() => {
ElMessage.warning(`路由 ${item.href} 不存在,请检查配置`);
});
ElMessage.success(`进入:${item.title}`);
} else {
ElMessage.info(`${item.title} 功能待开发`);
}
};
const getRandomColor = () => {
const colors = [
"#FF5733",
"#33FF57",
"#3357FF",
"#FF33E6",
"#FFFF33",
"#33FFFF",
"#FF3333",
"#5733FF",
"#33FFE6",
"#E633FF"
];
const randomIndex = Math.floor(Math.random() * colors.length);
return colors[randomIndex];
};
const handleDeleteLink = (item) => {
ElMessageBox.confirm(`确定要取消收藏"${item.title}"吗?`, "取消收藏确认", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
if (item.id) {
quickStartManager.removeQuickLink(item.id);
ElMessage.success(`已取消收藏:${item.title}`);
}
}).catch(() => {
});
};
const clearBookmarks = () => {
ElMessageBox.confirm("确定要清空收藏吗?", "清空收藏确认", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
quickStartManager.clearQuickLinks();
ElMessage.success("已清空收藏");
}).catch(() => {
});
};
const updateQuickLinks = (links) => {
quickLinks.value = links;
};
onMounted(() => {
listNotice();
quickStartManager.addListener(updateQuickLinks);
});
onUnmounted(() => {
quickStartManager.removeListener(updateQuickLinks);
});
const currentUser = {
avatar: userStore.basicInfo.avatar || "https://gw.alipayobjects.com/zos/rmsportal/BiazfanxmamNRoxxVxka.png",
name: userStore.basicInfo.name || "吴彦祖",
username: userStore.basicInfo.username || "账号信息",
description: userStore.basicInfo.description || "用户说明",
dept_name: userStore.basicInfo.dept_name || "软件专业部",
last_login: userStore.basicInfo.last_login || "2023-01-01 00:00:00"
};
const projectNotice = [
{
id: "xxx1",
title: "Mysql",
avatar: "https://labs.mysql.com/common/themes/sakila/favicon.ico",
description: "最流行的关系型数据库",
updatedAt: "几秒前",
member: "科学搬砖组",
href: "https://www.mysql.com/",
memberLink: ""
},
{
id: "xxx2",
title: "Fastapi",
avatar: "https://fastapi.tiangolo.com/img/favicon.png",
description: "一个现代、快速(高性能)的 web 框架",
updatedAt: "6 年前",
member: "全组都是吴彦祖",
href: "https://fastapi.tiangolo.com/zh/",
memberLink: ""
},
{
id: "xxx3",
title: "Element-plus",
avatar: "https://element-plus.org/images/element-plus-logo-small.svg",
description: "面向设计师和开发者的组件库",
updatedAt: "几秒前",
member: "中二少女团",
href: "https://element-plus.org/zh-CN/",
memberLink: ""
},
{
id: "xxx4",
title: "Vue",
avatar: "https://cn.vuejs.org/logo.svg",
description: "渐进式 JavaScript 框架",
updatedAt: "6 年前",
member: "程序员日常",
href: "https://cn.vuejs.org/",
memberLink: ""
},
{
id: "xxx5",
title: "Vite",
avatar: "https://vitejs.cn/vite3-cn/logo.svg",
description: "Vite 下一代的前端工具链",
updatedAt: "6 年前",
member: "高逼格设计天团",
href: "https://cn.vitejs.dev/",
memberLink: ""
},
{
id: "xxx6",
title: "Python",
avatar: "https://python.p2hp.com/static/favicon.ico",
description: "一种解释型、面向对象类型编程语言",
updatedAt: "6 年前",
member: "骗你来学计算机",
href: "",
memberLink: ""
}
];
const chartOptions = reactive({
tooltip: { trigger: "item" },
legend: { data: ["个人", "团队", "部门"] },
radar: {
shape: "circle",
indicator: [
{ name: "引用", max: 10 },
{ name: "热度", max: 10 },
{ name: "贡献", max: 10 },
{ name: "产量", max: 10 },
{ name: "口碑", max: 10 }
]
},
series: [
{
name: "Budget vs spending",
type: "radar",
areaStyle: {},
symbol: "none",
emphasis: { focus: "self" },
data: [
{ value: [10, 7, 5, 4, 8], name: "个人" },
{ value: [3, 1, 3, 6, 9], name: "团队" },
{ value: [4, 7, 5, 6, 1], name: "部门" }
]
}
]
});
return (_ctx, _cache) => {
const _component_ElAvatar = ElAvatar;
const _component_el_text = ElText;
const _component_ElCard = ElCard;
const _component_ElLink = ElLink;
const _component_el_empty = ElEmpty;
const _component_ElDescriptionsItem = ElDescriptionsItem;
const _component_el_tooltip = ElTooltip;
const _component_ElDescriptions = ElDescriptions;
const _component_ElCol = ElCol;
const _component_ElRow = ElRow;
const _component_ElButton = ElButton;
const _component_el_tag = ElTag;
const _component_ElTimelineItem = ElTimelineItem;
const _component_ElTimeline = ElTimeline;
const _component_el_icon = ElIcon;
const _component_ECharts = _sfc_main$1;
return openBlock(), createElementBlock("div", _hoisted_1, [
createBaseVNode("div", null, [
createVNode(_component_ElCard, { shadow: "hover" }, {
default: withCtx(() => [
createBaseVNode("div", _hoisted_2, [
createBaseVNode("div", _hoisted_3, [
createVNode(_component_ElAvatar, {
size: "large",
src: currentUser.avatar,
class: "mr-20px"
}, null, 8, ["src"]),
createBaseVNode("div", null, [
createBaseVNode("div", _hoisted_4, toDisplayString(unref(timefix)) + toDisplayString(currentUser.name) + "" + toDisplayString(welcome), 1),
createVNode(_component_el_text, null, {
default: withCtx(() => [
createTextVNode(toDisplayString(currentUser.username) + " | " + toDisplayString(currentUser.dept_name) + " | " + toDisplayString(currentUser.description), 1)
]),
_: 1
})
])
]),
createBaseVNode("div", _hoisted_5, [
createVNode(_component_el_text, null, {
default: withCtx(() => [..._cache[3] || (_cache[3] = [
createTextVNode("最近登录时间", -1)
])]),
_: 1
}),
createBaseVNode("div", _hoisted_6, toDisplayString(currentUser.last_login), 1)
])
])
]),
_: 1
})
]),
createBaseVNode("div", _hoisted_7, [
createVNode(_component_ElRow, {
gutter: 16,
justify: "space-between"
}, {
default: withCtx(() => [
createVNode(_component_ElCol, {
xl: 16,
lg: 16,
md: 24,
sm: 24,
xs: 24
}, {
default: withCtx(() => [
createVNode(_component_ElCard, {
shadow: "hover",
title: "进行中的项目"
}, {
header: withCtx(() => [
_cache[5] || (_cache[5] = createBaseVNode("span", { class: "font-bold" }, "进行中的项目", -1)),
createVNode(_component_ElLink, {
href: "",
type: "primary",
underline: "never",
style: { "float": "right" }
}, {
default: withCtx(() => [..._cache[4] || (_cache[4] = [
createTextVNode(" 全部项目 ", -1)
])]),
_: 1
})
]),
default: withCtx(() => [
projectNotice.length === 0 ? (openBlock(), createBlock(_component_el_empty, {
key: 0,
"image-size": 80,
description: "暂无数据"
})) : (openBlock(), createBlock(_component_ElRow, { key: 1 }, {
default: withCtx(() => [
(openBlock(), createElementBlock(Fragment, null, renderList(projectNotice, (item) => {
return createVNode(_component_ElCol, {
key: `card-${item.id}`,
xl: 8,
lg: 8,
md: 12,
sm: 24,
xs: 24
}, {
default: withCtx(() => [
(openBlock(), createBlock(_component_ElCard, {
key: item.id,
shadow: "hover"
}, {
default: withCtx(() => [
createVNode(_component_ElDescriptions, { column: 1 }, {
default: withCtx(() => [
createVNode(_component_ElDescriptionsItem, null, {
default: withCtx(() => [
createBaseVNode("div", _hoisted_8, [
createVNode(_component_ElAvatar, {
src: item.avatar,
size: "small",
class: "mr-20px"
}, null, 8, ["src"]),
createVNode(_component_ElLink, {
href: item.href,
underline: "never"
}, {
default: withCtx(() => [
createTextVNode(toDisplayString(item.title), 1)
]),
_: 2
}, 1032, ["href"])
])
]),
_: 2
}, 1024),
createVNode(_component_ElDescriptionsItem, null, {
default: withCtx(() => [
createVNode(_component_el_tooltip, {
placement: "top",
content: item.description
}, {
default: withCtx(() => [
createVNode(_component_el_text, {
"line-clamp": "1",
class: "truncate-text"
}, {
default: withCtx(() => [
createTextVNode(toDisplayString(item.description), 1)
]),
_: 2
}, 1024)
]),
_: 2
}, 1032, ["content"])
]),
_: 2
}, 1024),
createVNode(_component_ElDescriptionsItem, null, {
default: withCtx(() => [
createBaseVNode("div", _hoisted_9, [
createVNode(_component_ElLink, {
href: item.memberLink,
underline: "never"
}, {
default: withCtx(() => [
createTextVNode(toDisplayString(item.member || ""), 1)
]),
_: 2
}, 1032, ["href"]),
createBaseVNode("span", null, toDisplayString(item.updatedAt), 1)
])
]),
_: 2
}, 1024)
]),
_: 2
}, 1024)
]),
_: 2
}, 1024))
]),
_: 2
}, 1024);
}), 64))
]),
_: 1
}))
]),
_: 1
}),
createVNode(_component_ElCard, {
shadow: "hover",
class: "mt-4"
}, {
header: withCtx(() => [
createBaseVNode("div", _hoisted_10, [
_cache[7] || (_cache[7] = createBaseVNode("span", { class: "font-bold" }, "通知公告", -1)),
createVNode(_component_ElButton, {
type: "primary",
link: "",
onClick: _cache[0] || (_cache[0] = ($event) => goToNotice())
}, {
default: withCtx(() => [..._cache[6] || (_cache[6] = [
createTextVNode("更多", -1)
])]),
_: 1
})
])
]),
default: withCtx(() => [
noticeList.value.length === 0 ? (openBlock(), createBlock(_component_el_empty, {
key: 0,
"image-size": 80,
description: "暂无数据"
})) : createCommentVNode("", true),
createVNode(_component_ElTimeline, null, {
default: withCtx(() => [
(openBlock(true), createElementBlock(Fragment, null, renderList(noticeList.value, (item, index) => {
return openBlock(), createBlock(_component_ElTimelineItem, {
key: item.id,
type: index === 0 ? "primary" : "info"
}, {
default: withCtx(() => {
var _a;
return [
createBaseVNode("div", _hoisted_11, [
createBaseVNode("div", _hoisted_12, [
createBaseVNode("div", _hoisted_13, [
createBaseVNode("span", _hoisted_14, toDisplayString(item.notice_title), 1),
createVNode(_component_el_tag, {
size: "small",
type: getNoticeTypeColor(item.notice_type)
}, {
default: withCtx(() => [
createTextVNode(toDisplayString(getNoticeTypeText(item.notice_type)), 1)
]),
_: 2
}, 1032, ["type"])
]),
createBaseVNode("span", _hoisted_15, toDisplayString(formatTime(item.created_time)), 1)
]),
createBaseVNode("div", _hoisted_16, toDisplayString(item.notice_content), 1),
createBaseVNode("div", _hoisted_17, [
createBaseVNode("span", _hoisted_18, toDisplayString((_a = item.created_by) == null ? void 0 : _a.name) + " 发布 ", 1),
createVNode(_component_el_tooltip, {
placement: "top",
content: item.description || item.notice_content
}, {
default: withCtx(() => [
createVNode(_component_ElButton, {
target: "_blank",
type: "primary",
link: "",
onClick: _cache[1] || (_cache[1] = ($event) => goToNotice())
}, {
default: withCtx(() => [..._cache[8] || (_cache[8] = [
createTextVNode(" 详情↗ ", -1)
])]),
_: 1
})
]),
_: 1
}, 8, ["content"])
])
])
];
}),
_: 2
}, 1032, ["type"]);
}), 128))
]),
_: 1
})
]),
_: 1
}),
createVNode(_component_ElCard, {
shadow: "hover",
class: "mt-4"
}, {
header: withCtx(() => [..._cache[9] || (_cache[9] = [
createBaseVNode("span", { class: "font-bold" }, "团队", -1)
])]),
default: withCtx(() => [
projectNotice.length === 0 ? (openBlock(), createBlock(_component_el_empty, {
key: 0,
"image-size": 80,
description: "暂无数据"
})) : (openBlock(), createBlock(_component_ElRow, {
key: 1,
gutter: 16
}, {
default: withCtx(() => [
(openBlock(), createElementBlock(Fragment, null, renderList(projectNotice, (item) => {
return createVNode(_component_ElCol, {
key: `members-item-${item.id}`,
span: 8,
class: "mb-3"
}, {
default: withCtx(() => [
createVNode(_component_ElLink, {
underline: "never",
href: item.href,
class: "flex items-center hover:bg-[var(--el-fill-color-light)] p-2 rounded transition-colors"
}, {
default: withCtx(() => [
createVNode(_component_ElAvatar, {
src: item.avatar,
size: "small",
class: "mr-2"
}, null, 8, ["src"]),
createBaseVNode("span", _hoisted_19, toDisplayString(item.member), 1)
]),
_: 2
}, 1032, ["href"])
]),
_: 2
}, 1024);
}), 64))
]),
_: 1
}))
]),
_: 1
})
]),
_: 1
}),
createVNode(_component_ElCol, {
xl: 8,
lg: 8,
md: 12,
sm: 12,
xs: 24
}, {
default: withCtx(() => [
createVNode(_component_ElCard, {
shadow: "hover",
class: "mb-4"
}, {
header: withCtx(() => [
createBaseVNode("div", _hoisted_20, [
createBaseVNode("div", _hoisted_21, [
createVNode(_component_el_tooltip, {
content: "快速访问常用功能,标签右键收藏可添加快捷栏菜单。",
placement: "top"
}, {
default: withCtx(() => [
createVNode(_component_el_icon, {
class: "cursor-help",
size: "16"
}, {
default: withCtx(() => [
createVNode(unref(question_filled_default))
]),
_: 1
})
]),
_: 1
}),
_cache[10] || (_cache[10] = createBaseVNode("span", { class: "font-bold" }, "快速开始 / 便捷导航", -1))
]),
createVNode(_component_ElButton, {
size: "small",
type: "danger",
plain: "",
onClick: _cache[2] || (_cache[2] = ($event) => clearBookmarks())
}, {
default: withCtx(() => [
createVNode(_component_el_icon, null, {
default: withCtx(() => [
createVNode(unref(delete_default))
]),
_: 1
}),
createTextVNode(" " + toDisplayString(unref(t)("common.clear")), 1)
]),
_: 1
})
])
]),
default: withCtx(() => [
quickLinks.value.length > 0 ? (openBlock(), createBlock(_component_ElRow, {
key: 0,
gutter: 8
}, {
default: withCtx(() => [
(openBlock(true), createElementBlock(Fragment, null, renderList(quickLinks.value, (item, index) => {
return openBlock(), createBlock(_component_ElCol, {
key: index,
span: 6,
class: "group mb-4"
}, {
default: withCtx(() => [
createVNode(_component_ElButton, {
plain: "",
type: "default",
class: "w-full relative",
onClick: ($event) => handleQuickLinkClick(item)
}, {
default: withCtx(() => [
item.icon && item.icon.startsWith("el-icon") ? (openBlock(), createBlock(_component_el_icon, {
key: 0,
color: getRandomColor()
}, {
default: withCtx(() => [
(openBlock(), createBlock(resolveDynamicComponent(item.icon.replace("el-icon-", ""))))
]),
_: 2
}, 1032, ["color"])) : item.icon ? (openBlock(), createElementBlock("div", {
key: 1,
class: normalizeClass(`i-svg:${item.icon} mr-2`),
style: normalizeStyle({ color: getRandomColor() })
}, null, 6)) : (openBlock(), createElementBlock("div", {
key: 2,
class: normalizeClass(`i-svg:menu mr-2`),
style: normalizeStyle({ color: getRandomColor() })
}, null, 4)),
createBaseVNode("span", null, toDisplayString(item.title), 1),
createVNode(_component_el_icon, {
color: "var(--el-color-danger)",
class: "absolute top-0 right-0 opacity-0 group-hover:opacity-100",
onClick: withModifiers(($event) => handleDeleteLink(item), ["stop"])
}, {
default: withCtx(() => [
createVNode(unref(circle_close_default))
]),
_: 1
}, 8, ["onClick"])
]),
_: 2
}, 1032, ["onClick"])
]),
_: 2
}, 1024);
}), 128))
]),
_: 1
})) : (openBlock(), createBlock(_component_el_empty, {
key: 1,
"image-size": 80,
description: "暂无数据"
}))
]),
_: 1
}),
createVNode(_component_ElCard, {
class: "mb-4 font-bold",
header: "XX 指数"
}, {
default: withCtx(() => [
createVNode(_component_ECharts, {
class: "chart",
options: chartOptions,
height: "450px",
autoresize: "",
"init-options": { renderer: "canvas" }
}, null, 8, ["options"])
]),
_: 1
})
]),
_: 1
})
]),
_: 1
})
])
]);
};
}
});
const workplace = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-e11cce7f"]]);
export {
workplace as default
};