后台管理系统

1.1 项目概述

简易后台管理系统是一个基于Vue3+ElemrntPlus的后台管理系统,提供了用户登录、记住密码、数据的增删改查、分页、错误信息提示等功能,旨在协助管理员对特定数据进行管理和操作。
没有后台对接,数据源为假数据。
全部代码已上传GitHub,加⭐防丢失。后台管理系统 注释部分写的很详细。

1.2 具体功能

在这里插入图片描述
实现效果如下

简易后台管理系统

1.3 部分代码展示

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

<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——操作页面的布局部分

<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>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/64822.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

关于HIVE的分区与分桶

1.分区 1.概念 Hive中的分区就是把一张大表的数据按照业务需要分散的存储到多个目录&#xff0c;每个目录就称为该表的一个分区。在查询时通过where子句中的表达式选择查询所需要的分区&#xff0c;这样的查询效率会提高很多 个人理解白话:按表中或者自定义的一个列,对数据进…

整理mongodb文档:集合名字有类似-等特殊字符串如何处理?

个人博客 整理mongodb文档:集合名字有类似-等特殊字符串如何处理&#xff1f; 首先&#xff0c;先创建一个collection的名字为’collection-test’&#xff0c;这个表名中&#xff0c;colletion的名字有一个特殊字符串“-”&#xff0c;但是后面插入数据的时候会有这么一个错…

rk3399移植linux kernel

rk3399移植linux kernel 0.前言一、移植ubuntu根文件系统二、移植linux1.支持NFS(可选)2.配置uevent helper3.支持etx4文件系统(默认已支持)4.配置DRM驱动5.有线网卡驱动6.无线网卡驱动 三、设备树四、内核镜像文件制作五、烧录六、总结 参考文章&#xff1a; 1.RK3399移植u-bo…

无涯教程-Perl - defined函数

描述 如果 EXPR 的值不是undef值,则此函数返回true&#xff1b;如果未指定 EXPR ,则检查$_的值。它可以与许多功能一起使用以检测操作失败,因为如果出现问题,它们将返回undef。简单的布尔测试不会区分false,零,空字符串或字符串.0。 如果 EXPR 是函数或函数引用,则在定义函数…

第八篇: K8S Prometheus Operator实现Ceph集群企业微信机器人告警

Prometheus Operator实现Ceph集群企业微信告警 实现方案 我们的k8s集群与ceph集群是部署在不同的服务器上&#xff0c;因此实现方案如下&#xff1a; (1) ceph集群开启mgr内置的exporter服务&#xff0c;用于获取ceph集群的metrics (2) k8s集群通过 Service Endponit Ser…

推荐5本软件测试人员必读经典书籍

学会选择对的学习方法 俗话说&#xff1a;“选择大于努力”。 初学软件测试也如此。很多刚入行测试的同学最容易陷入一个误区&#xff0c;那就是优先买一堆视频来学习。结果时间过去了&#xff0c;视频仅以形式主义存在电脑的硬盘里&#xff0c;从此走上了入门到放弃之路。 …

TCP/IP四层模型对比OSI七层网络模型的区别是啥?数据传输过程原来是这样的

一、TCP/IP四层模型对比OSI七层模型 它们两个定义的一些功能和协议都是差不多的。TCP/IP四层协议模型比我们的七层少了三层&#xff0c;把我们的数据链路层和物理层放在一层里面了&#xff0c;叫做数据链路层&#xff08;网络接口层&#xff09;&#xff0c;对应网络协议也没有…

CNN成长路:从AlexNet到EfficientNet(02)

一、说明 在~10年的深度学习中&#xff0c;进步是多么迅速&#xff01;早在 2012 年&#xff0c;Alexnet 在 ImageNet 上的准确率就达到了 63.3% 的 Top-1。现在&#xff0c;我们超过90%的EfficientNet架构和师生训练&#xff08;teacher-student&#xff09;。 二、第一阶段 …

c++:day4

1.思维导图 2.shell函数获取uid和gid&#xff0c;并用变量接 #!/bin/bashfunction fun() {read -p "输入用户名" necho uid:id -u $necho gid:id -g $n } afun echo $a3.冒泡、选择和快排代码整理 /**************************************************************…

【MATLAB第66期】#源码分享 | 基于MATLAB的PAWN全局敏感性分析模型(有条件参数和无条件参数)

【MATLAB第66期】#源码分享 | 基于MATLAB的PAWN全局敏感性分析模型&#xff08;有条件参数和无条件参数&#xff09; 文献参考 Pianosi, F., Wagener, T., 2015. A simple and efficient method for global sensitivity analysis based on cumulative distribution functions.…

【具身智能】系列论文解读(CoWs on PASTURE VoxPoser Relational Pose Diffusion)

0. My Conclusion CoWs on PASTURE&#xff1a; 擅长零样本的视觉语言对象导航&#xff0c;主要解决了LLM辅助下的任务级动作执行任务VoxPoser&#xff1a; 擅长设计一些未预定义的动作轨迹&#xff0c;主要解决了LLM辅助下的动作轨迹设计任务Relational Pose Diffusion&#…

【使用基于二阶积分器的结构生成正交信号】基频共振而无延迟地滤波信号的正交信号生成模块,为单相系统创建 α/β 信号(Simulink实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

python人工智能可以干什么,python人工智能能干什么

大家好&#xff0c;给大家分享一下python做人工智能需要什么水平&#xff0c;很多人还不知道这一点。下面详细解释一下。现在让我们来看看&#xff01; 人工智能包含常用机器学习和深度学习两个很重要的模块&#xff0c;而python拥有matplotlib、Numpy、sklearn、keras等大量的…

人民日报点赞!十大央媒争相报道,星恒守护民生安全出行二十年

围绕电动自行车锂电池的安全性话题&#xff0c;甚至说争议&#xff0c;在近期有了权威定调。 就在7月底&#xff0c;“民生出行&#xff0c;安全为本——电动自行车锂电安全调研座谈会”在北京人民日报社举行&#xff0c;国家监管部门、行业协会、检验院所的权威领导专家&#…

Bean的Aware接口

Aware 简介 Spring中提供了一些以Aware结尾的接口&#xff0c;实现了Aware接口的bean在被初始化之后&#xff0c;可以获取相应资源。比如BeanNameAware之类的以Aware结尾的接口&#xff0c;这个接口获取的资源就是以BeanName相关的。 通过Aware接口&#xff0c;可以对Spring相…

k8s之Pod控制器

目录 一、Pod控制器及其功用二、pod控制器的多种类型2.1 pod容器中的有状态和无状态的区别 三、Deployment 控制器四、SatefulSet 控制器4.1 StatefulSet由以下几个部分组成4.2 为什么要有headless&#xff1f;4.3 为什么要有volumeClaimTemplate&#xff1f;4.4 滚动更新4.5 扩…

Mongodb 安装

一、win10安装 服务端下载地址&#xff1a;Download MongoDB Community Server | MongoDB shell 工具下载地址&#xff1a;MongoDB Shell Download | MongoDB 服务端安装时选择custom&#xff0c;否则安装文件没有bin目录。 将安装后的文件中的bin目录加到环境变量。 设置…

echarts中如何给柱状图增加滚动条

需求:当后台传递过来的数据过多的时候 页面的柱图就会很拥挤 如下图: 所以我们需要有一个横向的滚动条,让所有的柱子都能够展示 1.echarts中有一个dataZoom属性 可以给图形增加一个横向的滚动条 dataZoom:[ {type: slider, //滑动条型数据区域缩放组件realtime: true, //拖动…

【小吉带你学Git】idea操作(2)_版本和分支的相关操作

&#x1f38a;专栏【Git】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【Counting Stars 】 欢迎并且感谢大家指出小吉的问题&#x1f970; 文章目录 &#x1f354;版本⭐首先创建一个项目⭐添加暂存区⭐提交本地库&#x1f33…

Redis键值设计

1.1、优雅的key结构 Redis的Key虽然可以自定义&#xff0c;但最好遵循下面的几个最佳实践约定&#xff1a; 遵循基本格式&#xff1a;[业务名称]:[数据名]:[id]长度不超过44字节不包含特殊字符 例如&#xff1a;我们的登录业务&#xff0c;保存用户信息&#xff0c;其key可以…