feat: 会员积分
							parent
							
								
									0b3b5799ea
								
							
						
					
					
						commit
						d1ae887eba
					
				|  | @ -0,0 +1,25 @@ | |||
| import type { PageParam, PageResult } from '@vben/request'; | ||||
| 
 | ||||
| import { requestClient } from '#/api/request'; | ||||
| 
 | ||||
| export namespace MemberAddressApi { | ||||
|   /** 收件地址信息 */ | ||||
|   export interface Address { | ||||
|     id?: number; | ||||
|     name: string; | ||||
|     mobile: string; | ||||
|     areaId: number; | ||||
|     detailAddress: string; | ||||
|     defaultStatus: boolean; | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| /** 查询用户收件地址列表 */ | ||||
| export function getAddressList(params: PageParam) { | ||||
|   return requestClient.get<PageResult<MemberAddressApi.Address>>( | ||||
|     '/member/address/list', | ||||
|     { | ||||
|       params, | ||||
|     }, | ||||
|   ); | ||||
| } | ||||
|  | @ -0,0 +1,33 @@ | |||
| import type { PageParam, PageResult } from '@vben/request'; | ||||
| 
 | ||||
| import { requestClient } from '#/api/request'; | ||||
| 
 | ||||
| export namespace MemberExperienceRecordApi { | ||||
|   /** 会员经验记录信息 */ | ||||
|   export interface ExperienceRecord { | ||||
|     id?: number; | ||||
|     userId: number; | ||||
|     bizId: string; | ||||
|     bizType: number; | ||||
|     title: string; | ||||
|     description: string; | ||||
|     experience: number; | ||||
|     totalExperience: number; | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| /** 查询会员经验记录列表 */ | ||||
| export function getExperienceRecordPage(params: PageParam) { | ||||
|   return requestClient.get< | ||||
|     PageResult<MemberExperienceRecordApi.ExperienceRecord> | ||||
|   >('/member/experience-record/page', { | ||||
|     params, | ||||
|   }); | ||||
| } | ||||
| 
 | ||||
| /** 查询会员经验记录详情 */ | ||||
| export function getExperienceRecord(id: number) { | ||||
|   return requestClient.get<MemberExperienceRecordApi.ExperienceRecord>( | ||||
|     `/member/experience-record/get?id=${id}`, | ||||
|   ); | ||||
| } | ||||
|  | @ -0,0 +1,50 @@ | |||
| import type { PageParam, PageResult } from '@vben/request'; | ||||
| 
 | ||||
| import { requestClient } from '#/api/request'; | ||||
| 
 | ||||
| export namespace MemberGroupApi { | ||||
|   /** 用户分组信息 */ | ||||
|   export interface Group { | ||||
|     id?: number; | ||||
|     name: string; | ||||
|     remark: string; | ||||
|     status: number; | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| /** 查询用户分组列表 */ | ||||
| export function getGroupPage(params: PageParam) { | ||||
|   return requestClient.get<PageResult<MemberGroupApi.Group>>( | ||||
|     '/member/group/page', | ||||
|     { | ||||
|       params, | ||||
|     }, | ||||
|   ); | ||||
| } | ||||
| 
 | ||||
| /** 查询用户分组详情 */ | ||||
| export function getGroup(id: number) { | ||||
|   return requestClient.get<MemberGroupApi.Group>(`/member/group/get?id=${id}`); | ||||
| } | ||||
| 
 | ||||
| /** 新增用户分组 */ | ||||
| export function createGroup(data: MemberGroupApi.Group) { | ||||
|   return requestClient.post('/member/group/create', data); | ||||
| } | ||||
| 
 | ||||
| /** 查询用户分组 - 精简信息列表 */ | ||||
| export function getSimpleGroupList() { | ||||
|   return requestClient.get<MemberGroupApi.Group[]>( | ||||
|     '/member/group/list-all-simple', | ||||
|   ); | ||||
| } | ||||
| 
 | ||||
| /** 修改用户分组 */ | ||||
| export function updateGroup(data: MemberGroupApi.Group) { | ||||
|   return requestClient.put('/member/group/update', data); | ||||
| } | ||||
| 
 | ||||
| /** 删除用户分组 */ | ||||
| export function deleteGroup(id: number) { | ||||
|   return requestClient.delete(`/member/group/delete?id=${id}`); | ||||
| } | ||||
|  | @ -0,0 +1,28 @@ | |||
| import type { PageParam, PageResult } from '@vben/request'; | ||||
| 
 | ||||
| import { requestClient } from '#/api/request'; | ||||
| 
 | ||||
| export namespace MemberPointRecordApi { | ||||
|   /** 用户积分记录信息 */ | ||||
|   export interface Record { | ||||
|     id?: number; | ||||
|     bizId: string; | ||||
|     bizType: string; | ||||
|     title: string; | ||||
|     description: string; | ||||
|     point: number; | ||||
|     totalPoint: number; | ||||
|     userId: number; | ||||
|     createDate: Date; | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| /** 查询用户积分记录列表 */ | ||||
| export function getRecordPage(params: PageParam) { | ||||
|   return requestClient.get<PageResult<MemberPointRecordApi.Record>>( | ||||
|     '/member/point/record/page', | ||||
|     { | ||||
|       params, | ||||
|     }, | ||||
|   ); | ||||
| } | ||||
|  | @ -0,0 +1,41 @@ | |||
| import { requestClient } from '#/api/request'; | ||||
| 
 | ||||
| export namespace MemberSignInConfigApi { | ||||
|   /** 积分签到规则信息 */ | ||||
|   export interface SignInConfig { | ||||
|     id?: number; | ||||
|     day?: number; | ||||
|     point?: number; | ||||
|     experience?: number; | ||||
|     status?: number; | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| /** 查询积分签到规则列表 */ | ||||
| export function getSignInConfigList() { | ||||
|   return requestClient.get<MemberSignInConfigApi.SignInConfig[]>( | ||||
|     '/member/sign-in/config/list', | ||||
|   ); | ||||
| } | ||||
| 
 | ||||
| /** 查询积分签到规则详情 */ | ||||
| export function getSignInConfig(id: number) { | ||||
|   return requestClient.get<MemberSignInConfigApi.SignInConfig>( | ||||
|     `/member/sign-in/config/get?id=${id}`, | ||||
|   ); | ||||
| } | ||||
| 
 | ||||
| /** 新增积分签到规则 */ | ||||
| export function createSignInConfig(data: MemberSignInConfigApi.SignInConfig) { | ||||
|   return requestClient.post('/member/sign-in/config/create', data); | ||||
| } | ||||
| 
 | ||||
| /** 修改积分签到规则 */ | ||||
| export function updateSignInConfig(data: MemberSignInConfigApi.SignInConfig) { | ||||
|   return requestClient.put('/member/sign-in/config/update', data); | ||||
| } | ||||
| 
 | ||||
| /** 删除积分签到规则 */ | ||||
| export function deleteSignInConfig(id: number) { | ||||
|   return requestClient.delete(`/member/sign-in/config/delete?id=${id}`); | ||||
| } | ||||
|  | @ -0,0 +1,23 @@ | |||
| import type { PageParam, PageResult } from '@vben/request'; | ||||
| 
 | ||||
| import { requestClient } from '#/api/request'; | ||||
| 
 | ||||
| export namespace MemberSignInRecordApi { | ||||
|   /** 用户签到积分信息 */ | ||||
|   export interface SignInRecord { | ||||
|     id?: number; | ||||
|     userId: number; | ||||
|     day: number; | ||||
|     point: number; | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| /** 查询用户签到积分列表 */ | ||||
| export function getSignInRecordPage(params: PageParam) { | ||||
|   return requestClient.get<PageResult<MemberSignInRecordApi.SignInRecord>>( | ||||
|     '/member/sign-in/record/page', | ||||
|     { | ||||
|       params, | ||||
|     }, | ||||
|   ); | ||||
| } | ||||
|  | @ -0,0 +1,70 @@ | |||
| import type { PageParam, PageResult } from '@vben/request'; | ||||
| 
 | ||||
| import { requestClient } from '#/api/request'; | ||||
| 
 | ||||
| export namespace MemberUserApi { | ||||
|   /** 会员用户信息 */ | ||||
|   export interface User { | ||||
|     id?: number; | ||||
|     avatar?: string; | ||||
|     birthday?: number; | ||||
|     createTime?: number; | ||||
|     loginDate?: number; | ||||
|     loginIp: string; | ||||
|     mark: string; | ||||
|     mobile: string; | ||||
|     name?: string; | ||||
|     nickname?: string; | ||||
|     registerIp: string; | ||||
|     sex: number; | ||||
|     status: number; | ||||
|     areaId?: number; | ||||
|     areaName?: string; | ||||
|     levelName: null | string; | ||||
|     point?: null | number; | ||||
|     totalPoint?: null | number; | ||||
|     experience?: null | number; | ||||
|   } | ||||
| 
 | ||||
|   /** 会员用户等级更新信息 */ | ||||
|   export interface UserLevelUpdate { | ||||
|     id: number; | ||||
|     levelId: number; | ||||
|   } | ||||
| 
 | ||||
|   /** 会员用户积分更新信息 */ | ||||
|   export interface UserPointUpdate { | ||||
|     id: number; | ||||
|     point: number; | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| /** 查询会员用户列表 */ | ||||
| export function getUserPage(params: PageParam) { | ||||
|   return requestClient.get<PageResult<MemberUserApi.User>>( | ||||
|     '/member/user/page', | ||||
|     { | ||||
|       params, | ||||
|     }, | ||||
|   ); | ||||
| } | ||||
| 
 | ||||
| /** 查询会员用户详情 */ | ||||
| export function getUser(id: number) { | ||||
|   return requestClient.get<MemberUserApi.User>(`/member/user/get?id=${id}`); | ||||
| } | ||||
| 
 | ||||
| /** 修改会员用户 */ | ||||
| export function updateUser(data: MemberUserApi.User) { | ||||
|   return requestClient.put('/member/user/update', data); | ||||
| } | ||||
| 
 | ||||
| /** 修改会员用户等级 */ | ||||
| export function updateUserLevel(data: MemberUserApi.UserLevelUpdate) { | ||||
|   return requestClient.put('/member/user/update-level', data); | ||||
| } | ||||
| 
 | ||||
| /** 修改会员用户积分 */ | ||||
| export function updateUserPoint(data: MemberUserApi.UserPointUpdate) { | ||||
|   return requestClient.put('/member/user/update-point', data); | ||||
| } | ||||
|  | @ -0,0 +1,87 @@ | |||
| import type { VbenFormSchema } from '#/adapter/form'; | ||||
| import type { VxeTableGridOptions } from '#/adapter/vxe-table'; | ||||
| 
 | ||||
| import { DICT_TYPE, getDictOptions } from '#/utils'; | ||||
| 
 | ||||
| /** 列表的搜索表单 */ | ||||
| export function useGridFormSchema(): VbenFormSchema[] { | ||||
|   return [ | ||||
|     { | ||||
|       fieldName: 'nickname', | ||||
|       label: '用户', | ||||
|       component: 'Input', | ||||
|     }, | ||||
|     { | ||||
|       fieldName: 'bizType', | ||||
|       label: '业务类型', | ||||
|       component: 'Select', | ||||
|       componentProps: { | ||||
|         allowClear: true, | ||||
|         options: getDictOptions(DICT_TYPE.MEMBER_POINT_BIZ_TYPE, 'number'), | ||||
|       }, | ||||
|     }, | ||||
|     { | ||||
|       fieldName: 'title', | ||||
|       label: '积分标题', | ||||
|       component: 'Input', | ||||
|     }, | ||||
|     { | ||||
|       fieldName: 'createDate', | ||||
|       label: '获得时间', | ||||
|       component: 'DatePicker', | ||||
|       componentProps: { | ||||
|         type: 'daterange', | ||||
|         valueFormat: 'YYYY-MM-DD HH:mm:ss', | ||||
|         defaultTime: [new Date('1 00:00:00'), new Date('1 23:59:59')], | ||||
|       }, | ||||
|     }, | ||||
|   ]; | ||||
| } | ||||
| 
 | ||||
| /** 列表的字段 */ | ||||
| export function useGridColumns(): VxeTableGridOptions['columns'] { | ||||
|   return [ | ||||
|     { | ||||
|       field: 'id', | ||||
|       title: '编号', | ||||
|     }, | ||||
|     { | ||||
|       field: 'createTime', | ||||
|       title: '获得时间', | ||||
|       formatter: 'formatDateTime', | ||||
|     }, | ||||
|     { | ||||
|       field: 'nickname', | ||||
|       title: '用户', | ||||
|     }, | ||||
|     { | ||||
|       field: 'point', | ||||
|       title: '获得积分', | ||||
|       slots: { default: 'point' }, | ||||
|     }, | ||||
|     { | ||||
|       field: 'totalPoint', | ||||
|       title: '总积分', | ||||
|     }, | ||||
|     { | ||||
|       field: 'title', | ||||
|       title: '标题', | ||||
|     }, | ||||
|     { | ||||
|       field: 'description', | ||||
|       title: '描述', | ||||
|     }, | ||||
|     { | ||||
|       field: 'bizId', | ||||
|       title: '业务编码', | ||||
|     }, | ||||
|     { | ||||
|       field: 'bizType', | ||||
|       title: '业务类型', | ||||
|       cellRender: { | ||||
|         name: 'CellDict', | ||||
|         props: { type: DICT_TYPE.MEMBER_POINT_BIZ_TYPE }, | ||||
|       }, | ||||
|     }, | ||||
|   ]; | ||||
| } | ||||
|  | @ -1,34 +1,54 @@ | |||
| <script lang="ts" setup> | ||||
| import type { VxeTableGridOptions } from '#/adapter/vxe-table'; | ||||
| import type { MemberPointRecordApi } from '#/api/member/point/record'; | ||||
| 
 | ||||
| import { Page } from '@vben/common-ui'; | ||||
| 
 | ||||
| import { Button } from 'ant-design-vue'; | ||||
| import { Tag } from 'ant-design-vue'; | ||||
| 
 | ||||
| import { DocAlert } from '#/components/doc-alert'; | ||||
| import { useVbenVxeGrid } from '#/adapter/vxe-table'; | ||||
| import { getRecordPage } from '#/api/member/point/record'; | ||||
| 
 | ||||
| import { useGridColumns, useGridFormSchema } from './data'; | ||||
| 
 | ||||
| const [Grid] = useVbenVxeGrid({ | ||||
|   formOptions: { | ||||
|     schema: useGridFormSchema(), | ||||
|   }, | ||||
|   gridOptions: { | ||||
|     columns: useGridColumns(), | ||||
|     height: 'auto', | ||||
|     keepSource: true, | ||||
|     proxyConfig: { | ||||
|       ajax: { | ||||
|         query: async ({ page }, formValues) => { | ||||
|           return await getRecordPage({ | ||||
|             pageNo: page.currentPage, | ||||
|             pageSize: page.pageSize, | ||||
|             ...formValues, | ||||
|           }); | ||||
|         }, | ||||
|       }, | ||||
|     }, | ||||
|     rowConfig: { | ||||
|       keyField: 'id', | ||||
|     }, | ||||
|     toolbarConfig: { | ||||
|       refresh: { code: 'query' }, | ||||
|       search: true, | ||||
|     }, | ||||
|   } as VxeTableGridOptions<MemberPointRecordApi.Record>, | ||||
| }); | ||||
| </script> | ||||
| 
 | ||||
| <template> | ||||
|   <Page> | ||||
|     <DocAlert | ||||
|       title="会员等级、积分、签到" | ||||
|       url="https://doc.iocoder.cn/member/level/" | ||||
|     /> | ||||
|     <Button | ||||
|       danger | ||||
|       type="link" | ||||
|       target="_blank" | ||||
|       href="https://github.com/yudaocode/yudao-ui-admin-vue3" | ||||
|     > | ||||
|       该功能支持 Vue3 + element-plus 版本! | ||||
|     </Button> | ||||
|     <br /> | ||||
|     <Button | ||||
|       type="link" | ||||
|       target="_blank" | ||||
|       href="https://github.com/yudaocode/yudao-ui-admin-vue3/blob/master/src/views/member/point/record/index" | ||||
|     > | ||||
|       可参考 | ||||
|       https://github.com/yudaocode/yudao-ui-admin-vue3/blob/master/src/views/member/point/record/index | ||||
|       代码,pull request 贡献给我们! | ||||
|     </Button> | ||||
|   <Page auto-content-height> | ||||
|     <Grid table-title="积分记录列表"> | ||||
|       <template #point="{ row }"> | ||||
|         <Tag :color="row.point > 0 ? '#108ee9' : '#f50'"> | ||||
|           {{ row.point > 0 ? `+${row.point}` : row.point }} | ||||
|         </Tag> | ||||
|       </template> | ||||
|     </Grid> | ||||
|   </Page> | ||||
| </template> | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 xingyu4j
						xingyu4j