task-283(后台迁移收尾/发布): admin-vue 后台工程入库 + Flask 后台整体退役

- 新后台 admin-frontend-vue 整工程入库(base=/admin-vue/、History 路由、Nginx 静态托管方案与 verify-dist 校验)
- Java AdminConsoleController 改为入口重定向: /admin|/admin.html、/login|/login.html -> /admin-vue/; 删除 classpath:static 旧 admin.html/login.html 单页与 admin.js 副本
- Flask 后台整体退役: 删除 admin_api/auth/main 蓝图、web_source 页面、static 脚本与 admin 相关测试; app.py 收敛为仅注册 version_bp(/api/version、/api/version/latest, 供桌面端更新检查)
- AdminApiGuardFilterTest 豁免样例路径 /admin.html -> /admin-vue/
This commit is contained in:
2026-09-06 10:41:47 +08:00
parent 6bd935dc6b
commit 4c88964473
71 changed files with 974 additions and 39150 deletions
@@ -18,14 +18,19 @@ const isSuperAdmin = computed(() => session.isSuperAdmin)
const currentUserId = computed(() => session.user?.id ?? null)
// 客户端分页:全量拉取后按页切片展示。
const page = ref(1)
const pageSize = 10
const pageSize = ref(10)
const total = computed(() => rows.value.length)
const pagedRows = computed(() => rows.value.slice((page.value - 1) * pageSize, page.value * pageSize))
const pagedRows = computed(() => rows.value.slice((page.value - 1) * pageSize.value, page.value * pageSize.value))
function changePage(p: number) {
page.value = p
}
function changeSize(size: number) {
pageSize.value = size
page.value = 1
}
function canEditOf(group: ShopGroupItem): boolean {
if (isSuperAdmin.value) return true
return currentUserId.value != null && group.leaderUserId != null && currentUserId.value === group.leaderUserId
@@ -75,7 +80,6 @@ onMounted(loadGroups)
<h2>数据权限分组</h2>
<p>管理店铺数据访问分组和组员范围组长不可更改组员为普通账号</p>
</div>
<el-button type="primary" @click="openCreate">新建分组</el-button>
</div>
<el-row :gutter="12" style="margin-bottom: 12px">
<el-col :span="8">
@@ -96,8 +100,10 @@ onMounted(loadGroups)
</el-col>
</el-row>
<el-card shadow="never">
<div class="table-toolbar">
<el-button type="primary" @click="openCreate">新建分组</el-button>
</div>
<el-table v-loading="loading" :data="pagedRows" stripe>
<el-table-column type="index" label="序号" min-width="80" />
<el-table-column prop="name" label="分组名称" min-width="180" />
<el-table-column prop="leaderUsername" label="组长" min-width="170" />
<el-table-column prop="memberCount" label="组员数量" min-width="100" />
@@ -123,7 +129,7 @@ onMounted(loadGroups)
</el-table-column>
</el-table>
<div class="table-footer">
<el-pagination background layout="prev, pager, next, jumper" :total="total" :page-size="pageSize" :current-page="page" @current-change="changePage" />
<el-pagination background layout="sizes, prev, pager, next, jumper" :total="total" :page-size="pageSize" :page-sizes="[10, 20, 50, 100]" :current-page="page" @current-change="changePage" @size-change="changeSize" />
</div>
</el-card>
<GroupEditorDialog
@@ -24,13 +24,18 @@ const loading = ref(false)
const rows = ref<MenuManageNode[]>([])
// 客户端分页:列表展示统一带分页组件。
const page = ref(1)
const pageSize = 10
const pageSize = ref(10)
const total = computed(() => rows.value.length)
const pagedRows = computed(() => rows.value.slice((page.value - 1) * pageSize, page.value * pageSize))
const pagedRows = computed(() => rows.value.slice((page.value - 1) * pageSize.value, page.value * pageSize.value))
function changePage(p: number) {
page.value = p
}
function changeSize(size: number) {
pageSize.value = size
page.value = 1
}
const createVisible = ref(false)
const saving = ref(false)
const editingNode = ref<MenuManageNode | null>(null)
@@ -186,10 +191,12 @@ onMounted(loadMenus)
<h2>菜单管理</h2>
<p>维护后台菜单树和页面路由权限粒度仅到菜单/页面</p>
</div>
<el-button type="primary" @click="openCreate">新增菜单</el-button>
</div>
<el-card shadow="never">
<p class="menu-drag-tip">拖动每行左侧的手柄可调整同级菜单的显示顺序松开后自动保存</p>
<div class="table-toolbar">
<el-button type="primary" @click="openCreate">新增菜单</el-button>
</div>
<el-table v-loading="loading" :data="pagedRows" row-key="id" default-expand-all stripe>
<el-table-column label="排序" min-width="64">
<template #default="{ row }">
@@ -205,7 +212,6 @@ onMounted(loadMenus)
></span>
</template>
</el-table-column>
<el-table-column prop="id" label="ID" min-width="70" />
<el-table-column prop="name" label="菜单名称" min-width="180" />
<el-table-column label="菜单类型" min-width="110">
<template #default="{ row }">
@@ -230,11 +236,13 @@ onMounted(loadMenus)
<div class="table-footer">
<el-pagination
background
layout="prev, pager, next, jumper"
layout="sizes, prev, pager, next, jumper"
:total="total"
:page-size="pageSize"
:page-sizes="[10, 20, 50, 100]"
:current-page="page"
@current-change="changePage"
@size-change="changeSize"
/>
</div>
</el-card>
@@ -104,6 +104,12 @@ function changePage(page: number) {
void loadUsers()
}
function changeSize(size: number) {
filters.pageSize = size
filters.page = 1
void loadUsers()
}
onMounted(loadUsers)
</script>
@@ -114,7 +120,6 @@ onMounted(loadUsers)
<h2>用户管理</h2>
<p>当前没有开放注册入口仅管理员可在此创建用户层级关系超级管理员 -&gt; 管理员 -&gt; 普通账号</p>
</div>
<el-button type="primary" @click="openCreate">新建用户</el-button>
</div>
<el-card shadow="never" class="filter-card">
<el-form inline @submit.prevent="search">
@@ -156,8 +161,10 @@ onMounted(loadUsers)
<el-button link type="primary" @click="retry">重试</el-button>
</template>
</el-alert>
<div class="table-toolbar">
<el-button type="primary" @click="openCreate">新建用户</el-button>
</div>
<el-table v-loading="loading" :data="rows" stripe :empty-text="userListEmptyHint()">
<el-table-column prop="id" label="ID" min-width="90" />
<el-table-column prop="username" label="用户名" min-width="180" />
<el-table-column label="角色" min-width="140">
<template #default="{ row }">
@@ -186,11 +193,13 @@ onMounted(loadUsers)
<span> {{ total }} </span>
<el-pagination
background
layout="prev, pager, next, jumper"
layout="sizes, prev, pager, next, jumper"
:page-size="filters.pageSize"
:current-page="filters.page"
:page-sizes="[10, 20, 50, 100]"
:total="total"
@current-change="changePage"
@size-change="changeSize"
/>
</div>
</el-card>