This commit is contained in:
@@ -47,7 +47,7 @@
|
||||
<ElDialog
|
||||
v-model="dialogVisible"
|
||||
:title="dialogType === 'add' ? '新增店铺' : '编辑店铺'"
|
||||
width="800px"
|
||||
width="50%"
|
||||
>
|
||||
<ElForm ref="formRef" :model="formData" :rules="rules" label-width="100px">
|
||||
<ElRow :gutter="20">
|
||||
@@ -162,6 +162,32 @@
|
||||
/>
|
||||
</ElFormItem>
|
||||
</ElCol>
|
||||
<ElCol :span="12">
|
||||
<ElFormItem label="默认角色" prop="default_role_id">
|
||||
<ElSelect
|
||||
v-model="formData.default_role_id"
|
||||
placeholder="请选择默认角色"
|
||||
filterable
|
||||
remote
|
||||
:remote-method="searchDefaultRoles"
|
||||
:loading="defaultRoleLoading"
|
||||
clearable
|
||||
style="width: 100%"
|
||||
>
|
||||
<ElOption
|
||||
v-for="role in defaultRoleList"
|
||||
:key="role.ID"
|
||||
:label="role.role_name"
|
||||
:value="role.ID"
|
||||
>
|
||||
<div style="display: flex; justify-content: space-between; align-items: center;">
|
||||
<span>{{ role.role_name }}</span>
|
||||
<ElTag type="success" size="small">客户角色</ElTag>
|
||||
</div>
|
||||
</ElOption>
|
||||
</ElSelect>
|
||||
</ElFormItem>
|
||||
</ElCol>
|
||||
</ElRow>
|
||||
</template>
|
||||
|
||||
@@ -195,42 +221,38 @@
|
||||
<ElDialog
|
||||
v-model="defaultRolesDialogVisible"
|
||||
:title="`设置默认角色 - ${currentShop?.shop_name || ''}`"
|
||||
width="800px"
|
||||
width="50%"
|
||||
>
|
||||
<div v-loading="defaultRolesLoading">
|
||||
<!-- 当前默认角色列表 -->
|
||||
<div class="default-roles-section">
|
||||
<div class="section-header">
|
||||
<span style="color:white;">当前默认角色</span>
|
||||
<ElButton type="primary" @click="showAddRoleDialog">
|
||||
添加角色
|
||||
</ElButton>
|
||||
<span style="color: white">当前默认角色</span>
|
||||
<ElButton type="primary" @click="showAddRoleDialog"> 设置默认角色 </ElButton>
|
||||
</div>
|
||||
<ElTable :data="currentDefaultRoles" border stripe style="margin-top: 12px">
|
||||
<ElTableColumn prop="role_name" label="角色名称" width="150" />
|
||||
<ElTableColumn prop="role_desc" label="角色描述" min-width="200" />
|
||||
<ElTableColumn prop="status" label="状态" width="80">
|
||||
<template #default="{ row }">
|
||||
<ElTag :type="row.status === CommonStatus.ENABLED ? 'success' : 'info'" size="small">
|
||||
<ElTag
|
||||
:type="row.status === CommonStatus.ENABLED ? 'success' : 'info'"
|
||||
size="small"
|
||||
>
|
||||
{{ getStatusText(row.status) }}
|
||||
</ElTag>
|
||||
</template>
|
||||
</ElTableColumn>
|
||||
<ElTableColumn label="操作" width="100" fixed="right">
|
||||
<template #default="{ row }">
|
||||
<ElButton
|
||||
type="danger"
|
||||
text
|
||||
size="small"
|
||||
@click="handleDeleteDefaultRole(row)"
|
||||
>
|
||||
<ElButton type="danger" text size="small" @click="handleDeleteDefaultRole(row)">
|
||||
删除
|
||||
</ElButton>
|
||||
</template>
|
||||
</ElTableColumn>
|
||||
<template #empty>
|
||||
<div style="padding: 20px 0; color: #909399;">
|
||||
暂无默认角色,请点击"添加角色"按钮进行配置
|
||||
<div style="padding: 20px 0; color: #909399">
|
||||
暂无默认角色,请点击"设置默认角色"按钮进行配置
|
||||
</div>
|
||||
</template>
|
||||
</ElTable>
|
||||
@@ -243,19 +265,13 @@
|
||||
</template>
|
||||
</ElDialog>
|
||||
|
||||
<!-- 添加角色对话框 -->
|
||||
<ElDialog
|
||||
v-model="addRoleDialogVisible"
|
||||
title="添加默认角色"
|
||||
width="600px"
|
||||
append-to-body
|
||||
>
|
||||
<!-- 设置默认角色对话框 -->
|
||||
<ElDialog v-model="addRoleDialogVisible" title="设置默认角色" width="50%" append-to-body>
|
||||
<div v-loading="rolesLoading">
|
||||
<ElSelect
|
||||
v-model="selectedRoleIds"
|
||||
multiple
|
||||
v-model="selectedRoleId"
|
||||
filterable
|
||||
placeholder="请选择要添加的角色"
|
||||
placeholder="请选择默认角色"
|
||||
style="width: 100%"
|
||||
>
|
||||
<ElOption
|
||||
@@ -263,23 +279,15 @@
|
||||
:key="role.role_id"
|
||||
:label="role.role_name"
|
||||
:value="role.role_id"
|
||||
:disabled="isRoleAlreadyAssigned(role.role_id)"
|
||||
>
|
||||
<div style="display: flex; justify-content: space-between; align-items: center; width: 100%;">
|
||||
<div style="display: flex; gap: 8px; align-items: center;">
|
||||
<span>{{ role.role_name }}</span>
|
||||
<ElTag :type="role.role_type === 1 ? 'primary' : 'success'" size="small">
|
||||
{{ role.role_type === 1 ? '平台角色' : '客户角色' }}
|
||||
</ElTag>
|
||||
</div>
|
||||
<span v-if="isRoleAlreadyAssigned(role.role_id)" style="color: #909399; font-size: 12px;">
|
||||
已添加
|
||||
</span>
|
||||
<div style="display: flex; gap: 8px; align-items: center">
|
||||
<span>{{ role.role_name }}</span>
|
||||
<ElTag type="success" size="small">客户角色</ElTag>
|
||||
</div>
|
||||
</ElOption>
|
||||
</ElSelect>
|
||||
<div style="margin-top: 8px; color: #909399; font-size: 12px;">
|
||||
支持多选,已添加的角色将显示为禁用状态
|
||||
<div style="margin-top: 8px; color: #909399; font-size: 12px">
|
||||
只能选择一个客户角色,设置后将覆盖之前的默认角色
|
||||
</div>
|
||||
</div>
|
||||
<template #footer>
|
||||
@@ -334,6 +342,8 @@
|
||||
const parentShopLoading = ref(false)
|
||||
const parentShopList = ref<ShopResponse[]>([])
|
||||
const searchParentShopList = ref<ShopResponse[]>([])
|
||||
const defaultRoleLoading = ref(false)
|
||||
const defaultRoleList = ref<any[]>([])
|
||||
|
||||
// 默认角色管理相关状态
|
||||
const defaultRolesDialogVisible = ref(false)
|
||||
@@ -344,7 +354,7 @@
|
||||
const currentShop = ref<ShopResponse | null>(null)
|
||||
const currentDefaultRoles = ref<ShopRoleResponse[]>([])
|
||||
const availableRoles = ref<ShopRoleResponse[]>([])
|
||||
const selectedRoleIds = ref<number[]>([])
|
||||
const selectedRoleId = ref<number | undefined>(undefined)
|
||||
|
||||
// 右键菜单
|
||||
const shopOperationMenuRef = ref<InstanceType<typeof ArtMenuRight>>()
|
||||
@@ -474,6 +484,9 @@
|
||||
const showDialog = (type: string, row?: ShopResponse) => {
|
||||
dialogType.value = type
|
||||
|
||||
// 先清除验证状态
|
||||
formRef.value?.clearValidate()
|
||||
|
||||
if (type === 'edit' && row) {
|
||||
formData.id = row.id
|
||||
formData.shop_name = row.shop_name
|
||||
@@ -489,6 +502,7 @@
|
||||
formData.init_username = ''
|
||||
formData.init_password = ''
|
||||
formData.init_phone = ''
|
||||
formData.default_role_id = undefined
|
||||
} else {
|
||||
formData.id = 0
|
||||
formData.shop_name = ''
|
||||
@@ -504,9 +518,10 @@
|
||||
formData.init_username = ''
|
||||
formData.init_password = ''
|
||||
formData.init_phone = ''
|
||||
formData.default_role_id = undefined
|
||||
}
|
||||
|
||||
// 重置表单验证状态
|
||||
// 再次确保清除验证状态
|
||||
nextTick(() => {
|
||||
formRef.value?.clearValidate()
|
||||
})
|
||||
@@ -540,12 +555,13 @@
|
||||
{
|
||||
prop: 'shop_name',
|
||||
label: '店铺名称',
|
||||
minWidth: 120
|
||||
minWidth: 160,
|
||||
showOverflowTooltip: true
|
||||
},
|
||||
{
|
||||
prop: 'shop_code',
|
||||
label: '店铺编号',
|
||||
width: 150,
|
||||
width: 140,
|
||||
showOverflowTooltip: true
|
||||
},
|
||||
{
|
||||
@@ -560,6 +576,7 @@
|
||||
prop: 'region',
|
||||
label: '所在地区',
|
||||
minWidth: 170,
|
||||
showOverflowTooltip: true,
|
||||
formatter: (row: ShopResponse) => {
|
||||
const parts: string[] = []
|
||||
if (row.province) parts.push(row.province)
|
||||
@@ -652,13 +669,39 @@
|
||||
status: CommonStatus.ENABLED,
|
||||
init_username: '',
|
||||
init_password: '',
|
||||
init_phone: ''
|
||||
init_phone: '',
|
||||
default_role_id: undefined as number | undefined
|
||||
})
|
||||
|
||||
// 搜索默认角色(仅加载客户角色)
|
||||
const searchDefaultRoles = async (query: string) => {
|
||||
defaultRoleLoading.value = true
|
||||
try {
|
||||
const params: any = {
|
||||
page: 1,
|
||||
pageSize: 20,
|
||||
role_type: 2, // 仅客户角色
|
||||
status: 1 // 仅启用的角色
|
||||
}
|
||||
if (query) {
|
||||
params.role_name = query
|
||||
}
|
||||
const res = await RoleService.getRoles(params)
|
||||
if (res.code === 0) {
|
||||
defaultRoleList.value = res.data.items || []
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('获取默认角色列表失败:', error)
|
||||
} finally {
|
||||
defaultRoleLoading.value = false
|
||||
}
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
getShopList()
|
||||
loadParentShopList()
|
||||
loadSearchParentShopList()
|
||||
searchDefaultRoles('') // 加载初始默认角色列表
|
||||
})
|
||||
|
||||
// 加载上级店铺列表(用于新增对话框,默认加载20条)
|
||||
@@ -810,6 +853,9 @@
|
||||
{ required: true, message: '请输入初始账号手机号', trigger: 'blur' },
|
||||
{ len: 11, message: '手机号必须为 11 位', trigger: 'blur' },
|
||||
{ pattern: /^1[3-9]\d{9}$/, message: '请输入正确的手机号格式', trigger: 'blur' }
|
||||
],
|
||||
default_role_id: [
|
||||
{ required: true, message: '请选择默认角色', trigger: 'blur' }
|
||||
]
|
||||
})
|
||||
|
||||
@@ -827,7 +873,8 @@
|
||||
shop_code: formData.shop_code,
|
||||
init_username: formData.init_username,
|
||||
init_password: formData.init_password,
|
||||
init_phone: formData.init_phone
|
||||
init_phone: formData.init_phone,
|
||||
default_role_id: formData.default_role_id
|
||||
}
|
||||
|
||||
// 可选字段
|
||||
@@ -985,31 +1032,35 @@
|
||||
}
|
||||
}
|
||||
|
||||
// 显示添加角色对话框
|
||||
// 显示设置默认角色对话框
|
||||
const showAddRoleDialog = async () => {
|
||||
addRoleDialogVisible.value = true
|
||||
selectedRoleIds.value = []
|
||||
// 如果已有默认角色,预选第一个
|
||||
selectedRoleId.value = currentDefaultRoles.value.length > 0
|
||||
? currentDefaultRoles.value[0].role_id
|
||||
: undefined
|
||||
await loadAvailableRoles()
|
||||
}
|
||||
|
||||
// 加载可用角色列表
|
||||
// 加载可用角色列表(仅客户角色)
|
||||
const loadAvailableRoles = async () => {
|
||||
rolesLoading.value = true
|
||||
try {
|
||||
const res = await RoleService.getRoles({
|
||||
page: 1,
|
||||
page_size: 9999,
|
||||
role_type: 2, // 仅客户角色
|
||||
status: 1 // RoleStatus.ENABLED
|
||||
})
|
||||
if (res.code === 0) {
|
||||
// 将 PlatformRole 转换为与 ShopRoleResponse 兼容的格式,同时保留 role_type
|
||||
// 将 PlatformRole 转换为与 ShopRoleResponse 兼容的格式
|
||||
availableRoles.value = (res.data.items || []).map((role) => ({
|
||||
...role,
|
||||
role_id: role.ID,
|
||||
role_name: role.role_name,
|
||||
role_desc: role.role_desc,
|
||||
role_type: role.role_type, // 保留角色类型用于显示
|
||||
shop_id: 0 // 这个值在可用角色列表中不使用
|
||||
role_type: role.role_type,
|
||||
shop_id: 0
|
||||
}))
|
||||
}
|
||||
} catch (error) {
|
||||
@@ -1020,15 +1071,10 @@
|
||||
}
|
||||
}
|
||||
|
||||
// 判断角色是否已分配
|
||||
const isRoleAlreadyAssigned = (roleId: number) => {
|
||||
return currentDefaultRoles.value.some((r) => r.role_id === roleId)
|
||||
}
|
||||
|
||||
// 添加默认角色
|
||||
// 设置默认角色
|
||||
const handleAddDefaultRoles = async () => {
|
||||
if (selectedRoleIds.value.length === 0) {
|
||||
ElMessage.warning('请至少选择一个角色')
|
||||
if (!selectedRoleId.value) {
|
||||
ElMessage.warning('请选择默认角色')
|
||||
return
|
||||
}
|
||||
|
||||
@@ -1039,17 +1085,18 @@
|
||||
|
||||
addRoleLoading.value = true
|
||||
try {
|
||||
// 传递数组,但只包含一个角色ID
|
||||
const res = await ShopService.assignShopRoles(currentShop.value.id, {
|
||||
role_ids: selectedRoleIds.value
|
||||
role_ids: [selectedRoleId.value]
|
||||
})
|
||||
if (res.code === 0) {
|
||||
ElMessage.success('添加默认角色成功')
|
||||
ElMessage.success('设置默认角色成功')
|
||||
addRoleDialogVisible.value = false
|
||||
// 刷新默认角色列表
|
||||
await loadShopDefaultRoles(currentShop.value.id)
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('添加默认角色失败:', error)
|
||||
console.error('设置默认角色失败:', error)
|
||||
} finally {
|
||||
addRoleLoading.value = false
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user