diff --git a/src/views/Users.vue b/src/views/Users.vue
index 86fcd93..b2cda7e 100644
--- a/src/views/Users.vue
+++ b/src/views/Users.vue
@@ -289,25 +289,39 @@
-
- 普通商户
- 直营商户
- 虚拟商户
-
+
+
+
+
+
+
-
-
- 虚拟商户:用于新用户资金流向,对其他商户显示为普通商户,仅后台可见标识
-
-
-
-
- 直营商户:具有特殊权限
-
-
+
+
+
+
+
+
+
+
+
+
@@ -540,6 +554,8 @@ const isEdit = ref(false)
const users = ref([])
const regions = ref([])
const regionOptions = ref([])
+const agentOptions = ref([])
+const agentLoading = ref(false)
// 搜索表单
const searchForm = reactive({
@@ -565,7 +581,8 @@ const userForm = reactive({
username: '',
password: '',
role: 'user',
- accountType: 'normal', // 账户类型:normal-普通商户,virtual-虚拟商户
+ accountType: 'user', // 账户类型:user-普通用户,directly_operated-直营,agent-代理,agent_directly-直营代理
+ inviter: null, // 代理人ID
avatar: '',
realName: '',
idCard: '',
@@ -610,6 +627,18 @@ const userRules = computed(() => ({
],
region: [
{ required: true, message: '请选择省市区', trigger: 'change' }
+ ],
+ inviter: [
+ {
+ validator: (rule, value, callback) => {
+ if ((userForm.accountType === 'agent' || userForm.accountType === 'agent_directly') && !value) {
+ callback(new Error('选择代理类型时必须选择代理人'))
+ } else {
+ callback()
+ }
+ },
+ trigger: 'change'
+ }
]
}))
@@ -869,7 +898,8 @@ const showEditDialog = (user) => {
username: user.username,
password: '',
role: user.role,
- accountType: user.is_system_account ? 'virtual' : (user.is_direct_account ? 'direct' : 'normal'),
+ accountType: user.user_type || 'user',
+ inviter: user.inviter || null,
avatar: user.avatar || '',
realName: user.real_name || '',
idCard: user.id_card || '',
@@ -901,8 +931,7 @@ const handleSubmit = async () => {
const userData = {
username: userForm.username,
role: userForm.role,
- isSystemAccount: userForm.accountType === 'virtual', // 转换为后端字段
- isDirectAccount: userForm.accountType === 'direct', // 转换为后端字段
+ user_type: userForm.accountType, // 使用新的账户类型字段
avatar: userForm.avatar,
realName: userForm.realName,
idCard: userForm.idCard,
@@ -920,6 +949,11 @@ const handleSubmit = async () => {
businessLicense: userForm.businessLicense
}
+ // 如果选择了代理类型,添加代理人ID
+ if ((userForm.accountType === 'agent' || userForm.accountType === 'agent_directly') && userForm.inviter) {
+ userData.inviter = userForm.inviter
+ }
+
// 如果是创建模式或编辑模式下输入了密码,则包含密码字段
if (!isEdit.value || (userForm.password && userForm.password.trim() !== '')) {
userData.password = userForm.password
@@ -978,7 +1012,8 @@ const resetUserForm = () => {
username: '',
password: '',
role: 'user',
- accountType: 'normal',
+ accountType: 'user',
+ inviter: null,
avatar: '',
realName: '',
idCard: '',
@@ -1100,16 +1135,58 @@ const formatPoints = (points) => {
// 获取账户类型显示文本
const getAccountTypeText = (row) => {
- if (row.is_system_account) return '虚拟商户'
- if (row.is_direct_account) return '直营商户'
- return '普通商户'
+ const typeMap = {
+ 'user': '普通用户',
+ 'directly_operated': '直营',
+ 'agent': '代理',
+ 'agent_directly': '直营代理'
+ }
+ return typeMap[row.user_type] || '普通用户'
}
// 获取账户类型标签颜色
const getAccountTypeColor = (row) => {
- if (row.is_system_account) return 'warning'
- if (row.is_direct_account) return 'danger'
- return 'success'
+ const colorMap = {
+ 'user': 'success',
+ 'directly_operated': 'warning',
+ 'agent': 'info',
+ 'agent_directly': 'danger'
+ }
+ return colorMap[row.user_type] || 'success'
+}
+
+// 获取代理列表
+const fetchAgents = async () => {
+ try {
+ agentLoading.value = true
+ const response = await axios.get('/api/agent')
+ agentOptions.value = response.data?.data || []
+ } catch (error) {
+ console.error('获取代理列表失败:', error)
+ ElMessage.error('获取代理列表失败')
+ } finally {
+ agentLoading.value = false
+ }
+}
+
+// 搜索代理
+const searchAgents = async (query) => {
+ if (!query) {
+ await fetchAgents()
+ return
+ }
+
+ try {
+ agentLoading.value = true
+ const response = await axios.get('/api/agent', {
+ params: { search: query }
+ })
+ agentOptions.value = response.data?.data || []
+ } catch (error) {
+ console.error('搜索代理失败:', error)
+ } finally {
+ agentLoading.value = false
+ }
}
// 组件挂载时获取数据
@@ -1117,6 +1194,7 @@ onMounted(() => {
fetchUsers()
getRegions()
loadRegionOptions()
+ fetchAgents()
})