免费分享一套SpringBoot+Vue员工管理(职工管理,考勤管理,奖惩管理,合同管理)管理系统【论文+源码+SQL脚本】,帅呆了~~

时间:2025-03-28 08:55:38
  • <template>
  • <div class="login-container">
  • <el-form
  • ref="loginForm"
  • :model="loginForm"
  • :rules="loginRules"
  • class="login-form"
  • autocomplete="on"
  • label-position="left"
  • >
  • <div class="title-container">
  • <h3 class="title">职工管理系统</h3>
  • </div>
  • <el-form-item prop="username">
  • <span class="svg-container">
  • <i
  • class="iconfont icon-r-user1"
  • style="font-size: 22px"
  • ></i>
  • </span>
  • <el-input
  • ref="username"
  • v-model=""
  • placeholder="用户名"
  • name="username"
  • type="text"
  • tabindex="1"
  • />
  • </el-form-item>
  • <el-tooltip
  • v-model="capsTooltip"
  • content="Caps lock is On"
  • placement="right"
  • manual
  • >
  • <el-form-item prop="password">
  • <span class="svg-container">
  • <i
  • class="iconfont icon-r-lock"
  • style="font-size: 22px"
  • ></i>
  • </span>
  • <el-input
  • :key="passwordType"
  • ref="password"
  • v-model=""
  • :type="passwordType"
  • placeholder="密码"
  • name="password"
  • tabindex="2"
  • @="checkCapslock"
  • @blur="capsTooltip = false"
  • @="handleLogin"
  • />
  • <span class="show-pwd" @click="showPwd">
  • <svg-icon
  • :icon-class="
  • passwordType === 'password' ? 'eye' : 'eye-open'
  • "
  • />
  • </span>
  • </el-form-item>
  • </el-tooltip>
  • <el-button
  • :loading="loading"
  • type="primary"
  • style="width: 100%; margin-bottom: 30px; font-size: 22px"
  • @="handleLogin"
  • >
  • 登录</el-button
  • >
  • </el-form>
  • </div>
  • </template>
  • <script>
  • import { validUsername } from "@/utils/validate";
  • import SocialSign from "./components/SocialSignin";
  • export default {
  • name: "Login",
  • components: { SocialSign },
  • data() {
  • const validateUsername = (rule, value, callback) => {
  • if (!validUsername(value)) {
  • callback(new Error("Please enter the correct user name"));
  • } else {
  • callback();
  • }
  • };
  • const validatePassword = (rule, value, callback) => {
  • if (value.length < 6) {
  • callback(
  • new Error("The password can not be less than 6 digits")
  • );
  • } else {
  • callback();
  • }
  • };
  • return {
  • loginForm: {
  • username: "",
  • password: "",
  • },
  • loginRules: {
  • // username: [{ required: true, trigger: 'blur', validator: validateUsername }],
  • // password: [{ required: true, trigger: 'blur', validator: validatePassword }]
  • },
  • passwordType: "password",
  • capsTooltip: false,
  • loading: false,
  • showDialog: false,
  • redirect: undefined,
  • otherQuery: {},
  • };
  • },
  • watch: {
  • $route: {
  • handler: function (route) {
  • const query = route.query;
  • if (query) {
  • this.redirect = query.redirect;
  • this.otherQuery = this.getOtherQuery(query);
  • }
  • },
  • immediate: true,
  • },
  • },
  • created() {
  • // ('storage', )
  • },
  • mounted() {
  • if (this.loginForm.username === "") {
  • this.$refs.username.focus();
  • } else if (this.loginForm.password === "") {
  • this.$refs.password.focus();
  • }
  • },
  • destroyed() {
  • // ('storage', )
  • },
  • methods: {
  • checkCapslock(e) {
  • const { key } = e;
  • this.capsTooltip =
  • key && key.length === 1 && key >= "A" && key <= "Z";
  • },
  • showPwd() {
  • if (this.passwordType === "password") {
  • this.passwordType = "";
  • } else {
  • this.passwordType = "password";
  • }
  • this.$nextTick(() => {
  • this.$refs.password.focus();
  • });
  • },
  • handleLogin() {
  • this.$refs.loginForm.validate((valid) => {
  • if (valid) {
  • this.loading = true;
  • this.$store
  • .dispatch("user/login", this.loginForm)
  • .then(() => {
  • this.$router.push({
  • path: this.redirect || "/",
  • query: this.otherQuery,
  • });
  • this.loading = false;
  • })
  • .catch((e) => {
  • this.loading = false;
  • console.log(e);
  • if (
  • e.response == undefined ||
  • e.response.data == undefined
  • ) {
  • this.$message({
  • showClose: true,
  • message: e,
  • type: "error",
  • duration: 6000,
  • });
  • } else {
  • this.$message({
  • showClose: true,
  • message: e.response.data,
  • type: "error",
  • duration: 6000,
  • });
  • }
  • });
  • } else {
  • console.log("error submit!!");
  • return false;
  • }
  • });
  • },
  • getOtherQuery(query) {
  • return Object.keys(query).reduce((acc, cur) => {
  • if (cur !== "redirect") {
  • acc[cur] = query[cur];
  • }
  • return acc;
  • }, {});
  • },
  • },
  • };
  • </script>
  • <style lang="scss">
  • /* 修复input 背景不协调 和光标变色 */
  • /* Detail see /PanJiaChen/vue-element-admin/pull/927 */
  • $bg: #283443;
  • $light_gray: grey;
  • $cursor: black;
  • @supports (-webkit-mask: none) and (not (cater-color: $cursor)) {
  • .login-container .el-input input {
  • color: $cursor;
  • }
  • }
  • /* reset element-ui css */
  • .login-container {
  • background-image: url("../../assets/");
  • background-size: cover;
  • background-repeat: no-repeat;
  • .el-input {
  • display: inline-block;
  • height: 47px;
  • width: 85%;
  • input {
  • background: transparent;
  • border: 0px;
  • -webkit-appearance: none;
  • border-radius: 0px;
  • padding: 12px 5px 12px 15px;
  • color: $light_gray;
  • height: 47px;
  • caret-color: $cursor;
  • &:-webkit-autofill {
  • box-shadow: 0 0 0px 1000px $bg inset !important;
  • -webkit-text-fill-color: $cursor !important;
  • }
  • }
  • }
  • .el-form-item {
  • border: 1px solid rgba(255, 255, 255, 0.1);
  • background: white;
  • border-radius: 5px;
  • color: black;
  • }
  • }
  • </style>
  • <style lang="scss" scoped>
  • $bg: #2d3a4b;
  • $dark_gray: black;
  • $light_gray: #eee;
  • .login-container {
  • min-height: 100%;
  • width: 100%;
  • background-color: $bg;
  • overflow: hidden;
  • .login-form {
  • position: relative;
  • width: 520px;
  • max-width: 100%;
  • padding: 160px 35px 0;
  • margin: 0 auto;
  • overflow: hidden;
  • }
  • .tips {
  • font-size: 14px;
  • color: grey;
  • margin-bottom: 10px;
  • span {
  • &:first-of-type {
  • margin-right: 16px;
  • }
  • }
  • }
  • .svg-container {
  • padding: 6px 5px 6px 15px;
  • color: $dark_gray;
  • vertical-align: middle;
  • width: 30px;
  • display: inline-block;
  • }
  • .title-container {
  • position: relative;
  • .title {
  • font-size: 36px;
  • color: black;
  • margin: 0px auto 40px auto;
  • text-align: center;
  • -webkit-text-stroke: 0.5px green;
  • font-weight: 600;
  • }
  • }
  • .show-pwd {
  • position: absolute;
  • right: 10px;
  • top: 7px;
  • font-size: 16px;
  • color: $dark_gray;
  • cursor: pointer;
  • user-select: none;
  • }
  • .thirdparty-button {
  • position: absolute;
  • right: 0;
  • bottom: 6px;
  • }
  • @media only screen and (max-width: 470px) {
  • .thirdparty-button {
  • display: none;
  • }
  • }
  • }
  • </style>