【实用模板】Vue代码文件常用后台管理页面模板

简介: 【实用模板】Vue代码文件常用后台管理页面模板


<template>
  <div
    :class="$options.name"
    v-loading="loading"
    :element-loading-text="elementLoadingText"
  ></div>
  <sgSearch
    :collapse.sync="collapseSearch"
    @keyup.enter="(collapseSearch = true), (currentPage = 1), initList()"
    @getHeight="(d) => (sgSearchHeight = d)"
  >
    <template slot="searchFilter">
      <li>
        <label>搜索</label>
        <el-input clearable placeholder="请输入关键词" v-model.trim="keyword" />
      </li>
      <li style="width: 150px">
        <label>状态</label>
        <el-select style="width: 100%" v-model="ZT" placeholder="请选择" clearable>
          <el-option
            v-for="(a, i) in ZTs"
            :key="i"
            :value="a.value"
            :label="a.label"
          ></el-option>
        </el-select>
      </li>
      <li>
        <label>更新时间</label>
        <el-date-picker
          v-model="GXSJ"
          ref="GXSJ"
          type="daterange"
          align="right"
          unlink-panels
          range-separator="至"
          start-placeholder="开始日期"
          end-placeholder="结束日期"
          :picker-options="$global.pickerOptions"
          clearable
        />
      </li>
    </template>
    <template slot="searchBtns">
      <el-button
        size="medium"
        type="primary"
        icon="el-icon-search"
        @click="(collapseSearch = true), (currentPage = 1), initList()"
        >搜索</el-button
      >
      <el-button size="medium" type="primary" @click="resetFilterData(), initList()" plain
        >重置</el-button
      >
    </template>
    <template slot="operateBtns">
      <el-button size="medium" type="primary" @click="add">添加</el-button>
      <el-button
        :disabled="selection.length === 0"
        size="medium"
        type="danger"
        @click="delAny"
        >批量删除</el-button
      >
    </template>
  </sgSearch>
  <div
    class="sg-table"
    v-loading="loading"
    :full="fullscreenTable"
    @click="collapseSearch = true"
  >
    <el-table
      :data="tableData"
      ref="table"
      stripe
      border
      :header-cell-style="{ background: '#f5f7fa' }"
      :height="`calc(100vh - ${fullscreenTable ? 10 : 160 + sgSearchHeight}px -  ${
        total > 10 ? 40 : 0
      }px)`"
      :show-header="true"
      style="width: 100%"
      @row-click="row_click"
      @selection-change="selection_change"
      :row-class-name="row_class_name"
    >
      <template slot="empty">
        <el-empty v-show="!loading" :image="require('@/assets/404.png')">
          <span slot="description">暂无数据</span>
          <el-button type="primary" icon="el-icon-s-promotion" plain @click="add"
            >去添加数据</el-button
          >
        </el-empty>
      </template>
 
      <el-table-column type="selection" width="50" />
      <el-table-column
        type="index"
        label="序号"
        width="60"
        :index="(index) => (currentPage - 1) * pageSize + index + 1"
      />
 
      <!-- 主要列 BEGIN---------------------------------------- -->
      <el-table-column prop="字段" label="列名" minWidth="200" />
      <el-table-column :resizable="false" prop="ID" label="身份证号" minWidth="200">
        <template v-slot:header="scope">
          <span>
            身份证号
            <fullscreenTable v-model="fullscreenTable" />
          </span>
        </template>
        <template slot-scope="scope">
          <span>【索引{{ scope.$index }}】{{ scope.row.ID }}</span>
        </template>
      </el-table-column>
      <el-table-column label="用户名" show-overflow-tooltip minWidth="100">
        <template slot-scope="scope">
          <span>{{ scope.row.username }}</span>
        </template>
      </el-table-column>
      <el-table-column label="姓名" show-overflow-tooltip minWidth="80">
        <template slot-scope="scope">
          <span>{{ scope.row.name }}</span>
        </template>
      </el-table-column>
      <el-table-column label="权限角色" show-overflow-tooltip minWidth="100">
        <template slot-scope="scope">
          <span>{{ scope.row.role || `未分配` }}</span>
        </template>
      </el-table-column>
      <!-- 主要列 END---------------------------------------- -->
 
      <el-table-column label="操作" width="175">
        <template slot-scope="scope">
          <el-button
            size="mini"
            type="primary"
            @click.stop="edit(scope.row)"
            @dblclick.native.stop
            >修改</el-button
          >
          <el-button
            size="mini"
            type="danger"
            @click.stop="del(scope.row)"
            @dblclick.native.stop
            >删除</el-button
          >
        </template>
      </el-table-column>
    </el-table>
    <el-pagination
      style="width: 100%; text-align: center; margin-top: 10px"
      background
      :hidden="total <= 10"
      :layout="`total, sizes, prev, pager, next, jumper`"
      :page-sizes="[10, 20, 50, 100]"
      :pager-count="7"
      :current-page.sync="currentPage"
      :page-size.sync="pageSize"
      :total="total"
      @size-change="initList"
      @current-change="initList"
    />
  </div>
</template>
<script>
import sgSearch from "@/vue/components/admin/sgSearch";
 
export default {
  name: "组件模板",
  components: {
    sgSearch,
  },
  data() {
    return {
      loading: false, //加载状态
      elementLoadingText: ``, //加载提示文字
 
      visible: false, //是否显示
      forbid: false, //是否禁用
 
      form: {}, //表单信息
 
      showEditDrawer: false, //显示编辑抽屉
      editDrawerData: null, //抽屉数据
 
      collapseSearch: false, //折叠搜索栏
      keyword: "", //搜索关键词
      ZT: 1, //当前状态
      ZTs: [
        { value: 1, label: "显示文本1" },
        { value: 2, label: "显示文本2" },
        { value: 3, label: "显示文本3" },
        { value: 4, label: "显示文本4" },
        { value: 5, label: "显示文本5" },
      ],
      GXSJ: [], //更新时间
 
      fullscreenTable: false, //全屏表格
      sgSearchHeight: 0, //搜索栏的高度(或者相关选项卡组件的高度)
      tableData: [
        { ID: "330110198704103091", username: "username1", name: "姓名1", role: "role1" },
        { ID: "330110198704103092", username: "username2", name: "姓名2", role: "role2" },
        { ID: "330110198704103093", username: "username3", name: "姓名3", role: "role3" },
        { ID: "330110198704103094", username: "username4", name: "姓名4", role: "role4" },
        { ID: "330110198704103095", username: "username5", name: "姓名5", role: "role5" },
      ], //表格数据
      selection: [], //表格选中项数组
      currentPage: 1,
      pageSize: 10,
      total: 0,
      //total: 999,
    };
  },
  props: [
    "value", //是否显示
    "disabled", //是否禁用
    "data",
  ],
  computed: {},
  watch: {
    loading(newValue, oldValue) {
      newValue || (this.elementLoadingText = ``);
    },
    value: {
      handler(d) {
        this.visible = d;
      },
      deep: true,
      immediate: true,
    },
    visible(d) {
      this.$emit("input", d);
    }, //是否显示(双向绑定)
    disabled: {
      handler(d) {
        this.forbid = d;
      },
      deep: true,
      immediate: true,
    },
    forbid(d) {
      this.$emit(`update:disabled`, d);
    }, //是否显示(双向绑定)
    data: {
      handler(newValue, oldValue) {
        //console.log('深度监听:', newValue, oldValue);
        if (newValue && Object.keys(newValue).length) {
          this.form = JSON.parse(JSON.stringify(newValue));
        } else {
          this.form = {};
        }
      },
      deep: true, //深度监听
      immediate: true, //立即执行
    },
  },
  created() {
    this.init();
  },
  mounted() {},
  destroyed() {},
  methods: {
    row_click(row, column, event) {
      this.$refs.table.toggleRowSelection(row);
    },
    selection_change(selection) {
      this.selection = selection;
    },
    row_class_name({ row, rowIndex }) {
      return this.selection.some((v) => v.ID === row.ID) ? "selected" : "";
    },
 
    //初始化
    init({ d } = {}) {
      this.initData();
    },
    //初始化数据
    initData({ d } = {}) {
      this.initList();
    },
    // 重置
    reset(d) {
      this.resetFilterData(), this.initList();
    },
    // 重置筛选条件
    resetFilterData(d) {
      this.currentPage = 1;
      this.keyword = "";
      this.GXSJ = [];
    },
    //初始化列表
    initList({ keyword = this.keyword } = {}) {
      this.collapseSearch = true;
      // 更新时间
      let KSSJ = this.$g.date.get_yyyy_MM_dd(this.GXSJ[0]); //开始时间
      let JSSJ = this.$g.date.get_yyyy_MM_dd(this.GXSJ[1]); //结束时间
      let data = {
        KEYS: keyword,
        KSSJ,
        JSSJ,
        start: this.currentPage - 1, //当前页数(从0开始)
        limit: this.pageSize, //每页显示条目个数
        sgLog: `前端请求来源:${this.$options.name}查询数据接口`,
      };
      this.$d.查询数据接口({
        data,
        r: {
          l: { show: () => (this.loading = true), close: () => (this.loading = false) },
          s: (d) => {
            this.tableData = d.data; //列表数据赋值
            this.tableData.sort((prev, next) => prev.RANK - next.RANK); //从小到大升序(会改变原数组)
            this.total = d.totalCount; //总条数
          },
        },
      });
    },
 
    add(d) {
      this.editDrawerData = null;
      this.showEditDrawer = true;
    },
    edit(d) {
      this.editDrawerData = JSON.parse(JSON.stringify(d));
      this.showEditDrawer = true;
    },
    delAny() {
      this.del(this.selection);
    },
    del(arr) {
      Array.isArray(arr) || (arr = [arr]);
      this.$confirm(
        `此操作将永久删除${arr.length > 1 ? `这${arr.length}个` : `此`}数据,是否继续?`,
        `提示`,
        {
          dangerouslyUseHTMLString: true,
          confirmButtonText: `确定`,
          cancelButtonText: `取消`,
          type: "warning",
        }
      )
        .then(() => {
          let data = {
            IDS: arr.map((v) => v.ID),
            sgLog: `前端请求来源:${this.$options.name}删除数据接口`,
          };
          this.$d.删除数据接口({
            data,
            r: {
              l: {
                show: () => (this.loading = true),
                close: () => (this.loading = false),
              },
              s: (d) => {
                this.initList();
                this.$message.success(arr.length > 1 ? `批量删除成功` : `已删除`);
              },
            },
          });
        })
        .catch(() => {
          //this.$message(`已取消删除`);
        });
    },
    valid(d) {
      // if (!this.form.MC) return this.$message.error(this.$refs.MC.$el.querySelector("input").placeholder);
    },
    save() {
      if (this.valid()) return;
      if (this.form.ID) {
        // 修改
      } else {
        // 新增
      }
      let data = {
        ...this.form,
        sgLog: `前端请求来源:${this.$options.name}保存数据接口`,
      };
      this.$d.保存数据接口({
        data,
        r: {
          l: { show: () => (this.loading = true), close: () => (this.loading = false) },
          s: (d) => {
            this.initList({ keyword: "" });
            this.$emit(`save`, this.form);
            this.cancel(this.form);
          },
        },
      });
    },
    cancel(d) {
      this.$emit(`hide`, d);
    },
  },
};
</script>
<style lang="scss" scoped>
.组件模板 {
}
</style>


相关文章
|
2天前
|
JavaScript 前端开发
如何在 Vue 项目中配置 Tree Shaking?
通过以上针对 Webpack 或 Rollup 的配置方法,就可以在 Vue 项目中有效地启用 Tree Shaking,从而优化项目的打包体积,提高项目的性能和加载速度。在实际配置过程中,需要根据项目的具体情况和需求,对配置进行适当的调整和优化。
|
2天前
|
JavaScript 前端开发 UED
vue学习第二章
欢迎来到我的博客!我是一名自学了2年半前端的大一学生,熟悉JavaScript与Vue,目前正在向全栈方向发展。如果你从我的博客中有所收获,欢迎关注我,我将持续更新更多优质文章。你的支持是我最大的动力!🎉🎉🎉
|
2天前
|
JavaScript 前端开发 开发者
vue学习第一章
欢迎来到我的博客!我是瑞雨溪,一名热爱JavaScript和Vue的大一学生。自学前端2年半,熟悉JavaScript与Vue,正向全栈方向发展。博客内容涵盖Vue基础、列表展示及计数器案例等,希望能对你有所帮助。关注我,持续更新中!🎉🎉🎉
|
16天前
|
数据采集 监控 JavaScript
在 Vue 项目中使用预渲染技术
【10月更文挑战第23天】在 Vue 项目中使用预渲染技术是提升 SEO 效果的有效途径之一。通过选择合适的预渲染工具,正确配置和运行预渲染操作,结合其他 SEO 策略,可以实现更好的搜索引擎优化效果。同时,需要不断地监控和优化预渲染效果,以适应不断变化的搜索引擎环境和用户需求。
|
3天前
|
存储 缓存 JavaScript
在 Vue 中使用 computed 和 watch 时,性能问题探讨
本文探讨了在 Vue.js 中使用 computed 计算属性和 watch 监听器时可能遇到的性能问题,并提供了优化建议,帮助开发者提高应用性能。
|
3天前
|
存储 缓存 JavaScript
如何在大型 Vue 应用中有效地管理计算属性和侦听器
在大型 Vue 应用中,合理管理计算属性和侦听器是优化性能和维护性的关键。本文介绍了如何通过模块化、状态管理和避免冗余计算等方法,有效提升应用的响应性和可维护性。
|
3天前
|
存储 缓存 JavaScript
Vue 中 computed 和 watch 的差异
Vue 中的 `computed` 和 `watch` 都用于处理数据变化,但使用场景不同。`computed` 用于计算属性,依赖于其他数据自动更新;`watch` 用于监听数据变化,执行异步或复杂操作。
|
4天前
|
存储 JavaScript 开发者
Vue 组件间通信的最佳实践
本文总结了 Vue.js 中组件间通信的多种方法,包括 props、事件、Vuex 状态管理等,帮助开发者选择最适合项目需求的通信方式,提高开发效率和代码可维护性。
|
4天前
|
存储 JavaScript
Vue 组件间如何通信
Vue组件间通信是指在Vue应用中,不同组件之间传递数据和事件的方法。常用的方式有:props、自定义事件、$emit、$attrs、$refs、provide/inject、Vuex等。掌握这些方法可以实现父子组件、兄弟组件及跨级组件间的高效通信。
|
9天前
|
JavaScript
Vue基础知识总结 4:vue组件化开发
Vue基础知识总结 4:vue组件化开发