+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 查询
+
+
+ 重置
+
+
+
+
+ 新增用户
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 查询
- 重置
-
-
- 新增用户
-
-
-
-
-
-
-
-
-
-
-
- {{ getUserTypeDisplayName(row.userType) }}
-
-
-
-
-
- {{ row.pointsBalance || 0 }}
- -
-
-
-
-
- onToggle(row, v)" />
-
-
-
-
-
- 编辑
- 重置密码
- 删除
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 取消
- 保存
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 取消
+ 保存
+
+
@@ -245,7 +255,6 @@ const list = ref([])
const total = ref(0)
const isMobile = ref(false)
-// 检测移动端
const checkMobile = () => {
isMobile.value = window.innerWidth <= 768
}
@@ -264,13 +273,12 @@ const userTypeOptions = ref([
{ value: 'AGENT', label: '代理商' }
])
-// 用户类型显示名称映射
+// 显示名称映射
const userTypeDisplayMap = {
'ADMIN': '管理员',
'AGENT': '代理商'
}
-// 权限检查
const canViewUsers = computed(() => {
const permission = hasPermission(PERMISSIONS.USER_VIEW)
console.log('canViewUsers:', permission, 'USER_VIEW:', PERMISSIONS.USER_VIEW)
@@ -293,32 +301,34 @@ function unwrap(res) {
async function load() {
console.log('开始加载用户数据,权限检查:', canViewUsers.value)
-
if (!canViewUsers.value) {
ElMessage.warning('没有权限查看用户列表')
return
}
-
+
loading.value = true
try {
- // 根据OpenAPI文档,参数映射:pageSize -> size
- const params = {
- ...query,
- size: query.pageSize
- }
+ const params = { ...query, size: query.pageSize }
delete params.pageSize
-
+
console.log('请求参数:', params)
const res = await fetchUsers(params)
console.log('API原始响应:', res)
-
+
const data = unwrap(res) || {}
console.log('解析后数据:', data)
-
- // 兼容后端返回两种分页结构
- list.value = data.list || data.items || []
+
+ const rows = data.list || data.items || []
+ // 规范化字段:保证 pointsBalance 为 number
+ rows.forEach(r => {
+ if (r.userType === 'AGENT') {
+ r.pointsBalance = Number(r.pointsBalance || 0)
+ }
+ })
+
+ list.value = rows
total.value = data.total || data.totalCount || list.value.length
-
+
console.log('用户列表数据:', list.value)
console.log('总数:', total.value)
} catch (e) {
@@ -346,7 +356,6 @@ function onReset() {
async function onToggle(row, val) {
try {
await setUserStatus(row.id, val)
- // 更新 status 字段,保持与后端一致
row.status = val ? 'ENABLED' : 'DISABLED'
showSuccessMessage('状态已更新')
} catch (e) {
@@ -383,7 +392,6 @@ async function onResetPwd(row) {
inputErrorMessage: '请输入有效的密码'
}
)
-
await resetUserPassword(row.id, newPassword)
showSuccessMessage('密码重置成功')
} catch (e) {
@@ -395,13 +403,13 @@ const visible = ref(false)
const isEdit = ref(false)
const saving = ref(false)
const formRef = ref()
-const form = reactive({
- id: undefined,
- userType: 'AGENT',
- username: '',
- enabled: true,
- password: '',
- pointsBalance: 0
+const form = reactive({
+ id: undefined,
+ userType: 'AGENT',
+ username: '',
+ enabled: true,
+ password: '',
+ pointsBalance: 0
})
const rules = {
@@ -411,52 +419,49 @@ const rules = {
{ required: () => !isEdit.value, message: '请输入初始密码', trigger: 'blur' },
{ min: 6, message: '至少 6 位', trigger: 'blur' },
],
- pointsBalance: [{
- required: () => form.userType === 'AGENT',
- message: '请输入积分余额',
- trigger: 'blur'
- }],
+ pointsBalance: [
+ {
+ required: () => form.userType === 'AGENT',
+ message: '请输入积分余额',
+ trigger: 'change' // 关键:el-input-number 用 change 更稳
+ }
+ ],
}
function openCreate() {
isEdit.value = false
- Object.assign(form, {
- id: undefined,
- userType: 'AGENT',
- username: '',
- enabled: true,
- password: '',
- pointsBalance: 0
+ Object.assign(form, {
+ id: undefined,
+ userType: 'AGENT',
+ username: '',
+ enabled: true,
+ password: '',
+ pointsBalance: 0
})
visible.value = true
}
function openEdit(row) {
isEdit.value = true
- Object.assign(form, {
- ...row,
+ Object.assign(form, {
+ ...row,
password: '',
- pointsBalance: row.pointsBalance || 0,
- // 将后端的 status 字段映射为前端的 enabled 字段
+ pointsBalance: Number(row.pointsBalance || 0),
enabled: row.status === 'ENABLED'
})
visible.value = true
}
function doSubmit() {
- // 根据接口文档构建请求参数
const payload = {
userType: form.userType,
username: form.username,
status: form.enabled ? 'ENABLED' : 'DISABLED',
- pointsBalance: form.pointsBalance || 0
+ pointsBalance: Number(form.pointsBalance || 0)
}
-
- // 如果是新增用户,需要设置密码
if (!isEdit.value) {
payload.password = form.password
}
-
return isEdit.value
? updateUser(form.id, payload)
: createUser(payload)
@@ -480,7 +485,7 @@ async function onSubmit() {
})
}
-// 监听用户类型变化,重置积分余额字段
+// 监听类型变化,管理员清零积分
watch(() => form.userType, (newType) => {
if (newType === 'ADMIN') {
form.pointsBalance = 0
@@ -488,18 +493,17 @@ watch(() => form.userType, (newType) => {
})
onMounted(() => {
- // 添加调试信息
console.log('用户管理页面加载')
const auth = getCurrentUser()
const userType = getCurrentUserType()
console.log('当前用户信息:', auth)
console.log('用户类型:', userType)
console.log('权限列表:', hasPermission ? 'hasPermission函数存在' : 'hasPermission函数不存在')
-
+
checkMobile()
console.log('isMobile状态:', isMobile.value)
console.log('窗口宽度:', window.innerWidth)
-
+
window.addEventListener('resize', checkMobile)
load()
})
@@ -657,25 +661,25 @@ onUnmounted(() => {
.desktop-content {
display: none !important;
}
-
+
.users-page .permission-denied {
display: block !important;
}
-
+
.mobile-search-card .el-input {
height: 44px;
}
-
+
.mobile-search-card .el-input .el-input__inner {
height: 44px;
line-height: 44px;
font-size: 16px;
}
-
+
.mobile-search-card .el-select {
height: 44px;
}
-
+
.mobile-search-card .el-button {
height: 44px;
font-size: 16px;
@@ -686,30 +690,30 @@ onUnmounted(() => {
.mobile-search-card :deep(.el-card__body) {
padding: 12px;
}
-
+
.mobile-user-card :deep(.el-card__body) {
padding: 12px;
}
-
+
.user-actions {
flex-direction: column;
}
-
+
.user-actions .el-button {
flex: none;
width: 100%;
}
-
+
.detail-item {
flex-direction: column;
align-items: flex-start;
gap: 4px;
}
-
+
.username {
font-size: 15px;
}
-
+
.detail-item .label,
.detail-item .value {
font-size: 13px;