【实用模板】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>


相关文章
|
25天前
|
JavaScript
vue实现任务周期cron表达式选择组件
vue实现任务周期cron表达式选择组件
102 4
|
4天前
|
人工智能 自然语言处理 JavaScript
用 CodeBuddy 搭建Vue框架 像呼吸一样简单
本文介绍如何借助 CodeBuddy 快速创建 Vue 项目。CodeBuddy 是一款支持自然语言编程的工具,能根据用户需求自动生成代码,降低开发门槛。文章详细说明了通过 CodeBuddy 创建 Vue 项目的步骤,包括解决项目创建失败的问题、自动补全代码功能以及启动开发服务器的方法。无论开发者经验如何,CodeBuddy 都能显著提升效率,让开发更专注创意实现。
|
5月前
|
JavaScript
vue使用iconfont图标
vue使用iconfont图标
232 1
|
15天前
|
缓存 JavaScript 前端开发
Vue 基础语法介绍
Vue 基础语法介绍
|
2月前
|
JavaScript 前端开发 算法
vue渲染页面的原理
vue渲染页面的原理
136 56
|
2月前
|
SQL JavaScript 前端开发
Vue实现动态数据透视表(交叉表)
Vue实现动态数据透视表(交叉表)
185 13
|
3月前
|
前端开发 JavaScript Java
【03】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架搭建-服务端-后台管理-整体搭建-优雅草卓伊凡商业项目实战
【03】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架搭建-服务端-后台管理-整体搭建-优雅草卓伊凡商业项目实战
205 13
【03】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架搭建-服务端-后台管理-整体搭建-优雅草卓伊凡商业项目实战
|
2月前
|
数据采集 资源调度 JavaScript
极致的灵活度满足工程美学:用Vue Flow绘制一个完美流程图
本文介绍了使用 Vue Flow 绘制流程图的方法与技巧。Vue Flow 是一个灵活强大的工具,适合自定义复杂的流程图。文章从环境要求(Node.js v20+ 和 Vue 3.3+)、基础入门案例、自定义功能(节点与连线的定制、事件处理)到实际案例全面解析其用法。重点强调了 Vue Flow 的高度灵活性,虽然预定义内容较少,但提供了丰富的 API 支持深度定制。同时,文中还分享了关于句柄(handles)的使用方法,以及如何解决官网复杂案例无法运行的问题。最后通过对比 mermaid,总结 Vue Flow 更适合需要高度自定义和复杂需求的场景,并附带多个相关技术博客链接供进一步学习。
|
2月前
|
存储 数据采集 供应链
属性描述符初探——Vue实现数据劫持的基础
属性描述符还有很多内容可以挖掘,比如defineProperty与Proxy的区别,比如vue2与vue3实现数据劫持的方式有什么不同,实现效果有哪些差异等,这篇博文只是入门,以后有时间再深挖。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
3月前
|
移动开发 JavaScript API
Vue Router 核心原理
Vue Router 是 Vue.js 的官方路由管理器,用于实现单页面应用(SPA)的路由功能。其核心原理包括路由配置、监听浏览器事件和组件渲染等。通过定义路径与组件的映射关系,Vue Router 将用户访问的路径与对应的组件关联,支持哈希和历史模式监听 URL 变化,确保页面导航时正确渲染组件。