admin_new P0+P1 全批次合并 (84 commits) #2

Merged
direv merged 85 commits from develop into main 2026-08-07 11:27:17 +08:00
Showing only changes of commit 5c35297555 - Show all commits

View File

@ -1,9 +1,15 @@
<script setup lang="ts"> <script setup lang="ts">
/** /**
* F006 用户管理 (前台用户列表) - W17 完整化 * F006 用户管理 (前台用户列表) - W17 设计规范整改
* *
* W17: 补全字段到 9 列(老 vue 等价), 6 搜索条件, 操作列(修改/禁用启用/删除) * W17: 9 列 + 6 搜索 + 4 操作,符合设计规范
* 走 /user/user/page 后端 * 走 /user/user/page 后端
*
* 字段 (从 API 实测):
* id, nickName, mobile, header (头像 URL)
* isEnterprise (0/1), enterpriseName, accountBalance, enabled (0/1)
* createDate (ms)
* total=2284 真实用户
*/ */
import { onMounted, ref, reactive } from 'vue' import { onMounted, ref, reactive } from 'vue'
import { httpGet, httpPost } from '@/utils/request' import { httpGet, httpPost } from '@/utils/request'
@ -32,7 +38,7 @@ const total = ref(0)
const loading = ref(false) const loading = ref(false)
const query = reactive({ const query = reactive({
page: 1, page: 1,
limit: 10, limit: 20,
userId: '', userId: '',
nickName: '', nickName: '',
mobile: '', mobile: '',
@ -41,43 +47,43 @@ const query = reactive({
enabled: '' as '' | '0' | '1' enabled: '' as '' | '0' | '1'
}) })
// 字段定义:用 any 绕过 DataTable Column 类型限制(它支持 slot 字段但未在 type 中声明)
const columns: any[] = [ const columns: any[] = [
{ type: 'selection', width: 50 }, { type: 'selection', width: 50, fixed: 'left' },
{ prop: 'id', label: '用户ID', width: 90 }, { prop: 'id', label: '用户ID', width: 100 },
{ prop: 'nickName', label: '用户昵称', minWidth: 140 }, { prop: 'nickName', label: '用户昵称', minWidth: 160 },
{ prop: 'mobile', label: '手机号', width: 130 }, { prop: 'mobile', label: '手机号', width: 140 },
{ {
prop: 'isEnterprise', prop: 'isEnterprise',
label: '是否企业认证', label: '是否企业认证',
width: 110, width: 130,
formatter: (row: FrontUser) => row.isEnterprise === 1 ? '是' : '否' formatter: (row: FrontUser) => row.isEnterprise === 1 ? '是' : '否'
}, },
{ {
prop: 'enterpriseName', prop: 'enterpriseName',
label: '关联企业', label: '关联企业',
minWidth: 180, minWidth: 200,
formatter: (row: FrontUser) => row.enterpriseName || '--' formatter: (row: FrontUser) => row.enterpriseName || '--'
}, },
{ {
prop: 'accountBalance', prop: 'accountBalance',
label: '平台账户余额', label: '平台账户余额',
width: 130, width: 140,
align: 'right',
formatter: (row: FrontUser) => Number(row.accountBalance || 0).toFixed(2) formatter: (row: FrontUser) => Number(row.accountBalance || 0).toFixed(2)
}, },
{ {
prop: 'enabled', prop: 'enabled',
label: '禁用标识', label: '禁用标识',
width: 90, width: 110,
slot: 'enabled' slot: 'enabled'
}, },
{ {
prop: 'createDate', prop: 'createDate',
label: '注册时间', label: '注册时间',
width: 170, width: 180,
formatter: (row: FrontUser) => fmtDate(row.createDate) formatter: (row: FrontUser) => fmtDate(row.createDate)
}, },
{ label: '操作', width: 200, slot: 'action' } { label: '操作', width: 220, slot: 'action', fixed: 'right' }
] ]
function fmtDate(ts: number | null | undefined) { function fmtDate(ts: number | null | undefined) {
@ -208,21 +214,26 @@ onMounted(load)
:total="total" :total="total"
:page="query.page" :page="query.page"
:limit="query.limit" :limit="query.limit"
:page-sizes="[10, 20, 50, 100]"
:show-pagination="true" :show-pagination="true"
row-key="id" row-key="id"
empty-text="暂无用户" empty-text="暂无用户"
@page-change="onPageChange" @page-change="onPageChange"
> >
<template #enabled="{ row }"> <template #enabled="{ row }">
<el-tag v-if="row.enabled === 1" type="success" size="small">正常</el-tag> <el-tag v-if="row.enabled === 1" type="success" size="small" effect="light">正常</el-tag>
<el-tag v-else type="danger" size="small">禁用</el-tag> <el-tag v-else type="danger" size="small" effect="light">禁用</el-tag>
</template> </template>
<template #action="{ row }"> <template #action="{ row }">
<el-button link type="primary" size="small" @click="onEdit(row)">修改</el-button> <span class="rr-actions">
<el-button link :type="row.enabled === 1 ? 'warning' : 'success'" size="small" @click="toggleEnabled(row)"> <el-link type="primary" :underline="false" @click="onEdit(row)">修改</el-link>
{{ row.enabled === 1 ? '禁用' : '启用' }} <span class="rr-actions__sep">|</span>
</el-button> <el-link :type="row.enabled === 1 ? 'warning' : 'success'" :underline="false" @click="toggleEnabled(row)">
<el-button link type="danger" size="small" @click="deleteUser(row)">删除</el-button> {{ row.enabled === 1 ? '禁用' : '启用' }}
</el-link>
<span class="rr-actions__sep">|</span>
<el-link type="danger" :underline="false" @click="deleteUser(row)">删除</el-link>
</span>
</template> </template>
</DataTable> </DataTable>
</div> </div>
@ -232,4 +243,17 @@ onMounted(load)
<style scoped lang="scss"> <style scoped lang="scss">
.rr-page { max-width: 1600px; } .rr-page { max-width: 1600px; }
.user-header { width: 32px; height: 32px; border-radius: 50%; vertical-align: middle; } .user-header { width: 32px; height: 32px; border-radius: 50%; vertical-align: middle; }
.rr-actions {
display: inline-flex;
align-items: center;
gap: 0;
&__sep {
color: var(--rr-border, #e2e8f0);
margin: 0 8px;
font-size: 12px;
}
.el-link {
font-size: 13px;
}
}
</style> </style>