后台管理系统

1.1 项目概述

简易后台管理系统是一个基于Vue3+ElemrntPlus的后台管理系统,提供了用户登录、记住密码、数据的增删改查、分页、错误信息提示等功能,旨在协助管理员对特定数据进行管理和操作。

没有后台对接,数据源为假数据。
全部代码已上传GitHub,加⭐防丢失。➡️后台管理系统

1.2 具体功能

实现效果如下

简易后台管理系统

1.3 部分代码展示

src\views\LoginView.vue部分------登录页面

javascript 复制代码
<template>
  <div class="onShow">
    <h3 class="titleOne">后台管理系统</h3>
    
      <!-- 姓名 -->
      用户名
      <el-input v-model="input" placeholder="请输入用户名" />
      <!-- 错误提示 -->
     <div class="errContain">
      <div v-show="inputError" class="error-message">
        {{ inputErrorMessage }}
      </div>
     </div>
     
      <!-- 密码 -->
      密码
      <el-input v-model="password" type="password" placeholder="请输入密码" />
      <!-- 错误提示 -->
      <div class="errContain">
        <div v-show="passwordError" class="error-message">
        {{ passwordErrorMessage }}
      </div>
      </div>
     
    
    <!-- 记住密码 -->
    <div class="rem">
      记住密码
      <el-switch v-model="rememberPassword" size="small" />
    </div>
    
      <!-- 验证码 -->
      <Vcode
        :show="isShow"
        :imgs="imgs"
        @success="onSuccess"
        @close="onClose"
      />
      <!-- 登录 -->
      <!-- <router-link to="/home"> -->
      <el-button type="primary" @click="onShow" :disabled="hasError"
        >安全登录</el-button
      >
      <!-- </router-link> -->
    
  </div>
</template>

<script setup>
import { ref, computed, watch } from "vue";
import Vcode from "vue3-puzzle-vcode";
import sheep from "../assets/sheep.jpg";
import router from "@/router";
import Cookies from 'js-cookie';

const imgs = [sheep];
//记住密码开关
const rememberPassword = ref(false);

const isShow = ref(false);

const input = ref("");
const password = ref("");

const inputErrorMessage = ref(true);
const passwordErrorMessage = ref(true);
const inputError = ref(false);
const passwordError = ref(false);


// 监听input变化
watch(input, (newValue) => {
  validateInput(newValue);
});
// 监听password变化
watch(password, (newValue) => {
  validatePassword(newValue);
});
// 校验输入的用户名
const validateInput = (value) => {
  const nameRegExp = /^[\u4e00-\u9fa5]{2,5}$/; // 由2-5个汉字组成
  if (!nameRegExp.test(value)) {
    // 有一个符合就执行以下语句-
    //真,执行下行语句
    //先让快展示,然后展示信息
    inputError.value = true;
    inputErrorMessage.value = "用户名必须由2-5个汉字组成";
  } else {
    inputError.value = false;
    // inputErrorMessage.value=false
    inputErrorMessage.value = false;
  }
};
// 校验输入的密码
const validatePassword = (value) => {
  
  if (value.length >= 8 && value.length <= 16) {
    passwordError.value = false;
    inputErrorMessage.value = false;
  } else {
    passwordError.value = true;
    passwordErrorMessage.value = "密码长度在8-16位之间";
  }
};
// 联合判断是否有错误,禁用登录按钮
//禁用:返回true 只要一个为真即可
//没有错误返回的是假,目的是都为假

const hasError = computed(() => {
  return (
    inputError.value ||
    passwordError.value ||
    input.value === "" || // 添加对输入框的空值判断
    password.value === "" // 添加对密码输入框的空值判断
  );
});

const onShow = () => {
  isShow.value = true;
};
const onClose = () => {
  isShow.value = false;
};

const onSuccess = () => {
  onClose();
  ElMessage({
    message: "登录成功",
    type: "success",
    duration: 1000,
    //可手动关闭
    showClose: true,
  });

  if (rememberPassword.value) {
    const userInfo = { 
    username: input.value,
    password: password.value
  };
  Cookies.set("userInfo", JSON.stringify(userInfo), { expires: 365 });
    alert("输入信息已保存到Cookie");
  } else {
    // 执行取消记住密码的逻辑,例如删除Cookie或LocalStorage
    // ...
    Cookies.remove("userInfo");
  console.log('不存入信息');
  }
  router.push("/home");

  // 验证成功,需要手动关闭模态框
};

  
  
</script>

<style scoped>
.errContain{
  height: 15px;
  width: 100%;
}
.titleOne{
  text-align: center;
  padding-bottom: 20px;
}
.onShow {
  width: 300px;
  margin: 120px auto;
  padding: 40px 120px;
  background-image: url(../assets/bg.png);
  /* background-size:cover; */
  border-radius: 50px;
  background-size: 100% 100%;

}

.el-button,
router-link {
  width: 300px;
  margin-top: 20px;
}
.el-input {
  font-size: 10px;
}
.error-message {
  font-size: 10px;
  color: red;
}
.rem {
  font-size: 14px;
  color: rgb(87, 87, 87);
}

</style>

src\components\ComHome.vue------操作页面的布局部分

javascript 复制代码
<template>
  <div class="common-layout">
    <el-container>
      <!-- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------头部 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------->
      <el-header>
        <div class="add">
          <el-button :plain="true" @click="handleAdd">新增数据 </el-button>
        </div>
        <div class="title">后台管理系统</div>
        <span id="logout">
          <router-link to="/"
            ><el-button :plain="true" @click="open1"
              >退出</el-button
            ></router-link
          ></span
        >
      </el-header>
      <hr />
      <!-- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------主体------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ -->
      <el-main>
        <!-- 经查找、分页渲染出来 展示的数据 -->
          <el-table :data="displayedData" style="width: 100%">
            <el-table-column class="one" label="id" prop="id" />
            <el-table-column label="用户名" prop="name" />
            <el-table-column label="性别" prop="sex" />
            <el-table-column label="年龄" prop="age" />
            <el-table-column label="爱好" prop="hobby" />
            <el-table-column>
              <!-- 查找部分 -->
              <template #header>
                <el-input
                  class="search"
                  v-model="search"
                  size="small"
                  placeholder="Type id or name "
                />
              </template>
                <!-- 修改、删除按钮 -->
              <template #default="scope">
                <!-- scope.$index, scope.row拿到每一行的index和数据 -->
                <el-button
                  size="small"
                  @click="handleEdit(scope.row, scope.$index)"
                  >Edit</el-button
                >
                <el-button
                  size="small"
                  type="danger"
                  @click="handleDelete(scope.$index)"
                  >Delete</el-button
                >
              </template>
            </el-table-column>
          </el-table>
        </el-main>
        <!-- 删除确认弹窗 -->
      <el-dialog v-model="delDialogVisible" title="Tips" width="30%">
        <template #footer>
          <span class="dialog-footer">
            <el-button @click="open4">Cancel</el-button>
            <el-button type="primary" @click="delDialogVisible = false">
              Yes
            </el-button>
          </span>
        </template></el-dialog
      >
      <!-- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------尾部------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ -->
      <el-footer>
        <!-- 分页 -->
        <div class="demo-pagination-block">
          <el-pagination
            v-model:current-page="currentPage"
            v-model:page-size="pageSize"
            :page-sizes="[5, 10, 15, 20]"
            :small="small"
            :disabled="disabled"
            :background="background"
            layout="total, sizes, prev, pager, next, jumper"
            :total="filterTableData.length"
            @size-change="handleSizeChange"
            @current-change="handleCurrentChange"
          />
        </div>
      </el-footer>
      <!-- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------新增/编辑弹窗------------------------------------------------------------------------------------------------------------------------------------------------------------ -->
      <el-dialog
        v-model="dialogFormVisible"
        :title="titleMsg"
        width="40%"
        round-button="true"
      >
        <el-form :model="form" label-width="100px" style="padding-right: 30px">
          <el-form-item label="id:">
            <el-input v-model="form.id"></el-input>
          </el-form-item>
          <el-form-item label="姓名:">
            <el-input v-model="form.name"></el-input>
          </el-form-item>
          <el-form-item label="性别:">
            <el-radio-group v-model="form.sex">
              <el-radio label="男">男</el-radio>
              <el-radio label="女">女</el-radio>
            </el-radio-group>
          </el-form-item>
          <!-- 限制只能输入数字 -->
          <el-form-item label="年龄:">
            <el-input v-model.number="form.age"></el-input>
          </el-form-item>
          <el-form-item label="爱好:">
            <el-input v-model="form.hobby"></el-input>
          </el-form-item>
        </el-form>
        <template #footer>
          <span class="dialog-footer">
            <el-button @click="dialogFormVisible = false">取消</el-button>
            <el-button type="primary" @click="save">确认</el-button>
          </span>
        </template>
      </el-dialog>
    </el-container>
  </div>
</template>
相关推荐
mldong5 小时前
你的 Vue3 项目也能有钉钉同款审批流设计器:npm 装包,10 分钟画出第一条审批流
前端·vue.js
2分钟速写快排5 小时前
什么是 RAG?如何用 RAG 实现一个用户记忆?
前端·后端·ai编程
passerby60616 小时前
如何自己造一个时间处理库
前端·javascript·github
走到天涯海角7 小时前
react里面的长列表渲染优化
前端·react.js·前端框架
小羊没烦恼!7 小时前
Hello Web API系列教程——Web API与国际化
java·服务器·前端·javascript·php
北岛贰7 小时前
迷茫焦虑期,我做了一个带支付带官网的 AI 聊天虚拟恋人 App
前端·人工智能·后端
mayaairi9 小时前
Vue2 组件通讯(三):全局事件总线、PubSub、插槽与组件实例属性
前端·javascript·vue.js
kyriewen9 小时前
面试官问我:AI 都能写代码了,前端凭什么还值 25K
前端·javascript·人工智能
风骏时光牛马10 小时前
AI源码分析:拆解模型底层实现逻辑
前端
IT_陈寒10 小时前
React子组件莫名其妙重渲染?你可能漏了这个Hook
前端·人工智能·后端