front/src/components/UserProfileFields/index.vue
zzh 6fb1f4fd66 feat: 接入企业微信客服,并同步工作台与下单页改动
官网/H5 支持企微客服跳转;用户资料新增 WecomKfUrl;工作台与下单相关体验一并更新。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-01 19:09:34 +08:00

105 lines
3.0 KiB
Vue

<template>
<div class="user-profile-fields">
<a-form-item :label="t('system.user.form.phone')" field="phone">
<a-input v-model="phone" :placeholder="t('system.user.form.phonePlaceholder')" />
</a-form-item>
<a-form-item :label="t('system.user.form.employeeNo')" field="employeeNo">
<a-input
v-model="employeeNo"
:placeholder="t('system.user.form.employeeNoPlaceholder')"
:readonly="employeeNoReadonly"
/>
</a-form-item>
<a-form-item :label="t('system.user.form.wechatId')" field="wechatId">
<a-input v-model="wechatId" :placeholder="t('system.user.form.wechatIdPlaceholder')" />
</a-form-item>
<a-form-item :label="t('system.user.form.wecomKfUrl')" field="wecomKfUrl">
<a-input v-model="wecomKfUrl" :placeholder="t('system.user.form.wecomKfUrlPlaceholder')" />
</a-form-item>
<a-form-item :label="t('system.user.form.wechatQrCode')" field="wechatQrFiles">
<a-upload
v-model:file-list="wechatQrFiles"
list-type="picture-card"
:limit="1"
accept="image/*"
:custom-request="handleWechatCustomRequest"
>
<template #upload-button>
<div class="upload-placeholder">
<icon-plus class="upload-icon" />
<span>{{ t('system.user.form.wechatQrUpload') }}</span>
</div>
</template>
</a-upload>
</a-form-item>
</div>
</template>
<script setup lang="ts">
import { useI18n } from 'vue-i18n'
import { IconPlus } from '@arco-design/web-vue/es/icon'
import { $baseMessage } from '@/utils'
import { readFileAsDataUrl } from '@/utils/image-data-url'
const { t } = useI18n()
withDefaults(
defineProps<{
employeeNoReadonly?: boolean
}>(),
{
employeeNoReadonly: false,
},
)
const phone = defineModel<string>('phone', { default: '' })
const employeeNo = defineModel<string>('employeeNo', { default: '' })
const wechatId = defineModel<string>('wechatId', { default: '' })
const wecomKfUrl = defineModel<string>('wecomKfUrl', { default: '' })
const wechatQrFiles = defineModel<any[]>('wechatQrFiles', { default: () => [] })
async function handleWechatCustomRequest(options: any) {
const { fileItem, onSuccess, onError } = options
const file = fileItem?.file as File | undefined
if (!file) {
onError?.()
return
}
try {
const dataUrl = await readFileAsDataUrl(
file,
undefined,
t('system.user.message.wechatQrTooLarge'),
)
fileItem.url = dataUrl
fileItem.status = 'done'
fileItem.response = { url: dataUrl }
onSuccess?.({ url: dataUrl })
} catch (e: any) {
fileItem.status = 'error'
$baseMessage(e?.message || t('system.user.message.wechatQrTooLarge'), 'warning')
onError?.(e)
}
}
</script>
<style lang="less" scoped>
.upload-placeholder {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
color: var(--color-text-3);
font-size: 12px;
.upload-icon {
font-size: 20px;
margin-bottom: 4px;
}
}
</style>