diff --git a/src/App.vue b/src/App.vue index 2e627f8..54e0400 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,6 +1,6 @@ - + diff --git a/src/api/all/common.ts b/src/api/all/common.ts index 574d7e9..fc1e92a 100644 --- a/src/api/all/common.ts +++ b/src/api/all/common.ts @@ -72,3 +72,8 @@ export const getImagePreSignedUrl = (params = {}) => { export const getVideoPreSignedUrl = (params = {}) => { return Http.get('/v1/oss/video-pre-signed-url', params); }; + +// 清除限流 +export const postClearRateLimiter = (params = {}) => { + return Http.post(`/v1/rate-limiter/clear`, params); +}; \ No newline at end of file diff --git a/src/api/all/login.ts b/src/api/all/login.ts index fa0a154..d54db76 100644 --- a/src/api/all/login.ts +++ b/src/api/all/login.ts @@ -47,3 +47,28 @@ export const fetchBindPhone = (params = {}) => { export const fetchEnterpriseInfo = (id: number) => { return Http.get(`/v1/enterprises/${id}`); }; + +// 手机密码登录 +export const postLoginPassword = (params = {}) => { + return Http.post('/v1/authorizations/password', params); +}; + +// 用户注册 +export const postRegister = (params = {}) => { + return Http.post('/v1/users/register', params); +}; + +// 发送注册验证码 +export const postRegisterCaptcha = (params = {}) => { + return Http.post('/v1/sms/register-captcha', params); +}; + +// 发送忘记密码验证码 +export const postForgetPasswordCaptcha = (params = {}) => { + return Http.post('/v1/sms/forget-password-captcha', params); +}; + +// 忘记密码 +export const postForgetPassword = (params = {}) => { + return Http.post('/v1/users/forget-password', params); +}; \ No newline at end of file diff --git a/src/api/index.ts b/src/api/index.ts index 752c186..4bc4561 100644 --- a/src/api/index.ts +++ b/src/api/index.ts @@ -60,8 +60,8 @@ export class Request { this.instance.interceptors.response.use( (res: AxiosResponse) => { - const { data } = res; - switch (data.code) { + const { data, status } = res; + switch (status) { case HttpStatusCode.Success: return data; default: diff --git a/src/assets/img/login/icon-close.png b/src/assets/img/login/icon-close.png new file mode 100644 index 0000000..a7a1be5 Binary files /dev/null and b/src/assets/img/login/icon-close.png differ diff --git a/src/assets/img/login/icon-open.png b/src/assets/img/login/icon-open.png new file mode 100644 index 0000000..5a00dbc Binary files /dev/null and b/src/assets/img/login/icon-open.png differ diff --git a/src/layouts/components/navbar/components/middle-side/style.scss b/src/layouts/components/navbar/components/middle-side/style.scss index c2887a7..499b271 100644 --- a/src/layouts/components/navbar/components/middle-side/style.scss +++ b/src/layouts/components/navbar/components/middle-side/style.scss @@ -8,42 +8,42 @@ width: 560px; height: 36px; padding: 0 2px 0 16px; - border-radius: 50px; - background: rgba(255, 255, 255, 0.6); + border-radius: 50px !important; + background-color: rgba(255, 255, 255, 0.6) !important; backdrop-filter: blur(8px); - border-color: #fff; + border-color: #fff !important; box-shadow: none; transition: all 0.3s; display: flex; align-items: center; &.ant-input-affix-wrapper-focused { - border-color: #6d4cfe; - caret-color: #6d4cfe; + border-color: #6d4cfe !important; + caret-color: #6d4cfe !important; } &:hover { - border-color: #6d4cfe; + border-color: #6d4cfe !important; } .ant-input-suffix { - margin-inline-start: 0; + margin-inline-start: 0 !important; } .ant-input { padding-right: 16px; border: none !important; - background-color: transparent; + background-color: transparent !important; box-shadow: none; font-family: $font-family-regular; color: #211f24; - font-size: 12px; + font-size: 12px !important; font-style: normal; font-weight: 400; line-height: 20px; &::placeholder { - color: #939499; + color: #939499 !important; } &:focus-within { &::after { - border-width: 1px; + border-width: 1px !important; } } } diff --git a/src/router/index.ts b/src/router/index.ts index 2c9f39e..d79a09a 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -18,7 +18,7 @@ export const router = createRouter({ { path: '/login', name: 'UserLogin', - component: () => import('@/views/components/login/index.vue'), + component: () => import('@/views/login/index.vue'), meta: { requiresAuth: false, requireLogin: false, @@ -32,14 +32,23 @@ export const router = createRouter({ requiresAuth: false, requireLogin: true, group: GROUP_MAIN_NAME, - } + }, }, { path: '/chat/:conversationId?', name: 'Home', component: () => import('@/views/home/index.vue'), meta: { - requiresAuth: false, + requiresAuth: true, + requireLogin: true, + }, + }, + { + path: '/trial', + name: 'Trial', + component: () => import('@/views/trial/index.vue'), + meta: { + requiresAuth: true, requireLogin: true, }, }, diff --git a/src/styles/components/ant-button.scss b/src/styles/components/ant-button.scss index 79571a7..ad53838 100644 --- a/src/styles/components/ant-button.scss +++ b/src/styles/components/ant-button.scss @@ -1,5 +1,5 @@ .ant-btn { - border-radius: 2px !important; + border-radius: 4px !important; border: 1px solid #d7d7d9 !important; color: #3c4043 !important; font-family: $font-family-regular; diff --git a/src/styles/components/ant-input.scss b/src/styles/components/ant-input.scss index aee10b0..1f99625 100644 --- a/src/styles/components/ant-input.scss +++ b/src/styles/components/ant-input.scss @@ -6,12 +6,7 @@ background-color: #fff !important; padding: 0 12px; } -.ant-input-affix-wrapper { - @include box; - &.ant-input-affix-wrapper-disabled { - background-color: var(--BG-200, #f2f3f5) !important; - } -} + .ant-input, .ant-input-password { @include box; @@ -32,7 +27,7 @@ &.ant-input-focus, &.ant-textarea-focus { background-color: var(--color-bg-2) !important; - border-color: rgb(var(--primary-6)) !important; + border-color: $color-primary !important; box-shadow: 0 0 0 0 var(--color-primary-light-2) !important; } &.ant-input-disabled { @@ -44,7 +39,9 @@ } &.ant-input-status-error, &.ant-input-affix-wrapper-status-error { - border-color: $color-error !important; + &:not(.ant-input-disabled) { + border-color: $color-error !important; + } } } input.ant-input { @@ -62,9 +59,20 @@ textarea.ant-input { .ant-input-affix-wrapper { padding-top: 0; padding-bottom: 0; + @include box; + &.ant-input-affix-wrapper-disabled { + background-color: var(--BG-200, #f2f3f5) !important; + } + + &.ant-input-affix-wrapper-status-error { + &:not(.ant-input-affix-wrapper-disabled) { + border-color: $color-error !important; + } + } &:focus, &-focused { box-shadow: none !important; + border-color: $color-primary !important; } .ant-input { height: 30px; diff --git a/src/styles/components/ant-step.scss b/src/styles/components/ant-step.scss index 2eab583..e2061c1 100644 --- a/src/styles/components/ant-step.scss +++ b/src/styles/components/ant-step.scss @@ -53,4 +53,20 @@ } } } + &.ant-steps-dot { + .ant-steps-item-process { + .ant-steps-item-tail { + &::after { + background-color: #e6e6e8 !important; + } + } + } + .ant-steps-item-finish { + .ant-steps-item-tail { + &::after { + background-color: #6d4cfe !important; + } + } + } + } } diff --git a/src/styles/font.scss b/src/styles/font.scss index 3b1ea9a..28a9c4e 100644 --- a/src/styles/font.scss +++ b/src/styles/font.scss @@ -18,27 +18,27 @@ } .font-family-regular { - font-family: $font-family-regular; + font-family: $font-family-regular !important; } .font-family-medium { - font-family: $font-family-medium; + font-family: $font-family-medium !important; } .font-family-light { - font-family: $font-family-light; + font-family: $font-family-light !important; } .font-family-bold { - font-family: $font-family-bold; + font-family: $font-family-bold !important; } .font-family-manrope-regular { - font-family: $font-family-manrope-regular; + font-family: $font-family-manrope-regular !important; } .font-family-manrope-medium { - font-family: $font-family-manrope-medium; + font-family: $font-family-manrope-medium !important; } .font-family-manrope-bold { - font-family: $font-family-manrope-bold; + font-family: $font-family-manrope-bold !important; } .font-family-manrope-semiBold { - font-family: $font-family-manrope-semiBold; + font-family: $font-family-manrope-semiBold !important; } diff --git a/src/views/components/login/components/PuzzleVerification.vue b/src/views/login/components/PuzzleVerification.vue similarity index 100% rename from src/views/components/login/components/PuzzleVerification.vue rename to src/views/login/components/PuzzleVerification.vue diff --git a/src/views/login/components/login-form/index.vue b/src/views/login/components/login-form/index.vue new file mode 100644 index 0000000..f1c5410 --- /dev/null +++ b/src/views/login/components/login-form/index.vue @@ -0,0 +1,371 @@ + + + + + + + + + + + + + + + + + + {{ countdown > 0 ? `${countdown}s` : hasGetCode ? '重新发送' : '发送验证码' }} + + + + + {{ errMsg }} + + + + + + + + + + {{ errMsg }} + + + + + + + 登录即代表同意 用户协议 和 + 隐私政策 + + + 登录 + + + + 忘记密码? + + + 注册 + + + + + + + + + + + + + + diff --git a/src/views/login/components/login-form/style.scss b/src/views/login/components/login-form/style.scss new file mode 100644 index 0000000..49a0e69 --- /dev/null +++ b/src/views/login/components/login-form/style.scss @@ -0,0 +1,34 @@ +:deep(.ant-tabs) { + .ant-tabs-nav { + padding: 0; + &::before { + display: none; + } + .ant-tabs-nav-list { + .ant-tabs-tab { + padding: 0 0 4px; + .ant-tabs-tab-btn { + color: #939499; + font-size: 18px; + font-style: normal; + font-weight: 500; + line-height: 26px; + font-family: $font-family-medium; + } + &.ant-tabs-tab-active { + .ant-tabs-tab-btn { + color: #211f24; + } + } + } + .ant-tabs-ink-bar { + border-radius: 4px; + background: var(--Brand-6, #6d4cfe); + width: 24px !important; + height: 4px; + margin-left: 24px; + } + } + } +} + diff --git a/src/views/login/components/register-form/index.vue b/src/views/login/components/register-form/index.vue new file mode 100644 index 0000000..19a92c2 --- /dev/null +++ b/src/views/login/components/register-form/index.vue @@ -0,0 +1,389 @@ + + + + + + + {{ + isResetPassword ? '重置密码' : '手机注册' + }} + + + + + + + + + + + + + + + + + + + + + + + + {{ countdown > 0 ? `${countdown}s` : hasGetCode ? '重新发送' : '发送验证码' }} + + + + + {{ errMsg }} + + + + + + + 登录即代表同意 用户协议 和 + 隐私政策 + + + {{ isResetPassword ? '重置' : '注册' }} + + + + + + + + + + + + + diff --git a/src/views/login/components/register-form/style.scss b/src/views/login/components/register-form/style.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/views/login/components/select-account-modal/index.vue b/src/views/login/components/select-account-modal/index.vue new file mode 100644 index 0000000..32717d8 --- /dev/null +++ b/src/views/login/components/select-account-modal/index.vue @@ -0,0 +1,171 @@ + + + + 选择账号 + + + + + {{ mobileNumber }} 已在以下企业绑定了账号 + + + + + + + + + {{ account.name || '-' }} + + + + + + + + + + 确定 + + + + + + + + diff --git a/src/views/login/index.vue b/src/views/login/index.vue new file mode 100644 index 0000000..0b011bc --- /dev/null +++ b/src/views/login/index.vue @@ -0,0 +1,40 @@ + + + + + + + + + + + 闽公网安备 352018502850842号 闽ICP备20250520582号 © 2025小题科技 + + + + + + + + diff --git a/src/views/components/login/style.scss b/src/views/login/style.scss similarity index 62% rename from src/views/components/login/style.scss rename to src/views/login/style.scss index 86cc319..937d964 100644 --- a/src/views/components/login/style.scss +++ b/src/views/login/style.scss @@ -1,17 +1,57 @@ .login-wrap { - .arco-input-wrapper, - .arco-select-view-single, - .arco-textarea-wrapper, - .arco-picker, - .arco-select-view-multiple { - border-radius: 4px; - border-color: #d7d7d9 !important; - background-color: #fff !important; - &:focus-within, - &.arco-input-focus { - background-color: var(--color-bg-2); - // border-color: rgb(var(--primary-6)); - box-shadow: 0 0 0 0 var(--color-primary-light-2); + :deep(.ant-form) { + .ant-form-item { + &:not(:last-child) { + margin-bottom: 24px !important; + } + .ant-input-affix-wrapper { + height: 48px; + padding: 0 10px; + border-radius: 8px !important; + .ant-input { + border-radius: 8px !important; + font-size: 16px; + font-style: normal; + font-weight: 400; + line-height: 24px; + height: 24px; + } + } + } + + .captcha-form-item { + .ant-input-suffix { + position: relative; + &::before { + content: ''; + position: absolute; + top: 50%; + transform: translateY(-50%); + left: 0; + width: 1px; + height: 16px; + background-color: #d7d7d9; + } + margin-inline-start: 0; + padding-left: 16px; + // border-left: 1px solid #d7d7d9; + } + } + .password-form-item { + .ant-input-suffix { + cursor: pointer; + padding: 0; + } + } + } + :deep(.btn-login) { + &:disabled { + background-color: #c5b7ff !important; + } + &:not(:disabled) { + &:hover { + background-color: $color-primary-3 !important; + } } } .login-bg { @@ -26,11 +66,6 @@ background-position: center; background-size: cover; } - .form-link { - color: #211f24; - font-size: 12px; - margin: 0px; - } .login-footer { position: absolute; @@ -64,6 +99,7 @@ width: 100%; flex-direction: column; align-items: start; + box-shadow: none; } .bind-header { @@ -106,6 +142,9 @@ background-color: rgba(109, 76, 254, 0.1); box-shadow: 0 2px 4px 0 rgba(109, 76, 254, 0.5); } + :deep(.ant-list-item-meta-title) { + margin: 0; + } } .account-item:deep(.arco-list-item-main) { diff --git a/src/views/trial/img/icon-check.png b/src/views/trial/img/icon-check.png new file mode 100644 index 0000000..b859859 Binary files /dev/null and b/src/views/trial/img/icon-check.png differ diff --git a/src/views/trial/img/icon-info.png b/src/views/trial/img/icon-info.png new file mode 100644 index 0000000..677e49a Binary files /dev/null and b/src/views/trial/img/icon-info.png differ diff --git a/src/views/trial/index.vue b/src/views/trial/index.vue new file mode 100644 index 0000000..77832e3 --- /dev/null +++ b/src/views/trial/index.vue @@ -0,0 +1,221 @@ + + + + + + + + + + + + + + + + + + + 申请试用 + + 0-3个工作日 + + + + + 基本信息 + + + + + + + + + + + + + + 免费申请 + 申请成功后,您可开启 + 7 + 天免费试用,试用结束后,若满意可直接升级正式版,数据将自动保留 + + + + + + + + 您的试用申请已提交 + + 我们将在 1-3 个工作日内完成审核,审核结果会通过电话/短信告知您。 + + + 若超过 3 个工作日未收到通知,可拨打客服电话 153 5932 0192 咨询 + + + 进度 + + + + + + + + + + + + + + 试用已到期 + + 您的 7 天产品试用已到期,若想继续使用,可拨打客服电话 + + + 153 5932 0192 咨询续用事宜 + + + 进度 + + + + + + + + + + + + + + + + diff --git a/src/views/trial/style.scss b/src/views/trial/style.scss new file mode 100644 index 0000000..9531a7a --- /dev/null +++ b/src/views/trial/style.scss @@ -0,0 +1,95 @@ +.trial-wrap { + background: transparent; + min-width: 1200px; + .cts { + color: #211f24; + font-family: $font-family-medium; + font-size: 14px; + font-style: normal; + font-weight: 500; + line-height: 22px; + } + :deep(.ant-steps) { + .ant-steps-item { + margin-left: 0; + .ant-steps-item-icon { + width: 10px; + height: 10px; + } + .ant-steps-item-content { + margin-top: 8px; + .ant-steps-item-title { + color: var(--Text-1, #211f24); + font-family: $font-family-regular; + font-size: 16px; + font-style: normal; + font-weight: 400; + line-height: 24px; + } + .ant-steps-item-description { + color: var(--Text-3, #737478); + font-family: $font-family-regular; + font-size: 14px; + font-style: normal; + font-weight: 400; + line-height: 22px; + } + } + &.ant-steps-item-wait { + .ant-steps-icon { + .ant-steps-icon-dot { + background: #d7d7d9; + } + } + } + &.ant-steps-item-active, + &.ant-steps-item-finish { + .ant-steps-icon { + .ant-steps-icon-dot { + background: #6d4cfe; + } + } + .ant-steps-item-content { + .ant-steps-item-title { + padding: 0; + font-family: $font-family-medium; + } + } + } + } + } + .header-wrap { + background: transparent; + height: $navbar-height; + line-height: $navbar-height; + padding-inline: inherit; + color: inherit; + width: 100%; + min-width: $layout-min-width; + :deep(.right-wrap) { + .task-icon, + .agent-entry { + display: none; + } + } + } + .trial-content { + width: 100%; + height: 100%; + background: transparent; + min-height: calc(100vh - $navbar-height); + :deep(.ant-form) { + .ant-form-item { + &:not(:last-child) { + margin-bottom: 24px !important; + } + .ant-form-item-label { + > label { + font-family: $font-family-medium; + font-weight: 500; + } + } + } + } + } +}
+ {{ errMsg }} +
闽公网安备 352018502850842号 闽ICP备20250520582号 © 2025小题科技
基本信息
您的试用申请已提交
+ 我们将在 1-3 个工作日内完成审核,审核结果会通过电话/短信告知您。 +
+ 若超过 3 个工作日未收到通知,可拨打客服电话 153 5932 0192 咨询 +
进度
试用已到期
+ 您的 7 天产品试用已到期,若想继续使用,可拨打客服电话 +
+ 153 5932 0192 咨询续用事宜 +