| | |
| | | "@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", |
| | |
| | | "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", |
| | |
| | | } |
| | | } |
| | | }, |
| | | "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", |
| | |
| | | "@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", |
New file |
| | |
| | | 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(); |
| | | } |
| | |
| | | <!-- 产品名称 --> |
| | | <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> |
| | |
| | | </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> |
| | |
| | | </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> |
| | |
| | | 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 { |
| | |
| | | }, |
| | | ...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, |
| | |
| | | top: 20%; |
| | | right: 5%; |
| | | width: 360px; |
| | | &:deep(.el-input__inner){ |
| | | &:deep(.el-input__inner) { |
| | | background-color: #fff !important; |
| | | border: 1px solid #dcdfe6 !important; |
| | | } |
| | |
| | | width: 420px; |
| | | justify-content: space-between; |
| | | |
| | | .logo>img { |
| | | .logo > img { |
| | | width: 75px; |
| | | height: 75px; |
| | | border-radius: 4px; |
| | |
| | | @click="handleExport" |
| | | >导出</el-button |
| | | > |
| | | <el-button class="el-icon-delete-solid">清空</el-button> |
| | | <!-- <el-button class="el-icon-delete-solid">清空</el-button> --> |
| | | </div> |
| | | </div> |
| | | <!-- 数据展示 --> |