|
|
@@ -1,46 +1,34 @@
|
|
|
+// src/pages/layout/components/Wy_Header/components/Wy_Avatar/index.tsx
|
|
|
import {
|
|
|
CrownOutlined,
|
|
|
- GithubOutlined,
|
|
|
IdcardOutlined,
|
|
|
LogoutOutlined,
|
|
|
MessageOutlined,
|
|
|
- QqOutlined,
|
|
|
SettingOutlined,
|
|
|
StarOutlined,
|
|
|
UserOutlined,
|
|
|
- WechatOutlined,
|
|
|
- WeiboCircleOutlined,
|
|
|
-} from '@ant-design/icons'
|
|
|
-import {
|
|
|
- Avatar,
|
|
|
- Badge,
|
|
|
- Checkbox,
|
|
|
- Image,
|
|
|
- Modal,
|
|
|
- Popover,
|
|
|
- type CheckboxProps,
|
|
|
- Button,
|
|
|
- Form,
|
|
|
- Input,
|
|
|
- Space,
|
|
|
- Select,
|
|
|
-} from 'antd'
|
|
|
-import './index.css'
|
|
|
-import { getToken, removeToken, removeUserinfo, setToken, setUserinfo, getUserinfo } from '@/utils'
|
|
|
-import { useEffect, useState } from 'react'
|
|
|
-import type { FormProps } from 'antd'
|
|
|
-import { useNavigate } from 'react-router-dom'
|
|
|
-import { loginByPasswordApi, type loginResType } from '@/apis/login'
|
|
|
-import type { loginType } from '@/type/login'
|
|
|
-import { useMessageStore } from '@/store/useMessageStore'
|
|
|
-import { loginByWechat } from '@/apis/login';
|
|
|
-import GiteeLogin from '../GiteeLogin'
|
|
|
+} from '@ant-design/icons';
|
|
|
+import { Avatar, Badge, Modal, Popover } from 'antd';
|
|
|
+import './index.css';
|
|
|
+import { getToken, removeToken, removeUserinfo, getUserinfo } from '@/utils';
|
|
|
+import { useEffect, useState } from 'react';
|
|
|
+import { useMessageStore } from '@/store/useMessageStore';
|
|
|
+import LoginContent from '../../../LoginContent';
|
|
|
+
|
|
|
const Wy_Avatar = () => {
|
|
|
- const [userinfo, setUserinfoFn] = useState<any>(null); // 明确指定状态类型
|
|
|
+ const [userinfo, setUserinfoFn] = useState<any>(null);
|
|
|
const token = getToken();
|
|
|
- // 在 Wy_Avatar 组件中添加事件监听
|
|
|
+ // 初始化时检查用户信息
|
|
|
+ const initUserInfo = () => {
|
|
|
+ const currentToken = getToken();
|
|
|
+ if (currentToken) {
|
|
|
+ setUserinfoFn(getUserinfo());
|
|
|
+ } else {
|
|
|
+ setUserinfoFn(null);
|
|
|
+ }
|
|
|
+ };
|
|
|
useEffect(() => {
|
|
|
- // 监听自定义事件,当其他组件更新了用户信息时触发
|
|
|
+ initUserInfo();
|
|
|
const handleUserUpdate = () => {
|
|
|
const currentToken = getToken();
|
|
|
if (currentToken) {
|
|
|
@@ -58,98 +46,30 @@ const Wy_Avatar = () => {
|
|
|
window.removeEventListener('user-info-updated', handleUserUpdate);
|
|
|
};
|
|
|
}, []);
|
|
|
- const [isModalOpen, setIsModalOpen] = useState(false)
|
|
|
- const message = useMessageStore((state) => state.message)
|
|
|
- const setMessage = useMessageStore((state) => state.setMessage)
|
|
|
+
|
|
|
+ const [isModalOpen, setIsModalOpen] = useState(false);
|
|
|
+ const message = useMessageStore((state) => state.message);
|
|
|
+ const setMessage = useMessageStore((state) => state.setMessage);
|
|
|
+
|
|
|
useEffect(() => {
|
|
|
if (message) {
|
|
|
- showModal()
|
|
|
- setMessage(false)
|
|
|
+ showModal();
|
|
|
+ setMessage(false);
|
|
|
}
|
|
|
- }, [message])
|
|
|
+ }, [message]);
|
|
|
|
|
|
const showModal = () => {
|
|
|
- setIsModalOpen(true)
|
|
|
- }
|
|
|
+ setIsModalOpen(true);
|
|
|
+ };
|
|
|
|
|
|
const handleOk = () => {
|
|
|
- setIsModalOpen(false)
|
|
|
- }
|
|
|
-
|
|
|
- const handleCancel = () => {
|
|
|
- setIsModalOpen(false)
|
|
|
- }
|
|
|
-
|
|
|
- // 添加微信登录相关状态
|
|
|
- const [isWechatLogin, setIsWechatLogin] = useState(false);
|
|
|
-
|
|
|
- // 微信登录处理函数
|
|
|
- const handleWechatLogin = () => {
|
|
|
- setIsWechatLogin(true);
|
|
|
- // 初始化微信登录
|
|
|
- initWechatLogin();
|
|
|
+ setIsModalOpen(false);
|
|
|
};
|
|
|
- // 初始化微信登录
|
|
|
- const initWechatLogin = () => {
|
|
|
- // 动态加载微信登录JS
|
|
|
- const script = document.createElement('script');
|
|
|
- script.src = 'https://res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js';
|
|
|
- script.onload = () => {
|
|
|
- new WxLogin({
|
|
|
- self_redirect: false,
|
|
|
- id: 'wechat_login_container',
|
|
|
- appid: 'wxbdc5610cc59c1631',
|
|
|
- scope: 'snsapi_login',
|
|
|
- redirect_uri: encodeURIComponent('http://baidu.com'),
|
|
|
- state: generateState(),
|
|
|
- style: 'black',
|
|
|
- href: ''
|
|
|
- })
|
|
|
- }
|
|
|
- document.body.appendChild(script);
|
|
|
- }
|
|
|
|
|
|
- // 生成随机state参数
|
|
|
- const generateState = () => {
|
|
|
- return Math.random().toString(36).substring(2, 15) +
|
|
|
- Math.random().toString(36).substring(2, 15);
|
|
|
+ const handleCancel = () => {
|
|
|
+ setIsModalOpen(false);
|
|
|
};
|
|
|
|
|
|
- // 处理微信登录回调
|
|
|
- useEffect(() => {
|
|
|
- const handleMessage = (event: MessageEvent) => {
|
|
|
- if (event.data && event.data.type === 'wechat_login') {
|
|
|
- // 处理微信登录返回的code
|
|
|
- handleWechatCode(event.data.code, event.data.state);
|
|
|
- }
|
|
|
- };
|
|
|
-
|
|
|
- window.addEventListener('message', handleMessage);
|
|
|
- return () => {
|
|
|
- window.removeEventListener('message', handleMessage);
|
|
|
- };
|
|
|
- }, []);
|
|
|
-
|
|
|
- const handleWechatCode = async (code: string, state: string) => {
|
|
|
- try {
|
|
|
- // 使用封装的 request 工具调用后端API处理微信登录
|
|
|
- const response = await loginByWechat({ code, state });
|
|
|
- const res: loginResType = response.data;
|
|
|
-
|
|
|
- if (res && res.access_token) {
|
|
|
- // 登录成功,保存token
|
|
|
- setToken(res);
|
|
|
- setUserinfo(response.access_token)
|
|
|
- setIsWechatLogin(false);
|
|
|
- setIsModalOpen(false);
|
|
|
- window.dispatchEvent(new CustomEvent('user-info-updated'));
|
|
|
- } else {
|
|
|
- console.error('微信登录失败: 响应数据不完整');
|
|
|
- }
|
|
|
- } catch (error) {
|
|
|
- console.error('微信登录错误:', error);
|
|
|
- }
|
|
|
- };
|
|
|
const content = () => {
|
|
|
return (
|
|
|
<div className="Avatar_content">
|
|
|
@@ -176,403 +96,29 @@ const Wy_Avatar = () => {
|
|
|
</div>
|
|
|
<div
|
|
|
onClick={() => {
|
|
|
- removeUserinfo()
|
|
|
- removeToken()
|
|
|
- window.location.reload()
|
|
|
+ removeUserinfo();
|
|
|
+ removeToken();
|
|
|
+ window.location.reload();
|
|
|
}}
|
|
|
>
|
|
|
<LogoutOutlined /> 退出
|
|
|
</div>
|
|
|
</div>
|
|
|
- )
|
|
|
- }
|
|
|
-
|
|
|
- const LoginModal = () => {
|
|
|
- const [isChecked, setIsChecked] = useState(false)
|
|
|
- const [showCustomAlert, setShowCustomAlert] = useState(false)
|
|
|
- const [type, setType] = useState(0)
|
|
|
- const onChange: CheckboxProps['onChange'] = (e) => {
|
|
|
- setIsChecked(e.target.checked)
|
|
|
- }
|
|
|
- const handleLogin = () => {
|
|
|
- if (!isChecked) {
|
|
|
- setShowCustomAlert(true)
|
|
|
- return
|
|
|
- }
|
|
|
- setType(1)
|
|
|
- }
|
|
|
- const CustomAlert = () => {
|
|
|
- return (
|
|
|
- <div className="custom-alert" onClick={() => setShowCustomAlert(false)}>
|
|
|
- <div className="custom-alert-content">
|
|
|
- <p>请先同意服务条款和隐私政策</p>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- )
|
|
|
- }
|
|
|
- type FieldType = {
|
|
|
- username?: string
|
|
|
- password?: string
|
|
|
- remember?: string
|
|
|
- }
|
|
|
-
|
|
|
- const onFinish: FormProps<FieldType>['onFinish'] = (values) => {
|
|
|
- console.log('Success:', values)
|
|
|
- }
|
|
|
- const LoginByPassword: FormProps<loginType>['onFinish'] = async (
|
|
|
- values
|
|
|
- ) => {
|
|
|
- try {
|
|
|
- const res = await loginByPasswordApi(values);
|
|
|
- // 判断登录是否成功
|
|
|
- if (res && res.access_token) {
|
|
|
- // 登录成功处理
|
|
|
- console.log(res);
|
|
|
- // 保存 token 和用户信息
|
|
|
- setToken(res)
|
|
|
- setUserinfo(res.access_token)
|
|
|
- setIsModalOpen(false)
|
|
|
- // 刷新页面
|
|
|
- // window.location.reload()
|
|
|
- } else {
|
|
|
- // 登录失败处理
|
|
|
- console.log('登录失败');
|
|
|
- }
|
|
|
- } catch (error) {
|
|
|
- // 网络错误或异常处理
|
|
|
- console.error('登录请求失败:', error);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- const onFinishFailed: FormProps<FieldType>['onFinishFailed'] = (
|
|
|
- errorInfo
|
|
|
- ) => {
|
|
|
- console.log('Failed:', errorInfo)
|
|
|
- }
|
|
|
- const options = [
|
|
|
- { value: '+86', label: '中国大陆+86' },
|
|
|
- { value: '+852', label: '香港+852' },
|
|
|
- { value: '+853', label: '澳门+853' },
|
|
|
- { value: '+886', label: '台湾+886' },
|
|
|
- { value: '+82', label: '韩国+82' },
|
|
|
- { value: '+81', label: '日本+81' },
|
|
|
- { value: '+65', label: '新加坡+65' },
|
|
|
- { value: '+91', label: '印度+91' },
|
|
|
- { value: '+60', label: '马来西亚+60' },
|
|
|
- { value: '+44', label: '英国+44' },
|
|
|
- { value: '+33', label: '法国+33' },
|
|
|
- { value: '+49', label: '德国+49' },
|
|
|
- { value: '+39', label: '意大利+39' },
|
|
|
- { value: '+34', label: '西班牙+34' },
|
|
|
- ]
|
|
|
- const navigator = useNavigate()
|
|
|
- return (
|
|
|
- <div>
|
|
|
- {showCustomAlert && <CustomAlert />}
|
|
|
- {isWechatLogin ? (
|
|
|
- <Modal
|
|
|
- title="微信扫码登录"
|
|
|
- open={isModalOpen}
|
|
|
- onCancel={() => {
|
|
|
- setIsWechatLogin(false);
|
|
|
- setIsModalOpen(false);
|
|
|
- }}
|
|
|
- footer={null}
|
|
|
- width={530}
|
|
|
- >
|
|
|
- <div style={{ textAlign: 'center', padding: '20px 0' }}>
|
|
|
- <div id="wechat_login_container"></div>
|
|
|
- <p style={{ marginTop: '20px', color: '#999' }}>请使用微信扫描二维码登录</p>
|
|
|
- </div>
|
|
|
- <div
|
|
|
- style={{
|
|
|
- color: 'rgb(56, 157, 252)',
|
|
|
- cursor: 'pointer',
|
|
|
- textAlign: 'center',
|
|
|
- marginTop: '20px'
|
|
|
- }}
|
|
|
- onClick={() => {
|
|
|
- setIsWechatLogin(false);
|
|
|
- }}
|
|
|
- >
|
|
|
- {'<'}其他登录方式
|
|
|
- </div>
|
|
|
- </Modal>
|
|
|
- ) : type === 0 ? (
|
|
|
- <Modal
|
|
|
- title="登录"
|
|
|
- open={isModalOpen}
|
|
|
- onOk={handleOk}
|
|
|
- onCancel={handleCancel}
|
|
|
- footer={null}
|
|
|
- width={530}
|
|
|
- >
|
|
|
- <div className="login_content">
|
|
|
- <div className="login_content_item">
|
|
|
- <div className="login_content_left">
|
|
|
- <div className="login_content_left_top">
|
|
|
- <Image
|
|
|
- width={224}
|
|
|
- src={
|
|
|
- 'https://web-asd-asd.oss-cn-beijing.aliyuncs.com/login.png'
|
|
|
- }
|
|
|
- />
|
|
|
- </div>
|
|
|
- <div
|
|
|
- className="login_content_left_bottom"
|
|
|
- style={{ cursor: 'pointer' }}
|
|
|
- >
|
|
|
- <div onClick={handleLogin}>手机号登录/注册</div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- <div className="login_content_right">
|
|
|
- <div className="login_content_right_item" onClick={handleWechatLogin}>
|
|
|
- <div
|
|
|
- className="login_content_right_item_icon"
|
|
|
- style={{ color: 'rgb(105, 183, 53)' }}
|
|
|
- >
|
|
|
- <WechatOutlined />
|
|
|
- </div>
|
|
|
- <div className="login_content_right_item_text"
|
|
|
-
|
|
|
- >
|
|
|
- 微信登陆
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- <div className="login_content_right_item">
|
|
|
- <div
|
|
|
- className="login_content_right_item_icon"
|
|
|
- style={{ color: 'rgb(52, 161, 222)' }}
|
|
|
- >
|
|
|
- <QqOutlined />
|
|
|
- </div>
|
|
|
- <div className="login_content_right_item_text">QQ登陆</div>
|
|
|
- </div>
|
|
|
- <div className="login_content_right_item">
|
|
|
- <div className="login_content_right_item_icon">
|
|
|
- <WeiboCircleOutlined
|
|
|
- style={{ color: 'rgb(233, 77, 69)' }}
|
|
|
- />
|
|
|
- </div>
|
|
|
- <div className="login_content_right_item_text">
|
|
|
- 微博登录
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- <div className="login_content_right_item">
|
|
|
- <div
|
|
|
- className="login_content_right_item_icon"
|
|
|
- style={{ color: 'rgb(213, 71, 63)', fontSize: '20px' }}
|
|
|
- >
|
|
|
- 易
|
|
|
- </div>
|
|
|
- <div className="login_content_right_item_text">
|
|
|
- 网易邮箱账号登录
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- <div className="login_content_right_item">
|
|
|
- <div
|
|
|
- className="login_content_right_item_icon"
|
|
|
- style={{ color: 'rgb(51, 51, 51)', fontSize: '20px' }}
|
|
|
- >
|
|
|
- <GithubOutlined />
|
|
|
- </div>
|
|
|
- <div className="login_content_right_item_text">
|
|
|
- <GiteeLogin onSuccess={(userInfo) => {
|
|
|
- console.log('Gitee 登录成功:', userInfo)
|
|
|
- // 处理登录成功的逻辑
|
|
|
- setIsModalOpen(false)
|
|
|
- }} />
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- <div className="login_protocol">
|
|
|
- <Checkbox onChange={onChange} checked={isChecked}>
|
|
|
- 同意{' '}
|
|
|
- </Checkbox>
|
|
|
- <span className="protocol_span">
|
|
|
- 《服务条款》《隐私政策》《儿童隐私政策》
|
|
|
- </span>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </Modal>
|
|
|
- ) : type === 1 ? (
|
|
|
- <Modal
|
|
|
- title="手机号登录"
|
|
|
- open={isModalOpen}
|
|
|
- onOk={handleOk}
|
|
|
- onCancel={handleCancel}
|
|
|
- footer={null}
|
|
|
- width={530}
|
|
|
- >
|
|
|
- <div className="yzm_login_content">
|
|
|
- <div style={{ marginTop: '60px' }}>
|
|
|
- <Form
|
|
|
- className="yzm_login_content_form"
|
|
|
- name="basic"
|
|
|
- initialValues={{ remember: true }}
|
|
|
- onFinish={onFinish}
|
|
|
- onFinishFailed={onFinishFailed}
|
|
|
- autoComplete="off"
|
|
|
- >
|
|
|
- <Form.Item<FieldType>
|
|
|
- name="username"
|
|
|
- rules={[{ required: true, message: '请输入手机号!' }]}
|
|
|
- >
|
|
|
- <Space.Compact>
|
|
|
- <Select
|
|
|
- style={{ width: '180px' }}
|
|
|
- defaultValue="+86"
|
|
|
- options={options}
|
|
|
- />
|
|
|
- <Input placeholder="请输入手机号"></Input>
|
|
|
- </Space.Compact>
|
|
|
- </Form.Item>
|
|
|
-
|
|
|
- <Form.Item<FieldType>
|
|
|
- name="password"
|
|
|
- rules={[{ required: true, message: '请输入验证码!' }]}
|
|
|
- >
|
|
|
- <div style={{ display: 'flex' }}>
|
|
|
- <Input placeholder="请输入验证码"></Input>
|
|
|
- <Button type="primary" shape="round" danger>
|
|
|
- 获取验证码
|
|
|
- </Button>
|
|
|
- </div>
|
|
|
- </Form.Item>
|
|
|
-
|
|
|
- <Form.Item>
|
|
|
- <Button
|
|
|
- type="primary"
|
|
|
- block
|
|
|
- shape="round"
|
|
|
- danger
|
|
|
- htmlType="submit"
|
|
|
- >
|
|
|
- 登录
|
|
|
- </Button>
|
|
|
- </Form.Item>
|
|
|
- <div
|
|
|
- style={{
|
|
|
- textAlign: 'left',
|
|
|
- color: 'rgb(145, 142, 142)',
|
|
|
- cursor: 'pointer',
|
|
|
- }}
|
|
|
- onClick={() => {
|
|
|
- setType(2)
|
|
|
- }}
|
|
|
- >
|
|
|
- 密码登录
|
|
|
- </div>
|
|
|
- </Form>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- <div
|
|
|
- style={{ color: 'rgb(56, 157, 252)', cursor: 'pointer' }}
|
|
|
- onClick={() => setType(0)}
|
|
|
- >
|
|
|
- {'<'}其他登录方式
|
|
|
- </div>
|
|
|
- </Modal>
|
|
|
- ) : (
|
|
|
- <Modal
|
|
|
- title="密码登录"
|
|
|
- open={isModalOpen}
|
|
|
- onOk={handleOk}
|
|
|
- onCancel={handleCancel}
|
|
|
- footer={null}
|
|
|
- width={530}
|
|
|
- >
|
|
|
- <div className="yzm_login_content">
|
|
|
- <div style={{ marginTop: '60px' }}>
|
|
|
- <Form
|
|
|
- className="yzm_login_content_form"
|
|
|
- name="basic"
|
|
|
- initialValues={{ remember: true }}
|
|
|
- onFinish={LoginByPassword}
|
|
|
- onFinishFailed={onFinishFailed}
|
|
|
- autoComplete="off"
|
|
|
- >
|
|
|
- <Form.Item<FieldType>
|
|
|
- name="username"
|
|
|
- rules={[{ required: true, message: '请输入手机号!' }]}
|
|
|
- >
|
|
|
- <Space.Compact>
|
|
|
- <Select
|
|
|
- style={{ width: '180px' }}
|
|
|
- defaultValue="+86"
|
|
|
- options={options}
|
|
|
- />
|
|
|
- <Input placeholder="请输入手机号"></Input>
|
|
|
- </Space.Compact>
|
|
|
- </Form.Item>
|
|
|
-
|
|
|
- <Form.Item<FieldType>
|
|
|
- name="password"
|
|
|
- rules={[{ required: true, message: '请输入密码!' }]}
|
|
|
- >
|
|
|
- <div style={{ display: 'flex' }}>
|
|
|
- <Input
|
|
|
- placeholder="请输入密码"
|
|
|
- suffix={
|
|
|
- <span
|
|
|
- style={{
|
|
|
- color: 'rgb(56, 157, 252)',
|
|
|
- cursor: 'pointer',
|
|
|
- }}
|
|
|
- onClick={() => {
|
|
|
- navigator('/login/yzm')
|
|
|
- }}
|
|
|
- >
|
|
|
- 忘记密码?
|
|
|
- </span>
|
|
|
- }
|
|
|
- />
|
|
|
- </div>
|
|
|
- </Form.Item>
|
|
|
-
|
|
|
- <Form.Item>
|
|
|
- <Button
|
|
|
- type="primary"
|
|
|
- block
|
|
|
- shape="round"
|
|
|
- danger
|
|
|
- htmlType="submit"
|
|
|
- >
|
|
|
- 登录
|
|
|
- </Button>
|
|
|
- </Form.Item>
|
|
|
- <div
|
|
|
- style={{
|
|
|
- color: 'rgb(56, 157, 252)',
|
|
|
- cursor: 'pointer',
|
|
|
- textAlign: 'left',
|
|
|
- }}
|
|
|
- onClick={() => setType(0)}
|
|
|
- >
|
|
|
- {'<'}其他登录方式
|
|
|
- </div>
|
|
|
- </Form>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </Modal>
|
|
|
- )}
|
|
|
- </div>
|
|
|
- )
|
|
|
- }
|
|
|
+ );
|
|
|
+ };
|
|
|
|
|
|
return (
|
|
|
<>
|
|
|
{token ? (
|
|
|
<div>
|
|
|
- <Popover content={content} color='rgb(53, 53, 53)'>
|
|
|
+ <Popover content={content} color="rgb(53, 53, 53)">
|
|
|
<Badge count={1}>
|
|
|
<Avatar
|
|
|
size="large"
|
|
|
src={
|
|
|
userinfo && userinfo.url
|
|
|
? userinfo.url
|
|
|
- : "https://tse1-mm.cn.bing.net/th/id/OIP-C.7GLMYPqMlt2LgkbPsOnDIAAAAA?rs=1&pid=ImgDetMain"
|
|
|
+ : 'https://tse1-mm.cn.bing.net/th/id/OIP-C.7GLMYPqMlt2LgkbPsOnDIAAAAA?rs=1&pid=ImgDetMain'
|
|
|
}
|
|
|
/>
|
|
|
</Badge>
|
|
|
@@ -584,9 +130,21 @@ const Wy_Avatar = () => {
|
|
|
</div>
|
|
|
)}
|
|
|
|
|
|
- <LoginModal />
|
|
|
+ <Modal
|
|
|
+ title="登录"
|
|
|
+ open={isModalOpen}
|
|
|
+ onOk={handleOk}
|
|
|
+ onCancel={handleCancel}
|
|
|
+ footer={null}
|
|
|
+ width={530}
|
|
|
+ >
|
|
|
+ <LoginContent
|
|
|
+ onLoginSuccess={handleOk}
|
|
|
+
|
|
|
+ />
|
|
|
+ </Modal>
|
|
|
</>
|
|
|
- )
|
|
|
-}
|
|
|
+ );
|
|
|
+};
|
|
|
|
|
|
-export default Wy_Avatar
|
|
|
+export default Wy_Avatar;
|