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


相关文章
|
1天前
|
JavaScript
vue 监听 sessionStorage 中值的变化
vue 监听 sessionStorage 中值的变化
9 1
|
1天前
|
JavaScript 索引
Component name “index“ should always be multi-word vue/multi-word-component-names
Component name “index“ should always be multi-word vue/multi-word-component-names
|
1天前
|
JavaScript
vue 创建项目、运行项目、访问项目(vue2版)
vue 创建项目、运行项目、访问项目(vue2版)
7 0
|
1天前
|
JavaScript 编译器
|
1天前
|
JavaScript 前端开发 API
|
1天前
|
JavaScript
|
1天前
|
JavaScript
Vue中data常见的写法:
Vue中data常见的写法:
|
1天前
|
Web App开发 JavaScript
vue报错【解决方案】 [Violation] Added non-passive event listener to a scroll-blocking <some> event.
vue报错【解决方案】 [Violation] Added non-passive event listener to a scroll-blocking <some> event.
5 0
|
1天前
|
JavaScript
vue v-for循环渲染动态ref表单校验的实现技巧
vue v-for循环渲染动态ref表单校验的实现技巧
5 0
|
1天前
|
JavaScript 前端开发

相关实验场景

更多