wuheng hace 1 año
padre
commit
220b007069

+ 3 - 3
.env

@@ -1,10 +1,10 @@
 VITE_BASE_URL=/
 
-VITE_APP_NAME=SoybeanAdmin
+VITE_APP_NAME=教务系统
 
-VITE_APP_TITLE=Soybean管理系统
+VITE_APP_TITLE=爱扣钉教务系统
 
-VITE_APP_DESC=SoybeanAdmin是一个中后台管理系统模版
+VITE_APP_DESC=四福科技-爱扣钉-教务
 
 # 权限路由模式: static | dynamic
 VITE_AUTH_ROUTE_MODE=static

+ 4 - 2
src/config/regexp.ts

@@ -6,8 +6,10 @@ export const REGEXP_PHONE =
 export const REGEXP_EMAIL = /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/;
 
 /** 密码正则(密码为6-18位数字/字符/符号的组合) */
-export const REGEXP_PWD =
-  /^(?![0-9]+$)(?![a-z]+$)(?![A-Z]+$)(?!([^(0-9a-zA-Z)]|[()])+$)(?!^.*[\u4E00-\u9FA5].*$)([^(0-9a-zA-Z)]|[()]|[a-z]|[A-Z]|[0-9]){6,18}$/;
+// export const REGEXP_PWD =
+// /^(?![0-9]+$)(?![a-z]+$)(?![A-Z]+$)(?!([^(0-9a-zA-Z)]|[()])+$)(?!^.*[\u4E00-\u9FA5].*$)([^(0-9a-zA-Z)]|[()]|[a-z]|[A-Z]|[0-9]){6,18}$/;
+
+export const REGEXP_PWD = /^[(0-9a-zA-Z)]{6,18}$/;
 
 /** 6位数字验证码正则 */
 export const REGEXP_CODE_SIX = /^\d{6}$/;

+ 1 - 4
src/constants/business.ts

@@ -1,9 +1,6 @@
 export const loginModuleLabels: Record<UnionKey.LoginModule, string> = {
   'pwd-login': '账密登录',
-  'code-login': '手机验证码登录',
-  register: '注册',
-  'reset-pwd': '重置密码',
-  'bind-wechat': '微信绑定'
+  register: '注册'
 };
 
 export const userRoleLabels: Record<Auth.RoleType, string> = {

+ 0 - 9
src/router/routes/index.ts

@@ -29,15 +29,6 @@ export const constantRoutes: AuthRoute.Route[] = [
       singleLayout: 'blank'
     }
   },
-  {
-    name: 'constant-page',
-    path: '/constant-page',
-    component: 'self',
-    meta: {
-      title: '固定页面',
-      singleLayout: 'blank'
-    }
-  },
   {
     name: '403',
     path: '/403',

+ 0 - 2
src/typings/page-route.d.ts

@@ -19,7 +19,6 @@ declare namespace PageRoute {
     | '403'
     | '404'
     | '500'
-    | 'constant-page'
     | 'login'
     | 'not-found'
     | 'about'
@@ -86,7 +85,6 @@ declare namespace PageRoute {
     | '403'
     | '404'
     | '500'
-    | 'constant-page'
     | 'login'
     | 'not-found'
     | 'about'

+ 1 - 1
src/typings/union-key.d.ts

@@ -17,7 +17,7 @@ declare namespace UnionKey {
    * - reset-pwd: 重置密码
    * - bind-wechat: 微信绑定
    */
-  type LoginModule = 'pwd-login' | 'code-login' | 'register' | 'reset-pwd' | 'bind-wechat';
+  type LoginModule = 'pwd-login';
 
   /**
    * 布局模式

+ 0 - 107
src/views/_builtin/constant-page/index.vue

@@ -1,107 +0,0 @@
-<template>
-  <div class="wh-full flex-col-center">
-    <n-gradient-text class="mb-24px" type="primary" :size="28">Custom Constant Page</n-gradient-text>
-    <router-link :to="{ name: routeHomePath }">
-      <n-button type="primary">回到首页</n-button>
-    </router-link>
-    <n-card :bordered="false" size="small" class="mt-24px rounded-16px shadow-sm">
-      <div class="flex-center py-12px">
-        <n-button type="primary" class="mr-24px" :disabled="isMoving" @click="startMove">开始</n-button>
-        <n-button type="error" @click="endMove">暂停</n-button>
-      </div>
-      <div class="flex-center">
-        <div class="relative bg-primary_active" :style="containerStyle">
-          <svg class="w-full h-full">
-            <ellipse
-              :cx="ellipseConfig.cX"
-              :cy="ellipseConfig.cY"
-              :rx="ellipseConfig.rX"
-              :ry="ellipseConfig.rY"
-              :style="{ strokeWidth: ellipseConfig.strokeWidth + 'px' }"
-              class="fill-none stroke-primary"
-            ></ellipse>
-          </svg>
-          <div class="absolute left-182px top-82px w-40px h-40px bg-red rounded-20px" :style="transformStyle"></div>
-        </div>
-      </div>
-    </n-card>
-  </div>
-</template>
-
-<script setup lang="ts">
-import { ref, computed } from 'vue';
-import { routeName } from '@/router';
-
-const routeHomePath = routeName('root');
-
-interface EllipseConfig {
-  /** 左上角x坐标 */
-  cX: number;
-  /** 左上角y坐标 */
-  cY: number;
-  /** 椭圆长半轴A */
-  rX: number;
-  /** 椭圆短半轴B */
-  rY: number;
-  /** 椭圆线宽 */
-  strokeWidth: number;
-}
-
-const ellipseConfig: EllipseConfig = {
-  cX: 202,
-  cY: 102,
-  rX: 200,
-  rY: 100,
-  strokeWidth: 2
-};
-
-const containerStyle = (() => {
-  const { rX, rY, strokeWidth } = ellipseConfig;
-
-  const width = (rX + strokeWidth) * 2;
-  const height = (rY + strokeWidth) * 2;
-
-  return `width:${width}px;height:${height}px;`;
-})();
-
-/** 角度 */
-const angle = ref(0);
-
-const transformStyle = computed(() => {
-  const { rX, rY } = ellipseConfig;
-  const x = rX * Math.sin(angle.value);
-  const y = rY * Math.cos(angle.value);
-
-  return `transform: translate3d(${x}px,${y}px,0px)`;
-});
-
-/** 运动速度(周/秒) */
-const speed = ref(2);
-
-/** 一周的角度(弧度制) */
-const FULL_ANGLE = 2 * Math.PI;
-
-/** requestAnimationFrame一秒执行的次数 */
-const TIMES_PER_SECONDS = 60;
-
-const updateAnglePerTime = computed(() => FULL_ANGLE / speed.value / TIMES_PER_SECONDS);
-
-const rafId = ref<number | null>(null);
-
-const isMoving = computed(() => rafId.value !== null);
-
-const startMove = () => {
-  angle.value += updateAnglePerTime.value;
-
-  rafId.value = window.requestAnimationFrame(startMove);
-};
-
-const endMove = () => {
-  if (rafId.value !== null) {
-    window.cancelAnimationFrame(rafId.value);
-    rafId.value = null;
-  }
-};
-</script>
-
-<style scoped></style>

+ 0 - 55
src/views/_builtin/login/components/bind-wechat/index.vue

@@ -1,55 +0,0 @@
-<template>
-  <n-form ref="formRef" :model="model" :rules="rules" size="large" :show-label="false">
-    <n-form-item path="phone">
-      <n-input v-model:value="model.phone" placeholder="手机号码" />
-    </n-form-item>
-    <n-form-item path="code">
-      <div class="flex-y-center w-full">
-        <n-input v-model:value="model.code" placeholder="验证码" />
-        <div class="w-18px"></div>
-        <n-button size="large" :disabled="isCounting" :loading="smsLoading" @click="handleSmsCode">
-          {{ label }}
-        </n-button>
-      </div>
-    </n-form-item>
-    <n-space :vertical="true" size="large">
-      <n-button type="primary" size="large" :block="true" :round="true" @click="handleSubmit">确定</n-button>
-      <n-button size="large" :block="true" :round="true" @click="toLoginModule('pwd-login')">返回</n-button>
-    </n-space>
-  </n-form>
-</template>
-
-<script setup lang="ts">
-import { reactive, ref } from 'vue';
-import type { FormInst } from 'naive-ui';
-import { useRouterPush } from '@/composables';
-import { useSmsCode } from '@/hooks';
-import { formRules } from '@/utils';
-
-const { toLoginModule } = useRouterPush();
-const { label, isCounting, loading: smsLoading, getSmsCode } = useSmsCode();
-
-const formRef = ref<HTMLElement & FormInst>();
-
-const model = reactive({
-  phone: '',
-  code: '',
-  imgCode: ''
-});
-
-const rules = {
-  phone: formRules.phone,
-  code: formRules.code
-};
-
-function handleSmsCode() {
-  getSmsCode(model.phone);
-}
-
-async function handleSubmit() {
-  await formRef.value?.validate();
-  window.$message?.success('验证成功!');
-}
-</script>
-
-<style scoped></style>

+ 0 - 75
src/views/_builtin/login/components/code-login/index.vue

@@ -1,75 +0,0 @@
-<template>
-  <n-form ref="formRef" :model="model" :rules="rules" size="large" :show-label="false">
-    <n-form-item path="phone">
-      <n-input v-model:value="model.phone" placeholder="手机号码" />
-    </n-form-item>
-    <n-form-item path="code">
-      <div class="flex-y-center w-full">
-        <n-input v-model:value="model.code" placeholder="验证码" />
-        <div class="w-18px"></div>
-        <n-button size="large" :disabled="isCounting" :loading="smsLoading" @click="handleSmsCode">
-          {{ label }}
-        </n-button>
-      </div>
-    </n-form-item>
-    <n-form-item path="imgCode">
-      <n-input v-model:value="model.imgCode" placeholder="验证码,点击图片刷新" />
-      <div class="pl-8px">
-        <image-verify v-model:code="imgCode" />
-      </div>
-    </n-form-item>
-    <n-space :vertical="true" :size="18">
-      <n-button
-        type="primary"
-        size="large"
-        :block="true"
-        :round="true"
-        :loading="auth.loginLoading"
-        @click="handleSubmit"
-      >
-        确定
-      </n-button>
-      <n-button size="large" :block="true" :round="true" @click="toLoginModule('pwd-login')">返回</n-button>
-    </n-space>
-  </n-form>
-</template>
-
-<script setup lang="ts">
-import { reactive, ref } from 'vue';
-import type { FormInst } from 'naive-ui';
-import { useAuthStore } from '@/store';
-import { useRouterPush } from '@/composables';
-import { useSmsCode } from '@/hooks';
-import { formRules, getImgCodeRule } from '@/utils';
-
-const auth = useAuthStore();
-const { toLoginModule } = useRouterPush();
-const { label, isCounting, loading: smsLoading, getSmsCode } = useSmsCode();
-
-const formRef = ref<HTMLElement & FormInst>();
-
-const model = reactive({
-  phone: '',
-  code: '',
-  imgCode: ''
-});
-
-const imgCode = ref('');
-
-const rules = {
-  phone: formRules.phone,
-  code: formRules.code,
-  imgCode: getImgCodeRule(imgCode)
-};
-
-function handleSmsCode() {
-  getSmsCode(model.phone);
-}
-
-async function handleSubmit() {
-  await formRef.value?.validate();
-  window.$message?.success('验证成功!');
-}
-</script>
-
-<style scoped></style>

+ 1 - 5
src/views/_builtin/login/components/index.ts

@@ -1,8 +1,4 @@
 import LoginBg from './login-bg/index.vue';
 import PwdLogin from './pwd-login/index.vue';
-import CodeLogin from './code-login/index.vue';
-import Register from './register-user/index.vue';
-import ResetPwd from './reset-pwd/index.vue';
-import BindWechat from './bind-wechat/index.vue';
 
-export { LoginBg, PwdLogin, CodeLogin, Register, ResetPwd, BindWechat };
+export { LoginBg, PwdLogin };

+ 1 - 2
src/views/_builtin/login/components/pwd-login/components/index.ts

@@ -1,4 +1,3 @@
-import OtherLogin from './other-login.vue';
 import OtherAccount from './other-account.vue';
 
-export { OtherLogin, OtherAccount };
+export { OtherAccount };

+ 9 - 23
src/views/_builtin/login/components/pwd-login/components/other-account.vue

@@ -1,13 +1,8 @@
 <template>
   <n-space :vertical="true">
-    <n-divider class="!mb-0 text-14px text-#666">其他账户登录</n-divider>
+    <n-divider class="!mb-0 text-14px text-#666">登录账户类型</n-divider>
     <n-space justify="center">
-      <n-button
-        v-for="item in accounts"
-        :key="item.userName"
-        type="primary"
-        @click="login(item.userName, item.password)"
-      >
+      <n-button v-for="item in accounts" :key="item.type" type="primary" @click="change(item.type)">
         {{ item.label }}
       </n-button>
     </n-space>
@@ -16,31 +11,22 @@
 
 <script lang="ts" setup>
 interface Emits {
-  (e: 'login', param: { userName: string; password: string }): void;
+  (e: 'change', param: { type: string }): void;
 }
-
 const emit = defineEmits<Emits>();
-
 const accounts = [
   {
-    label: '超级管理员',
-    userName: 'Super',
-    password: 'super123'
-  },
-  {
-    label: '管理员',
-    userName: 'Admin',
-    password: 'admin123'
+    label: '教务人员',
+    type: 'admin'
   },
   {
-    label: '普通用户',
-    userName: 'User01',
-    password: 'user01123'
+    label: '学生账户',
+    type: 'student'
   }
 ];
 
-function login(userName: string, password: string) {
-  emit('login', { userName, password });
+function change(type: string) {
+  emit('change', { type });
 }
 </script>
 

+ 0 - 14
src/views/_builtin/login/components/pwd-login/components/other-login.vue

@@ -1,14 +0,0 @@
-<template>
-  <n-space :vertical="true">
-    <n-divider class="!mb-0 text-14px text-#666">其他登录方式</n-divider>
-    <div class="flex-center">
-      <n-button :text="true">
-        <icon-mdi-wechat class="text-22px text-#888 hover:text-#52BF5E" />
-      </n-button>
-    </div>
-  </n-space>
-</template>
-
-<script lang="ts" setup></script>
-
-<style scoped></style>

+ 6 - 22
src/views/_builtin/login/components/pwd-login/index.vue

@@ -1,5 +1,5 @@
 <template>
-  <n-form ref="formRef" :model="model" :rules="rules" size="large" :show-label="false">
+  <n-form ref="formRef" :model="model" :role="rules" size="large" :show-label="false">
     <n-form-item path="userName">
       <n-input v-model:value="model.userName" placeholder="请输入用户名" />
     </n-form-item>
@@ -9,7 +9,6 @@
     <n-space :vertical="true" :size="24">
       <div class="flex-y-center justify-between">
         <n-checkbox v-model:checked="rememberMe">记住我</n-checkbox>
-        <n-button :text="true" @click="toLoginModule('reset-pwd')">忘记密码?</n-button>
       </div>
       <n-button
         type="primary"
@@ -21,33 +20,20 @@
       >
         确定
       </n-button>
-      <div class="flex-y-center justify-between">
-        <n-button class="flex-1" :block="true" @click="toLoginModule('code-login')">
-          {{ loginModuleLabels['code-login'] }}
-        </n-button>
-        <div class="w-12px"></div>
-        <n-button class="flex-1" :block="true" @click="toLoginModule('register')">
-          {{ loginModuleLabels.register }}
-        </n-button>
-      </div>
     </n-space>
-    <other-account @login="handleLoginOtherAccount" />
+    <other-account @change="handleLoginOtherAccount" />
   </n-form>
 </template>
 
 <script setup lang="ts">
 import { reactive, ref } from 'vue';
 import type { FormInst, FormRules } from 'naive-ui';
-import { loginModuleLabels } from '@/constants';
 import { useAuthStore } from '@/store';
-import { useRouterPush } from '@/composables';
 import { formRules } from '@/utils';
 import { OtherAccount } from './components';
-
 const auth = useAuthStore();
-const { login } = useAuthStore();
-const { toLoginModule } = useRouterPush();
 
+const { login } = useAuthStore();
 const formRef = ref<HTMLElement & FormInst>();
 
 const model = reactive({
@@ -63,15 +49,13 @@ const rememberMe = ref(false);
 
 async function handleSubmit() {
   await formRef.value?.validate();
-
   const { userName, password } = model;
-
   login(userName, password);
 }
 
-function handleLoginOtherAccount(param: { userName: string; password: string }) {
-  const { userName, password } = param;
-  login(userName, password);
+function handleLoginOtherAccount(param: { type: string }) {
+  const { type } = param;
+  console.log(type);
 }
 </script>
 

+ 0 - 67
src/views/_builtin/login/components/register-user/index.vue

@@ -1,67 +0,0 @@
-<template>
-  <n-form ref="formRef" :model="model" :rules="rules" size="large" :show-label="false">
-    <n-form-item path="phone">
-      <n-input v-model:value="model.phone" placeholder="手机号码" />
-    </n-form-item>
-    <n-form-item path="code">
-      <div class="flex-y-center w-full">
-        <n-input v-model:value="model.code" placeholder="验证码" />
-        <div class="w-18px"></div>
-        <n-button size="large" :disabled="isCounting" :loading="smsLoading" @click="handleSmsCode">
-          {{ label }}
-        </n-button>
-      </div>
-    </n-form-item>
-    <n-form-item path="pwd">
-      <n-input v-model:value="model.pwd" type="password" show-password-on="click" placeholder="密码" />
-    </n-form-item>
-    <n-form-item path="confirmPwd">
-      <n-input v-model:value="model.confirmPwd" type="password" show-password-on="click" placeholder="确认密码" />
-    </n-form-item>
-    <n-space :vertical="true" :size="18">
-      <login-agreement v-model:value="agreement" />
-      <n-button type="primary" size="large" :block="true" :round="true" @click="handleSubmit">确定</n-button>
-      <n-button size="large" :block="true" :round="true" @click="toLoginModule('pwd-login')">返回</n-button>
-    </n-space>
-  </n-form>
-</template>
-
-<script lang="ts" setup>
-import { reactive, ref, toRefs } from 'vue';
-import type { FormInst, FormRules } from 'naive-ui';
-import { useRouterPush } from '@/composables';
-import { useSmsCode } from '@/hooks';
-import { formRules, getConfirmPwdRule } from '@/utils';
-
-const { toLoginModule } = useRouterPush();
-const { label, isCounting, loading: smsLoading, start } = useSmsCode();
-
-const formRef = ref<HTMLElement & FormInst>();
-
-const model = reactive({
-  phone: '',
-  code: '',
-  pwd: '',
-  confirmPwd: ''
-});
-
-const rules: FormRules = {
-  phone: formRules.phone,
-  code: formRules.code,
-  pwd: formRules.pwd,
-  confirmPwd: getConfirmPwdRule(toRefs(model).pwd)
-};
-
-const agreement = ref(false);
-
-function handleSmsCode() {
-  start();
-}
-
-async function handleSubmit() {
-  await formRef.value?.validate();
-  window.$message?.success('验证成功!');
-}
-</script>
-
-<style scoped></style>

+ 0 - 64
src/views/_builtin/login/components/reset-pwd/index.vue

@@ -1,64 +0,0 @@
-<template>
-  <n-form ref="formRef" :model="model" :rules="rules" size="large" :show-label="false">
-    <n-form-item path="phone">
-      <n-input v-model:value="model.phone" placeholder="手机号码" />
-    </n-form-item>
-    <n-form-item path="code">
-      <div class="flex-y-center w-full">
-        <n-input v-model:value="model.code" placeholder="验证码" />
-        <div class="w-18px"></div>
-        <n-button size="large" :disabled="isCounting" :loading="smsLoading" @click="handleSmsCode">
-          {{ label }}
-        </n-button>
-      </div>
-    </n-form-item>
-    <n-form-item path="pwd">
-      <n-input v-model:value="model.pwd" type="password" show-password-on="click" placeholder="密码" />
-    </n-form-item>
-    <n-form-item path="confirmPwd">
-      <n-input v-model:value="model.confirmPwd" type="password" show-password-on="click" placeholder="确认密码" />
-    </n-form-item>
-    <n-space :vertical="true" size="large">
-      <n-button type="primary" size="large" :block="true" :round="true" @click="handleSubmit">确定</n-button>
-      <n-button size="large" :block="true" :round="true" @click="toLoginModule('pwd-login')">返回</n-button>
-    </n-space>
-  </n-form>
-</template>
-
-<script lang="ts" setup>
-import { reactive, ref, toRefs } from 'vue';
-import type { FormInst, FormRules } from 'naive-ui';
-import { useRouterPush } from '@/composables';
-import { useSmsCode } from '@/hooks';
-import { formRules, getConfirmPwdRule } from '@/utils';
-
-const { toLoginModule } = useRouterPush();
-const { label, isCounting, loading: smsLoading, start } = useSmsCode();
-
-const formRef = ref<HTMLElement & FormInst>();
-
-const model = reactive({
-  phone: '',
-  code: '',
-  pwd: '',
-  confirmPwd: ''
-});
-
-const rules: FormRules = {
-  phone: formRules.phone,
-  code: formRules.code,
-  pwd: formRules.pwd,
-  confirmPwd: getConfirmPwdRule(toRefs(model).pwd)
-};
-
-function handleSmsCode() {
-  start();
-}
-
-async function handleSubmit() {
-  await formRef.value?.validate();
-  window.$message?.success('验证成功!');
-}
-</script>
-
-<style scoped></style>

+ 3 - 9
src/views/_builtin/login/index.vue

@@ -32,7 +32,7 @@ import { loginModuleLabels } from '@/constants';
 import { useThemeStore } from '@/store';
 import { useAppInfo } from '@/composables';
 import { getColorPalette, mixColor } from '@/utils';
-import { BindWechat, CodeLogin, LoginBg, PwdLogin, Register, ResetPwd } from './components';
+import { LoginBg, PwdLogin } from './components';
 
 interface Props {
   /** 登录模块分类 */
@@ -45,18 +45,12 @@ const theme = useThemeStore();
 const { title } = useAppInfo();
 
 interface LoginModule {
-  key: UnionKey.LoginModule;
+  key: string;
   label: string;
   component: Component;
 }
 
-const modules: LoginModule[] = [
-  { key: 'pwd-login', label: loginModuleLabels['pwd-login'], component: PwdLogin },
-  { key: 'code-login', label: loginModuleLabels['code-login'], component: CodeLogin },
-  { key: 'register', label: loginModuleLabels.register, component: Register },
-  { key: 'reset-pwd', label: loginModuleLabels['reset-pwd'], component: ResetPwd },
-  { key: 'bind-wechat', label: loginModuleLabels['bind-wechat'], component: BindWechat }
-];
+const modules: LoginModule[] = [{ key: 'pwd-login', label: loginModuleLabels['pwd-login'], component: PwdLogin }];
 
 const activeModule = computed(() => {
   const active: LoginModule = { ...modules[0] };

+ 0 - 1
src/views/index.ts

@@ -7,7 +7,6 @@ export const views: Record<
   403: () => import('./_builtin/403/index.vue'),
   404: () => import('./_builtin/404/index.vue'),
   500: () => import('./_builtin/500/index.vue'),
-  'constant-page': () => import('./_builtin/constant-page/index.vue'),
   login: () => import('./_builtin/login/index.vue'),
   'not-found': () => import('./_builtin/not-found/index.vue'),
   about: () => import('./about/index.vue'),