david 2 лет назад
Родитель
Сommit
f4eebca493

+ 1 - 1
.eslintignore

@@ -1,5 +1,5 @@
 build/*.js
-src/assets
+src/*
 public
 dist
 src/

+ 0 - 8
package.json

@@ -63,8 +63,6 @@
     "chalk": "2.4.2",
     "chokidar": "2.1.5",
     "connect": "3.6.6",
-    "eslint": "6.7.2",
-    "eslint-plugin-vue": "6.2.2",
     "html-webpack-plugin": "3.2.0",
     "husky": "1.3.1",
     "lint-staged": "8.1.5",
@@ -100,12 +98,6 @@
     "management-system"
   ],
   "license": "MIT",
-  "lint-staged": {
-    "src/**/*.{js,vue}": [
-      "eslint --fix",
-      "git add"
-    ]
-  },
   "husky": {
     "hooks": {
       "pre-commit": "lint-staged"

+ 22 - 0
src/App.vue

@@ -9,3 +9,25 @@ export default {
   name: 'App'
 }
 </script>
+
+<style>
+body {
+	margin: 0;
+	padding: 0;
+	background: #f4f6f8;
+}
+.el-table__body-wrapper::-webkit-scrollbar {
+	width: 12px; /*滚动条宽度*/
+	height: 10px; /*滚动条高度*/
+}
+.el-table__body-wrapper::-webkit-scrollbar-track {
+	border-radius: 10px; /*滚动条的背景区域的圆角*/
+	-webkit-box-shadow: inset 0 0 15px rgba(238,238,238, 0.3);
+	background-color: #eeeeee; /*滚动条的背景颜色*/
+}
+.el-table__body-wrapper::-webkit-scrollbar-thumb {
+	border-radius: 10px; /*滚动条的圆角*/
+	-webkit-box-shadow: inset 0 0 15px rgba(145, 143, 0143, 0.3);
+	background-color: rgb(145, 143, 143); /*滚动条的背景颜色*/
+}
+</style>

+ 186 - 0
src/api/config.js

@@ -72,3 +72,189 @@ export function updateStockistConfig(data, id) {
     data
   })
 }
+
+/**
+ * 获取奖金配置
+ * @returns {*}
+ */
+export function fetchBonusConfig() {
+  return request({
+    url: '/v1/config/bonus-opt',
+    method: 'get'
+  })
+}
+
+/**
+ * 更新奖金配置
+ * @param data
+ * @returns {*}
+ */
+export function updateBonusConfig(data) {
+  return request({
+    url: '/v1/config/bonus',
+    method: 'post',
+    data
+  })
+}
+
+/**
+ * 更新会员等级配置
+ * @param data
+ * @returns {*}
+ */
+export function updateBonusDecLevelConfig(data) {
+  return request({
+    url: '/v1/config/bonus-dec-level',
+    method: 'post',
+    data
+  })
+}
+
+/**
+ * 更新管理星级配置
+ * @param data
+ * @returns {*}
+ */
+export function updateBonusEmpLevelConfig(data) {
+  return request({
+    url: '/v1/config/bonus-emp-level',
+    method: 'post',
+    data
+  })
+}
+
+/**
+ * 更新皇冠星级配置
+ * @param data
+ * @returns {*}
+ */
+export function updateBonusCrownLevelConfig(data) {
+  return request({
+    url: '/v1/config/bonus-crown-level',
+    method: 'post',
+    data
+  })
+}
+
+/**
+ * 查询转账配置
+ * @returns {*}
+ */
+export function fetchTransferConfig() {
+  return request({
+    url: '/v1/config/transfer',
+    method: 'get'
+  })
+}
+
+/**
+ * 更新转账配置
+ * @param data
+ * @returns {*}
+ */
+export function updateTransferConfig(data) {
+  return request({
+    url: '/v1/config/transfer',
+    method: 'post',
+    data
+  })
+}
+
+/**
+ * 查询观察月份限制
+ * @returns {*}
+ */
+export function fetchMonthLimit() {
+  return request({
+    url: '/v1/config/month-limit',
+    method: 'get'
+  })
+}
+
+/**
+ * 更新观察月份限制
+ * @param data
+ * @returns {*}
+ */
+export function updateMonthLimit(data) {
+  return request({
+    url: '/v1/config/month-limit',
+    method: 'post',
+    data
+  })
+}
+
+/**
+ * 查询会员级别配置
+ * @returns {*}
+ */
+export function fetchDecLevelConfig() {
+  return request({
+    url: '/v1/config/dec-level',
+    method: 'get'
+  })
+}
+
+/**
+ * 更新会员级别配置
+ * @param data
+ * @param id
+ * @returns {*}
+ */
+export function updateDecLevel(data, id) {
+  return request({
+    url: `/v1/config/dec-level-edit/${id}`,
+    method: 'post',
+    data
+  })
+}
+
+/**
+ * 更新转账配置
+ * @param data
+ * @returns {*}
+ */
+export function updateDecLevelConfig(data) {
+  return request({
+    url: '/v1/config/transfer',
+    method: 'post',
+    data
+  })
+}
+
+/**
+ * 切换开关
+ * @param data
+ * @returns {*}
+ */
+export function updateOpenUpgradeConfig(data) {
+  return request({
+    url: '/v1/config/open-upgrade',
+    method: 'post',
+    data
+  })
+}
+
+/**
+ * 查询其他配置
+ * @returns {*}
+ */
+export function fetchOtherConfig() {
+  return request({
+    url: '/v1/config/other',
+    method: 'get'
+  })
+}
+
+/**
+ * 更新其他配置
+ * @param data
+ * @returns {*}
+ */
+export function updateOtherConfig(data) {
+  return request({
+    url: '/v1/config/other',
+    method: 'post',
+    data
+  })
+}

+ 1 - 1
src/components/Breadcrumb/index.vue

@@ -41,7 +41,7 @@ export default {
       const first = matched[0]
 
       if (!this.isDashboard(first)) {
-        matched = [{ path: '/dashboard', meta: { title: 'dashboard' }}].concat(matched)
+        matched = [{ path: '/dashboard/index', meta: { title: 'dashboard' }}].concat(matched)
       }
 
       this.levelList = matched.filter(item => item.meta && item.meta.title && item.meta.breadcrumb !== false)

+ 43 - 1
src/lang/en.js

@@ -201,6 +201,7 @@ export default {
     require: 'is required',
     createdAt: '创建时间',
     updatedAt: '更新时间',
+    updatedAdmin: '更新人',
     actionThisData: '操作该数据',
     selectType: '筛选类型',
     selectFunction: '筛选方式',
@@ -326,7 +327,48 @@ export default {
     confirmToChangeExchangeRate: '是否确认修改汇率?',
     levelName: '级别名称',
     sort: 'Sort',
-    modifiedStockist: '修改报单中心'
+    modifiedStockist: '修改报单中心',
+    openTransfer: '开启转账功能',
+    walletType: '转出/转入钱包类型',
+    lowerLimitAmountTransferOut: '转出金额下限',
+    upperLimitAmountTransferOut: '转出金额上限',
+    serviceCharge: '手续费%',
+    lowerLimitServiceCharge: '手续费下限',
+    upperLimitServiceCharge: '手续费上限',
+    periodUpperLimitAmountTransferOut: '期转出总额上限',
+    monthUpperLimitAmountTransferOut: '结算月转出总额上限',
+    whetherEnable: '是否启用',
+    pour: '注',
+    periodTotalAmountTransferOut: '期转出总额上限是指该转账规则一期之内会员最多可以转账的总金额',
+    monthTotalAmountTransferOut: '结算月转出总额上限是指该转账规则一个结算月内会员最多可转账的总金额',
+    ifNullRestrict: '填写空则为不限制',
+    needPerf: '所需业绩(BV)',
+    enterNumber: '请输入正整数数字',
+    enterZeroIsHoleSite: '输入0代表无观察期,即全站升级单为全额升级',
+    updatePeriodUnderObservation: '更新观察期',
+    baseConfig: '基本配置',
+    repeatAbout: '复消相关',
+    teamBonusConfig: '团队奖配置',
+    bonusPercent: '拿奖比例',
+    capBonus: '个人封顶值',
+    manageStarConfig: '管理星级配置',
+    manageBonusPercent: '蓝星奖比例',
+    tourBonusPercent: '旅游奖比例',
+    carFundBonusPercent: '车奖比例',
+    villaFundBonusPercent: '房奖比例',
+    achieveMemberNo: '推荐会员达标数',
+    achievePerfBV: '推荐达标及格获奖BV',
+    achieveBV: '推荐达标不及格获奖BV',
+    crownStarConfig: '皇冠星级配置',
+    levelScore: '级别分数(BV)',
+    upgradeScore: '升级分数(BV)',
+    score: '分',
+    bonusAmount: '奖金金额',
+    saleAmountCap: '销售额条件',
+    memberAbout: '会员相关',
+    homeAbout: '前台相关',
+    withdrawalAbout: '提现相关',
+    otherAbout: '其他'
   },
 
   // 财务管理

+ 43 - 2
src/lang/zh.js

@@ -185,7 +185,6 @@ export default {
     no: '否',
     view: '查看',
     select: '查询',
-    reset: '清空',
     startDate: '开始时间',
     endDate: '结束时间',
     deleteTips: '确认删除所选数据?',
@@ -203,6 +202,7 @@ export default {
     require: '必须填写',
     createdAt: '创建时间',
     updatedAt: '更新时间',
+    updatedAdmin: '更新人',
     actionThisData: '操作该数据',
     selectType: '筛选类型',
     selectFunction: '筛选方式',
@@ -329,7 +329,48 @@ export default {
     confirmToChangeExchangeRate: '是否确认修改汇率?',
     levelName: '级别名称',
     sort: '序号',
-    modifiedStockist: '修改报单中心'
+    modifiedStockist: '修改报单中心',
+    openTransfer: '开启转账功能',
+    walletType: '转出/转入钱包类型',
+    lowerLimitAmountTransferOut: '转出金额下限',
+    upperLimitAmountTransferOut: '转出金额上限',
+    serviceCharge: '手续费%',
+    lowerLimitServiceCharge: '手续费下限',
+    upperLimitServiceCharge: '手续费上限',
+    periodUpperLimitAmountTransferOut: '期转出总额上限',
+    monthUpperLimitAmountTransferOut: '结算月转出总额上限',
+    whetherEnable: '是否启用',
+    pour: '注',
+    periodTotalAmountTransferOut: '期转出总额上限是指该转账规则一期之内会员最多可以转账的总金额',
+    monthTotalAmountTransferOut: '结算月转出总额上限是指该转账规则一个结算月内会员最多可转账的总金额',
+    ifNullRestrict: '填写空则为不限制',
+    needPerf: '所需业绩(BV)',
+    enterNumber: '请输入正整数数字',
+    enterZeroIsHoleSite: '输入0代表无观察期,即全站升级单为全额升级',
+    updatePeriodUnderObservation: '更新观察期',
+    baseConfig: '基本配置',
+    repeatAbout: '复消相关',
+    teamBonusConfig: '团队奖配置',
+    bonusPercent: '拿奖比例',
+    capBonus: '个人封顶值',
+    manageStarConfig: '管理星级配置',
+    manageBonusPercent: '蓝星奖比例',
+    tourBonusPercent: '旅游奖比例',
+    carFundBonusPercent: '车奖比例',
+    villaFundBonusPercent: '房奖比例',
+    achieveMemberNo: '推荐会员达标数',
+    achievePerfBV: '推荐达标及格获奖BV',
+    achieveBV: '推荐达标不及格获奖BV',
+    crownStarConfig: '皇冠星级配置',
+    levelScore: '级别分数(BV)',
+    upgradeScore: '升级分数(BV)',
+    score: '分',
+    bonusAmount: '奖金金额',
+    saleAmountCap: '销售额条件',
+    memberAbout: '会员相关',
+    homeAbout: '前台相关',
+    withdrawalAbout: '提现相关',
+    otherAbout: '其他'
   },
 
   // 财务

+ 17 - 12
src/layout/components/Navbar.vue

@@ -6,9 +6,9 @@
 
     <div class="right-menu">
       <template v-if="device!=='mobile'">
-        <search id="header-search" class="right-menu-item" />
+<!--        <search id="header-search" class="right-menu-item" />-->
 
-        <error-log class="errLog-container right-menu-item hover-effect" />
+<!--        <error-log class="errLog-container right-menu-item hover-effect" />-->
 
         <screenfull id="screenfull" class="right-menu-item hover-effect" />
 
@@ -22,7 +22,7 @@
 
       <el-dropdown class="avatar-container right-menu-item hover-effect" trigger="click">
         <div class="avatar-wrapper">
-          <img :src="avatar+'?imageView2/1/w/80/h/80'" class="user-avatar" alt="">
+          <img src="@/assets/avatar/avatar.gif" class="user-avatar" alt="">
           <i class="el-icon-caret-bottom" />
         </div>
         <el-dropdown-menu slot="dropdown">
@@ -31,19 +31,19 @@
               {{ $t('navbar.profile') }}
             </el-dropdown-item>
           </router-link>
-          <router-link to="/">
+          <router-link to="/dashboard/index">
             <el-dropdown-item>
               {{ $t('navbar.dashboard') }}
             </el-dropdown-item>
           </router-link>
-          <a target="_blank" href="https://github.com/PanJiaChen/vue-element-admin/">
-            <el-dropdown-item>
-              {{ $t('navbar.github') }}
-            </el-dropdown-item>
-          </a>
-          <a target="_blank" href="https://panjiachen.github.io/vue-element-admin-site/#/">
-            <el-dropdown-item>Docs</el-dropdown-item>
-          </a>
+<!--          <a target="_blank" href="https://github.com/PanJiaChen/vue-element-admin/">-->
+<!--            <el-dropdown-item>-->
+<!--              {{ $t('navbar.github') }}-->
+<!--            </el-dropdown-item>-->
+<!--          </a>-->
+<!--          <a target="_blank" href="https://panjiachen.github.io/vue-element-admin-site/#/">-->
+<!--            <el-dropdown-item>Docs</el-dropdown-item>-->
+<!--          </a>-->
           <el-dropdown-item divided @click.native="logout">
             <span style="display:block;">{{ $t('navbar.logOut') }}</span>
           </el-dropdown-item>
@@ -80,6 +80,11 @@ export default {
       'device'
     ])
   },
+	data() {
+		return {
+
+		}
+	},
   methods: {
     toggleSideBar() {
       this.$store.dispatch('app/toggleSideBar')

+ 1 - 1
src/router/index.js

@@ -173,7 +173,7 @@ export const constantRoutes = [
     redirect: '/dashboard',
     children: [
       {
-        path: 'dashboard',
+        path: '/dashboard/index',
         component: () => import('@/views/dashboard/index'),
         name: 'Dashboard',
         meta: { title: 'dashboard', icon: 'dashboard', affix: true }

+ 24 - 0
src/router/modules/config.js

@@ -25,6 +25,30 @@ const configRouter = {
       component: () => import('@/views/config/stockist-config'),
       name: 'stockistConfig',
       meta: { title: '报单中心配置', icon: 'user', noCache: true }
+    },
+    {
+      path: 'bonus-opt', // 奖金配置
+      component: () => import('@/views/config/bonus-config'),
+      name: 'bonusConfig',
+      meta: { title: '奖金配置', icon: 'user', noCache: true }
+    },
+    {
+      path: 'transfer', // 转账配置
+      component: () => import('@/views/config/transfer-config'),
+      name: 'transferConfig',
+      meta: { title: '转账配置', icon: 'user', noCache: true }
+    },
+    {
+      path: 'dec-level', // 会员级别配置
+      component: () => import('@/views/config/dec-level-config'),
+      name: 'decLevelConfig',
+      meta: { title: '会员级别配置', icon: 'user', noCache: true }
+    },
+    {
+      path: 'other', // 其他配置
+      component: () => import('@/views/config/other-config'),
+      name: 'otherConfig',
+      meta: { title: '其他配置', icon: 'user', noCache: true }
     }
   ]
 }

+ 4 - 4
src/router/modules/member.js

@@ -7,10 +7,10 @@ const memberRouter = {
   component: Layout,
   redirect: '/user/index',
   name: 'Member Management',
-  meta: {
-    title: 'user',
-    icon: 'el-icon-user-solid'
-  },
+  // meta: {
+  //   title: 'user',
+  //   icon: 'el-icon-user-solid'
+  // },
   children: [
     {
       path: 'index', // 会员列表

+ 394 - 0
src/views/config/bonus-config.vue

@@ -0,0 +1,394 @@
+<template>
+  <div v-loading="loading">
+    <div v-if="permission.hasPermission(`config/bonus`)" class="panel">
+      <div class="panel-heading">{{ $t('config.baseConfig') }}</div>
+      <div class="panel-wrapper">
+        <div class="panel-body">
+          <el-form ref="form" :model="form" label-width="250px" :label-position="labelPosition">
+            <template v-for="item in configData">
+              <div v-if="item.SORT==='101'" class="hr-tip"><span>{{ $t('config.repeatAbout') }}</span></div>
+              <el-form-item :key="item.CONFIG_NAME" :label="item.TITLE">
+                <template v-if="item.INPUT_TYPE==='2'">
+                  <el-select v-model="item.VALUE" placeholder="请选择">
+                    <el-option v-for="optionItem in item.OPTIONS" :key="optionItem.label" :label="optionItem.label" :value="optionItem.value" />
+                  </el-select>
+                </template>
+                <template v-else-if="item.INPUT_TYPE==='3'">
+                  <el-select v-model="item.VALUE" placeholder="请选择" multiple style="width: 100%;">
+                    <el-option v-for="optionItem in item.OPTIONS" :key="optionItem.label" :label="optionItem.label" :value="optionItem.value" />
+                  </el-select>
+                </template>
+                <template v-else-if="item.INPUT_TYPE==='4'">
+                  <el-date-picker v-model="item.VALUE" type="year" placeholder="选择年" />
+                </template>
+                <template v-else-if="item.INPUT_TYPE==='5'">
+                  <el-date-picker v-model="item.VALUE" type="datetime" placeholder="Select date" />
+                </template>
+                <template v-else-if="item.INPUT_TYPE==='6'">
+                  <el-date-picker v-model="item.VALUE" type="date" placeholder="Select date" />
+                </template>
+                <template v-else-if="item.INPUT_TYPE==='7'">
+                  <el-time-select v-model="item.VALUE" :picker-options="{start: item.OPTIONS.start, end: item.OPTIONS.end, step: item.OPTIONS.step}" placeholder="选择时间" />
+                </template>
+                <template v-else-if="item.INPUT_TYPE==='8'">
+                  <el-switch v-model="item.VALUE" />
+                </template>
+                <template v-else-if="item.INPUT_TYPE==='10'">
+                  <el-table :data="item.VALUE" stripe style="width: 100%;">
+                    <el-table-column prop="outTitle" :label="$t('config.sort')">
+                      <template slot-scope="scope">
+                        {{ scope.row.sort }}
+                      </template>
+                    </el-table-column>
+                    <el-table-column prop="outTitle" :label="$t('config.bonusAmount')">
+                      <template slot-scope="scope">
+                        <el-input v-model="scope.row.salesCondition" placeholder="请输入内容" />
+                      </template>
+                    </el-table-column>
+                    <el-table-column prop="outTitle" :label="$t('config.saleAmountCap')">
+                      <template slot-scope="scope">
+                        <el-input v-model="scope.row.awardAmount" placeholder="请输入内容" />
+                      </template>
+                    </el-table-column>
+                  </el-table>
+                </template>
+                <template v-else>
+                  <el-input v-model="item.VALUE" placeholder="请输入内容">
+                    <template v-if="!!item.UNIT" slot="append">{{ item.UNIT }}</template>
+                  </el-input>
+                </template>
+              </el-form-item>
+            </template>
+          </el-form>
+        </div>
+        <div class="panel-footer">
+          <el-button type="primary" :loading="submitButtonStat" style="float: right;" @click="onSubmit">{{ $t('table.confirm') }}</el-button>
+        </div>
+      </div>
+    </div>
+
+    <div v-if="permission.hasPermission(`config/bonus-dec-level`)" class="panel">
+      <div class="panel-heading">{{ $t('config.teamBonusConfig') }}</div>
+      <div class="panel-wrapper">
+        <div class="panel-body">
+          <el-table :data="decLevelTableData" stripe style="width: 100%;">
+            <el-table-column prop="LEVEL_NAME" :label="$t('config.levelName')" min-width="100px" />
+            <el-table-column :label="$t('config.bonusPercent')" min-width="150px">
+              <template slot-scope="scope">
+                <el-input v-model="scope.row.QY_PERCENT" min="0" max="100">
+                  <template slot="append">%</template>
+                </el-input>
+              </template>
+            </el-table-column>
+            <el-table-column :label="$t('config.capBonus')" min-width="170px">
+              <template slot-scope="scope">
+                <el-input v-model="scope.row.INCOME_CAP" min="0">
+                  <template slot="append">$</template>
+                </el-input>
+              </template>
+            </el-table-column>
+          </el-table>
+        </div>
+        <div class="panel-footer">
+          <el-button type="primary" :loading="qySubmitButtonStat" style="float: right;" @click="onQYSubmit">{{ $t('table.confirm') }}</el-button>
+        </div>
+      </div>
+    </div>
+
+    <div v-if="permission.hasPermission(`config/bonus-emp-level`)" class="panel">
+      <div class="panel-heading">{{ $t('config.manageStarConfig') }}</div>
+      <div class="panel-wrapper">
+        <div class="panel-body">
+          <el-table :data="empLevelTableData" stripe style="width: 100%;">
+            <el-table-column prop="LEVEL_NAME" :label="$t('config.levelName')" min-width="120px" />
+            <el-table-column :label="$t('config.achieveMemberNo')" min-width="100px">
+              <template slot-scope="scope">
+                <el-input v-model="scope.row.ACHIEVE_MEMBER_NUM" type="number" min="0" max="1000" />
+              </template>
+            </el-table-column>
+            <el-table-column :label="$t('config.achievePerfBV')" min-width="120px">
+              <template slot-scope="scope">
+                <el-input v-model="scope.row.ACHIEVE_PERF_PV" type="number" min="0" />
+              </template>
+            </el-table-column>
+            <el-table-column :label="$t('config.achieveBV')" min-width="120px">
+              <template slot-scope="scope">
+                <el-input v-model="scope.row.ACHIEVE_PV" type="number" />
+              </template>
+            </el-table-column>
+            <el-table-column :label="$t('config.manageBonusPercent')" min-width="150px">
+              <template slot-scope="scope">
+                <el-input v-model="scope.row.BS_PERCENT" min="0" max="100">
+                  <template slot="append">%</template>
+                </el-input>
+              </template>
+            </el-table-column>
+            <el-table-column :label="$t('config.tourBonusPercent')" min-width="150px">
+              <template slot-scope="scope">
+                <el-input v-model="scope.row.TOURISM_PERCENT" min="0" max="100">
+                  <template slot="append">%</template>
+                </el-input>
+              </template>
+            </el-table-column>
+            <el-table-column :label="$t('config.carFundBonusPercent')" min-width="150px">
+              <template slot-scope="scope">
+                <el-input v-model="scope.row.GARAGE_PERCENT" min="0" max="100">
+                  <template slot="append">%</template>
+                </el-input>
+              </template>
+            </el-table-column>
+          </el-table>
+        </div>
+        <div class="panel-footer">
+          <el-button type="primary" :loading="ycSubmitButtonStat" style="float: right;" @click="onYCSubmit">{{ $t('table.confirm') }}</el-button>
+        </div>
+      </div>
+    </div>
+
+    <div v-if="permission.hasPermission(`config/bonus-star-level`)" class="panel">
+      <div class="panel-heading">{{ $t('config.crownStarConfig') }}</div>
+      <div class="panel-wrapper">
+        <div class="panel-body">
+          <el-table :data="crownLevelTableData" stripe style="width: 100%;">
+            <el-table-column prop="LEVEL_NAME" :label="$t('config.levelName')" min-width="110px" />
+            <el-table-column :label="$t('config.levelScore')" min-width="180px">
+              <template slot-scope="scope">
+                <el-input v-model="scope.row.LEVEL_SCORE" min="0">
+                  <template slot="append">{{ $t('config.score') }}</template>
+                </el-input>
+              </template>
+            </el-table-column>
+            <el-table-column :label="$t('config.upgradeScore')" min-width="180px">
+              <template slot-scope="scope">
+                <el-input v-model="scope.row.UPGRADE_SCORE" min="0">
+                  <template slot="append">{{ $t('config.score') }}</template>
+                </el-input>
+              </template>
+            </el-table-column>
+            <el-table-column :label="$t('config.tourBonusPercent')" min-width="150px">
+              <template slot-scope="scope">
+                <el-input v-model="scope.row.TOURISM_PERCENT" min="0" max="100">
+                  <template slot="append">%</template>
+                </el-input>
+              </template>
+            </el-table-column>
+            <el-table-column :label="$t('config.carFundBonusPercent')" min-width="150px">
+              <template slot-scope="scope">
+                <el-input v-model="scope.row.GARAGE_PERCENT" min="0" max="100">
+                  <template slot="append">%</template>
+                </el-input>
+              </template>
+            </el-table-column>
+            <el-table-column :label="$t('config.villaFundBonusPercent')" min-width="150px">
+              <template slot-scope="scope">
+                <el-input v-model="scope.row.VILLA_PERCENT" min="0" max="100">
+                  <template slot="append">%</template>
+                </el-input>
+              </template>
+            </el-table-column>
+          </el-table>
+        </div>
+        <div class="panel-footer">
+          <el-button type="primary" :loading="starSubmitButtonStat" style="float: right;" @click="onStarSubmit">{{ $t('table.confirm') }}</el-button>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import permission from '@/utils/permission'
+import { getScreenWidth } from '@/utils'
+import {
+  fetchBonusConfig,
+  updateBonusConfig,
+  updateBonusCrownLevelConfig,
+  updateBonusDecLevelConfig,
+  updateBonusEmpLevelConfig
+} from '@/api/config'
+
+export default {
+  name: 'ConfigBonusOpt',
+  data() {
+    return {
+      decLevelTableData: null,
+      empLevelTableData: null,
+      crownLevelTableData: null,
+      loading: true,
+      submitButtonStat: false,
+      qySubmitButtonStat: false,
+      glSubmitButtonStat: false,
+      ycSubmitButtonStat: false,
+      starSubmitButtonStat: false,
+      configData: null,
+      permission: permission,
+      screenWidth: getScreenWidth() > 600 ? '500px' : getScreenWidth() + 'px',
+      labelPosition: getScreenWidth() > 600 ? 'right' : 'top'
+    }
+  },
+  computed: {
+    form: function() {
+      const result = {}
+      for (const i in this.configData) {
+        result[i] = this.configData[i].VALUE
+      }
+      return result
+    }
+  },
+  mounted() {
+    this.fetchBonusConfig()
+  },
+  methods: {
+    fetchBonusConfig() {
+      this.loading = true
+      fetchBonusConfig().then(response => {
+        this.configData = response.data.config
+        this.decLevelTableData = response.data.decLevel
+        this.empLevelTableData = response.data.empLevel
+        this.crownLevelTableData = response.data.crownLevel
+
+        setTimeout(() => {
+          this.loading = false
+        }, 0.5 * 1000)
+      })
+    },
+    onSubmit() {
+      this.submitButtonStat = true
+      updateBonusConfig(this.form).then(response => {
+        this.$message({
+          message: response.data,
+          type: 'success'
+        })
+
+        setTimeout(() => {
+          this.submitButtonStat = false
+        }, 0.5 * 1000)
+      }).catch(error => {
+        this.$message({
+          message: error,
+          type: 'warning'
+        })
+        this.submitButtonStat = false
+      })
+    },
+    onQYSubmit() {
+      this.qySubmitButtonStat = true
+      updateBonusDecLevelConfig({ data: this.decLevelTableData }).then(response => {
+        this.$message({
+          message: response.data,
+          type: 'success'
+        })
+
+        setTimeout(() => {
+          this.qySubmitButtonStat = false
+        }, 0.5 * 1000)
+      }).catch(error => {
+        this.$message({
+          message: error,
+          type: 'warning'
+        })
+        this.qySubmitButtonStat = false
+      })
+    },
+    onGLSubmit() {
+      this.glSubmitButtonStat = true
+      updateBonusDecLevelConfig({ data: this.decLevelTableData }).then(response => {
+        this.$message({
+          message: response.data,
+          type: 'success'
+        })
+
+        setTimeout(() => {
+          this.glSubmitButtonStat = false
+        }, 0.5 * 1000)
+      }).catch(error => {
+        this.$message({
+          message: error,
+          type: 'warning'
+        })
+        this.glSubmitButtonStat = false
+      })
+    },
+    onYCSubmit() {
+      this.ycSubmitButtonStat = true
+      updateBonusEmpLevelConfig({ data: this.empLevelTableData }).then(response => {
+        this.$message({
+          message: response.data,
+          type: 'success'
+        })
+
+        setTimeout(() => {
+          this.ycSubmitButtonStat = false
+        }, 0.5 * 1000)
+      }).catch(error => {
+        this.$message({
+          message: error,
+          type: 'warning'
+        })
+        this.ycSubmitButtonStat = false
+      })
+    },
+    onStarSubmit() {
+      this.starSubmitButtonStat = true
+      updateBonusCrownLevelConfig({ data: this.crownLevelTableData }).then(response => {
+        this.$message({
+          message: response.data,
+          type: 'success'
+        })
+
+        setTimeout(() => {
+          this.starSubmitButtonStat = false
+        }, 0.5 * 1000)
+      }).catch(error => {
+        this.$message({
+          message: error,
+          type: 'warning'
+        })
+        this.starSubmitButtonStat = false
+      })
+    }
+  }
+}
+</script>
+
+<style>
+.app-main {
+	padding: 15px !important;
+}
+.app-container {
+	padding: 0;
+}
+.white-box {
+	padding: 15px;
+}
+.form-page {
+	width: 100%;
+}
+  .hr-tip {
+    font-size: 12px;
+    position: relative;
+    text-align: center;
+    height: 30px;
+    line-height: 30px;
+    color: #999;
+    margin-bottom: 20px;
+  }
+
+  .hr-tip:before {
+    content: '';
+    display: block;
+    position: absolute;
+    left: 0;
+    right: 0;
+    top: 14px;
+    border-bottom: 1px dashed #ddd;
+    height: 1px;
+  }
+
+  .hr-tip span {
+    display: inline-block;
+    background: #fff;
+    position: relative;
+    padding: 0 10px;
+  }
+</style>

+ 232 - 0
src/views/config/dec-level-config.vue

@@ -0,0 +1,232 @@
+<template>
+  <div v-loading="loading">
+    <div class="white-box">
+      <!-- 会员等级 -->
+      <el-table :data="tableData" stripe style="width: 100%;">
+        <el-table-column prop="LEVEL_NAME" :label="$t('config.levelName')" min-width="100px">
+          <template slot-scope="{row}">
+            <el-tag type="warning" size="small" class="no-border">{{ row.LEVEL_NAME }}</el-tag>
+          </template>
+        </el-table-column>
+        <el-table-column prop="PERF" :label="$t('config.needPerf')" min-width="120px">
+          <template slot-scope="{row}">
+            <el-tag type="danger" size="small" class="no-border">{{ row.PERF }}</el-tag>
+          </template>
+        </el-table-column>
+        <el-table-column :label="$t('common.updatedAdmin')" prop="UPDATE_ADMIN" min-width="100px" />
+        <el-table-column :label="$t('common.updatedAt')" min-width="100px">
+          <template slot-scope="{row}">
+            {{ row.UPDATED_AT | parseTime('{y}-{m}-{d} {h}:{i}:{s}') }}
+          </template>
+        </el-table-column>
+        <el-table-column :label="$t('common.action')" min-width="90px">
+          <template slot-scope="{row}">
+            <el-button type="primary" plain size="small" @click="editHandle(row)">{{ $t('common.edit') }}</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+
+      <!-- 更新观察期 -->
+      <el-form ref="form" :model="form" label-width="150px" :label-position="labelPosition" style="margin-top: 25px;">
+        <el-form-item :label="form.monthLimitTITLE">
+          <el-input v-model="form.monthLimitVALUE" />
+          <div class="white-box-footer" style="line-height: 1.2;color: #999;">
+            <p>{{ $t('config.pour') }}:</p>
+            <p>(1) {{ $t('config.enterNumber') }};</p>
+            <p>(2) {{ $t('config.enterZeroIsHoleSite') }};</p>
+          </div>
+          <div class="white-box-footer">
+            <el-button type="primary" :loading="submitButtonStat" @click="onSubmit">{{ $t('config.updatePeriodUnderObservation') }}</el-button>
+          </div>
+        </el-form-item>
+      </el-form>
+
+      <!-- 开启会员升级单	-->
+      <el-switch v-model="value1" :active-text="value1Text" @change="switchUpgrade" />
+    </div>
+
+    <!-- 编辑	-->
+    <el-dialog v-loading="editLoading" :title="$t('common.edit')" :visible.sync="dialog" :width="screenWidth" style="margin-top: -80px">
+      <el-form ref="editForm" :model="editForm" :label-position="labelPosition" label-width="100px" style="width: 100%; margin-top: -30px; margin-bottom: -15px;">
+        <el-row :gutter="3">
+          <el-col :xs="24" :sm="24" :lg="12">
+            <el-input v-show="false" v-model="editForm.ID" size="small" type="text" />
+            <el-form-item :label="$t('config.levelName')" prop="LEVEL_NAME" required style="margin-bottom: 10px; width: 100%;">
+              <el-input v-model.trim="editForm.LEVEL_NAME" size="small" type="text" style="min-width: 300px;" />
+            </el-form-item>
+            <el-form-item :label="$t('config.needPerf')" prop="PERF" required style="margin-bottom: 10px; width: 100%;">
+              <el-input v-model="editForm.PERF" size="small" type="text" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-form-item style="margin-bottom: 15px;">
+          <el-button type="warning" size="mini" @click="dialog = false">{{ $t('table.cancel') }}</el-button>
+          <el-button type="primary" size="mini" @click="onSubmitDecLevel">{{ $t('table.confirm') }}</el-button>
+        </el-form-item>
+      </el-form>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  fetchDecLevelConfig,
+  fetchMonthLimit, updateDecLevel,
+  updateMonthLimit,
+  updateOpenUpgradeConfig
+} from '@/api/config'
+import waves from '@/directive/waves'
+import { getScreenWidth } from '@/utils'
+
+export default {
+  name: 'DecLevelConfig',
+  directives: { waves },
+  data() {
+    return {
+      value1: true,
+      value1Text: '',
+      submitButtonStat: false,
+      form: {
+        monthLimitTITLE: '',
+        monthLimitVALUE: ''
+      },
+      tableData: null,
+      loading: true,
+      screenWidth: getScreenWidth() > 500 ? '500px' : getScreenWidth() + 'px',
+      labelPosition: getScreenWidth() >= 500 ? 'right' : 'top',
+      dialog: false,
+      editLoading: false,
+      editForm: {
+        ID: '',
+        LEVEL_NAME: '',
+        PERF: '',
+        isAdjustGift: false,
+        isDec: false
+      }
+    }
+  },
+  mounted() {
+    this.fetchDecLevelConfig()
+    this.fetchMonthLimit()
+  },
+  methods: {
+    fetchDecLevelConfig() {
+      this.loading = true
+      fetchDecLevelConfig().then(response => {
+        this.tableData = response.data.list
+
+        setTimeout(() => {
+          this.loading = false
+        }, 0.5 * 1000)
+      })
+    },
+    fetchMonthLimit() {
+      fetchMonthLimit().then(response => {
+        this.form.monthLimitTITLE = response.data.observe.TITLE
+        this.form.monthLimitVALUE = response.data.observe.VALUE
+        this.value1 = response.data.isOpenUpgrade.VALUE > 0 				// 是否开启会员升级功能
+        this.value1Text = response.data.isOpenUpgrade.TITLE
+      })
+    },
+    // 切换开关
+    switchUpgrade() {
+      const data = { isOpen: this.value1 === true ? 1 : 0 }
+      this.submitButtonStat = true
+      updateOpenUpgradeConfig(data).then(response => {
+        this.$message({
+          message: response.data,
+          type: 'success'
+        })
+
+        setTimeout(() => {
+          this.submitButtonStat = false
+          this.getData()
+        }, 0.5 * 1000)
+      }).catch(error => {
+        this.$message({
+          message: error,
+          type: 'warning'
+        })
+        this.submitButtonStat = false
+        this.getData()
+      })
+    },
+    onSubmit() {
+      this.submitButtonStat = true
+      const data = { month: this.form.monthLimitVALUE }
+      updateMonthLimit(data).then(response => {
+        this.$message({
+          message: response.data,
+          type: 'success'
+        })
+
+        setTimeout(() => {
+          this.submitButtonStat = false
+          this.getData()
+        }, 0.5 * 1000)
+      }).catch(error => {
+        this.$message({
+          message: error,
+          type: 'warning'
+        })
+        this.submitButtonStat = false
+        this.getData()
+      })
+    },
+    editHandle(row) {
+      this.editForm.ID = row.ID
+      this.editForm.LEVEL_NAME = row.LEVEL_NAME
+      this.editForm.PERF = row.PERF
+      this.editForm.isAdjustGift = row.IS_ADJUST_GIFT === '1'
+      this.editForm.isDec = row.IS_DEC === '1'
+      this.dialog = true
+    },
+    onSubmitDecLevel() {
+      this.editLoading = true
+      const data = {
+        levelName: this.editForm.LEVEL_NAME,
+        perf: this.editForm.PERF,
+        isAdjustGift: this.form.isAdjustGift ? 1 : 0,
+        isDec: this.form.isDec ? 1 : 0
+      }
+      updateDecLevel(data, this.editForm.ID).then(response => {
+        this.$message({
+          message: response.data,
+          type: 'success'
+        })
+
+        setTimeout(() => {
+          this.editLoading = false
+          this.dialog = false
+          this.fetchDecLevelConfig()
+        }, 0.5 * 1000)
+      }).catch(error => {
+        this.$message({
+          message: error,
+          type: 'warning'
+        })
+        this.editLoading = false
+        this.fetchDecLevelConfig()
+      })
+    }
+  }
+}
+</script>
+
+<style scoped>
+/deep/ .el-form-item__label {
+  text-align: left !important;
+}
+.app-main {
+	padding: 15px;
+}
+.app-container {
+	padding: 0;
+}
+.white-box {
+	padding: 15px;
+}
+.form-page {
+	width: 100%;
+}
+</style>

+ 12 - 1
src/views/config/exchange-rate.vue

@@ -93,5 +93,16 @@ export default {
 </script>
 
 <style scoped>
-
+.app-main {
+	padding: 15px;
+}
+.app-container {
+	padding: 0;
+}
+.white-box {
+	padding: 15px;
+}
+.form-page {
+	width: 100%;
+}
 </style>

+ 165 - 0
src/views/config/other-config.vue

@@ -0,0 +1,165 @@
+<template>
+  <div v-loading="loading">
+    <div class="white-box">
+      <el-form ref="form" :model="form" label-width="250px" :label-position="labelPosition">
+        <template v-for="item in configData">
+          <div v-if="item.SORT==='1'" class="hr-tip"><span>{{ $t('config.memberAbout') }}</span></div>
+          <div v-if="item.SORT==='13'" class="hr-tip"><span>{{ $t('config.homeAbout') }}</span></div>
+          <div v-if="item.SORT==='16'" class="hr-tip"><span>{{ $t('config.withdrawalAbout') }}</span></div>
+          <div v-if="item.SORT==='41'" class="hr-tip"><span>{{ $t('config.otherAbout') }}</span></div>
+          <el-form-item :key="item.CONFIG_NAME" :label="item.TITLE">
+            <template v-if="(item.INPUT_TYPE).toString()==='2'">
+              <el-select v-model="item.VALUE" placeholder="请选择">
+                <el-option v-for="optionItem in item.OPTIONS" :key="optionItem.label" :label="optionItem.label" :value="optionItem.value" />
+              </el-select>
+            </template>
+            <template v-else-if="(item.INPUT_TYPE).toString()==='3'">
+              <el-checkbox-group v-model="item.VALUE">
+                <el-checkbox v-for="optionItem in item.OPTIONS" :key="optionItem.label" :label="optionItem.label" :value="optionItem.value" />
+              </el-checkbox-group>
+            </template>
+            <template v-else-if="(item.INPUT_TYPE).toString()==='4'">
+              <el-date-picker v-model="item.VALUE" type="year" placeholder="选择年" />
+            </template>
+            <template v-else-if="(item.INPUT_TYPE).toString()==='5'">
+              <el-date-picker v-model="item.VALUE" type="datetime" placeholder="Select date" />
+            </template>
+            <template v-else-if="(item.INPUT_TYPE).toString()==='6'">
+              <el-date-picker v-model="item.VALUE" type="date" placeholder="Select date" />
+            </template>
+            <template v-else-if="(item.INPUT_TYPE).toString()==='7'">
+              <el-time-select v-model="item.VALUE" :picker-options="{start: item.OPTIONS.start, end: item.OPTIONS.end, step: item.OPTIONS.step}" placeholder="选择时间" />
+            </template>
+            <template v-else-if="(item.INPUT_TYPE).toString()==='8'">
+              <el-switch v-model="item.VALUE" />
+            </template>
+            <template v-else-if="(item.INPUT_TYPE).toString()==='9'">
+              <el-input
+                v-model="item.VALUE"
+                type="textarea"
+                :rows="4"
+                placeholder="请输入内容"
+              />
+            </template>
+            <template v-else>
+              <el-input v-model="item.VALUE" placeholder="请输入内容">
+                <template v-if="!!item.UNIT" slot="append">{{ item.UNIT }}</template>
+              </el-input>
+            </template>
+          </el-form-item>
+        </template>
+        <el-form-item>
+          <el-button type="primary" :loading="submitButtonStat" @click="onSubmit">{{ $t('table.confirm') }}</el-button>
+        </el-form-item>
+      </el-form>
+    </div>
+  </div>
+</template>
+
+<script>
+
+import { getScreenWidth } from '@/utils'
+import { fetchOtherConfig, updateOtherConfig } from '@/api/config'
+
+export default {
+  name: 'OtherConfig',
+  data() {
+    return {
+      loading: true,
+      submitButtonStat: false,
+      configData: null,
+      screenWidth: getScreenWidth() > 500 ? '500px' : getScreenWidth() + 'px',
+      labelPosition: getScreenWidth() >= 500 ? 'right' : 'top'
+    }
+  },
+  computed: {
+    form: function() {
+      const result = {}
+      for (const i in this.configData) {
+        result[i] = this.configData[i].VALUE
+      }
+      return result
+    }
+  },
+  mounted() {
+    this.fetchData()
+  },
+  methods: {
+    fetchData() {
+      this.loading = true
+      fetchOtherConfig().then(response => {
+        this.configData = response.data
+
+        setTimeout(() => {
+          this.loading = false
+        }, 0.5 * 1000)
+      })
+    },
+    onSubmit() {
+      this.loading = true
+      updateOtherConfig(this.form).then(response => {
+        this.$message({
+          message: response.data,
+          type: 'success'
+        })
+
+        setTimeout(() => {
+          this.loading = false
+        }, 0.5 * 1000)
+
+        this.fetchData()
+      }).catch(error => {
+        this.$message({
+          message: error,
+          type: 'warning'
+        })
+
+        this.loading = false
+        this.fetchData()
+      })
+    }
+  }
+}
+</script>
+
+<style scoped>
+.app-main {
+	padding: 15px;
+}
+.app-container {
+	padding: 0;
+}
+.white-box {
+	padding: 15px;
+}
+.form-page {
+	width: 100%;
+}
+  .hr-tip {
+    font-size: 12px;
+    position: relative;
+    text-align: center;
+    height: 30px;
+    line-height: 30px;
+    color: #999;
+    margin-bottom: 20px;
+  }
+
+  .hr-tip:before {
+    content: '';
+    display: block;
+    position: absolute;
+    left: 0;
+    right: 0;
+    top: 14px;
+    border-bottom: 1px dashed #ddd;
+    height: 1px;
+  }
+
+  .hr-tip span {
+    display: inline-block;
+    background: #fff;
+    position: relative;
+    padding: 0 10px;
+  }
+</style>

+ 19 - 8
src/views/config/site-config.vue

@@ -5,7 +5,7 @@
         <template v-for="item in configData">
           <el-form-item :key="item.CONFIG_NAME" :label="item.TITLE">
             <template v-if="item.INPUT_TYPE === '2'">
-              <el-select v-model="item.VALUE" placeholder="请选择">
+              <el-select v-model="item.VALUE">
                 <el-option v-for="optionItem in item.OPTIONS" :key="optionItem.label" :label="optionItem.label" :value="optionItem.value" />
               </el-select>
             </template>
@@ -17,27 +17,27 @@
             </template>
 
             <template v-else-if="item.INPUT_TYPE === '4'">
-              <el-date-picker v-model="item.VALUE" type="year" placeholder="选择年" />
+              <el-date-picker v-model="item.VALUE" type="year" />
             </template>
 
             <template v-else-if="item.INPUT_TYPE === '5'">
-              <el-date-picker v-model="item.VALUE" type="datetime" placeholder="Select date" />
+              <el-date-picker v-model="item.VALUE" type="datetime" />
             </template>
 
             <template v-else-if="item.INPUT_TYPE === '6'">
-              <el-date-picker v-model="item.VALUE" type="date" placeholder="Select date" />
+              <el-date-picker v-model="item.VALUE" type="date" />
             </template>
 
             <template v-else-if="item.INPUT_TYPE === '7'">
-              <el-time-select v-model="item.VALUE" :picker-options="{start: item.OPTIONS.start, end: item.OPTIONS.end, step: item.OPTIONS.step}" placeholder="选择时间" />
+              <el-time-select v-model="item.VALUE" :picker-options="{start: item.OPTIONS.start, end: item.OPTIONS.end, step: item.OPTIONS.step}" />
             </template>
 
-            <template v-else-if="item.INPUT_TYPE === '8'">
+            <template v-else-if="item.INPUT_TYPE === '8'" style="width: 100%;">
               <el-switch v-model="item.VALUE" />
             </template>
 
             <template v-else>
-              <el-input v-model="item.VALUE" placeholder="请输入内容">
+              <el-input v-model="item.VALUE" style="width: 100%;">
                 <template v-if="!!item.UNIT" slot="append">{{ item.UNIT }}</template>
               </el-input>
             </template>
@@ -120,5 +120,16 @@ export default {
 </script>
 
 <style>
-
+.app-main {
+	padding: 15px;
+}
+.app-container {
+	padding: 0;
+}
+.white-box {
+	padding: 15px;
+}
+.form-page {
+	width: 100%;
+}
 </style>

+ 24 - 13
src/views/config/stockist-config.vue

@@ -5,17 +5,17 @@
         <el-table-column prop="SORT" :label="$t('config.sort')" width="80" />
         <el-table-column prop="ROLE_NAME" :label="$t('config.levelName')" min-width="150px;" />
         <el-table-column prop="FW_BONUS_PERCENT" :label="$t('financial.serviceCharge')" min-width="90px;" />
-        <el-table-column :label="$t('common.createdAt')" min-width="150px;">
+        <el-table-column :label="$t('common.createdAt')" min-width="100px;">
           <template slot-scope="{row}">
             {{ row.CREATED_AT | parseTime('{y}-{m}-{d} {h}:{i}:{s}') }}
           </template>
         </el-table-column>
-        <el-table-column :label="$t('common.updatedAt')" min-width="150px;">
+        <el-table-column :label="$t('common.updatedAt')" min-width="100px;">
           <template slot-scope="{row}">
             {{ row.UPDATED_AT | parseTime('{y}-{m}-{d} {h}:{i}:{s}') }}
           </template>
         </el-table-column>
-        <el-table-column fixed="right" :label="$t('common.action')" min-width="90px;">
+        <el-table-column :label="$t('common.action')" min-width="100px;">
           <template slot-scope="scope">
             <el-button type="primary" size="mini" icon="el-icon-edit" plain @click="edit(scope.row)">{{ $t('common.edit') }}</el-button>
           </template>
@@ -25,22 +25,22 @@
 
     <!-- 编辑	-->
     <el-dialog v-loading="editLoading" :title="$t('config.modifiedStockist')" :visible.sync="dialog" :width="screenWidth" style="margin-top: -80px">
-      <el-form ref="editForm" :model="editForm" style="margin-top: -30px; margin-bottom: -15px;">
+      <el-form ref="editForm" :model="editForm" :label-position="labelPosition" label-width="100px" style="width: 100%; margin-top: -30px; margin-bottom: -15px;">
         <el-row :gutter="3">
           <el-col :xs="24" :sm="24" :lg="12">
             <el-input v-show="false" v-model="editForm.ID" size="small" type="text" />
-            <el-form-item :label="$t('config.levelName')" prop="ROLE_NAME" required style="margin-bottom: 10px;">
-              <el-input v-model.trim="editForm.ROLE_NAME" size="small" type="text" />
+            <el-form-item :label="$t('config.levelName')" prop="ROLE_NAME" required style="margin-bottom: 10px; width: 100%;">
+              <el-input v-model.trim="editForm.ROLE_NAME" size="small" type="text" style="min-width: 300px;" />
             </el-form-item>
-            <el-form-item :label="$t('financial.serviceCharge')" prop="FW_BONUS_PERCENT" required style="margin-bottom: 10px;">
-              <el-input v-model="editForm.FW_BONUS_PERCENT" size="small" />
-            </el-form-item>
-            <el-form-item style="margin-bottom: 15px;">
-              <el-button type="warning" size="mini" @click="dialog = false">{{ $t('table.cancel') }}</el-button>
-              <el-button type="primary" size="mini" @click="onSubmit">{{ $t('table.confirm') }}</el-button>
+            <el-form-item :label="$t('financial.serviceCharge')" prop="FW_BONUS_PERCENT" required style="margin-bottom: 10px; width: 100%;">
+              <el-input v-model="editForm.FW_BONUS_PERCENT" size="small" type="text" />
             </el-form-item>
           </el-col>
         </el-row>
+        <el-form-item style="margin-bottom: 15px;">
+          <el-button type="warning" size="mini" @click="dialog = false">{{ $t('table.cancel') }}</el-button>
+          <el-button type="primary" size="mini" @click="onSubmit">{{ $t('table.confirm') }}</el-button>
+        </el-form-item>
       </el-form>
     </el-dialog>
   </div>
@@ -124,5 +124,16 @@ export default {
 </script>
 
 <style>
-
+.app-main {
+	padding: 15px;
+}
+.app-container {
+	padding: 0;
+}
+.white-box {
+	padding: 15px;
+}
+.form-page {
+	width: 100%;
+}
 </style>

+ 161 - 0
src/views/config/transfer-config.vue

@@ -0,0 +1,161 @@
+<template>
+  <div v-loading="loading">
+    <div class="white-box">
+      <el-form ref="form" :model="form">
+        <div class="filter-box">
+          {{ $t('config.openTransfer') }}
+          <el-switch v-model="form.transferOpen" />
+        </div>
+        <el-table :data="form.allowWallet">
+          <el-table-column prop="outTitle" :label="$t('config.walletType')" min-width="150px">
+            <template slot-scope="scope">
+              {{ getWalletName(scope.row.out) }} -> {{ getWalletName(scope.row.in) }}
+            </template>
+          </el-table-column>
+          <el-table-column :label="$t('config.lowerLimitAmountTransferOut')" min-width="150px">
+            <template slot-scope="scope">
+              <el-input v-model="scope.row.outMin" size="small" maxlength="16">
+                <template slot="append">₦</template>
+              </el-input>
+            </template>
+          </el-table-column>
+          <el-table-column :label="$t('config.upperLimitAmountTransferOut')" min-width="150px">
+            <template slot-scope="scope">
+              <el-input v-model="scope.row.outMax" size="small" maxlength="16">
+                <template slot="append">₦</template>
+              </el-input>
+            </template>
+          </el-table-column>
+          <el-table-column :label="$t('config.serviceCharge')" min-width="120px">
+            <template slot-scope="scope">
+              <el-input v-model="scope.row.fee" size="small" maxlength="16" />
+            </template>
+          </el-table-column>
+          <el-table-column :label="$t('config.lowerLimitServiceCharge')" min-width="150px">
+            <template slot-scope="scope">
+              <el-input v-model="scope.row.feeMin" size="small" maxlength="16">
+                <template slot="append">₦</template>
+              </el-input>
+            </template>
+          </el-table-column>
+          <el-table-column :label="$t('config.upperLimitServiceCharge')" min-width="150px">
+            <template slot-scope="scope">
+              <el-input v-model="scope.row.feeMax" size="small" maxlength="16">
+                <template slot="append">₦</template>
+              </el-input>
+            </template>
+          </el-table-column>
+          <el-table-column :label="$t('config.periodUpperLimitAmountTransferOut')" min-width="150px">
+            <template slot-scope="scope">
+              <el-input v-model="scope.row.weekMax" size="small" maxlength="16">
+                <template slot="append">₦</template>
+              </el-input>
+            </template>
+          </el-table-column>
+          <el-table-column :label="$t('config.monthUpperLimitAmountTransferOut')" min-width="150px">
+            <template slot-scope="scope">
+              <el-input v-model="scope.row.monthMax" size="small" maxlength="16">
+                <template slot="append">₦</template>
+              </el-input>
+            </template>
+          </el-table-column>
+          <el-table-column width="90" :label="$t('config.whetherEnable')">
+            <template slot-scope="scope">
+              <el-switch v-model="scope.row.isOpen" />
+            </template>
+          </el-table-column>
+        </el-table>
+        <div class="white-box-footer" style="line-height: 1.2;color: #999;">
+          <p>{{ $t('config.pour') }}:</p>
+          <p>(1) {{ $t('config.periodTotalAmountTransferOut') }};</p>
+          <p>(2) {{ $t('config.monthTotalAmountTransferOut') }};</p>
+          <p>(3) {{ $t('config.ifNullRestrict') }};</p>
+        </div>
+        <div class="white-box-footer">
+          <el-button type="primary" :loading="submitButtonStat" @click="onSubmit">{{ $t('table.confirm') }}</el-button>
+        </div>
+      </el-form>
+    </div>
+  </div>
+</template>
+
+<script>
+import { fetchTransferConfig, updateTransferConfig } from '@/api/config'
+import { getScreenWidth } from '@/utils'
+
+export default {
+  name: 'TransferConfig',
+  data() {
+    return {
+      form: {
+        transferOpen: true,
+        allowWallet: []
+      },
+      loading: true,
+      submitButtonStat: false,
+      allWallet: { 'bonus': 'Bonus', 'cash': 'Ecoin' },
+      screenWidth: getScreenWidth() > 500 ? '500px' : getScreenWidth() + 'px',
+      labelPosition: getScreenWidth() >= 500 ? 'right' : 'top'
+    }
+  },
+  mounted() {
+    this.getData()
+  },
+  methods: {
+    getWalletName(type) {
+      return this.allWallet[type]
+    },
+    onSubmit() {
+      const data = {
+        transferOpen: this.form.transferOpen,
+        allowWallet: this.form.allowWallet
+      }
+      this.submitButtonStat = true
+      updateTransferConfig(data).then(response => {
+        this.$message({
+          message: response.data,
+          type: 'success'
+        })
+
+        setTimeout(() => {
+          this.submitButtonStat = false
+          this.getData()
+        }, 0.5 * 1000)
+      }).catch(error => {
+        this.$message({
+          message: error,
+          type: 'warning'
+        })
+        this.submitButtonStat = false
+        this.getData()
+      })
+    },
+    getData() {
+      this.loading = true
+      fetchTransferConfig().then(response => {
+        this.form.transferOpen = response.data.transferOpen.VALUE
+        this.form.allowWallet = response.data.allowWallet.VALUE
+
+        setTimeout(() => {
+          this.loading = false
+        }, 0.5 * 1000)
+      })
+    }
+  }
+}
+</script>
+
+<style scoped>
+.app-main {
+	padding: 15px;
+}
+.app-container {
+	padding: 0;
+}
+.white-box {
+	padding: 15px;
+}
+.form-page {
+	width: 100%;
+}
+</style>

+ 64 - 43
src/views/dashboard/admin/index.vue

@@ -1,40 +1,41 @@
 <template>
   <div class="dashboard-editor-container">
-    <github-corner class="github-corner" />
+		<h2>Welcome {{ user.name }}</h2>
+<!--    <github-corner class="github-corner" />-->
 
-    <panel-group @handleSetLineChartData="handleSetLineChartData" />
+<!--    <panel-group @handleSetLineChartData="handleSetLineChartData" />-->
 
-    <el-row style="background:#fff;padding:16px 16px 0;margin-bottom:32px;">
-      <line-chart :chart-data="lineChartData" />
-    </el-row>
+<!--    <el-row style="background:#fff;padding:16px 16px 0;margin-bottom:32px;">-->
+<!--      <line-chart :chart-data="lineChartData" />-->
+<!--    </el-row>-->
 
-    <el-row :gutter="32">
-      <el-col :xs="24" :sm="24" :lg="8">
-        <div class="chart-wrapper">
-          <raddar-chart />
-        </div>
-      </el-col>
-      <el-col :xs="24" :sm="24" :lg="8">
-        <div class="chart-wrapper">
-          <pie-chart />
-        </div>
-      </el-col>
-      <el-col :xs="24" :sm="24" :lg="8">
-        <div class="chart-wrapper">
-          <bar-chart />
-        </div>
-      </el-col>
-    </el-row>
+<!--    <el-row :gutter="32">-->
+<!--      <el-col :xs="24" :sm="24" :lg="8">-->
+<!--        <div class="chart-wrapper">-->
+<!--          <raddar-chart />-->
+<!--        </div>-->
+<!--      </el-col>-->
+<!--      <el-col :xs="24" :sm="24" :lg="8">-->
+<!--        <div class="chart-wrapper">-->
+<!--          <pie-chart />-->
+<!--        </div>-->
+<!--      </el-col>-->
+<!--      <el-col :xs="24" :sm="24" :lg="8">-->
+<!--        <div class="chart-wrapper">-->
+<!--          <bar-chart />-->
+<!--        </div>-->
+<!--      </el-col>-->
+<!--    </el-row>-->
 
-    <el-row :gutter="8">
-      <el-col :xs="{span: 24}" :sm="{span: 24}" :md="{span: 24}" :lg="{span: 12}" :xl="{span: 12}" style="padding-right:8px;margin-bottom:30px;" />
-      <el-col :xs="{span: 24}" :sm="{span: 12}" :md="{span: 12}" :lg="{span: 6}" :xl="{span: 6}" style="margin-bottom:30px;">
-        <todo-list />
-      </el-col>
-      <el-col :xs="{span: 24}" :sm="{span: 12}" :md="{span: 12}" :lg="{span: 6}" :xl="{span: 6}" style="margin-bottom:30px;">
-        <box-card />
-      </el-col>
-    </el-row>
+<!--    <el-row :gutter="8">-->
+<!--      <el-col :xs="{span: 24}" :sm="{span: 24}" :md="{span: 24}" :lg="{span: 12}" :xl="{span: 12}" style="padding-right:8px;margin-bottom:30px;" />-->
+<!--      <el-col :xs="{span: 24}" :sm="{span: 12}" :md="{span: 12}" :lg="{span: 6}" :xl="{span: 6}" style="margin-bottom:30px;">-->
+<!--        <todo-list />-->
+<!--      </el-col>-->
+<!--      <el-col :xs="{span: 24}" :sm="{span: 12}" :md="{span: 12}" :lg="{span: 6}" :xl="{span: 6}" style="margin-bottom:30px;">-->
+<!--        <box-card />-->
+<!--      </el-col>-->
+<!--    </el-row>-->
   </div>
 </template>
 
@@ -47,6 +48,8 @@ import PieChart from './components/PieChart'
 import BarChart from './components/BarChart'
 import TodoList from './components/TodoList'
 import BoxCard from './components/BoxCard'
+import {mapGetters} from "vuex";
+import usersInfo from "@/utils/usersInfo";
 
 const lineChartData = {
   newVisitis: {
@@ -70,24 +73,42 @@ const lineChartData = {
 export default {
   name: 'DashboardAdmin',
   components: {
-    GithubCorner,
-    PanelGroup,
-    LineChart,
-    RaddarChart,
-    PieChart,
-    BarChart,
-    TodoList,
-    BoxCard
+    // GithubCorner,
+    // PanelGroup,
+    // LineChart,
+    // RaddarChart,
+    // PieChart,
+    // BarChart,
+    // TodoList,
+    // BoxCard,
+		...mapGetters([
+			'name',
+			'avatar',
+			'roles'
+		])
   },
   data() {
     return {
-      lineChartData: lineChartData.newVisitis
+      // lineChartData: lineChartData.newVisitis
+			user: {},
     }
   },
+	created() {
+		this.getUser()
+	},
   methods: {
-    handleSetLineChartData(type) {
-      this.lineChartData = lineChartData[type]
-    }
+    // handleSetLineChartData(type) {
+    //   this.lineChartData = lineChartData[type]
+    // },
+		getUser() {
+			this.user = {
+				name: usersInfo.adminName(),
+				role: 'admin',
+				email: 'admin@test.com',
+				avatar: this.avatar
+			}
+			console.log(this.user)
+		}
   }
 }
 </script>

+ 1 - 1
src/views/login/index.vue

@@ -203,7 +203,7 @@ export default {
               return this.$store.dispatch('user/getBaseInfo', {})
             }).then(() => {
               this.loading = false
-              this.$router.push({ path: this.redirect || '/', query: this.otherQuery })
+              this.$router.push({ path: this.redirect || '/dashboard/index', query: this.otherQuery })
             }).catch(error => {
               this.loading = false
               // 强制修改密码