Skip to content

Commit 6ee2492

Browse files
author
puhui999
committed
新增社交用户 RUD
1 parent 8935188 commit 6ee2492

File tree

3 files changed

+377
-0
lines changed

3 files changed

+377
-0
lines changed

src/api/system/social/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 SocialUserVO {
4+
id: number
5+
type: number
6+
openid: string
7+
token: string
8+
rawTokenInfo: string
9+
nickname: string
10+
avatar: string
11+
rawUserInfo: string
12+
code: string
13+
state: string
14+
}
15+
16+
// 查询社交用户列表
17+
export const getSocialUserPage = async (params) => {
18+
return await request.get({ url: `/system/social-user/page`, params })
19+
}
20+
21+
// 查询社交用户详情
22+
export const getSocialUser = async (id: number) => {
23+
return await request.get({ url: `/system/social-user/get?id=` + id })
24+
}
25+
26+
// 修改社交用户
27+
export const updateSocialUser = async (data: SocialUserVO) => {
28+
return await request.put({ url: `/system/social-user/update`, data })
29+
}
30+
31+
// 删除社交用户
32+
export const deleteSocialUser = async (id: number) => {
33+
return await request.delete({ url: `/system/social-user/delete?id=` + id })
34+
}
Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
<template>
2+
<Dialog v-model="dialogVisible" :title="dialogTitle">
3+
<el-form
4+
ref="formRef"
5+
v-loading="formLoading"
6+
:model="formData"
7+
:rules="formRules"
8+
label-width="150px"
9+
>
10+
<el-form-item label="社交平台" prop="type">
11+
<el-radio-group v-model="formData.type">
12+
<el-radio
13+
v-for="dict in getIntDictOptions(DICT_TYPE.SYSTEM_SOCIAL_CLIENT_TYPE)"
14+
:key="dict.value"
15+
:label="dict.value"
16+
>
17+
{{ dict.label }}
18+
</el-radio>
19+
</el-radio-group>
20+
</el-form-item>
21+
<el-form-item label="社交 openid" prop="openid">
22+
<el-input v-model="formData.openid" placeholder="请输入社交 openid" />
23+
</el-form-item>
24+
<el-form-item label="社交 token" prop="token">
25+
<el-input v-model="formData.token" placeholder="请输入社交 token" />
26+
</el-form-item>
27+
<el-form-item label="原始 Token 数据" prop="rawTokenInfo">
28+
<el-input v-model="formData.rawTokenInfo" placeholder="请输入原始 Token 数据" />
29+
</el-form-item>
30+
<el-form-item label="用户昵称" prop="nickname">
31+
<el-input v-model="formData.nickname" placeholder="请输入用户昵称" />
32+
</el-form-item>
33+
<el-form-item label="用户头像" prop="avatar">
34+
<el-input v-model="formData.avatar" placeholder="请输入用户头像" />
35+
</el-form-item>
36+
<el-form-item label="原始用户数据" prop="rawUserInfo">
37+
<el-input v-model="formData.rawUserInfo" placeholder="请输入原始用户数据" />
38+
</el-form-item>
39+
<el-form-item label="最后一次的认证 code" prop="code">
40+
<el-input v-model="formData.code" placeholder="请输入最后一次的认证 code" />
41+
</el-form-item>
42+
<el-form-item label="最后一次的认证 state" prop="state">
43+
<el-input v-model="formData.state" placeholder="请输入最后一次的认证 state" />
44+
</el-form-item>
45+
</el-form>
46+
<template #footer>
47+
<el-button :disabled="formLoading" type="primary" @click="submitForm">确 定</el-button>
48+
<el-button @click="dialogVisible = false">取 消</el-button>
49+
</template>
50+
</Dialog>
51+
</template>
52+
<script lang="ts" setup>
53+
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
54+
import * as SocialUserApi from '@/api/system/social/user'
55+
56+
const { t } = useI18n() // 国际化
57+
const message = useMessage() // 消息弹窗
58+
59+
const dialogVisible = ref(false) // 弹窗的是否展示
60+
const dialogTitle = ref('') // 弹窗的标题
61+
const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
62+
const formType = ref('') // 表单的类型:create - 新增;update - 修改
63+
const formData = ref({
64+
id: undefined,
65+
type: undefined,
66+
openid: undefined,
67+
token: undefined,
68+
rawTokenInfo: undefined,
69+
nickname: undefined,
70+
avatar: undefined,
71+
rawUserInfo: undefined,
72+
code: undefined,
73+
state: 0
74+
})
75+
const formRules = reactive({
76+
type: [{ required: true, message: '社交平台不能为空', trigger: 'blur' }],
77+
openid: [{ required: true, message: '社交 openid 不能为空', trigger: 'blur' }],
78+
nickname: [{ required: true, message: '用户昵称不能为空', trigger: 'blur' }]
79+
})
80+
const formRef = ref() // 表单 Ref
81+
82+
/** 打开弹窗 */
83+
const open = async (type: string, id?: number) => {
84+
dialogVisible.value = true
85+
dialogTitle.value = t('action.' + type)
86+
formType.value = type
87+
resetForm()
88+
// 修改时,设置数据
89+
if (id) {
90+
formLoading.value = true
91+
try {
92+
formData.value = await SocialUserApi.getSocialUser(id)
93+
} finally {
94+
formLoading.value = false
95+
}
96+
}
97+
}
98+
defineExpose({ open }) // 提供 open 方法,用于打开弹窗
99+
100+
/** 提交表单 */
101+
const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
102+
const submitForm = async () => {
103+
// 校验表单
104+
if (!formRef) return
105+
const valid = await formRef.value.validate()
106+
if (!valid) return
107+
// 提交请求
108+
formLoading.value = true
109+
try {
110+
const data = formData.value as unknown as SocialUserApi.SocialUserVO
111+
if (formType.value === 'update') {
112+
await SocialUserApi.updateSocialUser(data)
113+
message.success(t('common.updateSuccess'))
114+
}
115+
dialogVisible.value = false
116+
// 发送操作成功的事件
117+
emit('success')
118+
} finally {
119+
formLoading.value = false
120+
}
121+
}
122+
123+
/** 重置表单 */
124+
const resetForm = () => {
125+
formData.value = {
126+
id: undefined,
127+
type: undefined,
128+
openid: undefined,
129+
token: undefined,
130+
rawTokenInfo: undefined,
131+
nickname: undefined,
132+
avatar: undefined,
133+
rawUserInfo: undefined,
134+
code: undefined,
135+
state: 0
136+
}
137+
formRef.value?.resetFields()
138+
}
139+
</script>
Lines changed: 204 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,204 @@
1+
<template>
2+
<ContentWrap>
3+
<!-- 搜索工作栏 -->
4+
<el-form
5+
ref="queryFormRef"
6+
:inline="true"
7+
:model="queryParams"
8+
class="-mb-15px"
9+
label-width="68px"
10+
>
11+
<el-form-item label="社交平台" prop="type">
12+
<el-select
13+
v-model="queryParams.type"
14+
class="!w-240px"
15+
clearable
16+
placeholder="请选择社交平台"
17+
>
18+
<el-option
19+
v-for="dict in getIntDictOptions(DICT_TYPE.SYSTEM_SOCIAL_CLIENT_TYPE)"
20+
:key="dict.value"
21+
:label="dict.label"
22+
:value="dict.value"
23+
/>
24+
</el-select>
25+
</el-form-item>
26+
<el-form-item label="用户昵称" prop="nickname">
27+
<el-input
28+
v-model="queryParams.nickname"
29+
class="!w-240px"
30+
clearable
31+
placeholder="请输入用户昵称"
32+
@keyup.enter="handleQuery"
33+
/>
34+
</el-form-item>
35+
<el-form-item label="创建时间" prop="createTime">
36+
<el-date-picker
37+
v-model="queryParams.createTime"
38+
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
39+
class="!w-240px"
40+
end-placeholder="结束日期"
41+
start-placeholder="开始日期"
42+
type="daterange"
43+
value-format="YYYY-MM-DD HH:mm:ss"
44+
/>
45+
</el-form-item>
46+
<el-form-item>
47+
<el-button @click="handleQuery">
48+
<Icon class="mr-5px" icon="ep:search" />
49+
搜索
50+
</el-button>
51+
<el-button @click="resetQuery">
52+
<Icon class="mr-5px" icon="ep:refresh" />
53+
重置
54+
</el-button>
55+
</el-form-item>
56+
</el-form>
57+
</ContentWrap>
58+
59+
<!-- 列表 -->
60+
<ContentWrap>
61+
<el-table v-loading="loading" :data="list" :show-overflow-tooltip="true" :stripe="true">
62+
<el-table-column align="center" label="社交平台" prop="type">
63+
<template #default="scope">
64+
<dict-tag :type="DICT_TYPE.SYSTEM_SOCIAL_CLIENT_TYPE" :value="scope.row.type" />
65+
</template>
66+
</el-table-column>
67+
<el-table-column align="center" label="社交 openid" prop="openid" />
68+
<el-table-column align="center" label="社交 token" prop="token" />
69+
<el-table-column align="center" label="原始 Token 数据" prop="rawTokenInfo" />
70+
<el-table-column align="center" label="用户昵称" prop="nickname" />
71+
<el-table-column align="center" label="用户头像" prop="avatar">
72+
<template #default="{ row }">
73+
<el-image :src="row.avatar" class="h-30px w-30px" @click="imagePreview(row.avatar)" />
74+
</template>
75+
</el-table-column>
76+
<el-table-column align="center" label="原始用户数据" prop="rawUserInfo" />
77+
<el-table-column align="center" label="最后一次的认证 code" prop="code" />
78+
<el-table-column align="center" label="最后一次的认证 state" prop="state" />
79+
<el-table-column
80+
:formatter="dateFormatter"
81+
align="center"
82+
label="创建时间"
83+
prop="createTime"
84+
width="180px"
85+
/>
86+
<el-table-column align="center" fixed="right" label="操作">
87+
<template #default="scope">
88+
<el-button
89+
v-hasPermi="['system:social-user:update']"
90+
link
91+
type="primary"
92+
@click="openForm('update', scope.row.id)"
93+
>
94+
编辑
95+
</el-button>
96+
<el-button
97+
v-hasPermi="['system:social-user:delete']"
98+
link
99+
type="danger"
100+
@click="handleDelete(scope.row.id)"
101+
>
102+
删除
103+
</el-button>
104+
</template>
105+
</el-table-column>
106+
</el-table>
107+
<!-- 分页 -->
108+
<Pagination
109+
v-model:limit="queryParams.pageSize"
110+
v-model:page="queryParams.pageNo"
111+
:total="total"
112+
@pagination="getList"
113+
/>
114+
</ContentWrap>
115+
116+
<!-- 表单弹窗:添加/修改 -->
117+
<SocialUserForm ref="formRef" @success="getList" />
118+
</template>
119+
120+
<script lang="ts" setup>
121+
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
122+
import { dateFormatter } from '@/utils/formatTime'
123+
import * as SocialUserApi from '@/api/system/social/user'
124+
import SocialUserForm from './SocialUserForm.vue'
125+
import { createImageViewer } from '@/components/ImageViewer'
126+
127+
defineOptions({ name: 'SocialUser' })
128+
129+
const message = useMessage() // 消息弹窗
130+
const { t } = useI18n() // 国际化
131+
132+
const loading = ref(true) // 列表的加载中
133+
const total = ref(0) // 列表的总页数
134+
const list = ref([]) // 列表的数据
135+
const queryParams = reactive({
136+
pageNo: 1,
137+
pageSize: 10,
138+
type: undefined,
139+
openid: undefined,
140+
token: undefined,
141+
rawTokenInfo: undefined,
142+
nickname: undefined,
143+
avatar: undefined,
144+
rawUserInfo: undefined,
145+
code: undefined,
146+
state: undefined,
147+
createTime: []
148+
})
149+
const queryFormRef = ref() // 搜索的表单
150+
151+
/** 查询列表 */
152+
const getList = async () => {
153+
loading.value = true
154+
try {
155+
const data = await SocialUserApi.getSocialUserPage(queryParams)
156+
list.value = data.list
157+
total.value = data.total
158+
} finally {
159+
loading.value = false
160+
}
161+
}
162+
163+
/** 搜索按钮操作 */
164+
const handleQuery = () => {
165+
queryParams.pageNo = 1
166+
getList()
167+
}
168+
169+
/** 重置按钮操作 */
170+
const resetQuery = () => {
171+
queryFormRef.value.resetFields()
172+
handleQuery()
173+
}
174+
175+
const imagePreview = (imgUrl: string) => {
176+
createImageViewer({
177+
urlList: [imgUrl]
178+
})
179+
}
180+
181+
/** 修改操作 */
182+
const formRef = ref()
183+
const openForm = (type: string, id?: number) => {
184+
formRef.value.open(type, id)
185+
}
186+
187+
/** 删除按钮操作 */
188+
const handleDelete = async (id: number) => {
189+
try {
190+
// 删除的二次确认
191+
await message.delConfirm()
192+
// 发起删除
193+
await SocialUserApi.deleteSocialUser(id)
194+
message.success(t('common.delSuccess'))
195+
// 刷新列表
196+
await getList()
197+
} catch {}
198+
}
199+
200+
/** 初始化 **/
201+
onMounted(() => {
202+
getList()
203+
})
204+
</script>

0 commit comments

Comments
 (0)