一个VUE3的页面demo

news2024/11/24 18:58:19

样子是这样的

目录是这样的 

 index.vue文件内容

<template>
  <div class="app-container">
    <div class="content">
      <div class="form" v-show="showSearch">
        <el-form
          ref="queryRef"
          :inline="true"
          :model="queryParams"
          label-width="72px"
        >
          <el-form-item label="名称" prop="name">
            <el-input
              v-model="queryParams.name"
              placeholder="请输入名称"
            ></el-input>
          </el-form-item>
          <el-form-item class="btns">
            <el-button @click="resetQuery">重置</el-button>
            <el-button
              type="primary"
              @click="handleQuery"
              class="btnClick"
              >搜索</el-button
            >
          </el-form-item>
        </el-form>
      </div>
      <div class="table">
        <div class="table-top-btn">
          <div class="mt-12">
            <el-button @click="handleAdd">
              <el-icon
                ><img src="@/assets/images/Plus.png" alt="" class="mr10"
              /></el-icon>
              新增
            </el-button>
            <el-button :disabled="attribute.single" @click="handleUpdate" >
              <el-icon
                ><img src="@/assets/images/Edit.png" alt="" class="mr10"
              /></el-icon>
              修改
            </el-button>
            <el-button :disabled="attribute.multiple" @click="handleDelete" >
              <el-icon
                ><img src="@/assets/images/Delete.png" alt="" class="mr10"
              /></el-icon>
              删除
            </el-button>
            <el-button type="primary" plain @click="download" >
              <el-icon
                ><img src="@/assets/images/export.png" alt="" class="mr10"
              /></el-icon>
              导出
            </el-button>
          </div>
          <right-toolbar
            v-model:showSearch="showSearch"
            @queryTable="getTable"
            :columns="columns"
          />
        </div>
        <TableInfo
          :dataList="dataList"
          :total="total"
          :queryParams="queryParams"
          :columns="columns"
          @fatherClick="getTable"
          @hidden="showButton"
        />
      </div>
    </div>

    <AddModify
      ref="addModifyRef"
      @closeDialog="offBtn"
      @define="submitButton"
    />
  </div>
</template>

<script setup>
import { reactive } from "vue";
import { ElMessageBox, ElMessage } from "element-plus";
import { parseTime } from "@/utils/ruoyi";
// import {
//   servicesList,
//   getServices,
//   addServices,
//   updateServices,
//   deleteServices,
// } from "@/api/archives/services.js";
import TableInfo from "./components/table";
import AddModify from "./components/addmodify.vue";

const { proxy } = getCurrentInstance();

const showSearch = ref(true);

// 查询条件
const queryParams = reactive({ name: "", pageNum: 1, pageSize: 10 });
// 选中表格相关参数
const attribute = reactive({
  ids: [],
  names: [],
  single: true,
  multiple: true,
});

const total = ref(0);
const dataList = ref([]);
const getTable = () => {

  // servicesList(queryParams).then((res) => {
  //   dataList.value = res.rows;
  //   total.value = res.total;
  // });
};
getTable();

// 查询
const handleQuery = () => {
  queryParams.pageNum = 1;
  getTable();
};
// 重置
const resetQuery = () => {
  proxy.resetForm("queryRef");
  queryParams.pageNum = 1;
  handleQuery();
};

// 列显隐信息
const columns = ref([
  { key: 0, label: `名称`, visible: true },
  { key: 1, label: `年龄`, visible: true },
  { key: 2, label: `性别`, visible: true },
  { key: 3, label: `职业`, visible: true },
  { key: 4, label: `地址`, visible: true },
  { key: 5, label: `备注`, visible: true },
]);

// 表格选中时触发的事件
const showButton = (val) => {
  attribute.ids = val.ids;
  attribute.names = val.names;
  attribute.single = val.single;
  attribute.multiple = val.multiple;
};

// 新增
const addModifyRef = ref(null);
const handleAdd = () => {
  addModifyRef.value.init({ title: "新增", open: true });
};
// 修改
const handleUpdate = async () => {
  if (attribute.single) {
    proxy.$modal.msgWarning("只能选择一条数据");
    return false;
  }
  const id = attribute.ids[0];
  let { rows } = await getServices({ id: id });
  addModifyRef.value.init({ title: "修改", open: true, obj: rows[0] });
};

// 新增、修改弹窗确认
const submitButton = (val) => {
  if (val.id != undefined && val.id != "") {
    updateServices(val).then((res) => {
      proxy.$modal.msgSuccess("修改成功");
      addModifyRef.value.resetForm();
      handleQuery();
    });
  } else {
    addServices(val).then((res) => {
      proxy.$modal.msgSuccess("新增成功");
      addModifyRef.value.resetForm();
      handleQuery();
    });
  }
};
// 新增、修改弹窗取消
const offBtn = () => {};

// 删除
const handleDelete = () => {
  const names = attribute.names;
  proxy.$modal
    .confirm('是否确认删除数据名称为"' + names + '"的数据项?')
    .then(function () {
      return deleteServices(attribute.ids);
    })
    .then(() => {
      handleQuery();
      proxy.$modal.msgSuccess("删除成功");
    })
    .catch(() => {});
};

// 导入
const importUpload = ref(null);
const handleImport = () => {
  importUpload.value.init();
};
const loadSucccess = () => {
  handleQuery();
};

// 导出
const download = () => {
  let date = parseTime(new Date().getTime(), "{y}-{m}-{d}");
  ElMessageBox.confirm("是否确认下载所有数据?", "提示", {
    confirmButtonText: "确定",
    cancelButtonText: "取消",
    type: "warning",
  })
    .then(async () => {
      proxy.download(
        "/archivesMgr/communication/export",
        { ...queryParams },
        `导出-${date}.xlsx`
      );
    })
    .catch(() => {
      ElMessage({ type: "info", message: "下载失败" });
    });
};
</script>

<style src="@/assets/styles/custom.scss" scoped />

其中里面引用日期组件在这里常用日期组件封装-CSDN博客 

封装的显隐列在这里VUE2/3:element ui table表格的显隐列(若依框架)_elementui表格隐藏列-CSDN博客

table表格部分

<template>
  <div class="table-container">
    <el-table
      stripe
      border
      :data="props.dataList"
      height="95%"
      @selection-change="handleSelectionChange"
    >
      <el-table-column type="selection" width="40" />
      <el-table-column type="index" label="序号" width="55" />
      <el-table-column
        prop="name"
        label="名称"
        min-width="110"
        v-if="props.columns[0].visible"
        show-overflow-tooltip
      >
        <template #default="scope">
          <div>
            {{ scope.row.name }}
          </div>
        </template>
      </el-table-column>
      <el-table-column
        prop="age"
        label="年龄"
        min-width="110"
        v-if="props.columns[1].visible"
        show-overflow-tooltip
      >
        <template #default="scope">
          <div>
            {{ scope.row.age }}
          </div>
        </template>
      </el-table-column>
     
      <el-table-column
        prop="sex"
        label="性别"
        min-width="110"
        v-if="props.columns[2].visible"
        show-overflow-tooltip
      />
      <el-table-column
        prop="job"
        label="职业"
        min-width="110"
        v-if="props.columns[3].visible"
        show-overflow-tooltip
      />
      <el-table-column
        prop="address"
        label="地址"
        min-width="110"
        v-if="props.columns[4].visible"
        show-overflow-tooltip
      />
    

      <el-table-column
        prop="note"
        :show-overflow-tooltip="true"
        min-width="120"
        label="备注"
        v-if="props.columns[5].visible"
      />
    </el-table>

    <pagination
      v-show="total > 0"
      :total="total"
      v-model:page="queryParams.pageNum"
      v-model:limit="queryParams.pageSize"
      @pagination="getList"
    />
  </div>
</template>

<script setup>
import { reactive } from "vue";
const { proxy } = getCurrentInstance();

const props = defineProps({
  dataList: { default: [] },
  total: { default: 0 },
  queryParams: {
    pageNum: { default: 1 },
    pageSize: { default: 10 },
  },
  columns: { default: [] },
});

const emit = defineEmits(["fatherClick", "hidden"]);

const getList = () => {
  emit("fatherClick");
};

// 自定义参数
const attribute = reactive({
  ids: [],
  names: [],
  single: true,
  multiple: true,
});
// 表格选中事件
const handleSelectionChange = (selection) => {
  attribute.ids = selection.map((item) => item.id);
  attribute.names = selection.map((item) => item.name);
  attribute.single = selection.length != 1;
  attribute.multiple = !selection.length;
  emit("hidden", attribute);
};
</script>

<style lang="scss" scoped></style>

新增修改的弹出层

<template>
  <el-dialog
    :title="params.title"
    v-model="params.open"
    width="550px"
    append-to-body
    destroy-on-close
    @closed="closeBtn"
  >
    <el-form ref="userRef" :model="form" :rules="rules" label-width="80px">
      <el-row>
        <el-col :span="12">
          <el-form-item label="名称" prop="name">
            <el-input
              v-model="form.name"
              placeholder="请输入名称"
              
            />
          </el-form-item>
        </el-col>
        <el-col :span="12">
          <el-form-item label="年龄" prop="age">
            <el-input
              v-model="form.age"
              placeholder="请输入年龄"
              
            />
          </el-form-item>
        </el-col>
      </el-row>
      <el-row>
        <el-col :span="12">
          <el-form-item label="性别" prop="sex">
            <el-input v-model="form.sex" placeholder="请输入性别"  />
          </el-form-item>
        </el-col>
        <el-col :span="12">
          <el-form-item label="职业" prop="job" label-width="80px">
            <el-input
              v-model="form.job"
              placeholder="请输入职业"
              
            />
          </el-form-item>
        </el-col>
      </el-row>
      <el-row>
       
        <el-col :span="12">
          <el-form-item label="地址" prop="address">
            <el-input
              v-model="form.address"
              placeholder="请输地址"
              
            />
          </el-form-item>
        </el-col>
      </el-row>
      <el-row>
        <el-col :span="24">
          <el-form-item label="备注" prop="note">
            <el-input
              v-model="form.note"
              rows="4"
              type="textarea"
              placeholder="请输入内容"
              maxlength="255"
              show-word-limit
            />
          </el-form-item>
        </el-col>
      </el-row>
    </el-form>
    <template #footer>
      <div class="dialog-footer">
        <el-button type="primary" @click="submitForm">确 定</el-button>
        <el-button @click="cancel">取 消</el-button>
      </div>
    </template>
  </el-dialog>
</template>

<script setup>
import { reactive } from "vue";

const emit = defineEmits();
const { proxy } = getCurrentInstance();

// 自定义参数
const params = reactive({ title: "", open: false });
// 表单及校验
const form = ref({
  name: "",
});
const rules = reactive({
  name: [{ required: true, message: "名称不能为空", trigger: "blur" }],
});


// 确定
const userRef = ref(null);
const submitForm = () => {
  userRef.value.validate((valid) => {
    if (!valid) return;
    emit("define", form.value);
  });
};
// 取消
const cancel = () => {
  resetForm();
  emit("closeDialog");
};
// 关闭
const closeBtn = () => {
  resetForm();
  emit("closeDialog");
};
// 重置表单
const resetForm = () => {
  params.open = false;
  proxy.resetForm("userRef");
};

const init = ({ title, open, obj = null }) => {
  params.title = title;
  params.open = open;
  if (obj) {
    form.value.id = obj.id;
    form.value.name = obj.name;
    form.value.sex = obj.sex;
    form.value.job = obj.job;
    form.value.address = obj.address;
    form.value.note = obj.note;
  } else {
    form.value = {};
  }
};

defineExpose({ init, resetForm });
</script>

<style lang="scss" scoped>
</style>

css部分

.redNum {
    color: #e2463d;
}

.bulNum {
    color: #326aff;
}

.paramsClass {
    color: #326aff;
}

.app-container {
    width: 100%;
    height: 100%;
    display: flex;
    padding: 12px 20px 0 20px;

    .content {
        width: 100%;
        height: 100%;

        .form {
            padding: 12px 5px 0px 5px;
            background: #f7f8fa;
            border-radius: 4px;

            .el-form-item {
                margin: 0 40px 10px 0;
            }

            .el-input {
                width: 200px;
            }

            .btnClick {
                background-color: #326aff;
                border-color: #326aff;
            }
        }

        .table {
            height: 80%;
            padding: 5px;
            padding-top: 16px;
            background: #fff;

            .table-top-btn {
                display: flex;
                justify-content: space-between;
            }

            .mt-12 {
                margin-bottom: 12px;
            }

            .table-container {
                height: 100%;
            }

        }


    }
}

// 顶部带有tab分页
.tab-container {
    width: 100%;
    height: 90%;
    display: flex;

    .content {
        width: 100%;
        height: 100%;

        .form {
            padding: 12px 5px 0px 5px;
            background: #f7f8fa;
            border-radius: 4px;

            .el-form-item {
                margin: 0 40px 10px 0;
            }

            :deep(.el-form .el-form-item__label) {
                margin-right: 12px;
                padding: 0;
            }

            .el-input {
                width: 200px;
            }

            .btnClick {
                background-color: #326aff;
                border-color: #326aff;
            }
        }

        .table {
            height: 80%;
            padding: 5px;
            padding-top: 16px;
            background: #fff;

            .table-top-btn {
                display: flex;
                justify-content: space-between;
            }

            .mt-12 {
                margin-bottom: 12px;
            }

            .btnClick {
                background-color: #326aff;
                border-color: #326aff;
            }

            .table-container {
                height: 100%;
            }
        }
    }
}

.w-200 {
    width: 200px;
}

css的目录

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言笔试题之找出数组的最大公约数

找出数组的最大公约数 实例要求 1、给定一个整数数组 &#xff0c;返回数组中最大数和最小数的最大公约数&#xff1b;2、两个数的最大公约数是能够被两个数整除的最大正整数&#xff1b;示例&#xff1a; 实例分析 1、要找到数组中最大数和最小数的最大公约数&#xff1b…

Python3.11修改并运行oneforall

遇到的问题 使用python3.11默认无法运行oneforall脚本&#xff0c;出现如下报错 # 解决方案 修改 /usr/local/lib/python3.11/dist-packages/exrex.py exrex.py具体文件路径报错中会显示 vim /usr/local/lib/python3.11/dist-packages/exrex.py# 修改前 from re import sre…

02_c/c++开源库ZeroMQ

1.安装 C库 libzmq sudo apt install libzmq3-dev 实例: https://zeromq.org/get-started/?languagec&librarylibzmq# 编译依赖: pkg-config --cflags --libs libzmq or cat /usr/lib/x86_64-linux-gnu/pkgconfig/libzmq.pc -isystem /usr/include/mit-krb5 -I/usr/in…

Magnet for Mac:高效窗口管理工具

Magnet for Mac是一款专为Mac用户设计的窗口管理工具&#xff0c;旨在帮助用户更高效地管理和布局多个应用程序窗口&#xff0c;提升工作效率。 Magnet for Mac v2.14.0中文免激活版下载 这款软件拥有直观易用的界面和丰富的功能&#xff0c;支持用户将屏幕分割成多个区域&…

低代码将干掉65%软件开发工作:留给码农的时间不多了

IDC预测&#xff0c;到2024年&#xff0c;约有65%的应用软件将通过低代码开发方式实现&#xff0c;同样&#xff0c;Gartner也曾发布过类似的预测&#xff0c;结果与IDC的预测大致相符。 低代码领域的知名公司Mendix之前发布的一份调研报告指出&#xff1a; “在中国&#xf…

基于Python实现的推箱子小游戏

Python贪吃蛇小游戏实现: 推箱子曾经在我们的童年给我们带来了很多乐趣。推箱子这款游戏现在基本上没人玩了&#xff0c;甚至在新一代人的印象中都已毫无记忆了。。。但是&#xff0c;这款游戏可以在一定程度上锻炼自己的编程能力。 运行效果如图所示&#xff1a; 游戏关卡有点…

C# 生成图形验证码

目录 应用场景 开发运行环境 设计 生成内容 生成图片 实现 核心代码 调用示例 小结 应用场景 我们当用户登录系统时经常会用到图形验证码技术&#xff0c;要求用户识别图片中的内容&#xff0c;并正确输入&#xff0c;方可尝试登录。类似的场景还有用户注册或者涉及…

探秘MySQL主从复制的多种实现方式

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 探秘MySQL主从复制的多种实现方式 前言基于语句的复制原理实现方法应用场景及优缺点应用场景优点缺点 基于行的复制原理实现方法优势和适用性优势适用性 基于混合模式的复制混合模式复制的工作原理混合…

【stomp 实战】Spring websocket使用详解和基本原理

spring框架对websocket有很好的支持&#xff0c;stomp协议作为websocket的子协议&#xff0c;Spring也做了很多封装&#xff0c;让我们在开发中易于使用。 学习使用Spring的Websocket模块&#xff0c;当然最好的办法就是看官网说明了。本篇文章对官网做一些简述和个人的理解。 …

链游:未来游戏发展的新风向

链游&#xff0c;即区块链游戏的一种&#xff0c;是一种将区块链技术与游戏玩法相结合的创新型游戏。它利用区块链技术的特性&#xff0c;如去中心化、可追溯性和安全性&#xff0c;为玩家提供了一种全新的游戏体验。链游通常采用智能合约来实现游戏的规则和交易系统&#xff0…

按现价和不变价计算与公布的统计指标主要有哪些

在经济统计和分析工作中 , 有些指标可以直接用实物量表示 , 如粮食和工业品产量等&#xff1b;而有些指标则是用价值量表示的 , 如全国居民人均可支配收入、社会消费品零售总额、商品房销售额等。在计算价值量指标时&#xff0c;一般均要考虑采用什么价格来计算。统计上常用的价…

新媒体运营-----短视频运营-----PR视频剪辑----PR特效

新媒体运营-----短视频运营-----PR视频剪辑-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/138079659 文章目录 1. 混合和对比度1. 滤色2. 对比度 2. 3d和属性粘贴3. 参考线和锚点 1. 混合和对比度 1. 滤色 混合是PS&#xff…

【数据结构(邓俊辉)学习笔记】绪论04——算法分析

文章目录 0. 前言1. 算法分析2.级数2.1基本形式2.2 收敛级数 3.循环 vs 级数4.示例 0. 前言 通过以基本计算模型作为参照&#xff0c;并且以大O记号的形式在上面添加适当刻度&#xff0c;已经建立一套对DSA进行分析的完整工具和体系。不清楚的可以看看复杂度度量 、复杂度分析…

Kafka 生产者应用解析

目录 1、生产者消息发送流程 1.1、发送原理 2、异步发送 API 2.1、普通异步发送 2.2、带回调函数的异步发送 3、同步发送 API 4、生产者分区 4.1、分区的优势 4.2、生产者发送消息的分区策略 示例1&#xff1a;将数据发往指定 partition 示例2&#xff1a;有 key 的…

Python浅谈清朝秋海棠叶版图

1、清朝疆域概述&#xff1a; 清朝是我国最后一个封建王朝&#xff0c;其始于1616年建州女真部努尔哈赤建立后金&#xff0c;此后统一女真各部、东北地区。后又降服漠南蒙古&#xff0c;1644年入关打败农民起义军、灭南明&#xff0c;削三藩&#xff0c;复台湾。后又收外蒙&am…

【后端】python与django的开发环境搭建指南

安装Git 双击Git 客户端安装文件&#xff0c;在安装页面&#xff0c;单击“Next” 在安装路径选择页面&#xff0c;保持默认&#xff0c;单击“Next” 在功能组件选择页面&#xff0c;保持默认&#xff0c;单击“Next” 在开始菜单文件夹设置页面&#xff0c;保持默认&am…

分享Python7个爬虫小案例(附源码)_爬虫实例

在这篇文章中&#xff0c;我们将分享7个Python爬虫的小案例&#xff0c;帮助大家更好地学习和了解Python爬虫的基础知识。以下是每个案例的简介和源代码&#xff1a; 1. 爬取豆瓣电影Top250 这个案例使用BeautifulSoup库爬取豆瓣电影Top250的电影名称、评分和评价人数等信息&…

Redisson - tryLock 函数参数分析

这里有三个参数&#xff1a; waitTime&#xff1a;等待时间leaseTime&#xff1a;超时施放时间TimeUnit&#xff1a;时间单位 等待时间 如果 ABC… 多个线程去抢夺一把锁&#xff0c;A 成功了&#xff0c;如果设置的是 -1&#xff0c;那么 BCD... 就不等待&#xff0c;直接返…

MYSQL45道练习题---持续更新中

来源&#xff1a; Mysql_45道练习题 - 简书 共四张表&#xff1a; ①、course表&#xff1a; CId&#xff1a;课程id Cname&#xff1a;课程名称 TId&#xff1a;老师id ②、student学生表&#xff1a; SId&#xff1a;学生id Sname&#xff1a;…

淘宝店铺商品信息抓取

一、背景 为了更好了解同行或竞争对手的情况&#xff0c;基于对行业数据分析、市场研究、竞争情报收集等方面的需求。一些公司或个人可能希望获取淘宝店铺的商品数据&#xff0c;以便进行以下操作&#xff1a; 市场研究和竞争分析&#xff1a;通过分析淘宝店铺的商品数据&…