123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297 |
- <template>
- <div class="edit" :class="[isH5 ? 'edit-h5' : '']">
- <header class="edit-header">
- <i v-if="isH5" class="icon icon-back" @click="cancel"></i>
- <h1 class="edit-header-title">{{ $t("TUIProfile.资料设置") }}</h1>
- </header>
- <ul class="edit-list">
- <li class="edit-list-item space-top">
- <main class="edit-list-item-content" @click="setProfile('avatar')">
- <label>{{ $t("TUIProfile.头像") }}</label>
- <span v-if="isH5">
- <img :src="profile.avatar ? profile.avatar : 'https://oss.dayaedu.com/news-info/07/1690787574969.png'" onerror="this.src='https://oss.dayaedu.com/news-info/07/1690787574969.png'" />
- </span>
- <ul class="avatar-list" v-else>
- <li class="avatar-list-item" v-for="(item, index) in avatarList" :key="index" @click="chooseAvatar(item)">
- <img :class="[profile.avatar === item.avatar && 'selected']" :src="item.avatar" />
- </li>
- </ul>
- </main>
- <i v-if="isH5" class="icon icon-right"></i>
- </li>
- <li class="edit-list-item space-top">
- <main class="edit-list-item-content" @click="setProfile('nick')">
- <label>{{ $t("TUIProfile.昵称") }}</label>
- <span v-if="isH5">{{ profile.nick }}</span>
- <input v-else type="text" v-model="profile.nick" />
- </main>
- <i v-if="isH5" class="icon icon-right"></i>
- </li>
- <li class="edit-list-item">
- <main class="edit-list-item-content">
- <label>{{ $t("TUIProfile.账号") }}</label>
- <span>{{ profile.userID }}</span>
- </main>
- </li>
- <li class="edit-list-item space-top">
- <main class="edit-list-item-content" @click="setProfile('selfSignature')">
- <label>{{ $t("TUIProfile.个性签名") }}</label>
- <span v-if="isH5">{{ profile.selfSignature }}</span>
- <input v-else type="text" v-model="profile.selfSignature" />
- </main>
- <i v-if="isH5" class="icon icon-right"></i>
- </li>
- <li class="edit-list-item">
- <main class="edit-list-item-content" @click="setProfile('gender')">
- <label>{{ $t("TUIProfile.性别") }}</label>
- <span v-if="isH5">{{ profile.gender ? $t(`TUIProfile.${genderLabel[profile.gender]}`) : "" }}</span>
- <ul v-else class="gender-list">
- <li class="gender-list-item" v-for="(item, index) in type" :key="index" @click="showChooseGender(item)">
- <i class="gender" :class="[profile.gender === item.type && 'gender-selected']"></i>
- <p class="name">{{ $t(`TUIProfile.${item.label}`) }}</p>
- </li>
- </ul>
- </main>
- <i v-if="isH5" class="icon icon-right"></i>
- </li>
- <li class="edit-list-item">
- <main class="edit-list-item-content" @click="setProfile('birthday')">
- <label>{{ $t("TUIProfile.出生年月") }}</label>
- <span v-if="isH5">{{ profile.birthday }}</span>
- <Datepicker v-else :placeholder="$t(`TUIProfile.请选择出生日期`)" :enableTimePicker="false" :format="format" :previewFormat="format" :modelValue="birthday" @update:modelValue="showBirthday" />
- </main>
- <i v-if="isH5" class="icon icon-right"></i>
- </li>
- </ul>
- <footer class="edit-footer" v-if="!isH5">
- <button class="btn-default" @click="cancel">{{ $t("TUIProfile.取消") }}</button>
- <button class="btn-submit" @click="submit">{{ $t("TUIProfile.保存") }}</button>
- </footer>
- <div class="mask" v-if="setName && isH5" @click.self="closeMask">
- <div class="mask-main">
- <header class="edit-h5-header">
- <h1>{{ $t(`TUIProfile.${editConfig.title}`) }}</h1>
- <span class="close" @click="closeMask">{{ $t(`关闭`) }}</span>
- </header>
- <main class="edit-h5-main">
- <ul class="list" v-if="editConfig.type === 'select'">
- <li class="list-item" v-for="(item, index) in editConfig.list" :key="index" @click="choose(item)">
- <img v-if="item?.avatar" :class="[editConfig.value === item.avatar && 'selected']" :src="item.avatar" />
- <span v-else :class="[editConfig.value === item.type && 'selected']">{{ $t(`TUIProfile.${item.label}`) }}</span>
- </li>
- </ul>
- <div class="input" v-else>
- <textarea v-if="editConfig.type === 'textarea'" :placeholder="editConfig.placeholder" v-model="editConfig.value"></textarea>
- <Datepicker class="datePicker" :placeholder="$t(`TUIProfile.请选择出生日期`)" v-else-if="editConfig.type === 'date'" :enableTimePicker="false" :format="format" :previewFormat="format" :modelValue="birthday" @update:modelValue="showBirthday" />
- <input v-else :type="editConfig.type" :placeholder="$t(`TUIProfile.${editConfig.placeholder}`)" v-model="editConfig.value" />
- </div>
- <sub v-if="editConfig.subText">{{ $t(`TUIProfile.${editConfig.subText}`) }}</sub>
- </main>
- <footer class="edit-h5-footer">
- <button class="btn btn-submit" :disabled="!editConfig.value" @click="submit">{{ $t(`确定`) }}</button>
- </footer>
- </div>
- </div>
- </div>
- </template>
- <script lang="ts">
- import { computed, defineComponent, reactive, toRefs, watchEffect } from "vue";
- import Datepicker from "@vuepic/vue-datepicker";
- import "@vuepic/vue-datepicker/dist/main.css";
- const TUIProfileEdit: any = defineComponent({
- props: {
- userInfo: {
- type: Object,
- default: () => ({}),
- },
- isH5: {
- type: Boolean,
- default: () => false,
- },
- },
- components: { Datepicker },
- setup(props: any, ctx: any) {
- const TUIServer: any = TUIProfileEdit?.TUIServer;
- const data = reactive({
- profile: {},
- isEdit: false,
- avatarList: [
- {
- name: "avatar_01",
- avatar: " https://im.sdk.qcloud.com/download/tuikit-resource/avatar/avatar_1.png",
- },
- {
- name: "avatar_02",
- avatar: " https://im.sdk.qcloud.com/download/tuikit-resource/avatar/avatar_2.png",
- },
- {
- name: "avatar_03",
- avatar: " https://im.sdk.qcloud.com/download/tuikit-resource/avatar/avatar_3.png",
- },
- {
- name: "avatar_04",
- avatar: " https://im.sdk.qcloud.com/download/tuikit-resource/avatar/avatar_4.png",
- },
- {
- name: "avatar_05",
- avatar: " https://im.sdk.qcloud.com/download/tuikit-resource/avatar/avatar_5.png",
- },
- {
- name: "avatar_06",
- avatar: " https://im.sdk.qcloud.com/download/tuikit-resource/avatar/avatar_6.png",
- },
- ],
- type: [
- {
- label: "男",
- type: TUIServer.TUICore.TIM.TYPES.GENDER_MALE,
- },
- {
- label: "女",
- type: TUIServer.TUICore.TIM.TYPES.GENDER_FEMALE,
- },
- ],
- genderLabel: {
- [TUIServer.TUICore.TIM.TYPES.GENDER_MALE]: "男",
- [TUIServer.TUICore.TIM.TYPES.GENDER_FEMALE]: "女",
- [TUIServer.TUICore.TIM.TYPES.GENDER_UNKNOWN]: "不显示",
- },
- setName: "",
- editConfig: {
- title: "",
- list: [],
- type: "", // select、text、textarea、date
- subText: "",
- placeholder: "",
- value: "",
- },
- });
- const format = (date: any) => {
- const day = date.getDate() > 9 ? date.getDate() : `0${date.getDate()}`;
- const month = date.getMonth() > 8 ? date.getMonth() + 1 : `0${date.getMonth() + 1}`;
- const year = date.getFullYear();
- return `${year}${month}${day}`;
- };
- watchEffect(() => {
- data.profile = JSON.parse(JSON.stringify(props.userInfo));
- });
- const birthday = computed(() => {
- let value = (data.profile as any).birthday;
- if (data.setName === "birthday" && props.isH5) {
- value = data.editConfig.value;
- }
- return handleBirthdayFamate(value);
- });
- const handleBirthdayFamate = (value: any) => {
- const birthday: any = `${value}`;
- if (birthday.length === 8) {
- const y = birthday.slice(0, 4);
- const m = birthday.slice(4, 6);
- const d = birthday.slice(-2);
- return `${y}-${m}-${d}`;
- }
- return "";
- };
- const showChooseGender = (options: any) => {
- (data.profile as any).gender = options.type;
- };
- const chooseAvatar = (item: any) => {
- (data.profile as any).avatar = item.avatar;
- };
- const showBirthday = (e: any) => {
- if (!props.isH5) {
- (data.profile as any).birthday = e ? Number(format(e)) : 0;
- } else {
- (data.editConfig.value as unknown) = e ? Number(format(e)) : 0;
- }
- };
- const submit = () => {
- if (props.isH5) {
- (data.profile as any)[data.setName] = data.editConfig.value;
- closeMask();
- }
- ctx.emit("submit", data.profile);
- };
- const cancel = () => {
- ctx.emit("cancel", data.profile);
- };
- const setProfile = (name: string) => {
- data.editConfig.value = `${(data.profile as any)[name]}`;
- data.setName = name;
- switch (name) {
- case "avatar":
- data.editConfig.title = "选择头像";
- (data.editConfig.list as unknown) = data.avatarList;
- data.editConfig.type = "select";
- break;
- case "nick":
- data.editConfig.title = "设置昵称";
- data.editConfig.subText = "仅限中文、字母、数字和下划线,2-20个字";
- data.editConfig.placeholder = "请输入昵称";
- data.editConfig.type = "text";
- break;
- case "gender":
- data.editConfig.title = "性别选择";
- (data.editConfig.list as unknown) = data.type;
- data.editConfig.type = "select";
- break;
- case "selfSignature":
- data.editConfig.title = "个性签名";
- data.editConfig.type = "textarea";
- data.editConfig.placeholder = "请输入内容";
- break;
- case "birthday":
- data.editConfig.title = "出生年月";
- data.editConfig.type = "date";
- data.editConfig.placeholder = "请选择出生日期";
- break;
- default:
- break;
- }
- };
- const choose = (item: any) => {
- data.editConfig.value = item?.avatar || item?.type;
- };
- const closeMask = () => {
- data.setName = "";
- data.editConfig = {
- title: "",
- list: [],
- type: "",
- subText: "",
- placeholder: "",
- value: "",
- };
- };
- return {
- ...toRefs(data),
- showChooseGender,
- chooseAvatar,
- showBirthday,
- birthday,
- submit,
- cancel,
- setProfile,
- choose,
- closeMask,
- format,
- };
- },
- });
- export default TUIProfileEdit;
- </script>
- <style lang="scss" scoped src="./style/index.scss"></style>
|