Commit 316052faf27393916f1a65b8f608a87eb5dd1900

Authored by wuxw
1 parent 20ca5dc6

加入用户关注功能

src/api/community/wechatSubscribeApi.js 0 → 100644
  1 +import request from '@/utils/request'
  2 +import { getCommunityId } from '@/api/community/communityApi'
  3 +
  4 +// 获取微信关注用户列表
  5 +export function listWechatSubscribe(params) {
  6 + return new Promise((resolve, reject) => {
  7 + request({
  8 + url: '/wechat.listWechatSubscribe',
  9 + method: 'get',
  10 + params: {
  11 + ...params,
  12 + communityId: getCommunityId()
  13 + }
  14 + }).then(response => {
  15 + const res = response.data
  16 + resolve(res)
  17 + }).catch(error => {
  18 + reject(error)
  19 + })
  20 + })
  21 +}
  22 +
  23 +// 同步微信关注用户
  24 +export function synchronizeWechatSubscribe(data) {
  25 + return new Promise((resolve, reject) => {
  26 + request({
  27 + url: '/wechat.synchronizeWechatSubscribe',
  28 + method: 'post',
  29 + data: {
  30 + ...data,
  31 + communityId: getCommunityId()
  32 + }
  33 + }).then(response => {
  34 + const res = response.data
  35 + resolve(res)
  36 + }).catch(error => {
  37 + reject(error)
  38 + })
  39 + })
  40 +}
0 41 \ No newline at end of file
... ...
src/components/community/syncSubscribeWechat.vue 0 → 100644
  1 +<template>
  2 + <el-dialog
  3 + :title="$t('wechatSubscribe.confirmTitle')"
  4 + :visible.sync="visible"
  5 + width="500px"
  6 + @close="handleClose">
  7 + <div class="dialog-content">
  8 + <p>{{ $t('wechatSubscribe.syncConfirmText') }}</p>
  9 + </div>
  10 + <div slot="footer" class="dialog-footer">
  11 + <el-button @click="handleClose">{{ $t('common.cancel') }}</el-button>
  12 + <el-button type="primary" @click="syncSubscribeWechat">{{ $t('common.submit') }}</el-button>
  13 + </div>
  14 + </el-dialog>
  15 +</template>
  16 +
  17 +<script>
  18 +import { synchronizeWechatSubscribe } from '@/api/community/wechatSubscribeApi'
  19 +import { getCommunityId } from '@/api/community/communityApi'
  20 +
  21 +export default {
  22 + name: 'SyncSubscribeWechat',
  23 + data() {
  24 + return {
  25 + visible: false
  26 + }
  27 + },
  28 + methods: {
  29 + open() {
  30 + this.visible = true
  31 + },
  32 + handleClose() {
  33 + this.visible = false
  34 + },
  35 + async syncSubscribeWechat() {
  36 + try {
  37 + const params = {
  38 + communityId: getCommunityId()
  39 + }
  40 + await synchronizeWechatSubscribe(params)
  41 + this.$message.success(this.$t('wechatSubscribe.syncSuccess'))
  42 + this.$emit('success')
  43 + this.handleClose()
  44 + } catch (error) {
  45 + this.$message.error(this.$t('wechatSubscribe.syncError'))
  46 + }
  47 + }
  48 + }
  49 +}
  50 +</script>
  51 +
  52 +<style lang="scss" scoped>
  53 +.dialog-content {
  54 + padding: 20px;
  55 + text-align: center;
  56 +
  57 + p {
  58 + margin: 0;
  59 + line-height: 1.5;
  60 + }
  61 +}
  62 +
  63 +.dialog-footer {
  64 + text-align: right;
  65 +}
  66 +</style>
0 67 \ No newline at end of file
... ...
src/i18n/communityI18n.js
... ... @@ -13,6 +13,7 @@ import { messages as adminCarDetailMessages } from &#39;../views/aCommunity/adminCar
13 13 import { messages as adminFeeDetailMessages } from '../views/aCommunity/adminFeeDetailLang.js'
14 14 import { messages as listRoomDecorationRecordMessages } from '../views/community/listRoomDecorationRecordLang'
15 15 import { messages as listRoomRenovationRecordDetailsMessages } from '../views/community/listRoomRenovationRecordDetailsLang'
  16 +import { messages as wechatSubscribeMessages } from '../views/community/wechatSubscribeLang'
16 17 export const messages = {
17 18 en: {
18 19 ...roomStructureMessages.en,
... ... @@ -30,6 +31,7 @@ export const messages = {
30 31 ...adminFeeDetailMessages.en,
31 32 ...listRoomDecorationRecordMessages.en,
32 33 ...listRoomRenovationRecordDetailsMessages.en,
  34 + ...wechatSubscribeMessages.en,
33 35 },
34 36 zh: {
35 37 ...roomStructureMessages.zh,
... ... @@ -47,5 +49,6 @@ export const messages = {
47 49 ...adminFeeDetailMessages.zh,
48 50 ...listRoomDecorationRecordMessages.zh,
49 51 ...listRoomRenovationRecordDetailsMessages.zh,
  52 + ...wechatSubscribeMessages.zh,
50 53 }
51 54 }
52 55 \ No newline at end of file
... ...
src/router/communityRouter.js
... ... @@ -74,4 +74,9 @@ export default [
74 74 name: '/views/community/listRoomRenovationRecordDetails',
75 75 component: () => import('@/views/community/listRoomRenovationRecordDetailsList.vue')
76 76 },
  77 + {
  78 + path: '/pages/community/wechatSubscribe',
  79 + name: '/pages/community/wechatSubscribe',
  80 + component: () => import('@/views/community/wechatSubscribeList.vue')
  81 + },
77 82 ]
78 83 \ No newline at end of file
... ...
src/views/community/wechatSubscribeLang.js 0 → 100644
  1 +export const messages = {
  2 + en: {
  3 + wechatSubscribe: {
  4 + title: 'Subscribed Users',
  5 + type: 'Type',
  6 + openId: 'Open ID',
  7 + unionId: 'Union ID',
  8 + syncTime: 'Sync Time',
  9 + wechat: 'WeChat',
  10 + other: 'Other',
  11 + syncUser: 'Sync Users',
  12 + confirmTitle: 'Please confirm your operation!',
  13 + syncConfirmText: 'Confirm to sync subscribed users data from WeChat official account. Please do not use frequently to avoid being banned by WeChat. Please refresh to view sync records after submission.',
  14 + syncSuccess: 'Sync successfully',
  15 + syncError: 'Sync failed',
  16 + fetchError: 'Failed to fetch subscribed users'
  17 + }
  18 + },
  19 + zh: {
  20 + wechatSubscribe: {
  21 + title: '关注用户',
  22 + type: '类型',
  23 + openId: 'Open ID',
  24 + unionId: 'Union ID',
  25 + syncTime: '同步时间',
  26 + wechat: '微信',
  27 + other: '其他',
  28 + syncUser: '同步用户',
  29 + confirmTitle: '请确认您的操作!',
  30 + syncConfirmText: '确定从公众号同步关注用户数据,请不要频繁使用,以免微信公众号封禁,提交后请刷新查看同步记录',
  31 + syncSuccess: '同步成功',
  32 + syncError: '同步失败',
  33 + fetchError: '获取关注用户失败'
  34 + }
  35 + }
  36 +}
0 37 \ No newline at end of file
... ...
src/views/community/wechatSubscribeList.vue 0 → 100644
  1 +<template>
  2 + <div class="wechat-subscribe-container">
  3 + <el-card class="box-card">
  4 + <div slot="header" class="flex justify-between items-center">
  5 + <span>{{ $t('wechatSubscribe.title') }}</span>
  6 + <div class="card-header-actions">
  7 + <el-button size="small" @click="_queryWechatSubscribeMethod()">
  8 + {{ $t('common.refresh') }}
  9 + </el-button>
  10 + <el-button
  11 + type="primary"
  12 + size="small"
  13 + @click="_openOpenSyncDataModel()">
  14 + {{ $t('wechatSubscribe.syncUser') }}
  15 + </el-button>
  16 + </div>
  17 + </div>
  18 +
  19 + <el-table
  20 + v-loading="loading"
  21 + :data="wechatSubscribeInfo.users"
  22 + border
  23 + style="width: 100%">
  24 + <el-table-column
  25 + prop="openType"
  26 + :label="$t('wechatSubscribe.type')"
  27 + align="center">
  28 + <template slot-scope="scope">
  29 + {{ scope.row.openType === 'WECHAT' ? $t('wechatSubscribe.wechat') : $t('wechatSubscribe.other') }}
  30 + </template>
  31 + </el-table-column>
  32 + <el-table-column
  33 + prop="openId"
  34 + :label="$t('wechatSubscribe.openId')"
  35 + align="center">
  36 + </el-table-column>
  37 + <el-table-column
  38 + prop="unionId"
  39 + :label="$t('wechatSubscribe.unionId')"
  40 + align="center">
  41 + </el-table-column>
  42 + <el-table-column
  43 + prop="appId"
  44 + label="app_id"
  45 + align="center">
  46 + </el-table-column>
  47 + <el-table-column
  48 + prop="createTime"
  49 + :label="$t('wechatSubscribe.syncTime')"
  50 + align="center">
  51 + </el-table-column>
  52 + </el-table>
  53 +
  54 + <el-pagination
  55 + class="pagination-wrapper"
  56 + :current-page.sync="page.current"
  57 + :page-sizes="[10, 20, 30, 50]"
  58 + :page-size="page.size"
  59 + :total="page.total"
  60 + layout="total, sizes, prev, pager, next, jumper"
  61 + @size-change="handleSizeChange"
  62 + @current-change="handleCurrentChange">
  63 + </el-pagination>
  64 + </el-card>
  65 +
  66 + <sync-subscribe-wechat ref="syncSubscribeWechat" @success="handleSyncSuccess"></sync-subscribe-wechat>
  67 + </div>
  68 +</template>
  69 +
  70 +<script>
  71 +import { listWechatSubscribe } from '@/api/community/wechatSubscribeApi'
  72 +import { getCommunityId } from '@/api/community/communityApi'
  73 +import SyncSubscribeWechat from '@/components/community/syncSubscribeWechat'
  74 +
  75 +export default {
  76 + name: 'WechatSubscribeList',
  77 + components: {
  78 + SyncSubscribeWechat
  79 + },
  80 + data() {
  81 + return {
  82 + loading: false,
  83 + wechatSubscribeInfo: {
  84 + users: [],
  85 + conditions: {
  86 + name: '',
  87 + appId: '',
  88 + weChatType: '1000'
  89 + }
  90 + },
  91 + page: {
  92 + current: 1,
  93 + size: 10,
  94 + total: 0
  95 + }
  96 + }
  97 + },
  98 + created() {
  99 + this._listWechatSubscribes(this.page.current, this.page.size)
  100 + },
  101 + methods: {
  102 + async _listWechatSubscribes(page, size) {
  103 + try {
  104 + this.loading = true
  105 + const params = {
  106 + page,
  107 + row: size,
  108 + communityId: getCommunityId(),
  109 + ...this.wechatSubscribeInfo.conditions
  110 + }
  111 + const { data, total } = await listWechatSubscribe(params)
  112 + this.wechatSubscribeInfo.users = data
  113 + this.page.total = total
  114 + } catch (error) {
  115 + this.$message.error(this.$t('wechatSubscribe.fetchError'))
  116 + } finally {
  117 + this.loading = false
  118 + }
  119 + },
  120 + _openOpenSyncDataModel() {
  121 + this.$refs.syncSubscribeWechat.open()
  122 + },
  123 + _queryWechatSubscribeMethod() {
  124 + this.page.current = 1
  125 + this._listWechatSubscribes(this.page.current, this.page.size)
  126 + },
  127 + handleSyncSuccess() {
  128 + this._listWechatSubscribes(this.page.current, this.page.size)
  129 + },
  130 + handleSizeChange(val) {
  131 + this.page.size = val
  132 + this._listWechatSubscribes(this.page.current, val)
  133 + },
  134 + handleCurrentChange(val) {
  135 + this._listWechatSubscribes(val, this.page.size)
  136 + }
  137 + }
  138 +}
  139 +</script>
  140 +
  141 +<style lang="scss" scoped>
  142 +.wechat-subscribe-container {
  143 + padding: 20px;
  144 +
  145 + .box-card {
  146 + margin-bottom: 20px;
  147 + }
  148 +
  149 + .card-header-actions {
  150 + float: right;
  151 + }
  152 +
  153 + .pagination-wrapper {
  154 + margin-top: 20px;
  155 + text-align: right;
  156 + }
  157 +}
  158 +</style>
0 159 \ No newline at end of file
... ...