Skip to content

Commit 848b668

Browse files
YunaiVgitee-org
authored andcommitted
!205 同步 master 代码到 dev
Merge pull request !205 from 芋道源码/master
2 parents 7bf3e41 + cb4c78b commit 848b668

File tree

12 files changed

+534
-249
lines changed

12 files changed

+534
-249
lines changed

package.json

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,6 @@
5757
"nprogress": "^0.2.0",
5858
"pinia": "^2.1.6",
5959
"qrcode": "^1.5.3",
60-
"qrcode.vue": "^3.4.0",
6160
"qs": "^6.11.2",
6261
"steady-xml": "^0.1.0",
6362
"url": "^0.11.1",
@@ -72,9 +71,9 @@
7271
"xml-js": "^1.6.11"
7372
},
7473
"devDependencies": {
75-
"@commitlint/cli": "^17.6.7",
76-
"@commitlint/config-conventional": "^17.6.7",
77-
"@iconify/json": "^2.2.98",
74+
"@commitlint/cli": "^17.7.1",
75+
"@commitlint/config-conventional": "^17.7.0",
76+
"@iconify/json": "^2.2.100",
7877
"@intlify/unplugin-vue-i18n": "^0.12.2",
7978
"@purge-icons/generated": "^0.9.0",
8079
"@types/intro.js": "^5.1.1",
@@ -83,42 +82,42 @@
8382
"@types/nprogress": "^0.2.0",
8483
"@types/qrcode": "^1.5.1",
8584
"@types/qs": "^6.9.7",
86-
"@typescript-eslint/eslint-plugin": "^6.2.1",
87-
"@typescript-eslint/parser": "^6.2.1",
88-
"@unocss/transformer-variant-group": "^0.54.1",
85+
"@typescript-eslint/eslint-plugin": "^6.3.0",
86+
"@typescript-eslint/parser": "^6.3.0",
87+
"@unocss/transformer-variant-group": "^0.55.0",
8988
"@vitejs/plugin-legacy": "^4.1.1",
9089
"@vitejs/plugin-vue": "^4.2.3",
9190
"@vitejs/plugin-vue-jsx": "^3.0.1",
92-
"@vue-macros/volar": "^0.13.2",
91+
"@vue-macros/volar": "^0.13.3",
9392
"autoprefixer": "^10.4.14",
9493
"bpmn-js": "^8.9.0",
9594
"bpmn-js-properties-panel": "^0.46.0",
9695
"consola": "^3.2.3",
97-
"eslint": "^8.46.0",
98-
"eslint-config-prettier": "^8.10.0",
99-
"eslint-define-config": "^1.22.0",
96+
"eslint": "^8.47.0",
97+
"eslint-config-prettier": "^9.0.0",
98+
"eslint-define-config": "^1.23.0",
10099
"eslint-plugin-prettier": "^5.0.0",
101-
"eslint-plugin-vue": "^9.16.1",
100+
"eslint-plugin-vue": "^9.17.0",
102101
"lint-staged": "^13.2.3",
103102
"postcss": "^8.4.27",
104103
"postcss-html": "^1.5.0",
105104
"postcss-scss": "^4.0.6",
106105
"prettier": "^3.0.1",
107106
"rimraf": "^5.0.1",
108-
"rollup": "^3.27.2",
109-
"sass": "^1.64.2",
107+
"rollup": "^3.28.0",
108+
"sass": "^1.65.1",
110109
"stylelint": "^15.10.2",
111110
"stylelint-config-html": "^1.1.0",
112111
"stylelint-config-recommended": "^13.0.0",
113112
"stylelint-config-standard": "^34.0.0",
114113
"stylelint-order": "^6.0.3",
115114
"terser": "^5.19.2",
116115
"typescript": "5.1.6",
117-
"unocss": "^0.54.1",
116+
"unocss": "^0.55.0",
118117
"unplugin-auto-import": "^0.16.6",
119118
"unplugin-element-plus": "^0.8.0",
120119
"unplugin-vue-components": "^0.25.1",
121-
"vite": "4.4.8",
120+
"vite": "4.4.9",
122121
"vite-plugin-compression": "^0.5.1",
123122
"vite-plugin-ejs": "^1.6.4",
124123
"vite-plugin-eslint": "^1.8.1",

src/api/member/user/index.ts

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import request from '@/config/axios'
2+
3+
export interface UserVO {
4+
id: number
5+
mobile: string
6+
password: string
7+
status: number
8+
registerIp: string
9+
loginIp: string
10+
loginDate: Date
11+
nickname: string
12+
avatar: string
13+
name: string
14+
sex: number
15+
areaId: number
16+
birthday: Date
17+
mark: string
18+
createTime: Date
19+
}
20+
21+
// 查询会员用户列表
22+
export const getUserPage = async (params) => {
23+
return await request.get({ url: `/member/user/page`, params })
24+
}
25+
26+
// 查询会员用户详情
27+
export const getUser = async (id: number) => {
28+
return await request.get({ url: `/member/user/get?id=` + id })
29+
}
30+
31+
// 修改会员用户
32+
export const updateUser = async (data: UserVO) => {
33+
return await request.put({ url: `/member/user/update`, data })
34+
}

src/utils/dict.ts

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -131,12 +131,8 @@ export enum DICT_TYPE {
131131

132132
// ========== PAY 模块 ==========
133133
PAY_CHANNEL_CODE = 'pay_channel_code', // 支付渠道编码类型
134-
PAY_CHANNEL_CODE_TYPE = 'pay_channel_code_type', // 支付渠道编码类型
135134
PAY_ORDER_STATUS = 'pay_order_status', // 商户支付订单状态
136-
PAY_ORDER_REFUND_STATUS = 'pay_order_refund_status', // 商户支付订单退款状态
137-
PAY_REFUND_ORDER_STATUS = 'pay_refund_order_status', // 退款订单状态
138-
PAY_REFUND_ORDER_TYPE = 'pay_refund_order_type', // 退款订单类别
139-
135+
PAY_REFUND_STATUS = 'pay_refund_status', // 退款订单状态
140136
PAY_NOTIFY_STATUS = 'pay_notify_status', // 商户支付回调状态
141137
PAY_NOTIFY_TYPE = 'pay_notify_type', // 商户支付回调状态
142138

src/views/member/user/UserForm.vue

Lines changed: 170 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,170 @@
1+
<template>
2+
<Dialog :title="dialogTitle" v-model="dialogVisible">
3+
<el-form
4+
ref="formRef"
5+
:model="formData"
6+
:rules="formRules"
7+
label-width="100px"
8+
v-loading="formLoading"
9+
>
10+
<el-form-item label="手机号" prop="mobile">
11+
<el-input v-model="formData.mobile" placeholder="请输入手机号" />
12+
</el-form-item>
13+
<el-form-item label="状态" prop="status">
14+
<el-radio-group v-model="formData.status">
15+
<el-radio
16+
v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
17+
:key="dict.value"
18+
:label="dict.value"
19+
>
20+
{{ dict.label }}
21+
</el-radio>
22+
</el-radio-group>
23+
</el-form-item>
24+
<el-form-item label="用户昵称" prop="nickname">
25+
<el-input v-model="formData.nickname" placeholder="请输入用户昵称" />
26+
</el-form-item>
27+
<el-form-item label="头像" prop="avatar">
28+
<UploadImg v-model="formData.avatar" :limit="1" :is-show-tip="false" />
29+
</el-form-item>
30+
<el-form-item label="真实名字" prop="name">
31+
<el-input v-model="formData.name" placeholder="请输入真实名字" />
32+
</el-form-item>
33+
<el-form-item label="用户性别" prop="sex">
34+
<el-radio-group v-model="formData.sex">
35+
<el-radio
36+
v-for="dict in getIntDictOptions(DICT_TYPE.SYSTEM_USER_SEX)"
37+
:key="dict.value"
38+
:label="dict.value"
39+
>
40+
{{ dict.label }}
41+
</el-radio>
42+
</el-radio-group>
43+
</el-form-item>
44+
<el-form-item label="出生日期" prop="birthday">
45+
<el-date-picker
46+
v-model="formData.birthday"
47+
type="date"
48+
value-format="x"
49+
placeholder="选择出生日期"
50+
/>
51+
</el-form-item>
52+
<el-form-item label="所在地" prop="areaId">
53+
<el-tree-select
54+
v-model="formData.areaId"
55+
:data="areaList"
56+
:props="defaultProps"
57+
:render-after-expand="true"
58+
/>
59+
</el-form-item>
60+
<el-form-item label="会员备注" prop="mark">
61+
<el-input type="textarea" v-model="formData.mark" placeholder="请输入会员备注" />
62+
</el-form-item>
63+
</el-form>
64+
<template #footer>
65+
<el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
66+
<el-button @click="dialogVisible = false">取 消</el-button>
67+
</template>
68+
</Dialog>
69+
</template>
70+
<script setup lang="ts">
71+
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
72+
import * as UserApi from '@/api/member/user'
73+
import * as AreaApi from '@/api/system/area'
74+
import { defaultProps } from '@/utils/tree'
75+
76+
const { t } = useI18n() // 国际化
77+
const message = useMessage() // 消息弹窗
78+
79+
const dialogVisible = ref(false) // 弹窗的是否展示
80+
const dialogTitle = ref('') // 弹窗的标题
81+
const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
82+
const formType = ref('') // 表单的类型:create - 新增;update - 修改
83+
const formData = ref({
84+
id: undefined,
85+
mobile: undefined,
86+
status: undefined,
87+
nickname: undefined,
88+
avatar: undefined,
89+
name: undefined,
90+
sex: undefined,
91+
areaId: undefined,
92+
birthday: undefined,
93+
mark: undefined
94+
})
95+
const formRules = reactive({
96+
mobile: [{ required: true, message: '手机号不能为空', trigger: 'blur' }],
97+
status: [{ required: true, message: '状态不能为空', trigger: 'blur' }]
98+
})
99+
const formRef = ref() // 表单 Ref
100+
const areaList = ref([]) // 地区列表
101+
102+
/** 打开弹窗 */
103+
const open = async (type: string, id?: number) => {
104+
dialogVisible.value = true
105+
dialogTitle.value = t('action.' + type)
106+
formType.value = type
107+
resetForm()
108+
// 修改时,设置数据
109+
if (id) {
110+
formLoading.value = true
111+
try {
112+
formData.value = await UserApi.getUser(id)
113+
} finally {
114+
formLoading.value = false
115+
}
116+
}
117+
// 获得地区列表
118+
areaList.value = await AreaApi.getAreaTree()
119+
}
120+
defineExpose({ open }) // 提供 open 方法,用于打开弹窗
121+
122+
/** 提交表单 */
123+
const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
124+
const submitForm = async () => {
125+
// 校验表单
126+
if (!formRef) return
127+
const valid = await formRef.value.validate()
128+
if (!valid) return
129+
// 提交请求
130+
formLoading.value = true
131+
try {
132+
const data = formData.value as unknown as UserApi.UserVO
133+
if (formType.value === 'create') {
134+
// 说明:目前暂时没有新增操作。如果自己业务需要,可以进行扩展
135+
// await UserApi.createUser(data)
136+
message.success(t('common.createSuccess'))
137+
} else {
138+
await UserApi.updateUser(data)
139+
message.success(t('common.updateSuccess'))
140+
}
141+
dialogVisible.value = false
142+
// 发送操作成功的事件
143+
emit('success')
144+
} finally {
145+
formLoading.value = false
146+
}
147+
}
148+
149+
/** 重置表单 */
150+
const resetForm = () => {
151+
formData.value = {
152+
id: undefined,
153+
mobile: undefined,
154+
password: undefined,
155+
status: undefined,
156+
registerIp: undefined,
157+
loginIp: undefined,
158+
loginDate: undefined,
159+
nickname: undefined,
160+
avatar: undefined,
161+
name: undefined,
162+
sex: undefined,
163+
areaId: undefined,
164+
birthday: undefined,
165+
mark: undefined,
166+
createTime: undefined
167+
}
168+
formRef.value?.resetFields()
169+
}
170+
</script>

0 commit comments

Comments
 (0)