From 393eceedc6ed2382fe60901294f978b73f709fa4 Mon Sep 17 00:00:00 2001
From: whychdw <496960745@qq.com>
Date: 星期三, 27 十一月 2024 17:32:06 +0800
Subject: [PATCH] 内容提交

---
 package-lock.json               |   16 ++
 src/api/user.js                 |   28 +++--
 src/utils/changeTheme.js        |    8 +
 src/views/login/index.vue       |    9 +
 src/layout/index.vue            |   15 ++
 src/utils/RSA.js                |   30 ++++++
 src/store/modules/user.ts       |   30 ++---
 src/utils/const/const_num.js    |   40 ++++++++
 src/styles/element-ui.scss      |    1 
 src/utils/formatPassword.js     |    9 +
 src/utils/const/const_theme.js  |   14 ++
 src/store/modules/settings.ts   |    7 +
 package.json                    |    2 
 src/views/device/lock/index.vue |   27 +++++
 src/styles/index.scss           |    1 
 src/styles/element/blue.scss    |    4 
 src/styles/element/index.scss   |    5 
 17 files changed, 211 insertions(+), 35 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index ff4783c..f0db0df 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,11 +1,11 @@
 {
-  "name": "vue3-element-admin",
+  "name": "hm-lock",
   "version": "1.0.0",
   "lockfileVersion": 3,
   "requires": true,
   "packages": {
     "": {
-      "name": "vue3-element-admin",
+      "name": "hm-lock",
       "version": "1.0.0",
       "dependencies": {
         "axios": "^1.7.2",
@@ -17,6 +17,8 @@
         "file-saver": "^2.0.5",
         "fuse.js": "^6.6.2",
         "js-cookie": "^3.0.5",
+        "js-md5": "^0.8.3",
+        "jsencrypt": "^3.3.2",
         "jszip": "^3.10.1",
         "nprogress": "^0.2.0",
         "path-browserify": "^1.0.1",
@@ -4717,6 +4719,11 @@
         "node": ">=14"
       }
     },
+    "node_modules/js-md5": {
+      "version": "0.8.3",
+      "resolved": "https://r.cnpmjs.org/js-md5/-/js-md5-0.8.3.tgz",
+      "integrity": "sha512-qR0HB5uP6wCuRMrWPTrkMaev7MJZwJuuw4fnwAzRgP4J4/F8RwtodOKpGp4XpqsLBFzzgqIO42efFAyz2Et6KQ=="
+    },
     "node_modules/js-tokens": {
       "version": "9.0.0",
       "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-9.0.0.tgz",
@@ -4735,6 +4742,11 @@
         "js-yaml": "bin/js-yaml.js"
       }
     },
+    "node_modules/jsencrypt": {
+      "version": "3.3.2",
+      "resolved": "https://r.cnpmjs.org/jsencrypt/-/jsencrypt-3.3.2.tgz",
+      "integrity": "sha512-arQR1R1ESGdAxY7ZheWr12wCaF2yF47v5qpB76TtV64H1pyGudk9Hvw8Y9tb/FiTIaaTRUyaSnm5T/Y53Ghm/A=="
+    },
     "node_modules/json-buffer": {
       "version": "3.0.1",
       "resolved": "https://registry.npmmirror.com/json-buffer/-/json-buffer-3.0.1.tgz",
diff --git a/package.json b/package.json
index d62aade..09ca05b 100644
--- a/package.json
+++ b/package.json
@@ -21,6 +21,8 @@
     "file-saver": "^2.0.5",
     "fuse.js": "^6.6.2",
     "js-cookie": "^3.0.5",
+    "js-md5": "^0.8.3",
+    "jsencrypt": "^3.3.2",
     "jszip": "^3.10.1",
     "nprogress": "^0.2.0",
     "path-browserify": "^1.0.1",
diff --git a/src/api/user.js b/src/api/user.js
index a23c066..4afac36 100644
--- a/src/api/user.js
+++ b/src/api/user.js
@@ -1,25 +1,31 @@
 import request from '@/utils/request';
+import formatPassword from '@/utils/formatPassword.js';
 
-export function login(data) {
+export function login(uname, usnId) {
   return request({
-    url: '/user/login',
-    method: 'post',
-    data
+    method: 'GET',
+    url: '/login/login',
+    params: {
+      uname,
+      usnId: encodeURIComponent(formatPassword(usnId))
+    }
   });
 }
 
-export function getInfo(token) {
+export function getInfo(uname, usnId) {
   return request({
-    url: '/vue-element-admin/user/info',
-    method: 'get',
-    params: { token }
+    method: 'GET',
+    url: '/login/login',
+    params: {
+      uname,
+      usnId: encodeURIComponent(formatPassword(usnId))
+    }
   });
 }
 
 export function logout(token) {
   return request({
-    url: '/vue-element-admin/user/logout',
-    method: 'post',
-    params: { token }
+    url: '/login/logout',
+    method: 'post'
   });
 }
diff --git a/src/layout/index.vue b/src/layout/index.vue
index 5b8722f..4cb34b4 100644
--- a/src/layout/index.vue
+++ b/src/layout/index.vue
@@ -22,6 +22,7 @@
 import { mapState } from 'pinia';
 import store from '@/store';
 import { defineComponent } from 'vue';
+import changeTheme from '@/utils/changeTheme.js';
 
 export default defineComponent({
   name: 'LayoutIndex',
@@ -33,10 +34,16 @@
     Sidebar,
     TagsView
   },
+  watch: {
+    theme() {
+      changeTheme(this.theme);
+    }
+  },
   mixins: [ResizeMixin],
   computed: {
     ...mapState(store.app, ['sidebar', 'device']),
     ...mapState(store.settings, {
+      theme: 'theme',
       showSettings: 'showSettings',
       needTagsView: 'tagsView',
       fixedHeader: 'fixedHeader'
@@ -54,13 +61,19 @@
     handleClickOutside() {
       store.app().closeSidebar({ withoutAnimation: false });
     }
+  },
+  beforeMount() {
+    changeTheme(this.theme);
+  },
+  mounted() {
+
   }
 });
 </script>
 
 <style lang="scss" scoped>
 @import "@/styles/mixin.scss";
-// @import "@/styles/variables.module.scss";
+@import "@/styles/element/index.scss";
 
 .app-wrapper {
   @include clearfix;
diff --git a/src/store/modules/settings.ts b/src/store/modules/settings.ts
index d65c29d..93f4b1a 100644
--- a/src/store/modules/settings.ts
+++ b/src/store/modules/settings.ts
@@ -1,12 +1,13 @@
 import { defineStore } from 'pinia';
 import defaultSettings from '@/settings';
+import changeTheme from '@/utils/changeTheme';
 
 const { showSettings, tagsView, fixedHeader, sidebarLogo, secondMenuPopup } = defaultSettings;
 
 export default defineStore({
   id: 'settings',
   state: () => ({
-    theme: '#1890ff',
+    theme: 'blue',
     showSettings: showSettings,
     tagsView: tagsView,
     fixedHeader: fixedHeader,
@@ -19,6 +20,10 @@
       // eslint-disable-next-line no-prototype-builtins
       if (this.hasOwnProperty(key)) {
         this[key] = value;
+        // 濡傛灉鏄慨鏀逛富棰橈紝灏卞垏鎹tml鏍囩鐨刢lass
+        if (key === 'theme') {
+          changeTheme(value);
+        }
       }
     }
   }
diff --git a/src/store/modules/user.ts b/src/store/modules/user.ts
index 654b68c..c6cb312 100644
--- a/src/store/modules/user.ts
+++ b/src/store/modules/user.ts
@@ -1,6 +1,6 @@
 import { defineStore } from 'pinia';
-import { logout as apiLogout, getInfo as apiGetInfo } from '@/api/user';
-import { getToken, setToken, removeToken } from '@/utils/auth';
+import { login as apiLogin, logout as apiLogout } from '@/api/user';
+import { getToken, removeToken, setToken } from '@/utils/auth';
 import router, { resetRouter } from '@/router';
 import tagsViewStore from './tagsView';
 import permissionStore from './permission';
@@ -27,19 +27,17 @@
   getters: {},
   actions: {
     // user login
-    login():Promise<void> {
-      // const { username, password } = userInfo;
-      return new Promise((resolve) => {
-        setToken('admin');
-        resolve();
-        // apiLogin({ username: username.trim(), password: password }).then(response => {
-        //   const { data } = response;
-        //   this.token = data.token;
-        //   setToken(data.token);
-        //   resolve();
-        // }).catch(error => {
-        //   reject(error);
-        // });
+    login(userInfo):Promise<void> {
+      const { username, password } = userInfo;
+      return new Promise((resolve, reject) => {
+        apiLogin(username.trim(), password).then(response => {
+          this.token = 'admin';
+          setToken('admin');
+          console.log(response);
+          resolve();
+        }).catch(error => {
+          reject(error);
+        });
       });
     },
 
@@ -64,7 +62,7 @@
     // user logout
     logout():Promise<void> {
       return new Promise((resolve, reject) => {
-        apiLogout(this.token).then(() => {
+        apiLogout().then(() => {
           this.token = '';
           this.roles = [];
           removeToken();
diff --git a/src/styles/element-ui.scss b/src/styles/element-ui.scss
index e69de29..8b13789 100644
--- a/src/styles/element-ui.scss
+++ b/src/styles/element-ui.scss
@@ -0,0 +1 @@
+
diff --git a/src/styles/element/blue.scss b/src/styles/element/blue.scss
new file mode 100644
index 0000000..d5fbfef
--- /dev/null
+++ b/src/styles/element/blue.scss
@@ -0,0 +1,4 @@
+.hdw-card {
+  border: 2px solid #143a92;
+}
+
diff --git a/src/styles/element/index.scss b/src/styles/element/index.scss
index aa49f97..9aba7b9 100644
--- a/src/styles/element/index.scss
+++ b/src/styles/element/index.scss
@@ -21,7 +21,7 @@
 // comment next lines to use default color
 @forward "element-plus/theme-chalk/src/common/var.scss" with ( // do not use same name, it will override.
   $colors: $--colors,
-  $button-padding-horizontal: ("default": 50px) // 
+  $button-padding-horizontal: ("default": 50px) //
 );
 
 // if you want to import all
@@ -31,4 +31,5 @@
 // @debug $--colors;
 
 // custom dark variables
-@use "./dark.scss";
\ No newline at end of file
+@use "./dark.scss";
+@use './blue.scss';
diff --git a/src/styles/index.scss b/src/styles/index.scss
index a071d20..4495eaa 100644
--- a/src/styles/index.scss
+++ b/src/styles/index.scss
@@ -16,6 +16,7 @@
   -moz-osx-font-smoothing: grayscale;
   text-rendering: optimizeLegibility;
   margin: 0;
+  color: #ffffff;
 }
 
 label {
diff --git a/src/utils/RSA.js b/src/utils/RSA.js
new file mode 100644
index 0000000..0753c92
--- /dev/null
+++ b/src/utils/RSA.js
@@ -0,0 +1,30 @@
+import { JSEncrypt } from 'jsencrypt';
+import const_num from '@/utils/const/const_num.js';
+
+export default {
+  /**
+   * 闈炲绉板姞瀵嗙畻娉�-鍔犲瘑
+   * @param word  闇�瑕佸姞瀵嗙殑瀛楃涓�
+   * @returns {string | false}
+   */
+  encrypt(word) {
+    const encryptor = new JSEncrypt();
+    const publicKey = const_num.publicKey;
+    encryptor.setPublicKey(publicKey);
+    return encryptor.encrypt(word);
+  },
+  /**
+   * 闈炲绉板姞瀵嗙畻娉�-瑙e瘑
+   * @param word
+   * @param privateKey
+   * @returns {string | false}
+   */
+  decrypt(word, privateKey) {
+    if (!privateKey) {
+      return '璇峰啓鍏ョ閽�';
+    }
+    const decrypt = new JSEncrypt();
+    decrypt.setPrivateKey(privateKey);
+    return decrypt.decrypt(word);
+  }
+};
diff --git a/src/utils/changeTheme.js b/src/utils/changeTheme.js
new file mode 100644
index 0000000..a54870e
--- /dev/null
+++ b/src/utils/changeTheme.js
@@ -0,0 +1,8 @@
+function changeTheme(theme) {
+  const htmlTag = document.querySelector('html');
+  // 娓呯┖鎵�鏈夌被
+  htmlTag.className = '';
+  htmlTag.classList.add(theme);
+}
+
+export default changeTheme;
diff --git a/src/utils/const/const_num.js b/src/utils/const/const_num.js
new file mode 100644
index 0000000..6190a27
--- /dev/null
+++ b/src/utils/const/const_num.js
@@ -0,0 +1,40 @@
+export default {
+  //privateKey: "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAI+kneP5IdDr2Wqr5KF"+
+  //   "Xt14DjRj7ytitrquvhF44n5QTt6Ty2wkmtzLXEw7VKimEl0ddfBI1tlaGclb0aUirVSboimWTAVz8C3Kh4kM/cQm1RmAjkfp"+
+  //   "9LPQE8sUefXwLQ3HPUGvXT1TTsOpB0yxqtwGYpdhDD7ahk7PQqkDlvQVrAgMBAAECgYA8ASdX4W2n6a4kKnRSleLqqg8aHazqAP"+
+  //   "vTinmAJqU65VW02SJ42yxyV3gFnTSErXfIfxviO3/U+0ruWiFVEwV5oDEh0dOd+HHGm4YzFXIRglMeRBgLuVJ+owzoVDwZsti"+
+  //   "IBa69DIjaJtmpSf5FjwxAth+gtCv3e11IXHraKN720QJBAMPMB1WtmpRGYHxWVYjKSL+RGw+h3gMQLk3exZjhmYRlXuqfVZ2Zol+NazDc59"+
+  //   "K5f+geMdJ0/X2kKnKLVjWzYHMCQQC7z1cFYswtLemxGfj+dwlVC01VL4pKa7HGHl/FAQ2UNYZY2d5hE/nXYbTpfI0gMowX926/aFpia7Nb"+
+  //   "AUJO7WEpAkAyUFa+LJthaOhYazMVsK2bFKW4kabkcJ8Fga6TR73UaNxIPGOa2SUBmuylpM6ptuNoeYHiDBAr3ijOQIIJ0KuDAkBy9fPahCNe9F+73"+
+  //   "J4hhVPdDtIDdto7u7hSAX215XMeabUW5iXNXqDsSg6nbWolb0t50CemWoYZALwE1Lx1+7AhAkEAoZtFt+2skjAxHEqNUye4vKBqB2Ng/wmfitCfT34"+
+  //   "lXWQsxs4BGk/8eQMzkam9bcB7FcinolxHF/1UjsUYpI+AgA==",
+  //privateKey: "",
+  //publicKey: "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCPpJ3j+SHQ69lqq+ShV7deA40Y+8rYra6rr4ReOJ+UE7ek8tsJJrcy1xMO1SophJdH"+
+  //   "XXwSNbZWhnJW9GlIq1Um6IplkwFc/AtyoeJDP3EJtUZgI5H6fSz0BPLFHn18C0Nxz1Br109U07DqQdMsarcBmKXYQw+2oZOz0KpA5b0FawIDAQAB"
+  publicKey: "MIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAu7CdCMIoWXUX584JpmE1bTE1r1MtmZGswsSbsm4s9zqETQ4BmUT2kz/wvvGsI8" +
+    "T3ZvTT4KIyKP4Ez+yNVejMM5XwR95KF4e3UwMc724buWKl4pVL09kvkCZt8ZKf359VAvhyHHz80wIiVmJs6xbho7OBsv/s7Hwho0n4HPL4u/eNR5vWa" +
+    "2rtgQG1+fi1XP0UiSRKKW15Va9R2CI3zB+sffquhyX5fi+06NibWzk7OPU+EGvAwkaJtrmfLAvpwr4+G0MBLIsPVFV17Sgpoj62rtfbhHwmLSo1JTw+" +
+    "/JskDQOjxXfw+w3uHAZgPTlEmn2Ya9ssIljqCBfvM9nbGUWcnmppKlPm6kECa4RsgPiRgPFV+nT/Q98kfUTb798Sy63x4NIZkLQn1DDbmcAgUqLR6y" +
+    "1r0fD8Ne3vVtuZlVR/8ZlcRAfb+th2cNN0rytrnUreJo7kPtTFdkNtmj0KdUkRO8ea0YymEQal+b0tCl3V8osSy+qO2OVRd7yCvpOWEYOBAgMBAAE=",
+  privateKey: "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"
+}
diff --git a/src/utils/const/const_theme.js b/src/utils/const/const_theme.js
new file mode 100644
index 0000000..494bceb
--- /dev/null
+++ b/src/utils/const/const_theme.js
@@ -0,0 +1,14 @@
+export default [
+  {
+    label: '榛樿涓婚',
+    value: 'default'
+  },
+  {
+    label: '鏆楅粦涓婚',
+    value: 'dark'
+  },
+  {
+    label: '绉戞妧涓婚',
+    value: 'blue'
+  }
+];
diff --git a/src/utils/formatPassword.js b/src/utils/formatPassword.js
new file mode 100644
index 0000000..a9e1e11
--- /dev/null
+++ b/src/utils/formatPassword.js
@@ -0,0 +1,9 @@
+import { md5 } from 'js-md5';
+import RSA from '@/utils/RSA.js';
+
+function formatPassword(pwd) {
+  const password = pwd + '&&&&&&&&&&' + md5(pwd);
+  return RSA.encrypt(password);
+}
+
+export default formatPassword;
diff --git a/src/views/device/lock/index.vue b/src/views/device/lock/index.vue
index 5ba0202..be9f5fb 100644
--- a/src/views/device/lock/index.vue
+++ b/src/views/device/lock/index.vue
@@ -1,12 +1,16 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import HdwCard from '@/components/HdwCard/index.vue';
+import const_theme from '@/utils/const/const_theme';
+import store from '@/store';
 
 export default defineComponent({
   name: 'LockManage',
   components: { HdwCard },
   data() {
     return {
+      theme: store.settings().theme,
+      themes: const_theme,
       tableData: [
         {
           type: '钃濈墮',
@@ -28,7 +32,13 @@
     };
   },
   methods: {
-
+    handleChangeTheme(val) {
+      console.log(val);
+      store.settings().changeSetting({
+        key: 'theme',
+        value: val
+      });
+    }
   }
 });
 </script>
@@ -93,6 +103,21 @@
                   </el-select>
                 </div>
               </div>
+              <div class="tools-filter-item">
+                <div class="filter-label">涓婚锛�</div>
+                <div class="filter-content">
+                  <el-select
+                      v-model="theme"
+                      placeholder="璇烽�夋嫨"
+                      size="small"
+                      @change="handleChangeTheme"
+                      style="width: 180px">
+                    <el-option
+                        v-for="item in themes" :key="item.label"
+                        :label="item.label" :value="item.value"/>
+                  </el-select>
+                </div>
+              </div>
             </div>
             <el-button type="primary" size="small" :icon="Search">鏌ヨ</el-button>
           </div>
diff --git a/src/views/login/index.vue b/src/views/login/index.vue
index 6419b8e..be7c69b 100644
--- a/src/views/login/index.vue
+++ b/src/views/login/index.vue
@@ -50,7 +50,7 @@
   name: 'Login',
   data() {
     const validateUsername: FormItemRule['validator'] = (_rule, value, callback) => {
-      if (!validUsername(value)) {
+      if (!value.trim()) {
         callback(new Error('璇疯緭鍏ョ敤鎴峰悕'));
       } else {
         callback();
@@ -101,11 +101,18 @@
     } else if (this.loginForm.password === '') {
       (this.$refs.password as HTMLElement).focus();
     }
+    this.themeChange('blue');
   },
   unmounted() {
     // window.removeEventListener('storage', this.afterQRScan)
   },
   methods: {
+    themeChange(val) {
+      store.settings().changeSetting({
+        key: 'theme',
+        value: val
+      });
+    },
     checkCapslock(e) {
       const { key } = e;
       this.capsTooltip = key && key.length === 1 && (key >= 'A' && key <= 'Z');

--
Gitblit v1.9.1