修改工单
All checks were successful
构建并部署前端到测试环境 / build-and-deploy (push) Successful in 5m26s

This commit is contained in:
sexygoat
2026-02-25 16:14:38 +08:00
parent ca3184857e
commit dccad819cf
20 changed files with 2163 additions and 1229 deletions

View File

@@ -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
}