zhanghua
2023-04-21 05569927171387146f0f67fcc5798be8b067cf0b
登录时密码加密
4个文件已修改
1个文件已添加
119 ■■■■ 已修改文件
package-lock.json 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
package.json 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/cryptojs.js 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/login/index.vue 52 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/operate/log/index.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
package-lock.json
@@ -11,6 +11,7 @@
        "@amap/amap-jsapi-loader": "^1.0.1",
        "axios": "^0.27.2",
        "core-js": "^3.8.3",
        "crypto-js": "^4.1.1",
        "docxtemplater": "^3.32.4",
        "docxtemplater-image-module-free": "^1.1.1",
        "echarts": "^5.4.0",
@@ -4073,6 +4074,11 @@
      "bin": {
        "semver": "bin/semver"
      }
    },
    "node_modules/crypto-js": {
      "version": "4.1.1",
      "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz",
      "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw=="
    },
    "node_modules/css-declaration-sorter": {
      "version": "6.3.1",
@@ -15368,6 +15374,11 @@
        }
      }
    },
    "crypto-js": {
      "version": "4.1.1",
      "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz",
      "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw=="
    },
    "css-declaration-sorter": {
      "version": "6.3.1",
      "resolved": "https://registry.npmmirror.com/css-declaration-sorter/-/css-declaration-sorter-6.3.1.tgz",
package.json
@@ -12,6 +12,7 @@
    "@amap/amap-jsapi-loader": "^1.0.1",
    "axios": "^0.27.2",
    "core-js": "^3.8.3",
    "crypto-js": "^4.1.1",
    "docxtemplater": "^3.32.4",
    "docxtemplater-image-module-free": "^1.1.1",
    "echarts": "^5.4.0",
src/utils/cryptojs.js
New file
@@ -0,0 +1,53 @@
import CryptoJS from 'crypto-js/crypto-js'
// 默认的 KEY 与 iv 如果没有给
const KEY = CryptoJS.enc.Utf8.parse("1234567890123456");
const IV = CryptoJS.enc.Utf8.parse('1234567890123456');
/**
 * AES加密 :字符串 key iv  返回base64
 */
export function Encrypt(word, keyStr, ivStr) {
  let key = KEY
  let iv = IV
  if (keyStr) {
    key = CryptoJS.enc.Utf8.parse(keyStr);
    iv = CryptoJS.enc.Utf8.parse(ivStr);
  }
  let srcs = CryptoJS.enc.Utf8.parse(word);
  var encrypted = CryptoJS.AES.encrypt(srcs, key, {
    iv: iv,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.ZeroPadding
  });
 // console.log("-=-=-=-", encrypted.ciphertext)
  return CryptoJS.enc.Base64.stringify(encrypted.ciphertext);
}
/**
 * AES 解密 :字符串 key iv  返回base64
 *
 */
export function Decrypt(word, keyStr, ivStr) {
  let key  = KEY
  let iv = IV
  if (keyStr) {
    key = CryptoJS.enc.Utf8.parse(keyStr);
    iv = CryptoJS.enc.Utf8.parse(ivStr);
  }
  let base64 = CryptoJS.enc.Base64.parse(word);
  let src = CryptoJS.enc.Base64.stringify(base64);
  var decrypt = CryptoJS.AES.decrypt(src, key, {
    iv: iv,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.ZeroPadding
  });
  var decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);
  return decryptedStr.toString();
}
src/views/login/index.vue
@@ -3,9 +3,7 @@
    <!-- 产品名称 -->
    <div class="text">
      <div class="logo">
        <img
          :src="imgUrl"
          alt="">
        <img :src="imgUrl" alt="" />
      </div>
      <div class="text-r">
        <h2 class="title font-extra-large">遂昌县智慧执法平台</h2>
@@ -16,12 +14,24 @@
    </div>
    <el-card class="login-form-layout">
      <!-- 表单 -->
      <el-form autoComplete="on" :model="loginForm" :rules="loginRules" ref="loginForm" label-position="left">
      <el-form
        autoComplete="on"
        :model="loginForm"
        :rules="loginRules"
        ref="loginForm"
        label-position="left"
      >
        <!-- title -->
        <h2 class="login-title">用户登录 / USER LOGIN</h2>
        <el-form-item prop="username">
          <!-- 用户名输入框 -->
          <el-input name="username" type="text" v-model="loginForm.username" autoComplete="on" placeholder="请输入用户名称">
          <el-input
            name="username"
            type="text"
            v-model="loginForm.username"
            autoComplete="on"
            placeholder="请输入用户名称"
          >
            <span slot="prefix">
              <svg-icon icon-class="user" class="color-main"></svg-icon>
            </span>
@@ -29,21 +39,35 @@
        </el-form-item>
        <el-form-item prop="password">
          <!-- 密码输入框 -->
          <el-input name="password" :type="pwdType ? 'text' : 'password'" @keyup.enter.native="handleLogin"
            v-model="loginForm.password" autoComplete="on" placeholder="请输入登录密码">
          <el-input
            name="password"
            :type="pwdType ? 'text' : 'password'"
            @keyup.enter.native="handleLogin"
            v-model="loginForm.password"
            autoComplete="on"
            placeholder="请输入登录密码"
          >
            <!-- 输入框前icon -->
            <span slot="prefix">
              <svg-icon icon-class="password" class="color"></svg-icon>
            </span>
            <!-- 输入框后icon -->
            <span slot="suffix" @click="showPwd">
              <svg-icon :icon-class="pwdType ? 'yanjing-zhengyan' : 'yanjing-biyan'" class="pointer"></svg-icon>
              <svg-icon
                :icon-class="pwdType ? 'yanjing-zhengyan' : 'yanjing-biyan'"
                class="pointer"
              ></svg-icon>
            </span>
          </el-input>
        </el-form-item>
        <!-- 表单提交按钮 -->
        <el-form-item style="margin-bottom: 60px; text-align: center">
          <el-button style="width: 100%" type="primary" :loading="loading" @click.native.prevent="handleLogin">
          <el-button
            style="width: 100%"
            type="primary"
            :loading="loading"
            @click.native.prevent="handleLogin"
          >
            登录
          </el-button>
        </el-form-item>
@@ -56,6 +80,8 @@
import { isvalidUsername } from "@/utils/validate";
import { createNamespacedHelpers } from "vuex";
import users from "@/api/users";
import {Decrypt,Encrypt} from '@/utils/cryptojs'
import leafletMapVue from '../systemSetting/device/grid/components/components/leafletMap.vue';
const { mapActions } = createNamespacedHelpers("users");
export default {
@@ -112,8 +138,10 @@
    },
    ...mapActions(["login"]),
    handleLogin() {
      const { username, password } = this.loginForm;
      let { username, password } = this.loginForm;
      const that = this;
      password = Encrypt(password)
      this.$axios
        .post("sccg/admin/login", {
          password,
@@ -168,7 +196,7 @@
  top: 20%;
  right: 5%;
  width: 360px;
  &:deep(.el-input__inner){
  &:deep(.el-input__inner) {
    background-color: #fff !important;
    border: 1px solid #dcdfe6 !important;
  }
@@ -183,7 +211,7 @@
  width: 420px;
  justify-content: space-between;
  .logo>img {
  .logo > img {
    width: 75px;
    height: 75px;
    border-radius: 4px;
src/views/operate/log/index.vue
@@ -64,7 +64,7 @@
              @click="handleExport"
              >导出</el-button
            >
            <el-button class="el-icon-delete-solid">清空</el-button>
            <!-- <el-button class="el-icon-delete-solid">清空</el-button> -->
          </div>
        </div>
        <!-- 数据展示 -->