修复文章发布报错

This commit is contained in:
2026-08-20 01:11:43 +08:00
parent 14f2e8b5c1
commit 758f072494
17 changed files with 644 additions and 69 deletions
+23 -8
View File
@@ -489,6 +489,7 @@ h3 {
font-size: 14px;
font-weight: 500;
position: relative;
background: transparent;
html:not(.dark) & {
color: rgba(255, 255, 255, 0.85);
@@ -533,22 +534,40 @@ h3 {
color: #ffffff !important;
}
// 嵌套展开的子菜单容器保持透明,避免 Element Plus 注入的
// --el-menu-bg-color 在二级及以下区域形成不透明背景块;
// 二级 ul 不需要上下内边距
.el-menu--inline {
background: transparent !important;
padding-top: 0 !important;
padding-bottom: 0 !important;
}
// 子菜单样式
.el-sub-menu {
.el-sub-menu__title {
position: relative;
}
&.is-opened .el-sub-menu__title {
background: rgba(255, 255, 255, 0.08) !important;
}
// 展开的父级菜单标题不加背景,背景只留给当前激活的菜单项
.el-menu-item {
padding-left: 48px !important;
font-size: 13px;
}
}
// 二级菜单项缩进 24px
.el-menu--inline > .el-menu-item,
.el-menu--inline > .el-sub-menu > .el-sub-menu__title {
padding-left: 24px !important;
}
// 三级菜单项缩进 48px
.el-menu--inline .el-menu--inline > .el-menu-item,
.el-menu--inline .el-menu--inline > .el-sub-menu > .el-sub-menu__title {
padding-left: 48px !important;
}
// 暗色主题适配
html.dark & {
.el-menu-item.is-active {
@@ -566,10 +585,6 @@ h3 {
background: rgba(255, 255, 255, 0.08) !important;
color: var(--el-color-primary-light-3) !important;
}
.el-sub-menu.is-opened .el-sub-menu__title {
background: rgba(64, 158, 255, 0.08) !important;
}
}
}
@@ -6,6 +6,18 @@
:before-close="handleBeforeClose"
>
<el-form :model="form" :rules="rules" ref="formRef" label-width="80px">
<el-form-item label="是否转载" prop="is_trans">
<el-radio-group v-model="form.is_trans">
<el-radio-button :value="0">否</el-radio-button>
<el-radio-button :value="1">是</el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item label="发布地址" prop="transurl" v-if="form.is_trans === 1">
<el-input v-model="form.transurl" placeholder="请输入转载文章地址" />
</el-form-item>
<el-form-item label="标题" prop="title">
<el-input v-model="form.title" placeholder="请输入文章标题" />
</el-form-item>
@@ -128,17 +140,6 @@
<el-divider></el-divider>
<el-form-item label="是否转载" prop="is_trans">
<el-radio-group v-model="form.is_trans">
<el-radio-button :value="0">否</el-radio-button>
<el-radio-button :value="1">是</el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item label="发布地址" prop="transurl" v-if="form.is_trans === 1">
<el-input v-model="form.transurl" placeholder="请输入转载文章地址" />
</el-form-item>
<el-form-item label="内容" prop="content">
<div class="editor-container">
<UmoEditor v-model="form.content" />
@@ -233,9 +234,14 @@ const rules = {
// 获取分类列表
async function fetchCategories() {
try {
const res = await listCategories();
const res = await listCategories({ page: 1, limit: 1000 });
if (res.code === 200) {
const categories = Array.isArray(res.data) ? res.data : [];
// 兼容两种返回结构:data 为数组 或 data.list 为数组
const categories = Array.isArray(res.data)
? res.data
: Array.isArray(res.data?.list)
? res.data.list
: [];
// 将分类转换为树形结构
cateOptions.value = buildCategoryTree(categories);
}
@@ -452,11 +458,7 @@ async function handleConfirm(status = 1) {
: res;
}
if (
resp &&
resp.code === 200 &&
(resp.message === "success" || resp.msg === "success")
) {
if (resp && resp.code === 200) {
ElMessage.success(
status === 0
? "保存草稿成功"
@@ -87,9 +87,11 @@ const fetchCategories = async () => {
// 根据分类ID获取分类名称
const getCategoryName = (cate) => {
if (!cate) return "无分类";
if (!cate && cate !== 0) return "无分类";
// 确保比较时类型一致
const cateId = Number(cate);
// 传入的不是数字(已经是分类名),直接展示
if (Number.isNaN(cateId)) return String(cate);
const category = categoryOptions.value.find(
(item) => Number(item.id) === cateId,
);
+11 -4
View File
@@ -41,11 +41,12 @@
<el-date-picker
v-model="dateFilter"
type="daterange"
value-format="yyyy-MM-dd"
value-format="YYYY-MM-DD"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
style="width: 240px; margin-right: 10px"
@change="handleFilterChange"
/>
</div>
@@ -232,6 +233,7 @@ const loading = ref(false);
const articleList = ref([]);
const searchQuery = ref("");
const categoryFilter = ref("");
const dateFilter = ref(null);
const categoryOptions = ref([]);
const currentPage = ref(1);
const pageSize = ref(10);
@@ -301,6 +303,8 @@ async function fetchArticleList() {
const params = {
keyword: searchQuery.value,
cate: categoryFilter.value,
startDate: dateFilter.value?.[0] || "",
endDate: dateFilter.value?.[1] || "",
page: currentPage.value,
pageSize: pageSize.value,
};
@@ -360,14 +364,15 @@ function handleEdit(row) {
id: m.id,
title: m.title || "",
author: m.author || "",
cate: m.cate || "",
// 详情接口的 cate 返回的是分类名,回显/预览需要分类ID
cate: m.cate_id ?? m.cate ?? "",
content: m.content || "",
desc: m.desc || "",
publish_time: m.publish_time || null,
_raw: m,
};
} else {
currentRow.value = { ...row };
currentRow.value = { ...row, cate: row.cate_id ?? row.cate };
}
dialogVisible.value = true;
});
@@ -388,7 +393,8 @@ function handleView(row) {
id: m.id,
title: m.title || "",
author: m.author || "",
cate: m.cate || "",
// 详情接口的 cate 返回的是分类名,预览组件按分类ID匹配名称
cate: m.cate_id ?? m.cate ?? "",
content: m.content || "",
desc: m.desc || "",
view_count: m.view_count || 0,
@@ -586,6 +592,7 @@ function handleSearch() {
function handleRefresh() {
searchQuery.value = "";
categoryFilter.value = "";
dateFilter.value = null;
currentPage.value = 1;
fetchArticleList();
}
@@ -229,10 +229,13 @@ const beforeImageUpload = (file: any) => {
// 图片上传成功
const handleImageSuccess = (response: any) => {
if (response.code === 200) {
// code 200=新上传成功,201=文件已存在(直接使用已有链接)
if (response.code === 200 || response.code === 201) {
// 直接保存相对路径,不拼接API_BASE_URL
currentBanner.value.image = response.data.url || response.data.path;
ElMessage.success("图片上传成功");
ElMessage.success(
response.code === 201 ? "文件已存在,直接使用" : "图片上传成功",
);
} else {
ElMessage.error(response.msg || "图片上传失败");
}
@@ -414,10 +414,11 @@ const beforeImageUpload = (file: any) => {
// 图片上传成功
const handleImageSuccess = (response: any) => {
if (response.code === 200) {
// code 200=新上传成功,201=文件已存在(直接使用已有链接)
if (response.code === 200 || response.code === 201) {
// 直接保存相对路径,不拼接API_BASE_URL
currentMenu.value.image = response.data.url || response.data.path;
ElMessage.success('图片上传成功');
ElMessage.success(response.code === 201 ? '文件已存在,直接使用' : '图片上传成功');
} else {
ElMessage.error(response.msg || '图片上传失败');
}
@@ -28,6 +28,8 @@ const isCreated = ref(false)
const options = {
height: '100%',
// umo-editor 会定时触发自动保存(onSave),内容已随表单统一提交,这里给空实现避免控制台报错
onSave: async () => {},
}
const onFileUpload = async (file) => {