一个VUE3的页面demo

样子是这样的

目录是这样的

index.vue文件内容

html 复制代码
<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表格部分

html 复制代码
<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>

新增修改的弹出层

html 复制代码
<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部分

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的目录

相关推荐
山川尔尔_1 小时前
JS手写-this绑定实现
开发语言·javascript·ecmascript
谁呛我名字4 小时前
大数据应用开发——数据可视化
javascript·vue.js·echarts
前端郭德纲4 小时前
浅谈React的虚拟DOM
前端·javascript·react.js
ComPDFKit6 小时前
使用 PDF API 合并 PDF 文件
前端·javascript·macos
yqcoder6 小时前
react 中 memo 模块作用
前端·javascript·react.js
谈谈叭6 小时前
Javascript中的深浅拷贝以及实现方法
开发语言·javascript·ecmascript
优雅永不过时·7 小时前
Three.js 原生 实现 react-three-fiber drei 的 磨砂反射的效果
前端·javascript·react.js·webgl·threejs·three
爱编程的鱼7 小时前
javascript用来干嘛的?赋予网站灵魂的语言
开发语言·javascript·ecmascript
神夜大侠9 小时前
VUE 实现公告无缝循环滚动
前端·javascript·vue.js
明辉光焱9 小时前
【Electron】Electron Forge如何支持Element plus?
前端·javascript·vue.js·electron·node.js