pengjing 11 månader sedan
förälder
incheckning
4f40a6e1b0

+ 2 - 1
h5app/src/api/account/model.d.ts

@@ -37,6 +37,7 @@ declare namespace API {
     createBy: string,
     createTime: string,
     updateBy: null,
-    updateTime: null
+    updateTime: null,
+    loginResult: null
   };
 }

+ 5 - 0
h5app/src/router/index.ts

@@ -9,6 +9,7 @@ import JobUserInfoIndex from '../views/pages/jobUserInfo/index.vue';
 import JobUserInfoUserEdit from '../views/pages/jobUserInfo/userEdit.vue';
 import JobUserInfoCompanyEdit from '../views/pages/jobUserInfo/companyEdit.vue';
 import IndexPage from '../views/index.vue';
+import ResetPassword from '../views/resetpassword.vue';
 
 const routes: Array<RouteRecordRaw> = [
     {
@@ -285,6 +286,10 @@ const routes: Array<RouteRecordRaw> = [
         path: '/apkDownLoad',
         name: 'apkDownLoad',
         component: () => import('@/views/pages/components/apkDownLoad.vue'),
+    },
+    {
+        path: '/resetpassword',
+        component: ResetPassword
     }
 ]
 

+ 4 - 3
h5app/src/store/modules/user.ts

@@ -80,7 +80,7 @@ export const useUserStore = defineStore({
 
         const data = await login(params);
         this.setToken(data.token);
-        return this.afterLogin();
+        return this.afterLogin(data);
 
       } catch (error) {
         return Promise.reject(error);
@@ -93,7 +93,7 @@ export const useUserStore = defineStore({
             const data = await oauthLogin(type, ticket,tm);
             if (data != null && data.token != null) {
                 this.setToken(data.token);
-                return this.afterLogin();
+                return this.afterLogin(data);
             }
             else{
                 return Promise.reject(false);
@@ -103,10 +103,11 @@ export const useUserStore = defineStore({
         }
     },
     /** 登录成功之后, 获取用户信息以及生成权限路由 */
-    async afterLogin() {
+    async afterLogin(loginResult:any) {
       try {
         //const wsStore = useWsStore();
         const [userInfo, { perms,menus }] = await Promise.all([getInfo(), permmenu()]);
+        userInfo.loginResult = loginResult;
         this.perms = perms;
         this.name = userInfo.name;
         /*this.avatar = userInfo.headImg;*/

+ 7 - 1
h5app/src/views/login.vue

@@ -115,7 +115,13 @@ const handleSubmit = async () => {
     sendPosition()
     // 设置定时器实时记录经纬度
     setPositionInterval()
-    router.push('/tabs/tabUser');
+
+    if (!data.userInfo.loginResult.isResetPassword) {
+      router.push('/resetpassword');
+    }
+    else{
+      router.push('/tabs/tabMain');
+    }
   }, (err) => {
     state.loading = false;
     state.errorShow = true;

+ 200 - 0
h5app/src/views/resetpassword.vue

@@ -0,0 +1,200 @@
+<template>
+  <ion-page>
+    <ion-content>
+      <div class="login-top"></div>
+      <div class="login-content">
+        <div class="login-item" style="color: #f50909">
+          {{dataModel.userName}},第一次登录,请重置密码!
+        </div>
+        <div class="login-item">
+          <ion-item>
+            <ion-input v-model="dataModel.pwd_default" name="pwd_default"
+                       placeholder="请填写8到16位新密码" type="password"></ion-input>
+          </ion-item>
+          <ion-note style="color: #f50909" v-if="v$.pwd_default.$error" slot="error">密码必须包含字母、数字和特殊字符,且长度要在8到16位。
+          </ion-note>
+        </div>
+        <div class="login-item">
+          <ion-item>
+            <ion-input v-model="dataModel.pwd_confirm" name="pwd_confirm"
+                       placeholder="请填写8到16位新密码" type="password"></ion-input>
+          </ion-item>
+          <ion-note style="color: #f50909" v-if="v$.pwd_confirm.$error" slot="error">密码必须包含字母、数字和特殊字符,且长度要在8到16位。
+          </ion-note>
+        </div>
+        <div class="login-btn">
+          <ion-buttons>
+            <ion-button @click="onSave()">
+              修改密码
+            </ion-button>
+          </ion-buttons>
+        </div>
+      </div>
+    </ion-content>
+  </ion-page>
+</template>
+
+<script setup lang="ts">
+import router from '@/router';
+import {useUserStore} from '@/store/modules/user';
+import {computed, onMounted, reactive, ref} from 'vue';
+import {minLength, required, maxLength} from "@vuelidate/validators";
+import {useVuelidate} from "@vuelidate/core";
+import {updateUserPassword} from "@/api/account";
+import {onIonViewDidEnter} from "@ionic/vue";
+
+const userStore = useUserStore();
+const userInfo = reactive(userStore.getUserInfo);
+const dataModel = ref({userID: '', userName: '', loginID: '', pwd_default: '', pwd_confirm: ''});
+const passwordRegex = /(?=.*[a-z_])(?=.*\d)(?=.*[^a-z0-9_])[\S]{8,}/i;
+// 定义校验器
+const password = (value:any) => {
+  return passwordRegex.test(value);
+};
+
+const rules = computed(() => {
+  return {
+    pwd_default: {required, minLength: minLength(8), maxLength: maxLength(16),password},
+    pwd_confirm: {required, minLength: minLength(8), maxLength: maxLength(16),password}
+  }
+});
+const v$ = useVuelidate(rules, dataModel);
+
+const onSave = async () => {
+  const isFormCorrect = await v$.value.$validate();
+
+  console.log(isFormCorrect)
+
+  if (!isFormCorrect) {
+    return null;
+  }
+
+  updateUserPassword(dataModel.value as any).then(result => {
+    if (result) {
+      router.push("/tabs/tabUser/myInfo");
+    }
+  });
+}
+
+onIonViewDidEnter(() => {
+  dataModel.value.userID = userInfo.userID || '';
+  dataModel.value.userName = userInfo.siteUserName || '';
+  dataModel.value.loginID = userInfo.loginID || '';
+  dataModel.value.pwd_default = "";
+  dataModel.value.pwd_confirm = "";
+});
+
+
+</script>
+
+<style lang="less">
+ion-content {
+  --background: #ffffff !important;
+  height: 100%;
+}
+
+.login-top {
+  background-image: url("./../assets/icon/login-bg.png");
+  width: 100%;
+  height: 35%;
+  background-size: 100% 100%;
+}
+
+.login-content {
+  position: relative;
+  padding: 40px 40px;
+  top: -35px;
+  border-radius: 30px;
+  background: #ffffff;
+  /*margin: 0 20px;*/
+
+  .login-logo {
+    margin-bottom: 15px;
+    padding-right: 5px;
+    text-align: center;
+
+    img {
+      content: url("./../assets/icon/login-logo.png");
+    }
+  }
+
+
+  .login-system {
+    margin-bottom: 15px;
+    text-align: center;
+
+    img {
+      content: url("./../assets/icon/login-system.png");
+      height: 50px;
+    }
+  }
+
+  .login-item {
+    margin-bottom: 15px;
+
+    ion-item {
+      --inner-border-width: 0px;
+      --background: #F3F3F3;
+      border-radius: 30px;
+
+      ion-icon {
+        color: #b7b8bb;
+      }
+
+      ion-input {
+        color: #7a7b80;
+      }
+
+      input {
+        color: #7a7b80;
+        background-color: #F3F3F3;
+        height: 100%;
+        border: none;
+        width: 100%;
+      }
+
+      input:focus {
+        box-shadow: none;
+        border: none;
+        outline: none;
+      }
+
+      input::placeholder {
+        color: #b4b4b7;
+      }
+
+    }
+  }
+
+  .login-btn {
+    border: none;
+  }
+
+  ion-item::part(native) {
+    padding: 0 20px 0 20px;
+    border: none;
+  }
+
+  ion-buttons {
+    margin: 30px 0px;
+
+    ion-button {
+      width: 100%;
+      color: white;
+      --background: #39A9FF !important;
+      --box-shadow: 0px 1px 5px #39A9FF;
+      --border-radius: 30px !important;
+      height: 40px;
+      font-size: 18px;
+    }
+  }
+
+  .error-label {
+    text-align: center;
+
+    p {
+      color: red;
+    }
+  }
+}
+</style>

+ 1 - 0
src/main/java/com/hz/employmentsite/controller/AccountController.java

@@ -93,6 +93,7 @@ public class AccountController {
         user.token = TokenUtils.sign(user.getUserId() + '|' + user.getUserTypeId());
         user.dataRangeList = userService.getUserDataRange(user.getUserId());
         user.permissionList = accountService.getUserPerms(user.getUserId());
+        user.isResetPassword = !userService.getDefaultPassword().equalsIgnoreCase(desData[1]);
 
         logService.save("登录", "", "登录", user.userId);
 

+ 5 - 0
src/main/java/com/hz/employmentsite/services/impl/UserServiceImpl.java

@@ -395,4 +395,9 @@ public class UserServiceImpl implements UserService {
         return sysUserSysRoleMapper.selectByExample(exp).size() > 0;
     }
 
+    @Override
+    public String getDefaultPassword(){
+        return this.defaultPassword;
+    }
+
 }

+ 2 - 0
src/main/java/com/hz/employmentsite/services/service/UserService.java

@@ -36,4 +36,6 @@ public interface UserService {
 
     boolean isSiteUser(String userId);
 
+    String getDefaultPassword();
+
 }

+ 2 - 0
src/main/java/com/hz/employmentsite/vo/user/UserModel.java

@@ -28,4 +28,6 @@ public class UserModel {
     public List<DataRange> dataRangeList;
 
     public List<String> permissionList;
+
+    public Boolean isResetPassword;
 }