cyy 1 年間 前
コミット
a5e93b2366

+ 2 - 1
src/utils/common.js

@@ -1,6 +1,6 @@
 // 通用工具类,定义通用函数及常用接口
 import { mapValues } from 'lodash'
-import { encryptByAes } from '@/utils/encrypt'
+import { encryptByAes, decryptByAes } from '@/utils/encrypt'
 // import { preview } from '@/business/platform/form/utils/custom/preview'
 import request from './joinCURD'
 import getRequest from './general'
@@ -221,6 +221,7 @@ export default {
   getNextIdByAlias,
   decode,
   encryptByAes,
+  decryptByAes,
   downloadByBlob,
   sendMsg,
   saveNews,

+ 41 - 22
src/utils/encrypt.js

@@ -1,26 +1,45 @@
 import CryptoJS from 'crypto-js'
-const key = CryptoJS.enc.Utf8.parse('dmngJmmO+9GMw+tu')
-const iv = CryptoJS.enc.Utf8.parse('sanXyqhk8+U7LPP4')
+const key1 = CryptoJS.enc.Utf8.parse('dmngJmmO+9GMw+tu')
+const iv1 = CryptoJS.enc.Utf8.parse('sanXyqhk8+U7LPP4')
+const key2 = CryptoJS.enc.Utf8.parse('49PBou+TREIOzSHj')
+const iv2 = CryptoJS.enc.Utf8.parse('5lDsNRe&UduJ97uS')
+
 // AES加密
-export const encryptByAes = pwd => {
-    let encrypted = ''
-    if (typeof pwd === 'string') {
-        const srcs = CryptoJS.enc.Utf8.parse(pwd)
-        const options = {
-            iv: iv,
-            mode: CryptoJS.mode.CBC, // 使用CBC模式
-            padding: CryptoJS.pad.Pkcs7 // 使用PKCS7填充
-        }
-        encrypted = CryptoJS.AES.encrypt(srcs, key, options)
-    } else if (typeof pwd === 'object') {
-        const data = JSON.stringify(pwd)
-        const srcs = CryptoJS.enc.Utf8.parse(data)
-        const options = {
-            iv: iv,
-            mode: CryptoJS.mode.CBC, // 使用CBC模式
-            padding: CryptoJS.pad.Pkcs7 // 使用PKCS7填充
-        }
-        encrypted = CryptoJS.AES.encrypt(srcs, key, options)
+export const encryptByAes = (pwd, type = 'normal') => {
+  let encrypted = ''
+  const key = type === 'normal' ? key1 : key2
+  const iv = type === 'normal' ? iv1 : iv2
+  if (typeof pwd === 'string') {
+    const srcs = CryptoJS.enc.Utf8.parse(pwd)
+    const options = {
+      iv: iv,
+      mode: CryptoJS.mode.CBC, // 使用CBC模式
+      padding: CryptoJS.pad.Pkcs7 // 使用PKCS7填充
     }
-    return encrypted.ciphertext.toString(CryptoJS.enc.Base64)
+    encrypted = CryptoJS.AES.encrypt(srcs, key, options)
+  } else if (typeof pwd === 'object') {
+    const data = JSON.stringify(pwd)
+    const srcs = CryptoJS.enc.Utf8.parse(data)
+    const options = {
+      iv: iv,
+      mode: CryptoJS.mode.CBC, // 使用CBC模式
+      padding: CryptoJS.pad.Pkcs7 // 使用PKCS7填充
+    }
+    encrypted = CryptoJS.AES.encrypt(srcs, key, options)
+  }
+  return encrypted.ciphertext.toString(CryptoJS.enc.Base64)
+}
+
+export const decryptByAes = (encryptedText, type = 'normal') => {
+  const key = type === 'normal' ? key1 : key2
+  const iv = type === 'normal' ? iv1 : iv2
+  const options = {
+    iv: iv,
+    mode: CryptoJS.mode.CBC, // 使用CBC模式
+    padding: CryptoJS.pad.Pkcs7 // 使用PKCS7填充
+  }
+  const encryptedData = CryptoJS.enc.Base64.parse(encryptedText)
+  const decryptedData = CryptoJS.AES.decrypt({ ciphertext: encryptedData }, key, options)
+  const decryptedText = decryptedData.toString(CryptoJS.enc.Utf8)
+  return decryptedText.trim()
 }

+ 101 - 66
src/views/platform/my/change-password.vue

@@ -1,7 +1,11 @@
 <template lang="html">
   <div class="ibps-fixed-top my-pwd">
     <van-sticky>
-      <van-nav-bar :title="generateTitle()" :left-text="$t('common.button.back')" left-arrow fixed
+      <van-nav-bar
+:title="generateTitle()"
+:left-text="$t('common.button.back')"
+left-arrow
+fixed
         @click-left="onBack" />
     </van-sticky>
 
@@ -11,20 +15,43 @@
     </div>
 
     <div class="divider" />
-    <van-form @submit="onSave" @failed="onFailed" class="submitStyle">
+    <van-form class="submitStyle" @submit="onSave" @failed="onFailed">
       <van-cell-group>
-        <van-field v-model="form.primitivePassword" :label="$t('platform.my.change-password.primitivePassword')"
+        <van-field
+v-model="form.primitivePassword"
+:label="$t('platform.my.change-password.primitivePassword')"
           :placeholder="$t('platform.my.change-password.primitivePasswordPlaceholder')"
           :rules="[{ required: true, message: $t('platform.my.change-password.primitivePasswordPlaceholder') }]"
-          type="password" name="my.primitivePassword" :size="size" autocomplete="off" required clearable />
-        <van-field v-model="form.newPassword" :label="$t('platform.my.change-password.newPassword')"
+          type="password"
+name="my.primitivePassword"
+:size="size"
+autocomplete="off"
+required
+clearable />
+        <van-field
+v-model="form.newPassword"
+:label="$t('platform.my.change-password.newPassword')"
           :placeholder="$t('platform.my.change-password.newPasswordPlaceholder')"
           :rules="[{ required: true, message: $t('platform.my.change-password.newPasswordPlaceholder') }]"
-          type="password" name="my.newPassword" :size="size" autocomplete="off" required clearable />
-        <van-field v-model="form.repeatPassword" :label="$t('platform.my.change-password.repeatPassword')"
-          :placeholder="$t('platform.my.change-password.repeatPasswordPlaceholder')" :rules="[{ required: true, message: $t('platform.my.change-password.newPasswordPlaceholder') },
+          type="password"
+name="my.newPassword"
+:size="size"
+autocomplete="off"
+required
+clearable />
+        <van-field
+v-model="form.repeatPassword"
+:label="$t('platform.my.change-password.repeatPassword')"
+          :placeholder="$t('platform.my.change-password.repeatPasswordPlaceholder')"
+:rules="[{ required: true, message: $t('platform.my.change-password.newPasswordPlaceholder') },
                    { validator :repeatValidator,message:$t('platform.my.change-password.repeatErrorMessage') }
-          ]" type="password" name="my.repeatPassword" :size="size" autocomplete="off" required clearable />
+          ]"
+type="password"
+name="my.repeatPassword"
+:size="size"
+autocomplete="off"
+required
+clearable />
       </van-cell-group>
       <div style="margin: 10px 0;border:0">
         <van-button block size="large" native-type="submit" color="	#1E90FF">
@@ -36,68 +63,78 @@
 </template>
 
 <script>
-  import { changePassword } from '@/api/platform/org/user'
-  import navbar from '@/mixins/navbar'
-  import defaultImage from '@/assets/images/logo/lc.png'
-  import { mapState } from 'vuex'
-  import { getFile } from '@/utils/image'
+import { changePassword } from '@/api/platform/org/user'
+import navbar from '@/mixins/navbar'
+import defaultImage from '@/assets/images/logo/lc.png'
+import { mapState } from 'vuex'
+import { getFile } from '@/utils/image'
+import { encryptByAes } from '@/utils/encrypt'
 
-  export default {
-    mixins: [navbar],
-    data() {
-      return {
-        form: {
-          primitivePassword: '',
-          newPassword: '',
-          repeatPassword: ''
-        },
-        size: 'large'
+export default {
+  mixins: [navbar],
+  data() {
+    return {
+      form: {
+        primitivePassword: '',
+        newPassword: '',
+        repeatPassword: ''
+      },
+      size: 'large'
+    }
+  },
+  computed: {
+    ...mapState('ibps/user', [
+      'info'
+    ]),
+    // 获取用户头像
+    avatar() {
+      const str = '/file/getImage?attachmentId='
+      const photo = this.info && this.info.employee ? (/^\d+$/.test(this.info.employee.photo) ? (str + this.info.employee.photo) : this.info.employee.photo) : null
+      if (this.$utils.isEmpty(photo)) {
+        return this.errorImage
       }
+      return getFile(photo)
     },
-    computed: {
-      ...mapState('ibps/user', [
-        'info'
-      ]),
-      // 获取用户头像
-      avatar() {
-        let str = "/file/getImage?attachmentId="
-        const photo = this.info && this.info.employee ? (/^\d+$/.test(this.info.employee.photo) ? (str + this.info.employee.photo) : this.info.employee.photo) : null
-        if (this.$utils.isEmpty(photo)) {
-          return this.errorImage
-        }
-        return getFile(photo)
-      },
-      errorImage() {
-        return defaultImage
-      },
+    errorImage() {
+      return defaultImage
+    }
+  },
+  methods: {
+    repeatValidator(val) {
+      return this.form.newPassword === val
     },
-    methods: {
-      repeatValidator(val) {
-        return this.form.newPassword === val
-      },
-      updatePassWord() {
-        this.form['userIds'] = [this.$store.getters.userId]
-        changePassword(this.form).then(response => {
-          this.$notify({
-            type: 'success',
-            message: this.$t('platform.my.change-password.success')
-          })
-          this.$router.push({ name: 'my' })
-        }).catch(e => {
-          console.error(e.cause)
-        })
-      },
-      onSave() {
-        this.updatePassWord()
-      },
-      onFailed() {
+    updatePassWord() {
+      // console.log(this.form, 'this.form')
+      // this.form['userIds'] = [this.$store.getters.userId]
+      const { primitivePassword, repeatPassword, newPassword } = this.form
+
+      const params = {
+        userIds: [this.$store.getters.userId],
+        primitivePassword: primitivePassword ? encryptByAes(primitivePassword, 'pwd') : '',
+        repeatPassword: encryptByAes(repeatPassword, 'pwd'),
+        newPassword: encryptByAes(newPassword, 'pwd')
+      }
+      changePassword(params).then(response => {
         this.$notify({
-          type: 'danger',
-          message: this.$t('common.formError')
+          type: 'success',
+          message: this.$t('platform.my.change-password.success')
         })
-      }
+        this.$router.push({ name: 'my' })
+      }).catch(e => {
+        console.error(e.cause)
+      })
+    },
+    onSave() {
+      this.updatePassWord()
+    },
+    onFailed() {
+      this.$notify({
+        type: 'danger',
+        message: this.$t('common.formError')
+      })
     }
   }
+}
 </script>
 <style lang="scss" scoped>
   .my-pwd {
@@ -117,7 +154,6 @@
     padding-top: 15%;
     box-sizing: border-box;
 
-
     img {
       width: 100%;
       border-radius: 50%;
@@ -136,7 +172,6 @@
 
       .van-field {
 
-
         ::v-deep .van-field__label {
           color: #6f6f70;
         }
@@ -147,4 +182,4 @@
       }
     }
   }
-</style>
+</style>

+ 5 - 1
src/views/system/login/index.vue

@@ -66,6 +66,7 @@ import { mapActions } from 'vuex'
 import Utils from '@/utils/util'
 import '@/assets/styles/pages/login.scss'
 import SwitchEnvironment from '@/views/system/switch-environment'
+import { encryptByAes } from '@/utils/encrypt'
 
 const loginForm = process.env.NODE_ENV === 'development'
   ? {
@@ -209,8 +210,11 @@ export default {
       }
     },
     handleLogin() {
+      // eslint-disable-next-line no-undef
+      const params = structuredClone(this.loginForm)
+      params.password = encryptByAes(this.loginForm.password, 'pwd')
       this.login({
-        form: this.loginForm
+        form: params
       }).then(() => {
         // let path = '/'
         // if (this.redirect) {