This commit is contained in:
zpc 2026-02-04 22:12:49 +08:00
parent 3cbc213ec4
commit cb22990844
6 changed files with 99 additions and 1 deletions

View File

@ -123,4 +123,24 @@ public class DanyeController : BusinessControllerBase
return Error(ex.Code, ex.Message); return Error(ex.Code, ex.Message);
} }
} }
/// <summary>
/// 删除单页
/// </summary>
/// <param name="id">单页ID</param>
/// <returns>操作结果</returns>
[HttpDelete("{id}")]
[BusinessPermission("danye:delete")]
public async Task<IActionResult> DeleteDanye(int id)
{
try
{
var result = await _danyeService.DeleteDanyeAsync(id);
return result ? Ok("删除成功") : Error(BusinessErrorCodes.InternalError, "删除失败");
}
catch (BusinessException ex)
{
return Error(ex.Code, ex.Message);
}
}
} }

View File

@ -147,6 +147,29 @@ public class DanyeService : IDanyeService
return result; return result;
} }
/// <inheritdoc />
public async Task<bool> DeleteDanyeAsync(int id)
{
var danye = await _dbContext.Danyes.FirstOrDefaultAsync(d => d.Id == id);
if (danye == null)
{
throw new BusinessException(BusinessErrorCodes.NotFound, "单页不存在");
}
// 系统预设单页ID 2-20不允许删除
if (IsTitleProtected(id))
{
throw new BusinessException(BusinessErrorCodes.ValidationFailed, "系统预设单页不允许删除");
}
_dbContext.Danyes.Remove(danye);
var result = await _dbContext.SaveChangesAsync() > 0;
_logger.LogInformation("删除单页: Id={Id}, Title={Title}", id, danye.Title);
return result;
}
#region Private Helper Methods #region Private Helper Methods
/// <summary> /// <summary>

View File

@ -42,4 +42,11 @@ public interface IDanyeService
/// <param name="id">单页ID</param> /// <param name="id">单页ID</param>
/// <returns>是否成功</returns> /// <returns>是否成功</returns>
Task<bool> ClearContentAsync(int id); Task<bool> ClearContentAsync(int id);
/// <summary>
/// 删除单页
/// </summary>
/// <param name="id">单页ID</param>
/// <returns>是否成功</returns>
Task<bool> DeleteDanyeAsync(int id);
} }

View File

@ -110,3 +110,15 @@ export function clearDanyeContent(id: number): Promise<ApiResponse<string>> {
method: 'put' method: 'put'
}) })
} }
/**
*
* @param id ID
* @returns
*/
export function deleteDanye(id: number): Promise<ApiResponse<string>> {
return request({
url: `${DANYE_BASE_URL}/${id}`,
method: 'delete'
})
}

View File

@ -27,7 +27,7 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="操作" width="160" align="center" fixed="right"> <el-table-column label="操作" width="200" align="center" fixed="right">
<template #default="{ row }"> <template #default="{ row }">
<el-button type="primary" link size="small" @click="handleEdit(row)"> <el-button type="primary" link size="small" @click="handleEdit(row)">
编辑 编辑
@ -35,6 +35,9 @@
<el-button type="warning" link size="small" @click="handleClear(row)"> <el-button type="warning" link size="small" @click="handleClear(row)">
清空 清空
</el-button> </el-button>
<el-button type="danger" link size="small" @click="handleDelete(row)">
删除
</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@ -55,6 +58,7 @@ const emit = defineEmits<{
(e: 'edit', row: DanyeResponse): void (e: 'edit', row: DanyeResponse): void
(e: 'toggle-optimizer', row: DanyeResponse, value: boolean): void (e: 'toggle-optimizer', row: DanyeResponse, value: boolean): void
(e: 'clear', row: DanyeResponse): void (e: 'clear', row: DanyeResponse): void
(e: 'delete', row: DanyeResponse): void
}>() }>()
const handleEdit = (row: DanyeResponse) => { const handleEdit = (row: DanyeResponse) => {
@ -68,6 +72,10 @@ const handleToggleOptimizer = (row: DanyeResponse, value: boolean) => {
const handleClear = (row: DanyeResponse) => { const handleClear = (row: DanyeResponse) => {
emit('clear', row) emit('clear', row)
} }
const handleDelete = (row: DanyeResponse) => {
emit('delete', row)
}
</script> </script>
<style scoped> <style scoped>

View File

@ -14,6 +14,7 @@
@edit="handleEdit" @edit="handleEdit"
@toggle-optimizer="handleToggleOptimizer" @toggle-optimizer="handleToggleOptimizer"
@clear="handleClear" @clear="handleClear"
@delete="handleDelete"
/> />
</el-card> </el-card>
@ -36,6 +37,7 @@ import {
getDanyeById, getDanyeById,
toggleImageOptimizer, toggleImageOptimizer,
clearDanyeContent, clearDanyeContent,
deleteDanye,
type DanyeResponse, type DanyeResponse,
type DanyeDetailResponse type DanyeDetailResponse
} from '@/api/business/danye' } from '@/api/business/danye'
@ -116,6 +118,32 @@ const handleClear = async (row: DanyeResponse) => {
} }
} }
//
const handleDelete = async (row: DanyeResponse) => {
try {
await ElMessageBox.confirm(
`确定要删除「${row.title}」吗?删除后无法恢复。`,
'删除确认',
{
confirmButtonText: '确定删除',
cancelButtonText: '取消',
type: 'error'
}
)
loading.value = true
await deleteDanye(row.id)
ElMessage.success('删除成功')
fetchData()
} catch (error) {
if (error !== 'cancel') {
ElMessage.error((error as any)?.message || '删除失败')
}
} finally {
loading.value = false
}
}
onMounted(() => { onMounted(() => {
fetchData() fetchData()
}) })