XdkX(Rh
z01PPSLa~nvC==0XM_^J!sW_EH2nfQGK$wV5JA)-%XS9Dy5S9emKl390GXv0mKe$$|
z?8<|Pa#ui~ule*8aneKVn4-%-*d7j-W3Cq17U}K}^uWwZxME)mY|zFO2?3CfHSv
z#djG|Ke+?=I)f~;0PeIIdKECx>&e;+#kWP#-*@`3iexiBvY0~LUH}+1kHM(da|^(Z
zj(j6`FS;~V_(R4at$au_9Xb1ZWBq!h(7T6R=FrYo5c8pzKBv9`>eWe1G()@-s54PC118&8
z9EV(2h<0*&2>NfY;y%U4-A@4_2lYua>tv@GAP2oD7zBXsZDHi|Tj92NFTjKF*jlv-
zt`dGERH2Tl$(2k)4fhhJw$WgxT&qZm&*4%_p)1MHgHC37LjxeTS>J)!u4qAQF9*&@
z0a6qc*LiHP{g}XxJEV3-Z&EJ!UW^q=doKHMi52w{X{DGZ7O9y)q#0=7#LuBzBiQJK!g?V6ik#|A(+s5)sMkBt{#$Ml`
zmEB)Z&J771RE{J6L|;Ze{9@EDMn24G`V|~|&GO;OdiM8%yfp$)euhAQHAEfnV2PlX
zL6=+WKA{6{qx<9oiy`>V=@5#9b~d`O_Lzt_5Qu2>00`T(a0a7mgN3RuN4hpxr?9Y2
z#&-6%vVWX3V6pzN?uL94)aA&Fir5r?-WCb2#aF=u3cd}7O?lgzG^m^V7r5zBwYx|i
z0o5++S4Jbfx1B6r&_)*j0z}*zpuCAK)
zv6`zOfl5s9je6`f5>Y0Ice{h6I|mu994IY7><{Yr+j5asEV$E~i{$Y(Aog#eSfaks
z*iE{OuD@B&)gtWgPJy0_5%zPna;`0LM;j*G$wG3j!Hqp6`xcoRVG#wc_2nvyRiuZ<;FAs?IAQ#~6N^tC)M15*E%5E)03vqr
zOZ|s7J%f4Mu6b-Y)(v$9b?t^ueB^$wioOB_12gm`%_B-2Mto;bbpBqIw@bAi-S0uI>(uUftGGh(hg43&&6fS1!!JHHRLL!
zyhcx6tK@PrcjuUmF>=rOK
zTVOS_q{hf*i$<_KtF#$(aiwIUC1zdkqWGY}f_iYuZ$JdmHKsKA
z9X0{tSfOfEPdN)6s&T2bn(RxJZt)Vu6!2_Vgw0nrqBa7BMLbsH|=xLwTk$F$Q
zrC5vwlYxTBs(7LTUaUB-0gy6B*^kY$BPx|Uy}^zK5)@md)mNJ{7b>85by;vhWgq+;
znGh+hl;@QS(S)o{lx-%SUt*C1kkuL(cGCrh-K3SEE)Pb8d1P5~bp7;Lx7g?#&`7OP
zb|*@di8CX$ikay+%t$Sy=J)@`bz+_ZnZ!Ow5G-iiK{V{LYQ06Hert3`&d~3?1`Jf<
zAO%Hg8zG~%5d;Epr(IyiUkeNT*JY$Dgi5SMbPLZ1d}1)xpueDwfi|0j?Z;3&;`$5X
ztRVaq#3*<2CW1+z<>9{=Kz7xG_|?;be}CEmgTUbHXlAEwt;Fpk}R
z{Be{S(!Hp5j|W8)K-tZV#=WJj_x^yB(^xx*R73oIJcqsn!;scTBXR2rvSkhrvJTEc
z3j62CyP{RtGoyG~DeQIYVxT&iFUJ+TzG_ZH2rq
z(y_X9^^d8;bW@mn{+}m}t^L~|6h4B6m)wPMJK9IP@J!ejmsVi_u;af$#enp-ml8vc
zN)OUtRUlhtf?aIu$QP>vFFCdC0G4KZC720OlijTNN7?p+*$Nml_}+*8sT^YAAIf_f
zCGIB$PsKoWbeXU9KY)y1^r)5eSp3h@<3T{Pz!V2KA3%1nN%w~%s
zPz$zNiz3Jxwj4$l#a2^UJ{X}Ye}*gzlp@`ZrX#E8%)M;sbiP9>8ZRN%nh?PqF}J}Z
zI7u?dAsX`B*i6+M?Q|OOgWW?>2$}-wC#_aKlQw225YMcu@vTZ6%Fd6mi4DG2iYyLP
z`gM0I^Qtz3gyZDD7X*5?DUwyPlB-Cdrud6GeM?Vm5id3RGB%&BV#w5qaC=vpk*os3UV}niyX&DA%>aEg@7f!!6AiTQC}K3EK4*$1!B=_WPE{JTD;C;7Kr}4ql??
z*XqwN^rL8GXiH}m%|JF7t)XowZfrlFF|;Wis*oS#eqa?>yl$51@OTS=a=;H_zEKBk
zFv!~gXiTR-{-EXx6kISL6$#*3u4p@;;1DQ_AO{!}AiqG*>|c4{FHnHO)K`cem@874
zI)E`V`D6B5_wym7AEb*H?m#Pg(Y+GXnRqM_i_0vY)&Z1VQfo);Q>C!N7?VId&e5ej
z0g4t|NakpwizQR}pmzdkvu`N#PNuLl39US!g@U$I>HHj)X;a3|=9KZbL+A@R<-bgV
z!qhq6If6$E;SKh@EvrP;aX&N2bUT@0noOp9`0WUQuu5jfK))?FsGV5@H;87|crrH#
zB;*>tETg(Uh&2MKsRhgtSx7Q=5_Cjvw;Yi|{A1GB6JiA8_1ZYz?>XgLmxmm2=tjSB
z=mdmo99~TreiXPV*J-)Jk)zuV6Ius7s0HmL)DCGX*uMTIVQ5@d}cBga1U*#N(#S!s3hJl
zdh`EDH^x*3v(%CLy5$^}0(Tm|Kw}Uuq~JlM06ywm%?I6F0?5-lwTwlmcZg~v
zVE~B=d4$3hMxT`o35?jKWiSc|e{g=6#C(zx#0mX88Fa)Jr*J?=h9*UV?|>QJ0dfT}
z9o%hJD-;U2Xs!twQ*Z||X+^6{>W8;wN2alaFxL&nzi3xmJN|`PZD#z-BedGg2*W5a
z6ilpGWP9>)r{odp!!SWBf;QQpoUOsMpu~Ssbm3vAnFl@@5D^eJZY5*{@}v1KXG87q
z-^l63`nk(oDqNVUPgal=V4zqgJsS2i;YOEenkC*}k&sbek&s3gx}OI#c^Fd3Q#u?L
zW}J>9;d@76Ah?i&%MzPs;5`Aw#4QkSp=r=soSk5XK{J-mYAZB-16e-z!7yn3uI}eA
z>Wpt%F3*B-qR=`9o6x=OwD29G5t%VT4rrlUIrlM@OY<&jH7xpXl0cy!jwER?@!)rP
zQHvzagmr`-!bs8-$~9;l@*8V_Ry{{L4=uP^;dG(XzIR*ZSV7uAI&8Rs5HEz_{Wf3;2(Qg$rbZA9Q6)>Ua`z&0T
z%;;~ktbv@qPR5q?!A-{E)jC(cBz`Mu_xWB^MJI)m8;>M>F~at2N&8oTs=5Ci38
zARBD{^2p5nfQ+LtJusMIDH?$FZq`2tjF)|%{uSm905;cTby!jg4m~Jm-$!eXva!G-5j53q*@+7|5epw1^-NBwBPpkOx=_
z+meH)QCof7DI<-j>Vk$hHr-%{v2P`)TtP6%rnZTx1VVPs_oz~zB_F5c6gV(a%=)AU
z0@nmkVkYbZWAv0YtgCErVNjc($Q!41VZej{rpRN|8GFEsH!n(JWN~~M$K0~VHr?nJ
zX7rD#!?zpF!&DvqzL^zQ09~{|ZpY>cU;uF;wW-DCm;Fh>T)70h}m<${`nnJ|EwZ#1SJT86PotFK;YZY#T8
zm;ixN5iJ%l$hAo>llSOj#$4
zNHB%a920$cfin%CQ%^$4#MxZfPN = {
+ success?: boolean;
+ code?: number;
+ codeMessage?: string;
+ errorMessage?: Map;
+ showType?: ErrorShowType;
+ data: T
+ }
+ type CurrentUser = {
+ name?: string;
+ avatar?: string;
+ userid?: string;
+ email?: string;
+ signature?: string;
+ title?: string;
+ group?: string;
+ tags?: { key?: string; label?: string }[];
+ notifyCount?: number;
+ unreadCount?: number;
+ country?: string;
+ access?: string;
+ geographic?: {
+ province?: { label?: string; key?: string };
+ city?: { label?: string; key?: string };
+ };
+ address?: string;
+ phone?: string;
+ };
+
+ type LoginResult = ResponseStructure & {
+ data?: {
+ token?: string;
+ expireDateTime?: number;
+ expire?: number;
+ timeUnit?: any;
+ }
+ };
+
+ type PageParams = {
+ pageNum?: number;
+ pageSize?: number;
+ };
+
+ type RuleListItem = {
+ key?: number;
+ disabled?: boolean;
+ href?: string;
+ avatar?: string;
+ name?: string;
+ owner?: string;
+ desc?: string;
+ callNo?: number;
+ status?: number;
+ updatedAt?: string;
+ createdAt?: string;
+ progress?: number;
+ };
+
+ type RuleList = {
+ data?: RuleListItem[];
+ /** 列表的内容总数 */
+ total?: number;
+ success?: boolean;
+ };
+ interface ResponseStructure {
+ success?: boolean;
+ code?: number;
+ codeMessage?: string;
+ errorMessage?: Map;
+ showType?: ErrorShowType;
+ }
+ type
+ FakeCaptcha = ResponseStructure & {
+ data?: boolean;
+ };
+
+ type PhonePasswordLoginParams = {
+ clientId?: string;
+ phone?: string;
+ password?: string;
+ code?: string;
+ autoLogin?: boolean;
+ };
+
+ type PhoneSmsCodeLoginParams = {
+ clientId?: string;
+ phone?: string;
+ smsCode?: string;
+ autoLogin?: boolean;
+ };
+
+ type ErrorResponse = {
+ /** 业务约定的错误码 */
+ errorCode: string;
+ /** 业务上的错误信息 */
+ errorMessage?: Map;
+ /** 业务上的请求是否成功 */
+ success?: boolean;
+ };
+
+ type NoticeIconList = {
+ data?: NoticeIconItem[];
+ /** 列表的内容总数 */
+ total?: number;
+ success?: boolean;
+ };
+
+ type NoticeIconItemType = 'notification' | 'message' | 'event';
+
+ type NoticeIconItem = {
+ id?: string;
+ extra?: string;
+ key?: string;
+ read?: boolean;
+ avatar?: string;
+ title?: string;
+ status?: string;
+ datetime?: string;
+ description?: string;
+ type?: NoticeIconItemType;
+ };
+
+ type GenerateMpRegCode = {
+ data?: {
+ regCode?: string;
+ qrCodeUrl?: string;
+ expireSeconds?: number;
+ ticket?: string;
+ url?: string;
+ };
+ }
+
+ type GetClientId = {
+ data?: string;
+ }
+
+ type GenerateBase64Code = {
+ data?: string;
+ }
+
+ type GetClientToken = {
+ data?: {
+ token?: string;
+ expireDateTime?: number;
+ expire?: number;
+ };
+ }
+
+ type PhoneRegisterRequest = {
+ clientId?: string;
+ phone?: string;
+ password?: string;
+ confirmPassword?: string;
+ smsCode?: number;
+ }
+
+ type PhoneRegisterResponse = ResponseStructure & {
+ data?: number;
+ }
+
+ type CustomValidate = {
+ validateStatus?: boolean;
+ msg?: string;
+ formValue?: any;
+ code?: number;
+ codeMessage?: string;
+ errors?: Map;
+ validateFields: ValidateFields;
+ }
+
+ type ListAccountBookVo = ResponseStructure & {
+ data?: {
+ total?: number;
+ list?: ListAccountBookVoItem[]
+ }
+ }
+ type ListAccountBookVoItem = {
+ id: number;
+ companyName?: string;
+ valueAddedTaxCate?: string;
+ accountingStandard?: string;
+ startTime?: Date;
+ createTime?: Date;
+ enableVoucherVerify?: boolean;
+ disable?: boolean;
+ }
+ type GetAccountBookVo = {
+ id?: number;
+ companyName?: string;
+ unifiedSocialCreditCode?: string;
+ industryId?: number;
+ valueAddedTaxCate?: number;
+ enableVoucherVerify?: boolean;
+ startTime?: Date;
+ accountingStandard?: number;
+ enableFixedAssets?: boolean;
+ enableCapital?: boolean;
+ enablePsi?: boolean;
+ }
+ type DataDictionaryVo = {
+ dataCode?: string;
+ dataValue?: string;
+ }
+
+ type ListTreeMenuVo = {
+ id?: number;
+ key?: string;
+ title?: any;
+ icon?: string;
+ checked?: boolean;
+ children?: ListTreeMenuVo[];
+ level?: number;
+ };
+
+ type ListTreeSelectMenuVo = {
+ id?: number;
+ value?: string;
+ title?: any;
+ children?: ListTreeMenuVo[];
+ }
+
+ type ListRoleVo = {
+ id: number;
+ roleName?: string;
+ disable?: boolean;
+ }
+
+ type ListSubject = {
+ id: number;
+ pid?: number;
+ valueAddedTaxCate?: string;
+ accountingStandard?: string;
+ startTime?: Date;
+ createTime?: Date;
+ enableVoucherVerify?: boolean;
+ disable?: boolean;
+ }
}
-export { user }
diff --git a/src/utils/cookie/cookie.ts b/src/utils/cookie/cookie.ts
index ddbb997..0743307 100644
--- a/src/utils/cookie/cookie.ts
+++ b/src/utils/cookie/cookie.ts
@@ -1,85 +1,85 @@
/** 配置 */
interface Options {
- /** key前缀 */
- prefix?: string;
+ /** key前缀 */
+ prefix?: string
}
/** 默认配置 */
const defaultOptions: Options = {
- prefix: ""
-};
-
-class CookieStorage {
- private prefix: string;
-
- constructor(options: Options = defaultOptions) {
- const { prefix } = options;
- this.prefix = prefix ?? "";
- }
-
- /**
- * @description: 设置cookie
- * @param {string} key 键
- * @param {any} value 值
- * @param {number} expires 过期时间s毫秒,不传默认2年有效
- * @Date: 2023-05-17 18:10:34
- * @Author: mulingyuer
- */
- public setItem(key: string, value: string | number, expires?: number): void {
- const timestamp = Date.now();
- if (typeof expires === "number") {
- expires = timestamp + expires;
- } else {
- expires = timestamp + 2 * 365 * 24 * 60 * 60 * 1000;
- }
- document.cookie = `${this.prefix}${key}=${value};expires=${new Date(expires).toUTCString()}`;
- }
-
- /**
- * @description: 获取cookie
- * @param {string} key 键
- * @Date: 2023-05-17 18:31:50
- * @Author: mulingyuer
- */
- public getItem(key: string): string | undefined {
- const cookies = document.cookie.split("; ");
- let val: string | undefined = undefined;
- cookies.find((item) => {
- const [k, v] = item.split("=");
- if (k === `${this.prefix}${key}`) {
- val = v;
- return true;
- }
- return false;
- });
-
- return val;
- }
-
- /**
- * @description: 删除指定key的cookie
- * @param {string} key 键
- * @Date: 2023-05-17 18:32:56
- * @Author: mulingyuer
- */
- public removeItem(key: string): void {
- this.setItem(key, "", -1);
- }
-
- /**
- * @description: 清空所有cookie
- * @Date: 2023-05-17 23:13:04
- * @Author: mulingyuer
- */
- public clear(): void {
- const cookies = document.cookie.split("; ");
- cookies.forEach((item) => {
- const [k] = item.split("=");
- this.removeItem(k);
- });
- }
+ prefix: '',
}
-const cookieStorage = new CookieStorage();
+class CookieStorage {
+ private prefix: string
-export default cookieStorage;
-export { CookieStorage };
+ constructor(options: Options = defaultOptions) {
+ const { prefix } = options
+ this.prefix = prefix ?? ''
+ }
+
+ /**
+ * @description: 设置cookie
+ * @param {string} key 键
+ * @param {any} value 值
+ * @param {number} expires 过期时间s毫秒,不传默认2年有效
+ * @Date: 2023-05-17 18:10:34
+ * @Author: mulingyuer
+ */
+ public setItem(key: string, value: string | number, expires?: number): void {
+ const timestamp = Date.now()
+ if (typeof expires === 'number') {
+ expires = timestamp + expires
+ } else {
+ expires = timestamp + 2 * 365 * 24 * 60 * 60 * 1000
+ }
+ document.cookie = `${this.prefix}${key}=${value};expires=${new Date(expires).toUTCString()}`
+ }
+
+ /**
+ * @description: 获取cookie
+ * @param {string} key 键
+ * @Date: 2023-05-17 18:31:50
+ * @Author: mulingyuer
+ */
+ public getItem(key: string): string | undefined {
+ const cookies = document.cookie.split('; ')
+ let val: string | undefined = undefined
+ cookies.find((item) => {
+ const [k, v] = item.split('=')
+ if (k === `${this.prefix}${key}`) {
+ val = v
+ return true
+ }
+ return false
+ })
+
+ return val
+ }
+
+ /**
+ * @description: 删除指定key的cookie
+ * @param {string} key 键
+ * @Date: 2023-05-17 18:32:56
+ * @Author: mulingyuer
+ */
+ public removeItem(key: string): void {
+ this.setItem(key, '', -1)
+ }
+
+ /**
+ * @description: 清空所有cookie
+ * @Date: 2023-05-17 23:13:04
+ * @Author: mulingyuer
+ */
+ public clear(): void {
+ const cookies = document.cookie.split('; ')
+ cookies.forEach((item) => {
+ const [k] = item.split('=')
+ this.removeItem(k)
+ })
+ }
+}
+
+const cookieStorage = new CookieStorage()
+
+export default cookieStorage
+export { CookieStorage }
diff --git a/src/views/Login/index.tsx b/src/views/Login/index.tsx
deleted file mode 100644
index 7b5c67b..0000000
--- a/src/views/Login/index.tsx
+++ /dev/null
@@ -1,243 +0,0 @@
-import {
- GithubOutlined,
- GitlabOutlined,
- LockOutlined,
- MobileOutlined,
- QqOutlined,
- UserOutlined,
- WechatOutlined,
-} from '@ant-design/icons'
-import {
- LoginFormPage,
- ProFormCaptcha,
- ProFormCheckbox,
- ProFormText,
-} from '@ant-design/pro-components'
-import { Divider, Space, Tabs, message, Button } from 'antd'
-import { CSSProperties } from 'react'
-import { useState } from 'react'
-import logo from '@/assets/icons/schisandra.svg'
-import background from '@/assets/images/background.png'
-import { observer } from 'mobx-react'
-// import useStore from '@/utils/store/useStore.tsx'
-type LoginType = 'account' | 'phone'
-
-const iconStyles: CSSProperties = {
- color: 'rgba(0, 0, 0, 0.2)',
- fontSize: '18px',
- verticalAlign: 'middle',
- cursor: 'pointer',
-}
-
-export default observer(() => {
- // const store = useStore('user')
-
- const items = [
- { label: '账户密码登录', key: 'account' },
- { label: '手机号登录', key: 'phone' },
- ]
- const [loginType, setLoginType] = useState('account')
-
- const onSubmit = async (formData: object) => {
- console.log(formData)
- }
- return (
-
-
- 去看看
-
- ),
- }}
- actions={
-
-
-
- 其他登录方式
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- }>
- setLoginType(activeKey as LoginType)}>
-
- {loginType === 'account' && (
- <>
- ,
- }}
- placeholder={'请输入账号/邮箱/电话号码'}
- rules={[
- {
- required: true,
- message: '请输入用户名!',
- },
- ]}
- />
- ,
- }}
- placeholder={'请输入密码'}
- rules={[
- {
- required: true,
- message: '请输入密码!',
- },
- ]}
- />
- >
- )}
- {loginType === 'phone' && (
- <>
- ,
- }}
- name='mobile'
- placeholder={'手机号'}
- rules={[
- {
- required: true,
- message: '请输入手机号!',
- },
- {
- pattern: /^1\d{10}$/,
- message: '手机号格式错误!',
- },
- ]}
- />
- ,
- }}
- captchaProps={{
- size: 'large',
- }}
- placeholder={'请输入验证码'}
- captchaTextRender={(timing, count) => {
- if (timing) {
- return `${count} ${'获取验证码'}`
- }
- return '获取验证码'
- }}
- name='captcha'
- rules={[
- {
- required: true,
- message: '请输入验证码!',
- },
- ]}
- onGetCaptcha={async () => {
- message.success('获取验证码成功!验证码为:1234')
- }}
- />
- >
- )}
-
-
-
- )
-})
diff --git a/src/views/User/Login/index.less b/src/views/User/Login/index.less
new file mode 100644
index 0000000..284cbf9
--- /dev/null
+++ b/src/views/User/Login/index.less
@@ -0,0 +1,154 @@
+
+.container {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ flex-direction: column;
+ height: 100vh;
+ width: 100vw;
+ overflow: auto;
+}
+
+.login_content {
+ // margin-top: 40px;
+ // position: relative;
+ width: 782px;
+ background-color: rgb(255, 255, 255);
+ // height: 100%;
+ overflow: hidden;
+ box-shadow: rgb(0 0 0 / 15%) 0px 2px 15px;
+ //float: right;
+ //height: 538px;
+ position: relative;
+ padding: 30px 0 30px 0;
+
+}
+
+.go_to_register {
+ cursor: pointer;
+ height: 70px;
+ width: 70px;
+ background-image: url('@/assets/icons/corner_markers.svg');
+ position: absolute;
+ top: 0px;
+ right: 0px;
+ text-align: right;
+}
+
+.go_to_register span {
+ font-size: 14px;
+ color: rgb(255, 255, 255);
+ font-weight: 500;
+ position: relative;
+ top: 10px;
+ right: 7px;
+}
+
+.lang {
+ width: 100%;
+ height: 40px;
+ line-height: 44px;
+ text-align: right;
+
+ :global(.ant-dropdown-trigger) {
+ margin-right: 24px;
+ }
+}
+
+.content {
+ //flex: 1;
+ //padding: 32px 0;
+
+ //box-sizing: border-box;
+ //margin: 60px auto;
+ //display: flex;
+ //align-items: center;
+ //justify-content: center;
+ //flex-direction: column;
+ //height: 100vh;
+ //overflow: auto;
+
+
+}
+
+@media (min-width: 768px) {
+ .container {
+ background-image: url('@/assets/images/background.png');
+ background-size: cover;
+ }
+
+ .content {
+ padding: 32px 0 24px;
+ }
+
+ .content img {
+ text-align: center;
+ }
+}
+
+.icon {
+ margin-left: 8px;
+ color: rgba(0, 0, 0, 0.2);
+ font-size: 24px;
+ vertical-align: middle;
+ cursor: pointer;
+ transition: color 0.3s;
+
+ &:hover {
+ color: aquamarine;
+ }
+}
+
+.mp_code {
+ padding: 0px 60px;
+ width: 361px;
+ height: 490px;
+ background-color: rgb(255, 255, 255);
+ border-right: 0.5px solid rgb(196, 203, 215);
+}
+
+.mp_code_title {
+ margin-top: 50px;
+ font-weight: 500;
+ font-size: 24px;
+ color: rgb(24, 24, 24)
+}
+
+.mp_code_img {
+ margin-top: 10px;
+}
+
+.alert {
+ margin-top: 25px;
+ width: 250px;
+ padding: 5px;
+ text-align: left;
+ vertical-align: middle;
+}
+
+.login_form {
+ // height: 100%;
+ // float: left;
+ margin: 0;
+ padding: 0 32px;
+}
+
+.mp_tips {
+ font-weight: bold;
+ color: rgb(7, 221, 7);
+}
+
+.logo span {
+ position: relative;
+ top: 2px;
+ color: rgba(0, 0, 0, .85);
+ font-weight: 600;
+ font-size: 33px;
+}
+
+.subTitle {
+ margin-top: 12px;
+ margin-bottom: 10px;
+ color: rgba(0, 0, 0, .45);
+ font-size: 14px;
+}
diff --git a/src/views/User/Login/index.tsx b/src/views/User/Login/index.tsx
new file mode 100644
index 0000000..a5004fb
--- /dev/null
+++ b/src/views/User/Login/index.tsx
@@ -0,0 +1,377 @@
+import {
+ BarcodeOutlined,
+ GithubOutlined,
+ GitlabOutlined,
+ LockOutlined,
+ MobileOutlined,
+ QqOutlined,
+ UserOutlined,
+ WechatOutlined,
+} from '@ant-design/icons'
+import { ProFormCaptcha, ProFormCheckbox, ProFormText } from '@ant-design/pro-components'
+import { Divider, Space, Tabs, message, Image, Alert, Form, Button } from 'antd'
+import { CSSProperties } from 'react'
+import { useState } from 'react'
+import logo from '@/assets/icons/schisandra.svg'
+import qrCode from '@/assets/images/login_qrcode-landaiqing.jpg'
+import './index.less'
+import { observer } from 'mobx-react'
+// import useStore from '@/utils/store/useStore.tsx'
+type LoginType = 'account' | 'phone'
+
+const iconStyles: CSSProperties = {
+ color: 'rgba(0, 0, 0, 0.2)',
+ fontSize: '18px',
+ verticalAlign: 'middle',
+ cursor: 'pointer',
+}
+
+export default observer(() => {
+ const [generateMpRegCodeData, setGenerateMpRegCodeData] = useState({})
+ const [form] = Form.useForm()
+ const [base64Code, setBase64Code] = useState({ data: '' })
+ const clickGetBase64CodeMethod = async () => {
+ await getBase64CodeMethod()
+ }
+ const CodeImg = (
+
+ )
+ const getBase64CodeMethod = async () => {}
+
+ const items = [
+ {
+ label: (
+
+
+ 账户登录
+
+ ),
+ key: 'account',
+ },
+ {
+ label: (
+
+
+ 短信登录
+
+ ),
+ key: 'phone',
+ },
+ ]
+ const [loginType, setLoginType] = useState('account')
+
+ const onSubmit = async (formData: object) => {
+ console.log(formData)
+ }
+ return (
+
+
+
+
+
+
+ 微信扫码登录
+
+ 微信扫码关注公众号)}
+ description={
+
+
+ 微信扫码
+ 关注公众号
+
+
+ 登录更快更安全
+
+ }
+ // type="success"
+ showIcon={true}
+ className={'alert'}
+ icon={}
+ />
+
+
+
+
+ 注册
+
+
+
+
+
+ )
+})
diff --git a/src/views/User/Register/index.less b/src/views/User/Register/index.less
new file mode 100644
index 0000000..284cbf9
--- /dev/null
+++ b/src/views/User/Register/index.less
@@ -0,0 +1,154 @@
+
+.container {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ flex-direction: column;
+ height: 100vh;
+ width: 100vw;
+ overflow: auto;
+}
+
+.login_content {
+ // margin-top: 40px;
+ // position: relative;
+ width: 782px;
+ background-color: rgb(255, 255, 255);
+ // height: 100%;
+ overflow: hidden;
+ box-shadow: rgb(0 0 0 / 15%) 0px 2px 15px;
+ //float: right;
+ //height: 538px;
+ position: relative;
+ padding: 30px 0 30px 0;
+
+}
+
+.go_to_register {
+ cursor: pointer;
+ height: 70px;
+ width: 70px;
+ background-image: url('@/assets/icons/corner_markers.svg');
+ position: absolute;
+ top: 0px;
+ right: 0px;
+ text-align: right;
+}
+
+.go_to_register span {
+ font-size: 14px;
+ color: rgb(255, 255, 255);
+ font-weight: 500;
+ position: relative;
+ top: 10px;
+ right: 7px;
+}
+
+.lang {
+ width: 100%;
+ height: 40px;
+ line-height: 44px;
+ text-align: right;
+
+ :global(.ant-dropdown-trigger) {
+ margin-right: 24px;
+ }
+}
+
+.content {
+ //flex: 1;
+ //padding: 32px 0;
+
+ //box-sizing: border-box;
+ //margin: 60px auto;
+ //display: flex;
+ //align-items: center;
+ //justify-content: center;
+ //flex-direction: column;
+ //height: 100vh;
+ //overflow: auto;
+
+
+}
+
+@media (min-width: 768px) {
+ .container {
+ background-image: url('@/assets/images/background.png');
+ background-size: cover;
+ }
+
+ .content {
+ padding: 32px 0 24px;
+ }
+
+ .content img {
+ text-align: center;
+ }
+}
+
+.icon {
+ margin-left: 8px;
+ color: rgba(0, 0, 0, 0.2);
+ font-size: 24px;
+ vertical-align: middle;
+ cursor: pointer;
+ transition: color 0.3s;
+
+ &:hover {
+ color: aquamarine;
+ }
+}
+
+.mp_code {
+ padding: 0px 60px;
+ width: 361px;
+ height: 490px;
+ background-color: rgb(255, 255, 255);
+ border-right: 0.5px solid rgb(196, 203, 215);
+}
+
+.mp_code_title {
+ margin-top: 50px;
+ font-weight: 500;
+ font-size: 24px;
+ color: rgb(24, 24, 24)
+}
+
+.mp_code_img {
+ margin-top: 10px;
+}
+
+.alert {
+ margin-top: 25px;
+ width: 250px;
+ padding: 5px;
+ text-align: left;
+ vertical-align: middle;
+}
+
+.login_form {
+ // height: 100%;
+ // float: left;
+ margin: 0;
+ padding: 0 32px;
+}
+
+.mp_tips {
+ font-weight: bold;
+ color: rgb(7, 221, 7);
+}
+
+.logo span {
+ position: relative;
+ top: 2px;
+ color: rgba(0, 0, 0, .85);
+ font-weight: 600;
+ font-size: 33px;
+}
+
+.subTitle {
+ margin-top: 12px;
+ margin-bottom: 10px;
+ color: rgba(0, 0, 0, .45);
+ font-size: 14px;
+}
diff --git a/src/views/User/Register/index.tsx b/src/views/User/Register/index.tsx
new file mode 100644
index 0000000..72f658b
--- /dev/null
+++ b/src/views/User/Register/index.tsx
@@ -0,0 +1,256 @@
+import { BarcodeOutlined, LockOutlined, MobileOutlined, WechatOutlined } from '@ant-design/icons'
+import { ProFormCaptcha, ProFormText } from '@ant-design/pro-components'
+import { Space, Tabs, message, Image, Alert, Form, Button } from 'antd'
+import { useState } from 'react'
+import logo from '@/assets/icons/schisandra.svg'
+// import background from '@/assets/images/background.png'
+import qrCode from '@/assets/images/login_qrcode-landaiqing.jpg'
+import './index.less'
+import { observer } from 'mobx-react'
+// import useStore from '@/utils/store/useStore.tsx'
+type LoginType = 'phone'
+
+export default observer(() => {
+ const [generateMpRegCodeData, setGenerateMpRegCodeData] = useState({})
+ const [form] = Form.useForm()
+ const [base64Code, setBase64Code] = useState({ data: '' })
+ const clickGetBase64CodeMethod = async () => {
+ await getBase64CodeMethod()
+ }
+ const CodeImg = (
+
+ )
+ const getBase64CodeMethod = async () => {}
+
+ const items = [
+ {
+ key: 'phone',
+ label: (
+
+
+ 手机号注册
+
+ ),
+ },
+ ]
+ const [loginType, setLoginType] = useState('phone')
+
+ const onSubmit = async (formData: object) => {
+ console.log(formData)
+ }
+ return (
+
+
+
+
+
+
+ 微信扫码登录
+
+ 微信扫码关注公众号)}
+ description={
+
+
+ 微信扫码
+ 关注公众号
+
+
+ 登录更快更安全
+
+ }
+ // type="success"
+ showIcon={true}
+ className={'alert'}
+ icon={}
+ />
+
+
+
+
+ 登录
+
+
+
+
+
+ )
+})
diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts
index 4dafaa8..7985ae1 100644
--- a/src/vite-env.d.ts
+++ b/src/vite-env.d.ts
@@ -15,6 +15,10 @@ declare module '*.svg' {
const content: any
export default content
}
+declare module '.*' {
+ const value: any
+ export default value
+}
declare module '*.tsx'
declare module '*.svg'
declare module '*.png'