diff --git a/src/api/member/address/index.ts b/src/api/member/address/index.ts
new file mode 100644
index 0000000..1d8fb25
--- /dev/null
+++ b/src/api/member/address/index.ts
@@ -0,0 +1,15 @@
+import { defHttp } from '@/utils/http/axios'
+
+export interface AddressVO {
+ id: number
+ name: string
+ mobile: string
+ areaId: number
+ detailAddress: string
+ defaultStatus: boolean
+}
+
+// 查询用户收件地址列表
+export function getAddressList(params) {
+ return defHttp.get({ url: '/member/address/list', params })
+}
diff --git a/src/api/member/group/index.ts b/src/api/member/group/index.ts
new file mode 100644
index 0000000..1787fed
--- /dev/null
+++ b/src/api/member/group/index.ts
@@ -0,0 +1,38 @@
+import { defHttp } from '@/utils/http/axios'
+
+export interface GroupVO {
+ id: number
+ name: string
+ remark: string
+ status: number
+}
+
+// 查询用户分组列表
+export function getGroupPage(params: any) {
+ return defHttp.get({ url: '/member/group/page', params })
+}
+
+// 查询用户分组详情
+export function getGroup(id: number) {
+ return defHttp.get({ url: `/member/group/get?id=${id}` })
+}
+
+// 新增用户分组
+export function createGroup(data: GroupVO) {
+ return defHttp.post({ url: '/member/group/create', data })
+}
+
+// 查询用户分组 - 精简信息列表
+export function getSimpleGroupList() {
+ return defHttp.get({ url: '/member/group/list-all-simple' })
+}
+
+// 修改用户分组
+export function updateGroup(data: GroupVO) {
+ return defHttp.put({ url: '/member/group/update', data })
+}
+
+// 删除用户分组
+export function deleteGroup(id: number) {
+ return defHttp.delete({ url: `/member/group/delete?id=${id}` })
+}
diff --git a/src/api/member/level/index.ts b/src/api/member/level/index.ts
new file mode 100644
index 0000000..d192124
--- /dev/null
+++ b/src/api/member/level/index.ts
@@ -0,0 +1,42 @@
+import { defHttp } from '@/utils/http/axios'
+
+export interface LevelVO {
+ id: number
+ name: string
+ experience: number
+ value: number
+ discountPercent: number
+ icon: string
+ bgUrl: string
+ status: number
+}
+
+// 查询会员等级列表
+export function getLevelList(params) {
+ return defHttp.get({ url: '/member/level/list', params })
+}
+
+// 查询会员等级详情
+export function getLevel(id: number) {
+ return defHttp.get({ url: `/member/level/get?id=${id}` })
+}
+
+// 查询会员等级 - 精简信息列表
+export function getSimpleLevelList() {
+ return defHttp.get({ url: '/member/level/list-all-simple' })
+}
+
+// 新增会员等级
+export function createLevel(data: LevelVO) {
+ return defHttp.post({ url: '/member/level/create', data })
+}
+
+// 修改会员等级
+export function updateLevel(data: LevelVO) {
+ return defHttp.put({ url: '/member/level/update', data })
+}
+
+// 删除会员等级
+export function deleteLevel(id: number) {
+ return defHttp.delete({ url: `/member/level/delete?id=${id}` })
+}
diff --git a/src/api/member/tag/index.ts b/src/api/member/tag/index.ts
index 07e6e07..b37914a 100644
--- a/src/api/member/tag/index.ts
+++ b/src/api/member/tag/index.ts
@@ -15,6 +15,11 @@ export function getMemberTag(id: number) {
return defHttp.get({ url: `/member/tag/get?id=${id}` })
}
+// 查询会员标签 - 精简信息列表
+export function getSimpleTagList() {
+ return defHttp.get({ url: '/member/tag/list-all-simple' })
+}
+
// 新增会员标签
export function createMemberTag(data: TagVO) {
return defHttp.post({ url: '/member/tag/create', data })
diff --git a/src/api/member/user/index.ts b/src/api/member/user/index.ts
index 6228ee4..3a4a13e 100644
--- a/src/api/member/user/index.ts
+++ b/src/api/member/user/index.ts
@@ -32,3 +32,8 @@ export function getUser(id: number) {
export function updateUser(data: UserVO) {
return defHttp.put({ url: '/member/user/update', data })
}
+
+// 修改会员用户等级
+export function updateUserLevel(data: any) {
+ return defHttp.put({ url: '/member/user/update-level', data })
+}
diff --git a/src/views/member/group/GroupModal.vue b/src/views/member/group/GroupModal.vue
new file mode 100644
index 0000000..62bd85d
--- /dev/null
+++ b/src/views/member/group/GroupModal.vue
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
diff --git a/src/views/member/group/group.data.ts b/src/views/member/group/group.data.ts
new file mode 100644
index 0000000..3825f64
--- /dev/null
+++ b/src/views/member/group/group.data.ts
@@ -0,0 +1,84 @@
+import type { BasicColumn, FormSchema } from '@/components/Table'
+import { useRender } from '@/components/Table'
+import { DICT_TYPE, getDictOptions } from '@/utils/dict'
+
+export const columns: BasicColumn[] = [
+ {
+ title: '编号',
+ dataIndex: 'id',
+ },
+ {
+ title: '名称',
+ dataIndex: 'name',
+ },
+ {
+ title: '备注',
+ dataIndex: 'remark',
+ },
+ {
+ title: '状态',
+ dataIndex: 'status',
+ customRender: ({ text }) => {
+ return useRender.renderDict(text, DICT_TYPE.COMMON_STATUS)
+ },
+ },
+ {
+ title: '创建时间',
+ dataIndex: 'createTime',
+ customRender: ({ text }) => {
+ return useRender.renderDate(text)
+ },
+ },
+]
+
+export const searchFormSchema: FormSchema[] = [
+ {
+ label: '分组名称',
+ field: 'name',
+ component: 'Input',
+ colProps: { span: 8 },
+ },
+ {
+ label: '创建时间',
+ field: 'createTime',
+ component: 'RangePicker',
+ colProps: { span: 8 },
+ },
+ {
+ label: '状态',
+ field: 'status',
+ component: 'Select',
+ componentProps: {
+ options: getDictOptions(DICT_TYPE.COMMON_STATUS),
+ },
+ colProps: { span: 8 },
+ },
+]
+
+export const formSchema: FormSchema[] = [
+ {
+ label: '编号',
+ field: 'id',
+ show: false,
+ component: 'Input',
+ },
+ {
+ label: '名称',
+ field: 'name',
+ required: true,
+ component: 'Input',
+ },
+ {
+ label: '状态',
+ field: 'status',
+ component: 'Select',
+ componentProps: {
+ options: getDictOptions(DICT_TYPE.COMMON_STATUS),
+ },
+ },
+ {
+ label: '备注',
+ field: 'remark',
+ component: 'InputTextArea',
+ },
+]
diff --git a/src/views/member/group/index.vue b/src/views/member/group/index.vue
new file mode 100644
index 0000000..dfe3c5b
--- /dev/null
+++ b/src/views/member/group/index.vue
@@ -0,0 +1,50 @@
+
+
+
+
+
diff --git a/src/views/member/level/LevelModal.vue b/src/views/member/level/LevelModal.vue
new file mode 100644
index 0000000..665525f
--- /dev/null
+++ b/src/views/member/level/LevelModal.vue
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
diff --git a/src/views/member/level/index.vue b/src/views/member/level/index.vue
new file mode 100644
index 0000000..d09a15f
--- /dev/null
+++ b/src/views/member/level/index.vue
@@ -0,0 +1,50 @@
+
+
+
+
+
diff --git a/src/views/member/level/level.data.ts b/src/views/member/level/level.data.ts
new file mode 100644
index 0000000..15b320c
--- /dev/null
+++ b/src/views/member/level/level.data.ts
@@ -0,0 +1,136 @@
+import type { BasicColumn, FormSchema } from '@/components/Table'
+import { useRender } from '@/components/Table'
+import { DICT_TYPE, getDictOptions } from '@/utils/dict'
+
+export const columns: BasicColumn[] = [
+ {
+ title: '编号',
+ dataIndex: 'id',
+ },
+ {
+ title: '等级图标',
+ dataIndex: 'icon',
+ customRender: ({ text }) => {
+ return useRender.renderImg(text)
+ },
+ },
+ {
+ title: '等级背景图',
+ dataIndex: 'remark',
+ customRender: ({ text }) => {
+ return useRender.renderImg(text)
+ },
+ },
+ {
+ title: '等级名称',
+ dataIndex: 'name',
+ },
+ {
+ title: '等级',
+ dataIndex: 'level',
+ },
+ {
+ title: '升级经验',
+ dataIndex: 'experience',
+ },
+ {
+ title: '享受折扣(%)',
+ dataIndex: 'discountPercent',
+ },
+ {
+ title: '状态',
+ dataIndex: 'status',
+ customRender: ({ text }) => {
+ return useRender.renderDict(text, DICT_TYPE.COMMON_STATUS)
+ },
+ },
+ {
+ title: '创建时间',
+ dataIndex: 'createTime',
+ customRender: ({ text }) => {
+ return useRender.renderDate(text)
+ },
+ },
+]
+
+export const searchFormSchema: FormSchema[] = [
+ {
+ label: '等级名称',
+ field: 'name',
+ component: 'Input',
+ colProps: { span: 8 },
+ },
+ {
+ label: '状态',
+ field: 'status',
+ component: 'Select',
+ componentProps: {
+ options: getDictOptions(DICT_TYPE.COMMON_STATUS),
+ },
+ colProps: { span: 8 },
+ },
+]
+
+export const formSchema: FormSchema[] = [
+ {
+ label: '编号',
+ field: 'id',
+ show: false,
+ component: 'Input',
+ },
+ {
+ label: '等级名称',
+ field: 'name',
+ required: true,
+ component: 'Input',
+ },
+ {
+ label: '等级',
+ field: 'level',
+ required: true,
+ component: 'InputNumber',
+ },
+ {
+ label: '升级经验',
+ field: 'experience',
+ required: true,
+ component: 'InputNumber',
+ },
+ {
+ label: '享受折扣(%)',
+ field: 'discountPercent',
+ required: true,
+ component: 'InputNumber',
+ },
+ {
+ label: '等级图标',
+ field: 'icon',
+ component: 'FileUpload',
+ componentProps: {
+ maxCount: 1,
+ fileType: 'image',
+ },
+ },
+ {
+ label: '背景图',
+ field: 'backgroundUrl',
+ component: 'FileUpload',
+ componentProps: {
+ maxCount: 1,
+ fileType: 'image',
+ },
+ },
+ {
+ label: '状态',
+ field: 'status',
+ component: 'Select',
+ componentProps: {
+ options: getDictOptions(DICT_TYPE.COMMON_STATUS),
+ },
+ },
+ {
+ label: '备注',
+ field: 'remark',
+ component: 'InputTextArea',
+ },
+]
diff --git a/src/views/member/signin/config/index.vue b/src/views/member/signin/config/index.vue
index bd15d91..0c669d1 100644
--- a/src/views/member/signin/config/index.vue
+++ b/src/views/member/signin/config/index.vue
@@ -45,7 +45,7 @@ async function handleDelete(record: Recordable) {
-
+
{{ t('action.create') }}
@@ -53,12 +53,12 @@ async function handleDelete(record: Recordable) {
-
+
{{ t('action.create') }}
@@ -56,12 +56,12 @@ async function handleDelete(record: Recordable) {
+import { ref, unref } from 'vue'
+import { updateLevelFormSchema } from './user.data'
+import { useI18n } from '@/hooks/web/useI18n'
+import { useMessage } from '@/hooks/web/useMessage'
+import { BasicForm, useForm } from '@/components/Form'
+import { BasicModal, useModalInner } from '@/components/Modal'
+import { getUser, updateUserLevel } from '@/api/member/user'
+
+defineOptions({ name: 'MemberUpdateLevelModal' })
+
+const emit = defineEmits(['success', 'register'])
+const { t } = useI18n()
+const { createMessage } = useMessage()
+const isUpdate = ref(true)
+
+const [registerForm, { setFieldsValue, resetFields, validate }] = useForm({
+ labelWidth: 120,
+ baseColProps: { span: 24 },
+ schemas: updateLevelFormSchema,
+ showActionButtonGroup: false,
+ actionColOptions: { span: 23 },
+})
+
+const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {
+ resetFields()
+ setModalProps({ confirmLoading: false })
+ isUpdate.value = !!data?.isUpdate
+ if (unref(isUpdate)) {
+ const res = await getUser(data.record.id)
+ setFieldsValue({ ...res })
+ }
+})
+
+async function handleSubmit() {
+ try {
+ const values = await validate()
+ setModalProps({ confirmLoading: true })
+ if (unref(isUpdate))
+ await updateUserLevel(values)
+ // else
+ // await createUser(values)
+
+ closeModal()
+ emit('success')
+ createMessage.success(t('common.saveSuccessText'))
+ }
+ finally {
+ setModalProps({ confirmLoading: false })
+ }
+}
+
+
+
+
+
+
+
diff --git a/src/views/member/user/index.vue b/src/views/member/user/index.vue
index 28e7a86..d370d90 100644
--- a/src/views/member/user/index.vue
+++ b/src/views/member/user/index.vue
@@ -1,5 +1,6 @@
@@ -39,12 +44,14 @@ function handleEdit(record: Recordable) {
+
diff --git a/src/views/member/user/user.data.ts b/src/views/member/user/user.data.ts
index 3cb91d6..554e84d 100644
--- a/src/views/member/user/user.data.ts
+++ b/src/views/member/user/user.data.ts
@@ -1,4 +1,6 @@
-import { getMemberTagPage } from '@/api/member/tag'
+import { getSimpleGroupList } from '@/api/member/group'
+import { getSimpleLevelList } from '@/api/member/level'
+import { getMemberTagPage, getSimpleTagList } from '@/api/member/tag'
import { getAreaTree } from '@/api/system/area'
import type { BasicColumn, FormSchema } from '@/components/Table'
import { useRender } from '@/components/Table'
@@ -28,11 +30,16 @@ export const columns: BasicColumn[] = [
dataIndex: 'nickname',
width: 100,
},
- // {
- // title: '分组',
- // dataIndex: 'id',
- // width: 100,
- // },
+ {
+ title: '等级',
+ dataIndex: 'levelName',
+ width: 100,
+ },
+ {
+ title: '分组',
+ dataIndex: 'groupName',
+ width: 100,
+ },
{
title: '用户标签',
dataIndex: 'tagNames',
@@ -41,11 +48,11 @@ export const columns: BasicColumn[] = [
return useRender.renderTags(text)
},
},
- // {
- // title: '积分',
- // dataIndex: 'nickname',
- // width: 100,
- // },
+ {
+ title: '积分',
+ dataIndex: 'point',
+ width: 100,
+ },
{
title: '状态',
dataIndex: 'status',
@@ -100,7 +107,29 @@ export const searchFormSchema: FormSchema[] = [
field: 'tagIds',
component: 'ApiSelect',
componentProps: {
- api: () => getMemberTagPage({}),
+ api: () => getSimpleTagList(),
+ labelField: 'name',
+ valueField: 'id',
+ },
+ colProps: { span: 8 },
+ },
+ {
+ label: '用户等级',
+ field: 'levelId',
+ component: 'ApiSelect',
+ componentProps: {
+ api: () => getSimpleLevelList(),
+ labelField: 'name',
+ valueField: 'id',
+ },
+ colProps: { span: 8 },
+ },
+ {
+ label: '用户分组',
+ field: 'groupId',
+ component: 'ApiSelect',
+ componentProps: {
+ api: () => getSimpleGroupList(),
labelField: 'name',
valueField: 'id',
},
@@ -183,7 +212,17 @@ export const formSchema: FormSchema[] = [
field: 'tagIds',
component: 'ApiSelect',
componentProps: {
- api: () => getMemberTagPage({}),
+ api: () => getSimpleTagList(),
+ labelField: 'name',
+ valueField: 'id',
+ },
+ },
+ {
+ label: '用户分组',
+ field: 'groupId',
+ component: 'ApiSelect',
+ componentProps: {
+ api: () => getSimpleGroupList(),
labelField: 'name',
valueField: 'id',
},
@@ -194,3 +233,34 @@ export const formSchema: FormSchema[] = [
component: 'InputTextArea',
},
]
+
+export const updateLevelFormSchema: FormSchema[] = [
+ {
+ label: '编号',
+ field: 'id',
+ show: false,
+ component: 'Input',
+ },
+ {
+ label: '用户昵称',
+ field: 'nickname',
+ dynamicDisabled: true,
+ component: 'Input',
+ },
+ {
+ label: '用户等级',
+ field: 'levelId',
+ component: 'ApiSelect',
+ componentProps: {
+ api: () => getSimpleLevelList(),
+ labelField: 'name',
+ valueField: 'id',
+ },
+ },
+ {
+ label: '修改原因',
+ field: 'reason',
+ required: true,
+ component: 'InputTextArea',
+ },
+]