Bladeren bron

Merge remote-tracking branch 'origin/master'

吴树波 6 dagen geleden
bovenliggende
commit
e0cda0dc92

+ 7 - 1
src/api/company/companyConfig.js

@@ -1,6 +1,6 @@
 import request from '@/utils/request'
 
- 
+
 
 // 根据参数键名查询参数值
 export function getConfigKey(configKey) {
@@ -10,6 +10,12 @@ export function getConfigKey(configKey) {
   })
 }
 
+export function getConfigByKey(configKey) {
+  return request({
+    url: '/company/companyConfig/getConfigByKey/' + configKey,
+    method: 'get'
+  })
+}
 
 // 修改参数配置
 export function updateConfig(data) {

+ 8 - 1
src/api/login.js

@@ -37,4 +37,11 @@ export function getCodeImg() {
     url: '/captchaImage',
     method: 'get'
   })
-}
+}
+// 判定是否首次登录
+export function getFirstLogin() {
+  return request({
+    url: '/getFirstLogin',
+    method: 'get'
+  })
+}

+ 6 - 0
src/router/index.js

@@ -44,6 +44,12 @@ export const constantRoutes = [
     component: (resolve) => require(['@/views/login'], resolve),
     hidden: true
   },
+  {
+    path: '/set-password',
+    name: 'SetPassword',
+    component: () => import('@/views/setPassword.vue'),
+    hidden: true
+  },
   {
     path: '/404',
     component: (resolve) => require(['@/views/error/404'], resolve),

+ 60 - 6
src/views/company/companyUser/index.vue

@@ -64,6 +64,15 @@
              v-hasPermi="['qw:user:sync']"
            >同步企微员工和部门</el-button>
           </el-col>
+          <el-col :span="1.5">
+            <el-button
+              type="primary"
+              plain
+              size="mini"
+              @click="synNameOpen=true"
+              v-hasPermi="['qw:user:sync']"
+            >同步企微员工名称</el-button>
+          </el-col>
           <el-col :span="1.5">
             <el-button
               type="primary"
@@ -178,6 +187,26 @@
         <el-button @click="synOpen=false">取 消</el-button>
       </div>
     </el-dialog>
+
+    <el-dialog title="选择企微主体" :visible.sync="synNameOpen" width="800px" append-to-body>
+
+      <el-form   label-width="80px">
+        <el-form-item label="企微公司" prop="corpId">
+          <el-select v-model="synNameform.corpId" placeholder="企微公司"  >
+            <el-option
+              v-for="dict in myQwCompanyList"
+              :key="dict.dictValue"
+              :label="dict.dictLabel"
+              :value="dict.dictValue"
+            />
+          </el-select>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="synNameSubmitForm">确 定</el-button>
+        <el-button @click="synNameOpen=false">取 消</el-button>
+      </div>
+    </el-dialog>
     <!-- 添加或修改参数配置对话框 -->
     <el-dialog :title="title" :visible.sync="open" width="700px" append-to-body>
       <el-form ref="form" :model="form" :rules="rules" label-width="80px">
@@ -371,10 +400,11 @@ import { getToken } from "@/utils/auth";
 import { treeselect } from "@/api/company/companyDept";
 import Treeselect from "@riophae/vue-treeselect";
 import "@riophae/vue-treeselect/dist/vue-treeselect.css";
-import {bindQwUser, getQwUserList, addQwUser, getQwUser, getQwUserByIds} from '@/api/qw/user';
+import {bindQwUser, getQwUserList, addQwUser, getQwUser, getQwUserByIds,addQwUserName} from '@/api/qw/user';
 import { syncDept } from '@/api/qw/qwDept';
 import { getMyQwUserList,getMyQwCompanyList } from "@/api/qw/user";
 import  selectUser  from "@/views/company/components/selectQwUser.vue";
+import { getConfigByKey } from "@/api/company/companyConfig";
 export default {
   name: "User",
   components: { Treeselect ,selectUser},
@@ -394,6 +424,8 @@ export default {
       ids: [],
       synform:{corpId:null},
       synOpen:false,
+      synNameform:{corpId:null},
+      synNameOpen:false,
       // 非单个禁用
       single: true,
       // 非多个禁用
@@ -441,6 +473,7 @@ export default {
       citysAreaList:[],
       // 表单参数
       form: {},
+      form1: {},
       defaultProps: {
         children: "children",
         label: "label",
@@ -533,6 +566,9 @@ export default {
     this.getDicts("sys_qw_user_status").then(response => {
           this.qwStatusOptions = response.data;
     });
+    getConfigByKey("his.login").then(response => {
+      this.form1 =JSON.parse(response.data.configValue);
+    });
     getCitysAreaList().then(res=>{
       this.citysAreaList=res.data;
     })
@@ -705,7 +741,8 @@ export default {
         this.roleOptions = response.roles;
         this.open = true;
         this.title = "添加员工";
-        this.form.password = "ylrz147..";
+        this.form.password = this.form1.loginPassword;
+        console.log(" this.form1 ", this.form1)
       });
     },
     qwBind(row){
@@ -824,24 +861,41 @@ export default {
     synSubmitForm() {
       this.synOpen=false;
       this.loading=true;
-      this.msgSuccess("");
+      /*this.msgSuccess("");
 
       let loadingRock = this.$loading({
         lock: true,
         text: '同步中.....请等待.....请不要重复点击!!',
         spinner: 'el-icon-loading',
         background: 'rgba(0, 0, 0, 0.7)'
-      });
+      });*/
 
 
       addQwUser(this.synform.corpId).then(response => {
-        this.msgSuccess("同步成功");
+        //this.msgSuccess("同步成功");
+        this.msgSuccess("正在同步中...");
         this.getList();
         this.synOpen=false;
       }).finally(()=>{
         this.loading=false;
         this.synOpen=false;
-        loadingRock.close();
+        //loadingRock.close();
+      });
+    },
+
+    synNameSubmitForm() {
+      this.synNameOpen=false;
+      this.loading=true;
+
+      addQwUserName(this.synNameform.corpId).then(response => {
+        // this.msgSuccess("同步成功");
+        this.msgSuccess("正在同步中...");
+        this.getList();
+        this.synNameOpen=false;
+      }).finally(()=>{
+        this.loading=false;
+        this.synNameOpen=false;
+        //loadingRock.close();
       });
     },
     /**

+ 6 - 0
src/views/index.vue

@@ -940,6 +940,12 @@ export default {
     })
   },
   created() {
+    // 检查是否是首次登录
+    if (localStorage.getItem('isFirstLogin') === 'true') {
+      this.$message.warning('请先设置密码');
+      this.$router.push('/set-password');
+      return;
+    }
     this.refresh();
   },
   methods: {

+ 20 - 2
src/views/login.vue

@@ -78,6 +78,7 @@
 import { getCodeImg } from "@/api/login";
 import Cookies from "js-cookie";
 import { encrypt, decrypt } from '@/utils/jsencrypt'
+import { getFirstLogin } from "@/api/login";
 
 export default {
   name: "Login",
@@ -132,7 +133,22 @@ export default {
     this.getCookie();
   },
   methods: {
-
+    checkFirstLogin() {
+      getFirstLogin().then(res => {
+        if (res.code === 200 && res.data) {
+          // 将首次登录状态存储到本地
+          localStorage.setItem('isFirstLogin', res.data ? 'true' : 'false');
+          // 如果是首次登录,跳转到设置密码页面
+          this.$router.push('/set-password');
+        } else {
+          // 否则进入首页
+          this.$router.push({ path: this.redirect || "/" });
+        }
+      }).catch(() => {
+        this.loading = false;
+        this.getCode();
+      });
+    },
     getCode() {
       getCodeImg().then(res => {
         this.codeUrl = "data:image/gif;base64," + res.img;
@@ -165,7 +181,9 @@ export default {
           this.$store
             .dispatch("Login", this.loginForm)
             .then(() => {
-              this.$router.push({ path: this.redirect || "/" });
+              // 登录成功后检查是否是首次登录
+              this.checkFirstLogin();
+              //this.$router.push({ path: this.redirect || "/" });
             })
             .catch(() => {
               this.loading = false;

+ 134 - 0
src/views/setPassword.vue

@@ -0,0 +1,134 @@
+<template>
+  <div class="set-password-container">
+    <!-- 将el-dialog改为直接显示 -->
+    <div class="password-dialog">
+      <div class="password-header">
+        <span>设置密码</span>
+      </div>
+      <div class="password-body">
+        <el-form ref="passwordForm" :model="form" label-position="right" :rules="rules" label-width="100px">
+          <el-form-item label="旧密码" prop="oldPassword">
+            <el-input v-model="form.oldPassword" type="password" show-password></el-input>
+          </el-form-item>
+          <el-form-item label="新密码" prop="newPassword">
+            <el-input v-model="form.newPassword" type="password" show-password></el-input>
+          </el-form-item>
+          <el-form-item label="确认密码" prop="confirmPassword">
+            <el-input v-model="form.confirmPassword" type="password" show-password></el-input>
+          </el-form-item>
+        </el-form>
+      </div>
+      <div class="password-footer">
+        <el-button @click="submitNewPassword">确 定</el-button>
+        <el-button @click="cancelSetPassword">取 消</el-button>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import { updateUserPwd } from "@/api/company/companyUser";
+import { removeToken } from "@/utils/auth";
+
+export default {
+  name: "SetPassword",
+  data() {
+    const validateConfirmPass = (rule, value, callback) => {
+      if (value !== this.form.newPassword) {
+        callback(new Error("两次输入的密码不一致"));
+      } else {
+        callback();
+      }
+    };
+
+    return {
+      form: {
+        oldPassword: "",
+        newPassword: "",
+        confirmPassword: ""
+      },
+      rules: {
+        oldPassword: [
+          {required: true, message: "旧密码不能为空", trigger: "blur"}
+        ],
+        newPassword: [
+          {required: true, message: "新密码不能为空", trigger: "blur"},
+          {
+            pattern: /^(?=.*[A-Za-z])(?=.*\d)(?=.*[^A-Za-z0-9]).{8,20}$/,
+            message: "密码长度为 8-20 位,必须包含字母、数字和特殊字符",
+            trigger: ["blur", "change"],
+          }
+        ],
+        confirmPassword: [
+          {required: true, message: "确认密码不能为空", trigger: "blur"},
+          {validator: validateConfirmPass, trigger: "blur"}
+        ]
+      },
+    };
+  },
+  methods: {
+    submitNewPassword() {
+      this.$refs.passwordForm.validate(valid => {
+        if (valid) {
+          // 调用API设置新密码
+          updateUserPwd(this.form.oldPassword, this.form.newPassword).then(res => {
+            if (res.code === 200) {
+              this.$message.success('密码设置成功');
+              // 更新首次登录状态
+              localStorage.setItem('isFirstLogin', 'false');
+
+              // 清除token等信息
+              this.cancelSetPassword();
+            } else {
+              this.$message.error(res.message || '密码设置失败')
+            }
+          })
+        }
+      });
+    },
+    cancelSetPassword() {
+      // 清除token等信息
+      removeToken()
+
+      // 跳转到登录页面
+      this.$router.push('/login')
+    }
+  }
+}
+</script>
+
+<style scoped>
+.set-password-container {
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  height: 100vh;
+  background-color: #f5f7fa;
+}
+
+.password-dialog {
+  width: 400px;
+  background: #fff;
+  border-radius: 4px;
+  box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
+  overflow: hidden;
+}
+
+.password-header {
+  padding: 15px;
+  border-bottom: 1px solid #ebeef5;
+  font-size: 16px;
+  font-weight: bold;
+  color: #1f2d3d;
+}
+
+.password-body {
+  padding: 20px;
+}
+
+.password-footer {
+  padding: 10px 20px;
+  text-align: right;
+  border-top: 1px solid #ebeef5;
+}
+</style>