From 9057e04efad1b7d61c77a72e5c37a504d0aee935 Mon Sep 17 00:00:00 2001
From: doum <doum>
Date: 星期五, 26 九月 2025 09:24:03 +0800
Subject: [PATCH] H5静态化

---
 admin/src/views/login.vue |  220 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 220 insertions(+), 0 deletions(-)

diff --git a/admin/src/views/login.vue b/admin/src/views/login.vue
new file mode 100644
index 0000000..65d9460
--- /dev/null
+++ b/admin/src/views/login.vue
@@ -0,0 +1,220 @@
+<template>
+  <div class="wrap">
+    <div class="introduce">
+      <h2>璞嗙背璺宠烦瀹樼綉鍚庡彴绠$悊</h2>
+      <h3></h3>
+    </div>
+    <div class="login">
+      <h1>绯荤粺鐧诲綍&nbsp;/&nbsp;LOGIN IN</h1>
+      <div class="info-input">
+        <el-input v-model="username" placeholder="璇疯緭鍏ョ敤鎴峰悕" prefix-icon="el-icon-user-solid" maxlength="50" v-trim/>
+        <el-input v-model="password" placeholder="璇疯緭鍏ュ瘑鐮�" type="password" prefix-icon="eva-icon-password" maxlength="30" show-password/>
+        <div class="captcha-input">
+          <el-input v-model="captcha.value" placeholder="鍥剧墖楠岃瘉鐮�" prefix-icon="eva-icon-shield" maxlength="4" @keypress.enter.native="login"/>
+          <img v-if="!captcha.loading" :src="captcha.uri" @click="refreshCaptcha">
+          <span v-else><i class="el-icon-loading"></i></span>
+        </div>
+      </div>
+      <el-button :loading="loading" @click="login">鐧�&nbsp;&nbsp;褰�</el-button>
+    </div>
+  </div>
+</template>
+
+<script>
+import { mapMutations } from 'vuex'
+import { getCaptcha, loginByPassword } from '@/api/system/common'
+
+export default {
+  name: 'Login',
+  data () {
+    return {
+      loading: false,
+      username: '',
+      password: '',
+      // 楠岃瘉鐮�
+      captcha: {
+        loading: false,
+        value: '',
+        uuid: '',
+        uri: ''
+      }
+    }
+  },
+  methods: {
+    ...mapMutations(['setUserInfo']),
+    /**
+     * 鐧诲綍
+     */
+    login () {
+      if (this.loading) {
+        return
+      }
+      if (!this.__check()) {
+        return
+      }
+      this.loading = true
+      loginByPassword({
+        username: this.username.trim(),
+        password: this.password,
+        code: this.captcha.value.trim(),
+        uuid: this.captcha.uuid
+      },true)
+        .then(() => {
+          window.location.href = process.env.VUE_APP_CONTEXT_PATH
+        })
+        .catch(e => {
+          this.refreshCaptcha()
+          this.$tip.apiFailed(e)
+        })
+        .finally(() => {
+          this.loading = false
+        })
+    },
+    /**
+     * 鍒锋柊楠岃瘉鐮�
+     */
+    refreshCaptcha () {
+      this.captcha.loading = true
+      getCaptcha()
+        .then(data => {
+          this.captcha.uri = data.image
+          this.captcha.uuid = data.uuid
+        })
+        .catch(e => {
+          this.$tip.apiFailed(e)
+        })
+        .finally(() => {
+          setTimeout(() => {
+            this.captcha.loading = false
+          }, 150)
+        })
+    },
+    /**
+     * 鐧诲綍鍓嶉獙璇�
+     *
+     * @returns {boolean}
+     * @private
+     */
+    __check () {
+      if (this.username.trim() === '') {
+        this.$tip.error('璇疯緭鍏ョ敤鎴峰悕')
+        return false
+      }
+      if (this.password === '') {
+        this.$tip.error('璇疯緭鍏ュ瘑鐮�')
+        return false
+      }
+      if (this.captcha.value.trim() === '') {
+        this.$tip.error('璇疯緭鍏ュ浘鐗囬獙璇佺爜')
+        return false
+      }
+      return true
+    }
+  },
+  created () {
+    this.refreshCaptcha()
+  }
+}
+</script>
+
+<style scoped lang="scss">
+@import "@/assets/style/variables.scss";
+$input-gap: 30px;
+.wrap {
+  display: flex;
+  width: 100%;
+  height: 100vh;
+  background-image: url("../assets/images/login.png");
+  background-repeat: no-repeat;
+  background-size: auto 180%;
+  background-clip: content-box;
+  background-position: center;
+  // 宸﹁竟浠嬬粛
+  .introduce {
+    padding-left: 10%;
+    width: 100%;
+    height: 100%;
+    box-sizing: border-box;
+    color: #fff;
+    background: rgba(0, 0, 0, 0.4);
+    display: flex;
+    flex-direction: column;
+    justify-content: center;
+    h2 {
+      font-size:44px;
+      font-style: italic;
+      font-weight: 900;
+      margin-top: 0px;
+    }
+    h3 {
+      font-size: 49px;
+      font-weight: 300;
+      margin: 25px 0;
+    }
+  }
+  // 鍙宠竟鐧诲綍
+  .login {
+    height: 100%;
+    width: 38%;
+    max-width: 560px;
+    min-width: 460px;
+    flex-shrink: 0;
+    text-align: center;
+    background: #fff;
+    padding: 0 80px;
+    display: flex;
+    flex-direction: column;
+    justify-content: center;
+    box-sizing: border-box;
+    h1 {
+      font-size: 28px;
+      font-weight: 500;
+    }
+    .info-input {
+      margin-top: $input-gap;
+      margin-bottom: 60px;
+      /deep/ .el-input {
+        margin-top: 30px;
+        .el-input__inner {
+          height: 50px;
+          background: #F9F9F9;
+          border: 1px solid transparent;
+          &:focus {
+            border: 1px solid $primary-color;
+          }
+        }
+      }
+    }
+    // 楠岃瘉鐮佽緭鍏�
+    .captcha-input {
+      display: flex;
+      margin-top: $input-gap;
+      height: 50px;
+      .el-input {
+        width: 100%;
+        margin-top: 0;
+      }
+      span, img {
+        width: 45%;
+        height: 100%;
+        flex-shrink: 0;
+        margin-left: 16px;
+      }
+      span {
+        display: flex;
+        align-items: center;
+        justify-content: center;
+        background: #f7f7f7;
+        border-radius: 8px;
+      }
+    }
+    .el-button {
+      height: 50px;
+      width: 100%;
+      color: #fff;
+      font-size: 16px;
+      background: linear-gradient(130deg, $primary-color + 20 0%, $primary-color - 20 100%);
+    }
+  }
+}
+</style>

--
Gitblit v1.9.3