Browse Source

表格组件、公共样式、注释

@dongkboy 2 days ago
parent
commit
c506568fd4

+ 2 - 3
env.js

@@ -34,9 +34,8 @@ const envs = {
     _ISCDN: true, // 是否开启cdn加速
   },
   development: {
-    // DOMAIN: 'http://10.1.4.199:6180',
-    // DOMAIN: 'http://10.1.37.249:6180',
-    DOMAIN: 'https://scrm-gw.chinacoal-ins.com',
+    // DOMAIN: 'http://192.168.0.19:6180',//董鑫
+    DOMAIN: 'http://192.168.0.106:6180',//屈晨
     BASE_URL: './', // 路由基础路径
     BASE_API: 'https://scrm-gw.chinacoal-ins.com',
     // BASE_API: 'http://10.1.37.249:6180',

+ 640 - 0
src/components/templateTable.vue

@@ -0,0 +1,640 @@
+<template>
+  <div style="position: relative" ref="commonTable">
+    <!--表格栏-->
+    <el-table id="commonTable" ref="doLayout" :data="data.content" :highlight-current-row="highlightCurrentRow"
+      @selection-change="selectionChange" @row-click="rowClick" @current-change="handleCurrentChange" :border="border"
+      :stripe="stripe" :show-summary="showSummary" :show-overflow-tooltip="showOverflowTooltip"
+      :height="tableHeights ? tableHeights : tableHeight" :size="size" :align="align" style="width: 100%"
+      :row-class-name="tableRowClassName" :expand-row-keys="expandRows" row-key="id">
+      <el-table-column type="selection" width="50" fixed align="center" v-if="
+        showBatchDelete ||
+        refreshStatus ||
+        showBatchSettled ||
+        showBatchPrint ||
+        customToolseletted ||
+        disableInBulk ||
+        select
+      "></el-table-column>
+      <el-table-column v-if="SerialShow" label="序号" type="index" width="50" align="center"></el-table-column>
+      <template v-for="column in columns">
+        <el-table-column header-align="center" align="center" :prop="column.prop" :label="column.label"
+          :width="column.width" :min-width="column.minWidth" :fixed="column.fixed" :key="column.prop"
+          :type="column.type" :formatter="column.formatter" :sortable="column.sortable ? column.sortable : false">
+          <template v-for="columnchildren in column.children">
+            <el-table-column v-if="columnchildren" header-align="center" align="center" :prop="columnchildren.prop"
+              :label="columnchildren.label" :width="columnchildren.width" :min-width="columnchildren.minWidth"
+              :fixed="columnchildren.fixed" :key="columnchildren.prop" :type="columnchildren.type"
+              :formatter="columnchildren.formatter" :sortable="columnchildren.sortable == null ? true : columnchildren.sortable
+                ">
+            </el-table-column>
+          </template>
+        </el-table-column>
+      </template>
+      <el-table-column label="操作" :width="operationWidth" :fixed="isNotFixed ? false : 'right'" v-if="showOperation"
+        header-align="center" align="center" class-name="table-fiexd">
+        <template slot-scope="scope">
+          <slot name="buttonSlot" :row="scope.row" :index="scope.$index"></slot>
+        </template>
+      </el-table-column>
+
+    </el-table>
+    <!--分页栏-->
+    <!-- 底部分页 -->
+    <!-- <kt-button :label="customToolName" :perms="permscustomTool" :size="size" type="danger" @click="customToolMethod()"
+        :disabled="selections.length === 0" style="float: left" v-if="customToolseletted" />
+      <kt-button class="debutton" :label="deleteName" :perms="permsDelete" :size="size" type="danger"
+        @click="handleBatchDelete()" :disabled="selections.length === 0" style="float: left"
+        v-if="showBatchDelete & showOperation" />
+      <kt-button class="debutton" :label="refreshStatusName" :size="size" type="danger" @click="refreshStatusBatch()"
+        :disabled="selections.length === 0" style="float: left" v-if="refreshStatus" />
+      <kt-button :label="customToolName1" :perms="permscustomTool" :size="size" type="danger"
+        @click="customToolMethod1()" :disabled="selections.length === 0" style="float: left"
+        v-if="customToolseletted" />
+      <kt-button :label="disableInBulkName" :perms="disableInBulkperms" :size="size" type="danger"
+        @click="disableInBulkClick()" :disabled="selections.length === 0" style="float: left" v-if="disableInBulk" />
+      <kt-button :label="settledName" :perms="permsSettled" :size="size" type="danger" @click="handleBatchSettled()"
+        :disabled="selections.length === 0" style="float: left" v-if="showBatchSettled" />
+      <kt-button label="导出Excel" :perms="permsExcel" :size="size" type="danger" @click="handleBatchPrint()"
+        style="float: left" v-if="showBatchPrint" />
+      <div v-if="tableSelectedCount" class="tableSelectedCountClass">已选
+        <span>{{ tableSelectedCount }}</span>
+        条
+      </div> -->
+    <pagination v-show="data.totalSize > 0" :total="data.totalSize" :page.sync="data.pageNum"
+      :limit.sync="data.pageSize" @pagination="findPage()" />
+  </div>
+</template>
+<script>
+export default {
+  name: "KtCommonTable",
+  components: {
+  },
+  props: {
+    //批量刷新状态
+    refreshStatus: {
+      type: Boolean,
+      default: false
+    },
+    // 承保规则expend内容
+    agreementUnderwritingRuleShow: {
+      type: Boolean,
+      default: false
+    },
+    select: {
+      type: Boolean,
+      default: false,
+    },
+    tableHeights: {
+      type: Number,
+    },
+    operationWidth: {
+      type: Number,
+      default: 200,
+    },
+    // 是否需要固定列(指操作那一列)
+    isNotFixed: {
+      type: Boolean,
+      default: false
+    },
+    showBatchSettled: {
+      //显示批量结算
+      type: Boolean,
+      default: false,
+    },
+    SerialShow: {
+      type: Boolean,
+      default: false,
+    },
+    customToolName: {
+      type: String,
+    },
+    customToolName1: {
+      type: String,
+    },
+    permscustomTool: {
+      type: String,
+    },
+    customToolseletted: {
+      // 自定义操作组件
+      type: Boolean,
+      default: false,
+    },
+    disableInBulkName: {
+      type: String,
+    },
+    disableInBulkperms: {
+      type: String,
+    },
+    disableInBulk: {
+      // 批量禁用
+      type: Boolean,
+      default: false,
+    },
+    settledName: {
+      //批量按钮name
+      type: String,
+    },
+    deleteName: {
+      type: String,
+    },
+    refreshStatusName: {
+      //批量更新状态按钮Name
+      type: String,
+    },
+    showBatchPrint: {
+      //显示批量导出
+      type: Boolean,
+      default: false,
+    },
+    //显示合计
+    showSummary: {
+      type: Boolean,
+      default: false,
+    },
+    //更多操作
+    buttonDropdown: {
+      type: Array,
+      default: () => [],
+    },
+    isshowpagination: {
+      //是否显示分页栏
+      type: Boolean,
+      default: true,
+    },
+
+    showSummaryFieldList: Array, //自定义合计列配置
+    keyName: String, //主键字段名
+    columns: Array, // 表格列配置
+    data: {}, // 表格分页数据
+    permsEdit: String, // 编辑权限标识
+    permsDelete: String, // 底部按钮标识
+    permsSettled: String, // 底部按钮标识
+    permsExcel: String, // 底部按钮标识
+    size: {
+      // 尺寸样式
+      type: String,
+      default: "small ",
+    },
+    align: {
+      // 文本对齐方式
+      type: String,
+      default: "left",
+    },
+    // maxHeight: {  // 表格最大高度
+    //   type: Number,
+    //   default: 1420
+    // },
+    // height: {  // 表格最大高度
+    //   type: Number,
+    //   default: 250
+    // },
+    showOperation: {
+      // 是否显示操作组件
+      type: Boolean,
+      default: true,
+    },
+    border: {
+      // 是否显示边框
+      type: Boolean,
+      default: false,
+    },
+    stripe: {
+      // 是否显示斑马线
+      type: Boolean,
+      default: true,
+    },
+    highlightCurrentRow: {
+      // 是否高亮当前行
+      type: Boolean,
+      default: true,
+    },
+    showOverflowTooltip: {
+      // 是否单行显示
+      type: Boolean,
+      default: true,
+    },
+    showBatchDelete: {
+      // 是否显示操作组件
+      type: Boolean,
+      default: false,
+    },
+    showSysUserAccountCardList: {
+      // 是否显示二级列组件
+      type: Boolean,
+      default: false,
+    },
+    showDefaultPage: {
+      // 是否默认调用一次查询
+      type: Boolean,
+      default: true,
+    }
+  },
+  data() {
+    return {
+      tableSelectedCount: "",
+      tableHeight: 0,
+      loading: false, // 加载标识
+      selections: [], // 列表选中列
+      pageRequest: {
+        pageNum: 1,
+        pageSize: 20,
+      },
+      taskPool: false,
+
+      underwritingRulesAddVehicleFactorVisible: false,
+      underwritingRulesForm: {
+        //承保因子表单项
+        agreementId: "", //协议id
+        ruleDescription: "", //规则描述
+        rulesStartDate: "",//规则起期
+        rulesEndDate: "",//规则止期
+        validInd: "1", //是否有效
+        rulesAttrList: [],//规则属性
+        carClassList: [],
+        areanumberplateList: [],
+        licenseAreaList: [],
+      },
+      expandRows: []
+    };
+  },
+  created() {
+  },
+  watch: {
+
+  },
+  methods: {
+    //获取银行卡信息
+    getSysUserAccountCardList(row) {
+      if (typeof row.expanded === "undefined") {
+        row.expanded = true;
+      }
+      if (row.expanded) {
+        if (this.expandRows.includes(row.id)) {
+          this.expandRows = this.expandRows.filter(item => item !== row.id);
+        } else {
+          this.expandRows.push(row.id);
+        }
+      } else {
+        this.expandRows = this.expandRows.filter(item => item !== row.id);
+      }
+      row.expanded = !row.expanded;
+      if (row.sysUserAccountCardList.length === 0) {
+        this.$api.dept.queryCardListByUserId(row.userId).then((res) => {
+          if (res.code == 200) {
+            if (res.data) {
+              row.sysUserAccountCardList = res.data;
+              this.$set(this.data.content, row.index, row)
+            }
+          }
+        });
+      }
+      //this.$refs.doLayout.toggleRowExpansion(row, row.expanded);
+    },
+
+    tableRowClassName(row, rowIndex) {
+      // if (!!row.fieldName24 && row.fieldName24.indexOf("未") >= 0) {
+      //   return "warningRow";
+      // } else if (!!row.fieldName24 && row.fieldName24.indexOf("已") >= 0) {
+      // return "successRow";
+      // }
+      if (!!this.taskPool) {
+        if (row.row.isExternal === 1) {
+          return "flagRow";
+        } else {
+          return "";
+        }
+      }
+      this.$emit("tableRowClassName", row);
+      // return '';
+    },
+
+    // 分页查询
+    findPage: function () {
+      this.loading = true;
+      let callback = (res) => {
+        this.loading = false;
+        //解决操作栏位置偏移问题
+        this.$nextTick(() => {
+          this.$refs.doLayout.doLayout();
+        }, 200);
+      };
+      this.$emit("findPage", {
+        pageRequest: this.pageRequest,
+        callback: callback,
+      });
+    },
+    hideLoading() {
+      this.loading = false;
+    },
+    // 选择切换
+    selectionChange: function (selections) {
+      let idlist = [];
+      this.tableSelectedCount = selections.length;
+      this.selections = selections;
+      // this.selections.map((item) => idlist.push(item.id));
+      this.$emit("selectionChange", selections);
+    },
+    // 选择切换
+    handleCurrentChange: function (val) {
+      this.$emit("handleCurrentChange", {
+        val: val,
+      });
+    },
+
+    rowClick: function (row) {
+      this.$emit("rowClick", {
+        row: row,
+      });
+    },
+    // 换页刷新
+    refreshPageRequest: function (pageNum) {
+      this.pageRequest.pageNum = pageNum;
+      // this.pageRequest.pageSize = 20;
+      this.findPage();
+    },
+    // 每页条数发生改变
+    handleSizeChange(pageSize) {
+      this.pageRequest.pageSize = pageSize;
+      this.findPage();
+    },
+    signStateChanged(index, row) {
+      this.$emit("signStateChanged", {
+        index: index,
+        row: row,
+      });
+    },
+    // 按钮编辑
+    handleBtnEdit: function (index, row) {
+      this.$emit("handleBtnEdit", {
+        index: index,
+        row: row,
+      });
+    },
+    // 编辑
+    handleEdit: function (index, row) {
+      this.$emit("handleEdit", {
+        index: index,
+        row: row,
+      });
+      // this.$emit('findLeftTreeData')
+    },
+    handleBreak: function (index, row, i, r) {
+      this.$emit("handleBreak", {
+        index: index,
+        row: row,
+        i: i,
+        r: r,
+      });
+    },
+
+    handleTimeLine: function (index, row, i, r) {
+      this.$emit("handleTimeLine", {
+        index: index,
+        row: row,
+        i: i,
+        r: r,
+      });
+    },
+    handleRebind: function (index, row, i, r) {
+      this.$emit("handleRebind", {
+        index: index,
+        row: row,
+        i: i,
+        r: r,
+      });
+    },
+    // 删除
+    handleDelete: function (index, row) {
+      let _keyName = "id";
+      if (!!this.keyName) {
+        _keyName = this.keyName;
+      }
+
+      this.delete(row[_keyName]);
+    },
+    handleButton1: function (index, row) {
+      this.$emit("handleButton1", {
+        index: index,
+        row: row,
+      });
+    },
+    handleButton2: function (index, row) {
+      this.$emit("handleButton2", {
+        index: index,
+        row: row,
+      });
+    },
+    handleButton3: function (index, row) {
+      this.$emit("handleButton3", {
+        index: index,
+        row: row,
+      });
+    },
+    handleButton4: function (index, row) {
+      this.$emit("handleButton4", {
+        index: index,
+        row: row,
+      });
+    },
+    handleButton5: function (index, row) {
+      this.$emit("handleButton5", {
+        index: index,
+        row: row,
+      });
+    },
+    handleButton6: function (index, row) {
+      this.$emit("handleButton6", {
+        index: index,
+        row: row,
+      });
+    },
+    handleButton7: function (index, row) {
+      this.$emit("handleButton7", {
+        index: index,
+        row: row,
+      });
+    },
+    handleButton8: function (index, row) {
+      this.$emit("handleButton8", {
+        index: index,
+        row: row,
+      });
+    },
+    handleButton10: function (index, row) {
+      this.$emit("handleButton10", {
+        index: index,
+        row: row,
+      });
+    },
+    handleButton9: function (index, row) {
+      this.$emit("handleButton9", {
+        index: index,
+        row: row,
+      });
+    },
+    handleButton: function (index, row) {
+      this.$emit("handleButton", {
+        index: index,
+        row: row,
+      });
+    },
+    //删除单个
+    handleDeleteFlag: function (index, row) {
+      this.$emit("handleDeleteFlag", { index: index, row: row });
+      // var _keyName = "id";
+      // if (!!this.keyName) {
+      //   _keyName = this.keyName;
+      // }
+      // let ids = row[_keyName];
+      // this.$confirm("确认删除吗?", "提示", {
+      //   type: "warning",
+      // })
+      //   .then(() => {
+      //     let params = [];
+      //     let idArray = (ids + "").split(",");
+      //     for (var i = 0; i < idArray.length; i++) {
+      //       var obj = {};
+      //       obj[_keyName] = idArray[i];
+      //       params.push(obj);
+      //     }
+      //     this.loading = true;
+      //     let callback = (res) => {
+      //       if (res.code == 200) {
+      //         this.$message({
+      //           message: "操作成功",
+      //           type: "success",
+      //         });
+      //         this.findPage();
+      //         // this.$emit('findLeftTreeData')
+      //       } else {
+      //         this.$message({
+      //           message: "操作失败, " + res.msg,
+      //           type: "error",
+      //         });
+      //       }
+      //     };
+      //     this.$emit("handleDeleteFlag", {
+      //       params: params,
+      //       callback: callback,
+      //     });
+      //     this.loading = false;
+      //   })
+      //   .catch(() => {
+      //     this.loading = false;
+      //   });
+    },
+    //批量刷新状态
+    refreshStatusBatch: function () {
+      let idlist = [];
+      this.selections.map((item) => idlist.push(item.subOrderId));
+      this.$emit("refreshStatusBatch", idlist);
+    },
+    // 批量删除
+    handleBatchDelete: function () {
+      let idlist = [];
+      this.selections.map((item) => idlist.push(item.id));
+      this.$emit("handleDelete", idlist);
+    },
+    //自定义批量操作按钮
+    customToolMethod() {
+      let idlist = [];
+      this.selections.map((item) => idlist.push(item.id));
+      this.$emit("customTool", idlist);
+    },
+
+    //自定义批量操作按钮1
+    customToolMethod1() {
+      let idlist = [];
+      this.selections.map((item) => idlist.push(item.id));
+      this.$emit("customTool1", idlist);
+    },
+    //批量导出
+    disableInBulkClick() {
+      let idlist = [];
+      this.selections.map((item) => idlist.push(item.id));
+      this.$emit("disableInBulkClick", idlist);
+    },
+    // 删除操作
+    delete: function (ids) {
+      var _keyName = "id";
+      if (!!this.keyName) {
+        _keyName = this.keyName;
+      }
+
+      this.$confirm("确认删除吗?", "提示", {
+        type: "warning",
+      })
+        .then(() => {
+          let params = [];
+          let idArray = (ids + "").split(",");
+          for (var i = 0; i < idArray.length; i++) {
+            var obj = {};
+            obj[_keyName] = idArray[i];
+            params.push(obj);
+          }
+          let callback = (res) => {
+            if (res.code == 200) {
+              this.$message({
+                message: "操作成功",
+                type: "success",
+              });
+              this.findPage();
+              // this.$emit('findLeftTreeData')
+            } else {
+              this.$message({
+                message: "操作失败, " + res.msg,
+                type: "error",
+              });
+            }
+          };
+          this.$emit("handleDelete", {
+            params: params,
+            callback: callback,
+          });
+        })
+        .catch(() => { });
+    },
+    //批量结算
+    handleBatchSettled: function () {
+      let _keyName = "orderno";
+      if (!!this.keyName) {
+        _keyName = this.keyName;
+      }
+      let idlist = [];
+      this.selections.map((item) => idlist.push(item[_keyName]));
+      this.$emit("handleSettled", idlist);
+    },
+    //批量打印
+    handleBatchPrint: function () {
+      // let _keyName = "orderno";
+      // if(!!this.keyName){
+      //   _keyName = this.keyName;
+      // }
+      // let ids = this.selections.map(item => item[_keyName]).toString()
+      // console.log(ids);
+      this.$emit("handlePrint");
+    },
+  },
+
+  mounted() {
+    const that = this;
+    if (this.showDefaultPage) {
+      that.refreshPageRequest(1);
+    }
+    setTimeout(() => {
+      let tableTop = that.$refs.commonTable.offsetTop;
+      let height = window.innerHeight;
+      that.tableHeight = height - tableTop - 225 + "px";
+    }, 10);
+    // window.onresize = function () {
+    //   let tableTop = that.$refs.commonTable.offsetTop;
+    //   let bottomTop = that.$refs.bottomFixed.offsetTop;
+
+    //   that.tableHeight = bottomTop - tableTop - 120 + "px";
+    // };
+  },
+};
+</script>
+
+
+<style lang="scss" scoped></style>

+ 12 - 3
src/directive/index.js

@@ -1,17 +1,26 @@
-import hasRole from './permission/hasRole'
-import hasPermi from './permission/hasPermi'
-import preventReClick from './preventReClick'
+// 导入权限相关的自定义指令
+import hasRole from './permission/hasRole' // 导入检查用户角色的指令
+import hasPermi from './permission/hasPermi' // 导入检查用户权限的指令
+import preventReClick from './preventReClick' // 导入防止重复点击的指令
 
+// 定义一个安装函数,用于注册自定义指令
 const install = function(Vue) {
+  // 注册 hasRole 指令
   Vue.directive('hasRole', hasRole)
+  // 注册 hasPermi 指令
   Vue.directive('hasPermi', hasPermi)
+  // 注册 preventReClick 指令
   Vue.directive('preventReClick', preventReClick)
 }
 
+// 检查是否在浏览器环境中使用 Vue
 if (window.Vue) {
+  // 如果 Vue 已经在全局范围内定义,将指令暴露到全局
   window['hasRole'] = hasRole
   window['hasPermi'] = hasPermi
+  // 使用 install 函数注册指令
   Vue.use(install) // eslint-disable-line
 }
 
+// 导出 install 函数,以便在其他地方使用
 export default install

+ 14 - 6
src/directive/permission/hasPermi.js

@@ -1,26 +1,34 @@
 /**
-* 操作权限处理
-*/
+ * 操作权限处理指令
+ * 该指令用于根据用户的权限控制元素的显示与隐藏
+ */
 
 import store from '@/store'
 
 export default {
+  // 当指令被绑定到元素上时调用
   inserted (el, binding, vnode) {
-    const { value } = binding
-    const all_permission = "*:*:*";
-    const permissions = store.getters && store.getters.permissions
+    const { value } = binding // 获取指令传入的值
+    const all_permission = "*:*:*"; // 定义一个常量,表示所有权限
+    const permissions = store.getters && store.getters.permissions // 从 Vuex store 获取当前用户的权限列表
 
+    // 检查指令值是否存在,并且是一个非空数组
     if (value && value instanceof Array && value.length > 0) {
-      const permissionFlag = value
+      const permissionFlag = value // 将传入的权限值赋给 permissionFlag
 
+      // 检查用户是否具有所需的权限
       const hasPermissions = permissions.some(permission => {
+        // 如果用户拥有所有权限,或者用户的权限列表中包含所需的权限
         return all_permission === permission || permissionFlag.includes(permission)
       })
 
+      // 如果用户没有所需的权限
       if (!hasPermissions) {
+        // 可选:从 DOM 中移除该元素
         // el.parentNode && el.parentNode.removeChild(el)
       }
     } else {
+      // 如果没有设置操作权限标签值,抛出错误
       throw new Error(`请设置操作权限标签值`)
     }
   }

+ 16 - 8
src/directive/permission/hasRole.js

@@ -1,27 +1,35 @@
 /**
-* 角色权限处理
-*/
+ * 角色权限处理指令
+ * 该指令用于根据用户的角色控制元素的显示与隐藏
+ */
 
-import store from '@/store'
+import store from '@/store' // 导入 Vuex store,以获取用户的角色信息
 
 export default {
+  // 当指令被绑定到元素上时调用
   inserted(el, binding, vnode) {
-    const { value } = binding
-    const super_admin = "admin";
-    const roles = store.getters && store.getters.roles
+    const { value } = binding // 获取指令传入的值
+    const super_admin = "admin"; // 定义超级管理员角色
+    const roles = store.getters && store.getters.roles // 从 Vuex store 获取当前用户的角色列表
 
+    // 检查指令值是否存在,并且是一个非空数组
     if (value && value instanceof Array && value.length > 0) {
-      const roleFlag = value
+      const roleFlag = value // 将传入的角色值赋给 roleFlag
 
+      // 检查用户是否具有所需的角色
       const hasRole = roles.some(role => {
+        // 如果用户是超级管理员,或者用户的角色列表中包含所需的角色
         return super_admin === role || roleFlag.includes(role)
       })
 
+      // 如果用户没有所需的角色
       if (!hasRole) {
+        // 从 DOM 中移除该元素
         el.parentNode && el.parentNode.removeChild(el)
       }
     } else {
-      throw new Error(`请设置角色权限标签值"`)
+      // 如果没有设置角色权限标签值,抛出错误
+      throw new Error(`请设置角色权限标签值`)
     }
   }
 }

+ 140 - 1
src/styles/index.scss

@@ -187,7 +187,7 @@ div:focus {
       align-items: center;
       margin-bottom: 20px;
       font-size: 16px;
-      font-weight: 500;
+      font-weight:500;
       color: var(--font-black);
       line-height: 1;
       .desc {
@@ -358,3 +358,142 @@ div:focus {
     padding-bottom: 0 !important;
   }
 }
+/* flex布局 */
+.u-f,
+.u-f-ac,
+.u-f-ajc,
+.u-f-jsb,
+.u-f-je,
+.u-f1,
+.u-f-column,
+.u-f-sa {
+  display: flex;
+}
+
+.u-f-ac,
+.u-f-ajc {
+  align-items: center;
+}
+
+.u-f-ajc {
+  justify-content: center;
+}
+
+.u-f-jsb {
+  justify-content: space-between;
+}
+
+.u-f-je {
+  justify-content: flex-end;
+}
+
+.u-f-sa {
+  justify-content: space-around;
+}
+
+.u-f1 {
+  flex: 1;
+}
+
+.u-f-column {
+  flex-direction: column;
+}
+
+.flex {
+  display: flex;
+
+}
+
+.f-wrap {
+  flex-wrap: wrap;
+}
+
+.j-s {
+  justify-content: space-between;
+}
+
+.j-c {
+  justify-content: center;
+}
+
+.j-start {
+  justify-content: flex-start;
+}
+
+.j-end {
+  justify-content: flex-end;
+}
+
+.a-c {
+  align-items: center;
+}
+
+.a-start {
+  align-items: flex-start;
+}
+
+.a-end {
+  align-items: flex-end;
+}
+
+.f-c {
+  flex-direction: column;
+}
+
+.p-1 {
+  padding: 10px;
+}
+
+.p-2 {
+  padding: 20px;
+}
+.mrgin-5{
+  margin: 5px;
+}
+.mrgin-1 {
+  margin: 10px;
+}
+
+.mrgin-2 {
+  margin: 20px;
+}
+
+.m-top-5 {
+  margin-top: 5px;
+}
+
+.m-top-10 {
+  margin-top: 10px;
+}
+.m-top-20 {
+  margin-top: 20px;
+}
+
+.m-btn-10 {
+  margin-bottom: 10px;
+}
+
+.m-btn-15 {
+  margin-bottom: 15px;
+}
+.mr-1{
+  margin-right: 10px;
+}
+.mr-2{
+  margin-right: 20px;
+}
+.mr-3{
+  margin-right: 30px;
+}
+.ml-1{
+  margin-left: 10px;
+}
+.ml-2{
+  margin-left: 20px;
+}
+.ml-3{
+  margin-left: 30px;
+}
+.mb-2{
+  margin-bottom: 20px;
+}