74 lines
2.3 KiB
Vue
74 lines
2.3 KiB
Vue
<script setup lang="ts">
|
||
/**
|
||
* 租户管理
|
||
*
|
||
* 迁移自 TempLate/GERP/pages/Company/tenant.html
|
||
* 原生实现:CompanyTablePage 基类 + tableName='Tenant' + pkField='TenantUUID'
|
||
* + adminBadge:true(特权模式徽章)+ defaultColumns fallback + onView 跳详情
|
||
*
|
||
* 原生 defaultColumns(仅作 fallback 参考,Vue 版走后端 Columns 接口):
|
||
* TenantUUID(主键,隐藏表单) / TenantName(文本) / TenantStatus(0禁用/1启用)
|
||
* / ReviewStatus(0待审核/1已通过/2已拒绝) / TenantExpireTime(日期时间)
|
||
* / ReviewRemark(文本) / CreateTime(创建时间,只读)
|
||
*
|
||
* Vue 版(阶段 1 简化):
|
||
* - server / admin_verify 由 request.ts 拦截器统一注入,页面不拼接 buildApiUrl
|
||
* - 列定义优先走后端 /API/FormAPI/Columns/Tenant(CrudTable 自动处理)
|
||
* 非主实例的 getDefaultColumns fallback 暂不实现(TODO)
|
||
* - AdminBadge 自动根据 server/admin_verify 显示特权横幅(对齐原生 adminBadge:true)
|
||
* - role_scope 细粒度判断暂用 userStore.isAdmin 二分(TODO 待 checkAdmin 接入)
|
||
* - onView 跳 Vue 路由 /company/tenant-detail?TenantUUID=xxx(替代 GERP.Navigate)
|
||
* - 页面标题随 server 变化由 setPageTitle 统一处理
|
||
*/
|
||
import { useRouter } from 'vue-router'
|
||
import CrudTable from '@/components/CrudTable.vue'
|
||
import AdminBadge from '@/components/AdminBadge.vue'
|
||
import { setPageTitle } from '@/utils/serverScope'
|
||
|
||
setPageTitle('租户管理')
|
||
|
||
const router = useRouter()
|
||
|
||
// 租户记录类型(仅声明本页用到的字段)
|
||
interface TenantRow {
|
||
TenantUUID?: string
|
||
TenantName?: string
|
||
[k: string]: unknown
|
||
}
|
||
|
||
// 跳转租户详情页
|
||
function handleView(row: TenantRow): void {
|
||
router.push({
|
||
path: '/company/tenant-detail',
|
||
query: { TenantUUID: row.TenantUUID || '' },
|
||
})
|
||
}
|
||
</script>
|
||
|
||
<template>
|
||
<div class="tenant-page">
|
||
<!-- 管理员特权横幅(仅特权模式显示) -->
|
||
<AdminBadge />
|
||
<CrudTable
|
||
table="Tenant"
|
||
title="租户管理"
|
||
pk-field="TenantUUID"
|
||
searchable
|
||
pageable
|
||
stretch
|
||
selectable
|
||
:on-view="handleView"
|
||
/>
|
||
</div>
|
||
</template>
|
||
|
||
<style scoped lang="scss">
|
||
.tenant-page {
|
||
padding: 20px;
|
||
height: 100%;
|
||
display: flex;
|
||
flex-direction: column;
|
||
box-sizing: border-box;
|
||
}
|
||
</style>
|