Browse Source

增加渠道管理模块

Limengbo 5 years ago
parent
commit
fd60ea5556

+ 12 - 7
build/webpack.dev.conf.js

@@ -5,20 +5,25 @@ const baseConfig = require('./webpack.base.conf');
 const path = require('path');
 
 module.exports = merge(baseConfig, {
-  mode: 'development',
   devtool: 'inline-source-map',
   module: {
     rules: [
       {
-        test: /\.css$/,
+        test: /\.(sa|sc|c)ss$/,
         use: [
-          'vue-style-loader',
+          {
+            loader: 'vue-style-loader',
+            options: {
+              publicPath: '../'
+            }
+          },
           'css-loader',
-          'postcss-loader'
-        ]
+          'postcss-loader',
+          'sass-loader',
+        ],
       },
       {
-        test: /\.scss$/,
+        test: /\.less$/,
         use: [
           {
             loader: 'vue-style-loader',
@@ -28,7 +33,7 @@ module.exports = merge(baseConfig, {
           },
           'css-loader',
           'postcss-loader',
-          'sass-loader',
+          'less-loader',
         ],
       },
     ]

+ 12 - 7
build/webpack.prod.conf.js

@@ -11,20 +11,25 @@ const MiniCssExtractPlugin = require('mini-css-extract-plugin');
 const OptimizeCSSAssetsPlugin = require("optimize-css-assets-webpack-plugin");
 
 module.exports = merge(baseConfig, {
-  mode: 'production',
   devtool: 'source-map',
   module: {
     rules: [
       {
-        test: /\.css$/,
+        test: /\.(sa|sc|c)ss$/,
         use: [
-          MiniCssExtractPlugin.loader,
+          {
+            loader: MiniCssExtractPlugin.loader,
+            options: {
+              publicPath: '../'
+            }
+          },
           'css-loader',
-          'postcss-loader'
-        ]
+          'postcss-loader',
+          'sass-loader',
+        ],
       },
       {
-        test: /\.scss$/,
+        test: /\.less$/,
         use: [
           {
             loader: MiniCssExtractPlugin.loader,
@@ -34,7 +39,7 @@ module.exports = merge(baseConfig, {
           },
           'css-loader',
           'postcss-loader',
-          'sass-loader',
+          'less-loader',
         ],
       }
     ]

+ 1 - 1
config/dev.env.js

@@ -4,5 +4,5 @@ const prodEnv = require('./prod.env')
 
 module.exports = merge(prodEnv, {
   NODE_ENV: '"development"',
-  BASE_API: '"http://manage.ai160.com/"',
+  BASE_API: '"http://192.168.1.46:8060/"',
 })

+ 2 - 2
index.html

@@ -4,9 +4,9 @@
   <meta charset="UTF-8">
   <meta name="viewport" content="width=device-width, initial-scale=1.0">
   <meta http-equiv="X-UA-Compatible" content="ie=edge">
-  <title>webpack构建vue</title>
+  <title>资源管理平台</title>
 </head>
 <body>
   <div id="app"></div>
 </body>
-</html>
+</html>

+ 82 - 21
package-lock.json

@@ -587,6 +587,13 @@
       "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
       "dev": true
     },
+    "asap": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
+      "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=",
+      "dev": true,
+      "optional": true
+    },
     "asn1": {
       "version": "0.2.4",
       "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
@@ -2233,6 +2240,12 @@
         "wrap-ansi": "^2.0.0"
       }
     },
+    "clone": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
+      "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=",
+      "dev": true
+    },
     "clone-deep": {
       "version": "2.0.2",
       "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-2.0.2.tgz",
@@ -3794,14 +3807,12 @@
         "balanced-match": {
           "version": "1.0.0",
           "bundled": true,
-          "dev": true,
-          "optional": true
+          "dev": true
         },
         "brace-expansion": {
           "version": "1.1.11",
           "bundled": true,
           "dev": true,
-          "optional": true,
           "requires": {
             "balanced-match": "^1.0.0",
             "concat-map": "0.0.1"
@@ -3816,20 +3827,17 @@
         "code-point-at": {
           "version": "1.1.0",
           "bundled": true,
-          "dev": true,
-          "optional": true
+          "dev": true
         },
         "concat-map": {
           "version": "0.0.1",
           "bundled": true,
-          "dev": true,
-          "optional": true
+          "dev": true
         },
         "console-control-strings": {
           "version": "1.1.0",
           "bundled": true,
-          "dev": true,
-          "optional": true
+          "dev": true
         },
         "core-util-is": {
           "version": "1.0.2",
@@ -3946,8 +3954,7 @@
         "inherits": {
           "version": "2.0.3",
           "bundled": true,
-          "dev": true,
-          "optional": true
+          "dev": true
         },
         "ini": {
           "version": "1.3.5",
@@ -3959,7 +3966,6 @@
           "version": "1.0.0",
           "bundled": true,
           "dev": true,
-          "optional": true,
           "requires": {
             "number-is-nan": "^1.0.0"
           }
@@ -3974,7 +3980,6 @@
           "version": "3.0.4",
           "bundled": true,
           "dev": true,
-          "optional": true,
           "requires": {
             "brace-expansion": "^1.1.7"
           }
@@ -3982,14 +3987,12 @@
         "minimist": {
           "version": "0.0.8",
           "bundled": true,
-          "dev": true,
-          "optional": true
+          "dev": true
         },
         "minipass": {
           "version": "2.3.5",
           "bundled": true,
           "dev": true,
-          "optional": true,
           "requires": {
             "safe-buffer": "^5.1.2",
             "yallist": "^3.0.0"
@@ -4008,7 +4011,6 @@
           "version": "0.5.1",
           "bundled": true,
           "dev": true,
-          "optional": true,
           "requires": {
             "minimist": "0.0.8"
           }
@@ -4089,8 +4091,7 @@
         "number-is-nan": {
           "version": "1.0.1",
           "bundled": true,
-          "dev": true,
-          "optional": true
+          "dev": true
         },
         "object-assign": {
           "version": "4.1.1",
@@ -4102,7 +4103,6 @@
           "version": "1.4.0",
           "bundled": true,
           "dev": true,
-          "optional": true,
           "requires": {
             "wrappy": "1"
           }
@@ -4224,7 +4224,6 @@
           "version": "1.0.2",
           "bundled": true,
           "dev": true,
-          "optional": true,
           "requires": {
             "code-point-at": "^1.0.0",
             "is-fullwidth-code-point": "^1.0.0",
@@ -4914,6 +4913,13 @@
       "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=",
       "dev": true
     },
+    "image-size": {
+      "version": "0.5.5",
+      "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz",
+      "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=",
+      "dev": true,
+      "optional": true
+    },
     "import-cwd": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz",
@@ -5480,6 +5486,51 @@
         "invert-kv": "^2.0.0"
       }
     },
+    "less": {
+      "version": "3.9.0",
+      "resolved": "https://registry.npmjs.org/less/-/less-3.9.0.tgz",
+      "integrity": "sha512-31CmtPEZraNUtuUREYjSqRkeETFdyEHSEPAGq4erDlUXtda7pzNmctdljdIagSb589d/qXGWiiP31R5JVf+v0w==",
+      "dev": true,
+      "requires": {
+        "clone": "^2.1.2",
+        "errno": "^0.1.1",
+        "graceful-fs": "^4.1.2",
+        "image-size": "~0.5.0",
+        "mime": "^1.4.1",
+        "mkdirp": "^0.5.0",
+        "promise": "^7.1.1",
+        "request": "^2.83.0",
+        "source-map": "~0.6.0"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true,
+          "optional": true
+        }
+      }
+    },
+    "less-loader": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-4.1.0.tgz",
+      "integrity": "sha512-KNTsgCE9tMOM70+ddxp9yyt9iHqgmSs0yTZc5XH5Wo+g80RWRIYNqE58QJKm/yMud5wZEvz50ugRDuzVIkyahg==",
+      "dev": true,
+      "requires": {
+        "clone": "^2.1.1",
+        "loader-utils": "^1.1.0",
+        "pify": "^3.0.0"
+      },
+      "dependencies": {
+        "pify": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+          "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+          "dev": true
+        }
+      }
+    },
     "load-json-file": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
@@ -7285,6 +7336,16 @@
       "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==",
       "dev": true
     },
+    "promise": {
+      "version": "7.3.1",
+      "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz",
+      "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "asap": "~2.0.3"
+      }
+    },
     "promise-inflight": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz",

+ 2 - 0
package.json

@@ -30,6 +30,8 @@
     "optimize-css-assets-webpack-plugin": "^5.0.1",
     "postcss-loader": "^3.0.0",
     "sass-loader": "^7.1.0",
+    "less": "^3.9.0",
+    "less-loader": "^4.1.0",
     "uglifyjs-webpack-plugin": "^2.1.2",
     "vue": "^2.6.10",
     "vue-loader": "^15.7.0",

+ 25 - 0
src/api/channel.js

@@ -0,0 +1,25 @@
+import request from '../utils/request';
+// 获取渠道列表
+export function getChannelList (data) {
+  return request({
+    url: '/channel',
+    method: 'get',
+    data,
+  })
+}
+// 更新渠道
+export function setChannelList (data) {
+  return request({
+    url: '/channel',
+    method: 'put',
+    data,
+  })
+}
+// 增加渠道
+export function addChannelList (data) {
+  return request({
+    url: '/channel',
+    method: 'post',
+    data,
+  })
+}

+ 86 - 0
src/pages/channel/Channel.vue

@@ -0,0 +1,86 @@
+<template>
+  <div class="channel">
+    <el-card class="box-card">
+      <div slot="header" class="clearfix">
+        <span>渠道管理</span>
+        <el-button style="float: right; padding: 3px 0" type="text">增加</el-button>
+      </div>
+      <el-table
+        :data="channeList"
+        style="width: 100%">
+        <!--
+        <el-table-column type="expand">
+          <template slot-scope="props">
+            <el-form label-position="left" inline class="demo-table-expand">
+              <el-form-item label="商品名称">
+                <span>{{ props.row.name }}</span>
+              </el-form-item>
+              <el-form-item label="所属店铺">
+                <span>{{ props.row.shop }}</span>
+              </el-form-item>
+              <el-form-item label="商品 ID">
+                <span>{{ props.row.id }}</span>
+              </el-form-item>
+              <el-form-item label="店铺 ID">
+                <span>{{ props.row.shopId }}</span>
+              </el-form-item>
+              <el-form-item label="商品分类">
+                <span>{{ props.row.category }}</span>
+              </el-form-item>
+              <el-form-item label="店铺地址">
+                <span>{{ props.row.address }}</span>
+              </el-form-item>
+              <el-form-item label="商品描述">
+                <span>{{ props.row.desc }}</span>
+              </el-form-item>
+            </el-form>
+          </template>
+        </el-table-column>
+        -->
+        <el-table-column
+          label="渠道 CODE"
+          prop="code">
+        </el-table-column>
+        <el-table-column
+          label="渠道名称"
+          prop="title">
+        </el-table-column>
+        <el-table-column
+          label="CDN 前缀"
+          prop="cdnPrefix">
+        </el-table-column>
+        <el-table-column
+          label="联系人"
+          prop="contact">
+        </el-table-column>
+        <el-table-column
+          label="联系人电话"
+          prop="mobileNo">
+        </el-table-column>
+        <el-table-column label="操作">
+          <template slot-scope="scope">
+            <el-button
+              size="mini"
+              @click="handleEdit(scope.$index, scope.row)">编辑</el-button>
+            <el-button
+              size="mini"
+              type="danger"
+              @click="handleDelete(scope.$index, scope.row)">删除</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+    </el-card>
+  </div>
+</template>
+
+<script>
+import { mapGetters } from 'vuex'
+export default {
+  computed: {
+    ...mapGetters(['channeList'])
+  },
+  created() {
+    this.$store.dispatch('getChannelList', {pageNo: 1, pageSize: 10 })
+  }
+}
+</script>

+ 0 - 6
src/pages/index/Index.vue

@@ -1,6 +0,0 @@
-<template>
-  <div>
-      name: admin
-  </div>
-</template>
-

+ 1 - 1
src/pages/layout/Layout.vue

@@ -21,7 +21,7 @@ export default {
   },
 }
 </script>
-<style lang="scss">
+<style lang="less">
   .container {
     width: 100%;
     height: 100%;

+ 3 - 4
src/pages/layout/leftnav/LeftNav.vue

@@ -7,9 +7,8 @@
       active-text-color="#20a0ff"
       :router=true
       :default-active="$route.path">
-      <el-menu-item index="/dashboard/index" route="/dashboard/index">
-        <i class="el-icon-menu"></i>
-        <span slot="title">首页</span>
+      <el-menu-item index="/channel/index" route="/channel/index">
+        <span slot="title">渠道管理</span>
       </el-menu-item>
       <el-submenu index="/nav">
         <template slot="title">
@@ -40,7 +39,7 @@
     </el-menu>
   </div>
 </template>
-<style lang="scss">
+<style lang="less">
   .left-nav {
     width: 200px;
     height: 100%;

+ 1 - 1
src/pages/layout/tabs/Tabs.vue

@@ -91,7 +91,7 @@
     }
   }
 </script>
-<style lang="scss">
+<style lang="less">
   .tabs {
     white-space: nowrap;
     overflow: hidden;

+ 1 - 1
src/pages/layout/toptitle/TopTitle.vue

@@ -15,7 +15,7 @@
     </el-dropdown>
   </div>
 </template>
-<style lang="scss">
+<style lang="less">
   .top-title {
     display: flex;
     align-items: center;

+ 2 - 2
src/pages/login/Login.vue

@@ -1,7 +1,7 @@
 <template>
   <div class="login-container">
     <el-form :model="loginForm" status-icon :rules="rules" ref="loginForm" autocomplete="off" class="login-form">
-      <h3 class="title">登录</h3>
+      <h3 class="title">资源管理平台</h3>
       <el-form-item prop="userName" class="el-form-item">
         <el-input v-model="loginForm.userName" name="userName" type="text" autocomplete="off" placeholder="账号"/>
       </el-form-item>
@@ -82,7 +82,7 @@
   }
 </script>
 
-<style lang="scss">
+<style lang="less">
   .login-container {
     width: 100%;
     height: 100%;

+ 0 - 1
src/pages/nav1/Nav1.vue

@@ -47,7 +47,6 @@
 </template>
 
 <script>
-  import { companyList, setCompanyList, addCompanyList } from '../../api/nav1.js';
   import { mapGetters } from 'vuex';
   export default {
     data() {

+ 3 - 3
src/router/router.js

@@ -22,13 +22,13 @@ export default new Router({
       hidden: true
     },
     {
-      path: '/dashboard',
+      path: '/channel',
       component: Layout,
       children: [{
         path: 'index',
         name:'Index',
-        meta: { title: '首页', url: '/dashboard/index' },
-        component: () => import('@/pages/index/Index'),
+        meta: { title: '渠道管理', url: '/channel/index' },
+        component: () => import('@/pages/channel/Channel'),
       }]
     },
     {

+ 2 - 1
src/store/getter.js

@@ -1,5 +1,6 @@
 const getters = {
   flag: state => state.login.flag,
-  data: state => state.navList.data
+  data: state => state.navList.data,
+  channeList: state => state.channel.channeList
 }
 export default getters

+ 3 - 1
src/store/index.js

@@ -2,6 +2,7 @@ import Vue from 'vue'
 import Vuex from 'vuex'
 import login from './modules/login'
 import navList from './modules/navList'
+import channel from './modules/channel'
 import getters from './getter'
 
 Vue.use(Vuex)
@@ -9,7 +10,8 @@ Vue.use(Vuex)
 const store = new Vuex.Store({
   modules: {
     login,
-    navList
+    navList,
+    channel
   },
   getters
 })

+ 54 - 0
src/store/modules/channel.js

@@ -0,0 +1,54 @@
+import { getChannelList, setChannelList, addChannelList } from '../../api/channel';
+
+const channel = {
+  state: {
+    channeList: []
+  },
+  mutations: {
+    GET_CHANNEL_LIST: (state, data) => {
+      state.channeList = data
+    }
+  },
+  actions: {
+    getChannelList({dispatch, commit }, data) {
+      return new Promise((resolve, reject) => {
+        getChannelList(data).then(res => {
+          if(res.code == 200) {
+            resolve(res.data);
+            commit('GET_CHANNEL_LIST', res.data)
+          }
+        }).catch(error => {
+          reject(error);
+        })
+      })
+    },
+    setChannelList({dispatch, commit }, from) {
+      return new Promise((resolve, reject) => {
+        setChannelList(from).then(res => {
+          if(res.code == 200) {
+            resolve(res.data);
+            // commit('GET_CHANNEL_LIST', res.data)
+            dispatch('getChannelList')
+          }
+        }).catch(error => {
+          reject(error);
+        })
+      })
+    },
+    addChannelList({dispatch, commit }, from) {
+      return new Promise((resolve, reject) => {
+        addChannelList(from).then(res => {
+          if(res.code == 200) {
+            resolve(res.data);
+            // commit('GET_CHANNEL_LIST', res.data)
+            dispatch('getChannelList')
+          }
+        }).catch(error => {
+          reject(error);
+        })
+      })
+    },
+  }
+}
+
+export default channel

+ 4 - 1
src/utils/request.js

@@ -12,7 +12,10 @@ const service = axios.create({
 // request拦截器
 service.interceptors.request.use(
   config => {
-    config.headers['uid'] = 1
+    config.headers['uid'] = 1;
+    config.headers['channelCode'] = '';
+    config.headers['courseId'] = '';
+    config.headers['wareId'] = '';
     // if (store.getters.token) {
     //   config.headers['X-Token'] = getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
     // }