Browse Source

cim-home 首页短信验证修改

zhiyuan-007 4 months ago
parent
commit
7864a7c80e

+ 1 - 1
cim-my-home/index.html

@@ -5,7 +5,7 @@
     <link rel="icon" href="./bitbug_favicon4.ico">
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
     <title>上海市CIM平台</title>
-    <script type="module" crossorigin src="./assets/index-90b9323d.js"></script>
+    <script type="module" crossorigin src="./assets/index-058ee110.js"></script>
     <link rel="stylesheet" href="./assets/index-f31ef0f6.css">
   </head>
   <body>

BIN
src/assets/imgs/密码_黑.png


BIN
src/assets/imgs/用户名_黑.png


BIN
src/assets/imgs/验证码_黑.png


+ 14 - 1
src/service/login.js

@@ -11,6 +11,18 @@ import {
     requestInstance_YYFNIMG
 } from "@/service/index";
 
+
+export function sendPhoneVerificationCode(phone,verificationCode) {
+    return requestInstance_YYFN({
+        url: '/user/v1/sendPhoneVerificationCode',
+        data: {
+            "telphone": phone,
+            "verificationCode": verificationCode
+        },
+    })
+}
+
+
 export function sendVerificationCode(userid,verificationCode) {
     return requestInstance_YYFN({
         url: '/user/v1/sendVerificationCode',
@@ -134,10 +146,11 @@ export function kjUserInfologin(username, password, verifyCode) {
 }
 
 //获取验证码
-export function randomImageCode_v1(username, password, TYPE) {
+export function randomImageCode_v1(color) {
     return requestInstance_YYFNIMG({
         url: '/user/v1/randomImageCode',
         data: {
+            color:color
         },
     })
 }

+ 196 - 63
src/views/login/Login.vue

@@ -1,5 +1,5 @@
 <template>
-  <div id="login-page">
+  <div id="login-page" >
     <div class="title">
       <div class="text font-ht" >
         上海市CIM平台
@@ -9,7 +9,7 @@
     <div class="login-content">
 
 
-      <div v-show="loginState=='1'">
+      <div v-show="loginState=='1'||loginState=='2'">
         <div class="welcome">欢迎登录</div>
         <div class="form-item">
           <el-input v-model="formInfo.username" placeholder="请输入用户名">
@@ -32,10 +32,50 @@
         </div>
       </div>
 
-      <div v-show="loginState=='2'">
-        <div class="welcome">手机号注册</div>
+<!--      <div v-show="loginState=='2'">-->
+<!--        <div class="welcome">手机号绑定</div>-->
+<!--        <div class="form-item">-->
+<!--          <el-input v-model="formInfo.codeUserInput_phone" >-->
+<!--            <template #prefix>-->
+<!--              <img src="../../assets/imgs/验证码.png" alt="">-->
+<!--            </template>-->
+<!--            <template #suffix>-->
+<!--              <img style="width: 80px;height: 50px;" :src="formInfo.vCodeReal" alt="" id="validCode" @click="changeValidCode" class="valid-code" />-->
+<!--              &lt;!&ndash;            <canvas  id="validCode" @click="changeValidCode" class="valid-code"></canvas>&ndash;&gt;-->
+<!--            </template>-->
+<!--          </el-input>-->
+<!--        </div>-->
+<!--        <div class="error"  v-if="!showObj.isValidCodeEmptyShow && showObj.isValidCodeErrorShow">验证码错误</div>-->
+
+<!--        <div class="form-item">-->
+<!--          <el-input v-model="formInfo.phone" placeholder="请输入手机号">-->
+<!--            <template #prefix>-->
+<!--              <img src="../../assets/imgs/验证码.png" alt="">-->
+<!--            </template>-->
+<!--            <template #suffix>-->
+<!--              <el-button :disabled="register_countdown > 0" @click="getRegisterCode">{{ register_countdown > 0 ? `${register_countdown}秒后重新获取` : '获取验证码' }}</el-button>-->
+<!--            </template>-->
+<!--          </el-input>-->
+<!--        </div>-->
+
+<!--        <div class="form-item">-->
+<!--          <el-input v-model="formInfo.register_message" placeholder="请输入验证码">-->
+<!--            <template #prefix>-->
+<!--              <img  src="../../assets/imgs/用户名.png" alt="">-->
+<!--            </template>-->
+<!--          </el-input>-->
+<!--        </div>-->
+<!--        <div class="error" v-if="showObj.isUserNameEmptyShow">请输入验证码</div>-->
+<!--        <div >-->
+<!--          <div class="btn" @click="loginIn_phone">注册</div>-->
+<!--        </div>-->
+<!--      </div>-->
+
+
+      <div v-show="loginState=='3'">
+        <div class="welcome">短信验证</div>
         <div class="form-item">
-          <el-input v-model="formInfo.codeUserInput_phone" >
+          <el-input v-model="formInfo.codeUserInput_message" placeholder="请输入验证码">
             <template #prefix>
               <img src="../../assets/imgs/验证码.png" alt="">
             </template>
@@ -47,69 +87,80 @@
         </div>
         <div class="error"  v-if="!showObj.isValidCodeEmptyShow && showObj.isValidCodeErrorShow">验证码错误</div>
         <div class="form-item">
-          <el-input v-model="formInfo.phone" placeholder="请输入手机号">
+          <el-input v-model="formInfo.message" placeholder="请输入短信验证码">
             <template #prefix>
-              <img  src="../../assets/imgs/用户名.png" alt="">
+              <img src="../../assets/imgs/验证码.png" alt="">
+            </template>
+            <template #suffix>
+              <el-button :disabled="countdown > 0" @click="getSmsCode">{{ countdown > 0 ? `${countdown}秒后重新获取` : '获取验证码' }}</el-button>
             </template>
           </el-input>
         </div>
-        <div class="error" v-if="showObj.isUserNameEmptyShow">请输入手机号</div>
+        <div class="error" v-if="showObj.isValidCodeEmptyShow">请输入短信验证码</div>
         <div >
-          <div class="btn" @click="loginIn_phone">登录</div>
+          <div class="btn" @click="loginIn_yyfnzt">登录</div>
         </div>
       </div>
 
+    </div>
 
-      <div v-show="loginState=='3'">
-        <div class="welcome">短信验证</div>
+
+    <el-dialog
+        v-model="dialogVisible"
+        title="手机号绑定"
+        width="500"
+        align-center
+    >
+      <div class="dialog-content">
+        <div class="tip custom-block">
+<!--          <p class="custom-block-title">通知</p>-->
+          <p class="custom-block-content">
+            由于安全需要,现需将身份认证升级为双因素认证,即在原有用户名密码基础上新增手机号短信验证。
+          </p>
+          <p class="custom-block-content">
+            现检测到该账号没有绑定过手机号,需进行手机号绑定,一个账号只能对应一个手机号。绑定之后每次登录都需进行手机号短信验证,请谨慎操作。
+          </p>
+        </div>
         <div class="form-item">
-          <el-input v-model="formInfo.codeUserInput_message" >
+          <el-input v-model="formInfo.phone" placeholder="请输入手机号">
             <template #prefix>
-              <img src="../../assets/imgs/验证码.png" alt="">
+              <img  src="../../assets/imgs/用户名_黑.png" alt="">
+            </template>
+          </el-input>
+        </div>
+
+        <div class="form-item">
+          <el-input v-model="formInfo.codeUserInput_phone" placeholder="请输入图形验证码">
+            <template #prefix>
+              <img src="../../assets/imgs/验证码_黑.png" alt="">
             </template>
             <template #suffix>
-              <img style="width: 80px;height: 50px;" :src="formInfo.vCodeReal" alt="" id="validCode" @click="changeValidCode" class="valid-code" />
+              <img style="width: 80px;height: 50px;" :src="formInfo.vCodeReal" alt="" id="validCode" @click="changeValidCode('black')" class="valid-code" />
               <!--            <canvas  id="validCode" @click="changeValidCode" class="valid-code"></canvas>-->
             </template>
           </el-input>
         </div>
         <div class="error"  v-if="!showObj.isValidCodeEmptyShow && showObj.isValidCodeErrorShow">验证码错误</div>
+
         <div class="form-item">
-          <el-input v-model="formInfo.message" >
+          <el-input v-model="formInfo.register_message" placeholder="请输入短信验证码">
             <template #prefix>
-              <img src="../../assets/imgs/验证码.png" alt="">
+              <img src="../../assets/imgs/验证码_黑.png" alt="">
             </template>
             <template #suffix>
-              <el-button :disabled="countdown > 0" @click="getSmsCode">{{ countdown > 0 ? `${countdown}秒后重新获取` : '获取验证码' }}</el-button>
+              <el-button :disabled="register_countdown > 0" @click="getRegisterCode">{{ register_countdown > 0 ? `${register_countdown}秒后重新获取` : '获取验证码' }}</el-button>
             </template>
           </el-input>
-
-
-        </div>
-        <div class="error" v-if="showObj.isValidCodeEmptyShow">请输入短信验证码</div>
-        <div >
-          <div class="btn" @click="loginIn_yyfnzt">登录</div>
         </div>
       </div>
-
-
-      <el-dialog
-          v-model="dialogVisible"
-          title="通知"
-          width="500"
-          align-center
-      >
-        <span>根据通知,现在需要将系统用户与手机号码绑定,后续通过手机短信验证码登录</span>
-        <template #footer>
-          <div class="dialog-footer">
-            <el-button type="primary" @click="dialogVisible = false">
-              确定
-            </el-button>
-          </div>
-        </template>
-      </el-dialog>
-
-    </div>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" @click="loginIn_phone">
+            绑定
+          </el-button>
+        </div>
+      </template>
+    </el-dialog>
   </div>
 </template>
 
@@ -117,13 +168,14 @@
 import {encode} from "js-base64";
 import {onMounted, ref} from 'vue'
 import {drawPic} from "@/unit/valid-code";
+import {ElLoading} from "element-plus";
 import {
   loginCim,
   randomImageCode_v2,
   kjUserInfologin,
   verifyUserInformation,
   userBindPhone,
-  randomImageCode_v1, sendVerificationCode
+  randomImageCode_v1, sendVerificationCode, sendPhoneVerificationCode
 } from "@/service/login";
 import {showMessage} from "@/unit/element-ui/tip";
 import {useRouter} from "vue-router";
@@ -133,17 +185,48 @@ import {ElMessageBox} from "element-plus";
 const router = useRouter()
 let loginState = ref('1');
 let countdown = ref(0);
+let register_countdown = ref(0);
 let userId = ref(null);
 let dialogVisible = ref(false);
-let loginPinia = useLoginStore()
-function changeValidCode(){
+let loginPinia = useLoginStore();
+let loading;
+function changeValidCode(type){
   // formInfo.value.vCodeReal = drawPic()
-  randomImageCode_v1().then(res =>{
+  randomImageCode_v1(type).then(res =>{
     const blob = new Blob([res], { type: "image/png" });
     // 创建URL对象
     formInfo.value.vCodeReal = URL.createObjectURL(blob);
   })
 }
+function getRegisterCode() {
+  // 模拟发送短信验证码的请求
+  // 实际应用中,这里应该是向服务器发送请求,并处理响应
+  sendPhoneVerificationCode(formInfo.value.phone,formInfo.value.codeUserInput_phone)
+      .then(res =>{
+        if(res.code == '200'){
+          showMessage({
+            type: 'success',
+            message: res.msg
+          });
+          // 设置60秒倒计时
+          register_countdown.value = 60;
+          const registerIntervalId = setInterval(() => {
+            if (register_countdown.value > 0) {
+              register_countdown.value -= 1;
+            } else {
+              clearInterval(registerIntervalId);
+            }
+          }, 1000);
+        }else{
+          showMessage({
+            type: 'error',
+            message: res.msg
+          })
+        }
+      })
+  console.log('发送短信验证码到手机号');
+
+}
 function getSmsCode() {
   // 模拟发送短信验证码的请求
   // 实际应用中,这里应该是向服务器发送请求,并处理响应
@@ -191,8 +274,10 @@ function loginMyCim(){
         type:'error',
         message:'无权登录'
       })
+      loading.close();
+      return;
     }else {
-
+      loading.close();
       router.push('/LoginedPage')
       localStorage.setItem('userInfoPsdOrUserName',JSON.stringify({
         ...formInfo.value,
@@ -257,6 +342,11 @@ function loginIn_yyfnzt() {
     changeValidCode();
     return;
   }
+  loading = ElLoading.service({
+    lock: true,
+    text: 'Loading',
+    background: 'rgba(0, 0, 0, 0.7)',
+  })
   kjUserInfologin(formInfo.value.username,encode(formInfo.value.psd),formInfo.value.message)
       .then(res => {
         //刷新验证码
@@ -266,17 +356,21 @@ function loginIn_yyfnzt() {
           //如果没有查询到登陆信息则报错
           data = res.msg[0].Rows;
         }catch {
+          loading.close()
           showMessage({
             type: 'error',
             message: '登录失败'
           })
+          return
         }
         //存在多条用户信息时报错
         if(data.length != 1){
+          loading.close()
           showMessage({
             type: 'error',
             message: '登录失败'
           })
+          return
         }
         //验证密码输入次数
         var time2 = new Date(data[0]["GETTIME"]).getTime() - new Date(data[0]["LAST_TIME"]).getTime();
@@ -293,6 +387,7 @@ function loginIn_yyfnzt() {
                 message:'账号已锁定,请15分钟后重试'
               })
             }
+            loading.close();
             return;
           }
         }
@@ -303,6 +398,8 @@ function loginIn_yyfnzt() {
             type: 'error',
             message: '登录失败'
           })
+          loading.close();
+          return;
         }
       })
       .catch((e) => {
@@ -311,6 +408,8 @@ function loginIn_yyfnzt() {
           type: 'error',
           message: '登录失败'
         })
+        loading.close();
+        return;
       })
 }
 
@@ -322,9 +421,9 @@ function loginIn(){  //用户名密码校验
           if(res.data.state == '0'){
             userId.value = res.data.userid;
             if(res.data.isBindPhone == '0'){  //没有转注册手机号
-              loginState.value = '2';
+              //loginState.value = '2';
               dialogVisible.value = true;
-              changeValidCode();
+              changeValidCode('black');
             }else if(res.data.isBindPhone == '1'){ //有转短信验证码
               loginState.value = '3';
               changeValidCode();
@@ -345,9 +444,10 @@ function loginIn(){  //用户名密码校验
 }
 
 function loginIn_phone(){
-  userBindPhone(userId.value,formInfo.value.phone,formInfo.value.codeUserInput_phone)
+  userBindPhone(userId.value,formInfo.value.phone,formInfo.value.register_message)
       .then(res =>{
         if(res.code == '200'){
+          dialogVisible = false
           loginState.value = '3';
           changeValidCode();
         }else{
@@ -377,11 +477,18 @@ let showObj= ref({
    codeUserInput_phone:'',   //手机号图片验证码
    phone:'', //手机号
    codeUserInput_message:'',  //短信图片验证码
-   message:'' //短信验证码
+   message:'', //短信验证码
+   register_message:'', //注册短信验证码
+
  })
 </script>
 
 <style scoped lang="scss">
+::v-deep{
+  .el-dialog__title{
+    font-size: 20px;
+  }
+}
 #login-page{
   .title{
     position: absolute;
@@ -433,18 +540,6 @@ let showObj= ref({
 
     margin-bottom: 40px;
   }
-  :deep{
-    .el-input__wrapper{
-      .el-input__inner{
-        color: #fff;
-        height: 54px;
-        line-height: 54px;
-      }
- background: rgba(0,0,0,0.25);
-      box-shadow: 0 0 0 1px var(--el-input-border-color,var(--el-border-color)) inset;
-      border-radius:0;
-    }
-  }
   height: 100%;
   width: 100%;
   background: url("@/assets/imgs/CIMbg.jpg");
@@ -454,6 +549,18 @@ let showObj= ref({
   justify-content: center;
   text-align: center;
   .login-content{
+    :deep{
+      .el-input__wrapper{
+        .el-input__inner{
+          color: #fff;
+          height: 54px;
+          line-height: 54px;
+        }
+        background: rgba(0,0,0,0.25);
+        box-shadow: 0 0 0 1px var(--el-input-border-color,var(--el-border-color)) inset;
+        border-radius:0;
+      }
+    }
     .form-item{
       img{
         width: 32px;
@@ -472,5 +579,31 @@ let showObj= ref({
     background: rgba(0,0,0,0.3);
 
   }
+  .dialog-content{
+    :deep{
+      .el-input__wrapper{
+        .el-input__inner{
+          height: 54px;
+          line-height: 54px;
+        }
+        border-radius:0;
+      }
+    }
+    .custom-block{
+      padding: 8px 16px;
+      background-color: rgba(64,158,255,0.1);
+      border-radius: 4px;
+      border-left: 5px solid var(--el-color-primary);
+      margin: 20px 0;
+
+      .custom-block-title {
+        margin-bottom: 20px;
+        font-weight: 700;
+      }
+      .custom-block-content{
+        text-align: left;
+      }
+    }
+  }
 }
 </style>

+ 2 - 2
vite.config.js

@@ -32,8 +32,8 @@ export default defineConfig({
       '^/api': {
         // 代理请求之后的请求地址(你的真实接口地址)
         // target: 'https://cimweb.zjw.sh.cegn.cn:2002/data-business-prod/',
-        //target: 'https://cimweb.zjw.sh.cegn.cn:2007/data-business-prod/',
-        target: 'http://localhost:9250/',
+        target: 'https://cimweb.zjw.sh.cegn.cn:2007/data-business-prod/',
+        //target: 'http://localhost:9250/',
         secure: false,
         ws: true,
         // 跨域