mtb-vue

 

<!DOCTYPE html>
<html lang="">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
    <title><%= htmlWebpackPlugin.options.title %></title>
  </head>
  <body>
    <noscript>
      <strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
    </noscript>
    <div id="app"></div>
    <!-- built files will be auto injected -->
  </body>
</html>
public/index.html

 

import Vue from 'vue'
import axios from 'axios'
import VueAxios from 'vue-axios'
import {getToken} from "@/plugins/cookie"
import router from '../router/index'
import store from '../store/index'
import {Message} from "element-ui"

Vue.use(VueAxios, axios)


// 设置默认值
axios.defaults.baseURL = 'http://127.0.0.1:8005/api/';
// axios.defaults.baseURL = 'http://127.0.0.1:8000/api/';
// axios.defaults.baseURL = 'http://124.222.193.204:8000/api/';


// axios.defaults.headers.common['Authorization'] = getToken();  // 只在页面刷新时才执行
// axios.defaults.headers.post['Content-Type'] = 'application/json';
// axios.defaults.headers.put['Content-Type'] = 'application/json';


// 请求拦截器,axios发送请求时候,每次请求
axios.interceptors.request.use(function (config) {
    // 在发送请求之前做些什么
    const token = getToken();
    if (token) {
        // 表示用户已登录
        config.headers.common['Authorization'] = token;
    }
    return config;
});

// 响应拦截器
axios.interceptors.response.use(function (response) {
    // API请求执行成功,响应状态码200,自动执行
    if (response.data.code === "2000") {
        // store中的logout方法
        store.commit("logout");
        // 重定向登录页面  [Login,]
        // router.push({name:"Login"});
        router.replace({name: "Login"});

        // 页面提示
        Message.error("认证过期,请重新登录...");

        return Promise.reject(); // 下一个相应拦截器的第二个函数
    }

    return response;

}, function (error) {
    // API请求执行失败,响应状态码400/500,自动执行
    if (error.response.status === 401) {
        // store中的logout方法
        store.commit("logout");
        // 重定向登录页面  [Login,]
        // router.push({name:"Login"});
        router.replace({name: "Login"});
        Message.error("认证过期,请重新登录...");
        // return
    }
    return Promise.reject(error);  // 下一个相应拦截器的第二个函数
});
src/plugins/axios.js
import Vue from 'vue'
import VueCookie from 'vue-cookie'

Vue.use(VueCookie)


export const getToken = () => {
    return Vue.cookie.get("token")
}


export const getUserName = () => {
    return Vue.cookie.get("username")
}


export const setUserToken = (username, token) => {
    Vue.cookie.set('username', username, {expires: '7D'});
    Vue.cookie.set('token', token, {expires: '7D'});
}

export const clearUserToken = () => {
    Vue.cookie.delete('username');
    Vue.cookie.delete('token');
}
src/plugins/cookie.js
import Vue from 'vue'
import Element from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'

Vue.use(Element)
src/plugins/element.js

 

import Vue from 'vue'
import VueRouter from 'vue-router'
import {getToken} from '@/plugins/cookie'

Vue.use(VueRouter)

const routes = [
    {
        path: '/login',
        name: 'Login',
        component: () => import('../views/Login.vue')
    },
    {
        path: '/',
        name: 'Layout',
        component: () => import('../views/Layout.vue'),
        children: [
            {
                path: "",
                redirect: "task",
            },
            {
                path: 'task',
                name: 'Task',
                component: () => import('../views/task/TaskLayout.vue'),
                children: [
                    {
                        path: "/",
                        redirect: "activity"
                    },
                    {
                        path: "activity",
                        name: 'Activity',
                        component: () => import('../views/task/Activity.vue'),
                        children: [
                            {
                                path: "/",
                                redirect: "list"
                            },
                            {
                                path: "list",
                                name: 'ActivityList',
                                component: () => import('../views/task/ActivityList.vue'),
                            },
                            {
                                path: "create",
                                name: 'ActivityCreate',
                                component: () => import('../views/task/ActivityCreate.vue'),
                            }
                        ]

                    },
                    {
                        path: "promo",
                        name: 'Promo',
                        component: () => import('../views/task/Promo.vue'),
                    },
                    {
                        path: "stat",
                        name: 'Stat',
                        component: () => import('../views/task/Stat.vue'),
                    },
                    {
                        path: "fans",
                        name: 'Fans',
                        component: () => import('../views/task/Fans.vue'),
                    },
                ]
            },
            {
                path: 'msg',
                name: 'Msg',
                component: () => import('../views/msg/MsgLayout.vue'),
                children: [
                    {
                        path: "/",
                        redirect: "push"
                    },
                    {
                        path: "push",
                        name: 'Push',
                        component: () => import('../views/msg/Push.vue'),
                    },
                    {
                        path: "sop",
                        name: 'Sop',
                        component: () => import('../views/msg/Sop.vue'),
                    },
                ]
            },
            {
                path: 'auth',
                name: 'Auth',
                component: () => import('../views/auth/Auth.vue'),
            }
        ]
    },
    {
        path: '/*',
        component: () => import('../views/NotFound.vue')
    }
]

const router = new VueRouter({
    routes,
    mode: "history"
})

// router.beforeEach((to, from, next) => {
//     let token = getToken();
//
//     // 如果已登录,则可以继续访问目标地址
//     if (token) {
//         next();
//         return;
//     }
//     // 未登录,访问登录页面
//     if (to.name === "Login") {
//         next();
//         return;
//     }
//
//     // 未登录,跳转登录页面
//     next({name: 'Login'});
// })



export default router
src/router/index.js
import Vue from 'vue'
import Vuex from 'vuex'
import {getUserName, getToken, setUserToken,clearUserToken} from "@/plugins/cookie"

Vue.use(Vuex)

export default new Vuex.Store({
    state: {
        username: getUserName(),
        token: getToken(),
    },
    mutations: {
        login: function (state, {username, token}) {
            state.username = username;
            state.token = token;
            // Vue.cookie.set("username",username);
            // Vue.cookie.set("token",token);
            setUserToken(username, token);
        },
        logout:function (state) {
            state.username = ""
            state.token = ""
            clearUserToken()
        }
    },
    actions: {},
    modules: {}
})
src/store/index.js

 

<template>
    <div>

        <el-card class="box-card flex-row-center" shadow="hover">
            <div class="flex-col-center">
                <i class="el-icon-circle-plus-outline icon"></i>
                <div class="text">添加公众号</div>
            </div>
        </el-card>

        <el-card class="box-card box-item" shadow="hover" :body-style="{width:'100%',padding:'20px'}">
            <div class="item flex-row-center">
                <el-avatar size="large"
                           src="http://wx.qlogo.cn/mmopen/t6cpMpYeAkhIjyBs9Y5nD6g8SPSfXbVRY2icK7MELDVWs0jPuQQXga8YCnVY6z8U4DI4ZMfvTqTww6FQeQNc4cfyDTHyr4wMm/0"></el-avatar>
            </div>
            <div class="item flex-row-center">路飞小课</div>
            <div class="item flex-row-center">
                <div class="flex-row-between" style="width: 100px;font-size: 12px;">
                    <div style="color: gray">服务号</div>
                    <div style="color: #0c8eff;">已认证</div>
                </div>
            </div>
            <el-divider></el-divider>
            <div class="item small flex-row-between">
                <div><i class="el-icon-position"></i> 任务包</div>
                <div class="date">2020-11-11到期</div>
            </div>
            <div class="item small flex-row-between">
                <div><i class="el-icon-bell"></i> 消息宝</div>
                <div class="date">2020-11-11到期</div>
            </div>
        </el-card>

        <el-card class="box-card box-item" shadow="hover" :body-style="{width:'100%',padding:'20px'}">
            <div class="item flex-row-center">
                <el-avatar size="large"
                           src="http://wx.qlogo.cn/mmopen/t6cpMpYeAkhIjyBs9Y5nD6g8SPSfXbVRY2icK7MELDVWs0jPuQQXga8YCnVY6z8U4DI4ZMfvTqTww6FQeQNc4cfyDTHyr4wMm/0"></el-avatar>
            </div>
            <div class="item flex-row-center">路飞小课</div>
            <div class="item flex-row-center">
                <div class="flex-row-between" style="width: 100px;font-size: 12px;">
                    <div style="color: gray">服务号</div>
                    <div style="color: #0c8eff;">已认证</div>
                </div>
            </div>
            <el-divider></el-divider>
            <div class="item small flex-row-between">
                <div><i class="el-icon-position"></i> 任务包</div>
                <div class="date">2020-11-11到期</div>
            </div>
            <div class="item small flex-row-between">
                <div><i class="el-icon-bell"></i> 消息宝</div>
                <div class="date">2020-11-11到期</div>
            </div>
        </el-card>

        <el-card class="box-card box-item" shadow="hover" :body-style="{width:'100%',padding:'20px'}">
            <div class="item flex-row-center">
                <el-avatar size="large"
                           src="http://wx.qlogo.cn/mmopen/t6cpMpYeAkhIjyBs9Y5nD6g8SPSfXbVRY2icK7MELDVWs0jPuQQXga8YCnVY6z8U4DI4ZMfvTqTww6FQeQNc4cfyDTHyr4wMm/0"></el-avatar>
            </div>
            <div class="item flex-row-center">路飞小课</div>
            <div class="item flex-row-center">
                <div class="flex-row-between" style="width: 100px;font-size: 12px;">
                    <div style="color: gray">服务号</div>
                    <div style="color: #0c8eff;">已认证</div>
                </div>
            </div>
            <el-divider></el-divider>
            <div class="item small flex-row-between">
                <div><i class="el-icon-position"></i> 任务包</div>
                <div class="date">2020-11-11到期</div>
            </div>
            <div class="item small flex-row-between">
                <div><i class="el-icon-bell"></i> 消息宝</div>
                <div class="date">2020-11-11到期</div>
            </div>
        </el-card>

        <el-card class="box-card box-item" shadow="hover" :body-style="{width:'100%',padding:'20px'}">
            <div class="item flex-row-center">
                <el-avatar size="large"
                           src="http://wx.qlogo.cn/mmopen/t6cpMpYeAkhIjyBs9Y5nD6g8SPSfXbVRY2icK7MELDVWs0jPuQQXga8YCnVY6z8U4DI4ZMfvTqTww6FQeQNc4cfyDTHyr4wMm/0"></el-avatar>
            </div>
            <div class="item flex-row-center">路飞小课</div>
            <div class="item flex-row-center">
                <div class="flex-row-between" style="width: 100px;font-size: 12px;">
                    <div style="color: gray">服务号</div>
                    <div style="color: #0c8eff;">已认证</div>
                </div>
            </div>
            <el-divider></el-divider>
            <div class="item small flex-row-between">
                <div><i class="el-icon-position"></i> 任务包</div>
                <div class="date">2020-11-11到期</div>
            </div>
            <div class="item small flex-row-between">
                <div><i class="el-icon-bell"></i> 消息宝</div>
                <div class="date">2020-11-11到期</div>
            </div>
        </el-card>

        <el-card class="box-card box-item" shadow="hover" :body-style="{width:'100%',padding:'20px'}">
            <div class="item flex-row-center">
                <el-avatar size="large"
                           src="http://wx.qlogo.cn/mmopen/t6cpMpYeAkhIjyBs9Y5nD6g8SPSfXbVRY2icK7MELDVWs0jPuQQXga8YCnVY6z8U4DI4ZMfvTqTww6FQeQNc4cfyDTHyr4wMm/0"></el-avatar>
            </div>
            <div class="item flex-row-center">路飞小课</div>
            <div class="item flex-row-center">
                <div class="flex-row-between" style="width: 100px;font-size: 12px;">
                    <div style="color: gray">服务号</div>
                    <div style="color: #0c8eff;">已认证</div>
                </div>
            </div>
            <el-divider></el-divider>
            <div class="item small flex-row-between">
                <div><i class="el-icon-position"></i> 任务包</div>
                <div class="date">2020-11-11到期</div>
            </div>
            <div class="item small flex-row-between">
                <div><i class="el-icon-bell"></i> 消息宝</div>
                <div class="date">2020-11-11到期</div>
            </div>
        </el-card>

    </div>
</template>

<script>
    export default {
        name: 'Auth',
        created: function () {

        }
    }
</script>

<style scoped>
    .box-card {
        width: 240px;
        height: 260px;
        float: left;
        margin: 20px;
    }

    .box-item {
        display: flex;
    }

    .box-item .item {
        padding: 5px 0;
    }

    .box-item .small {
        font-size: 14px;
        padding: 10px 0;
        color: #646464;
    }

    .box-item .date {
        font-size: 13px;
        color: #908e8e;
    }

    .flex-row-center {
        display: flex;
        flex-direction: row;
        justify-content: center;
        align-items: center;
    }

    .flex-row-between {
        display: flex;
        flex-direction: row;
        justify-content: space-between;
    }

    .flex-col-center {
        display: flex;
        flex-direction: column;
        justify-content: center;
        align-items: center;
    }

    .box-card .icon {
        font-size: 50px;
    }

    .box-card .text {
        font-size: 14px;
        margin-top: 8px;
    }

    .el-divider--horizontal {
        margin: 18px 0;
    }
</style>
src/views/auth/Auth.vue
<template>
    <div>
        <el-menu class="sub-menu" mode="horizontal" :default-active="subActiveRouter" router>
            <el-menu-item index="Push" :route="{name:'Push'}"><i class="el-icon-coin"></i>消息推送</el-menu-item>
            <el-menu-item index="Sop" :route="{name:'Sop'}"><i class="el-icon-data-analysis"></i>SOP计划</el-menu-item>
        </el-menu>

        <router-view></router-view>
    </div>
</template>

<script>
    export default {
        name: "MsgLayout",
        data() {
            return {
                subActiveRouter: ""
            }
        },
        mounted() {
            // 获取当前的所有路由
            this.subActiveRouter = this.$route.matched[2].name;
        }
    }
</script>

<style scoped>
    .sub-menu .el-menu-item {
        line-height: 40px;
        height: 40px;
        vertical-align: middle;
        font-size: 13px;
    }

    .sub-menu .el-menu-item i {
        margin-top: -3px;
    }
</style>
src/views/msg/MsgLayout.vue
<template>
    <div style="padding: 20px;">
        <el-card class="box-card">
            <el-form :inline="true" class="demo-form-inline" size="small" :model="searchForm" ref="searchForm">
                <el-form-item label="标题" prop="title">
                    <el-input placeholder="标题" v-model="searchForm.title"></el-input>
                </el-form-item>

                <el-form-item label="类型" prop="category">
                    <el-select placeholder="类型" v-model="searchForm.category">
                        <el-option v-for="item in categoryOptions" :key="item.value" :label="item.label"
                                   :value="item.value"></el-option>
                        <el-option label="区域二" value="beijing"></el-option>
                    </el-select>
                </el-form-item>

                <el-form-item label="推送时间" prop="dateValue">
                    <el-date-picker
                            v-model="searchForm.dateValue"
                            type="datetimerange"
                            start-placeholder="开始日期"
                            end-placeholder="结束日期"
                            :default-time="['12:00:00']">
                    </el-date-picker>
                </el-form-item>
            </el-form>

            <el-row type="flex" justify="center">
                <el-button size="small" type="primary" @click="clickSearch">筛选</el-button>
                <el-button size="small" @click="resetSearchForm('searchForm')">重置</el-button>
            </el-row>
        </el-card>

        <el-card class="box-card" style="margin-top: 25px;">
            <div slot="header" class="clearfix">
                <span><i class="el-icon-s-grid"></i> 消息列表</span>
                <el-button style="float: right;" type="primary" size="small" @click="clickAddDialog">
                    <i class="el-icon-circle-plus-outline"></i> 操作按钮
                </el-button>
            </div>
            <div>
                <el-table :data="tableData" border style="width: 100%">
                    <el-table-column prop="date" label="日期"></el-table-column>
                    <el-table-column prop="name" label="姓名"></el-table-column>
                    <el-table-column prop="address" label="地址"></el-table-column>
                    <el-table-column label="操作">
                        <template slot-scope="scope">
                            <el-button @click="handleClick(scope.row)" type="text" size="small">查看</el-button>

                            <el-popconfirm title="这是一段内容确定删除吗?" @confirm="confirmDelete(scope.row)">
                                <el-button slot="reference" type="text" size="small">删除</el-button>
                            </el-popconfirm>
                        </template>
                    </el-table-column>
                </el-table>
            </div>
            <el-row type="flex" justify="end" style="margin-top: 30px;">
                <el-pagination
                        :total="page.totalCount"
                        :page-size="page.perPageSize"
                        background
                        layout="prev, pager, next,jumper"
                        @current-change="handleCurrentChange"
                >
                </el-pagination>
            </el-row>
        </el-card>


        <el-dialog title="收货地址" :visible.sync="dialogFormVisible">
            <el-form label-position="left" label-width="80px" :model="addForm">
                <el-form-item label="活动名称" prop="x1">
                    <el-input autocomplete="off" v-model="addForm.x1"></el-input>
                </el-form-item>
                <el-form-item label="活动区域" prop="x2">
                    <el-select placeholder="请选择活动区域" v-model="addForm.x2">
                        <el-option label="区域一" value="shanghai"></el-option>
                        <el-option label="区域二" value="beijing"></el-option>
                    </el-select>
                </el-form-item>
            </el-form>
            <div slot="footer" class="dialog-footer">
                <el-button @click="dialogFormVisible = false">取 消</el-button>
                <el-button type="primary" @click="dialogFormVisible = false">确 定</el-button>
            </div>
        </el-dialog>

        <el-dialog title="提示" :visible.sync="dialogVisible" width="30%">
            <span>这是一段信息</span>
            <span slot="footer" class="dialog-footer">
                <el-button @click="dialogVisible = false">取 消</el-button>
                <el-button type="primary" @click="dialogVisible = false">确 定</el-button>
              </span>
        </el-dialog>
    </div>
</template>

<script>
    export default {
        name: "Push",
        data() {
            return {
                searchForm: {
                    title: "",
                    category: "",
                    dateValue: "",
                },
                categoryOptions: [
                    {
                        value: '1',
                        label: '黄金糕'
                    }, {
                        value: '2',
                        label: '双皮奶'
                    }, {
                        value: '3',
                        label: '蚵仔煎'
                    }, {
                        value: '4',
                        label: '龙须面'
                    }, {
                        value: '5',
                        label: '北京烤鸭'
                    }],
                tableData: [
                    {
                        date: '2016-05-02',
                        name: '王小虎',
                        province: '上海',
                        city: '普陀区',
                        address: '上海市普陀区金沙江路 1518 弄',
                        zip: 200333
                    }, {
                        date: '2016-05-04',
                        name: '王小虎',
                        province: '上海',
                        city: '普陀区',
                        address: '上海市普陀区金沙江路 1517 弄',
                        zip: 200333
                    }, {
                        date: '2016-05-01',
                        name: '王小虎',
                        province: '上海',
                        city: '普陀区',
                        address: '上海市普陀区金沙江路 1519 弄',
                        zip: 200333
                    }, {
                        date: '2016-05-03',
                        name: '王小虎',
                        province: '上海',
                        city: '普陀区',
                        address: '上海市普陀区金沙江路 1516 弄',
                        zip: 200333
                    }],
                page: {
                    totalCount: 10000,
                    perPageSize: 20
                },
                dialogFormVisible: false,
                addForm: {
                    x1: "",
                    x2: ""
                },
                dialogVisible:false
            }
        },
        methods: {
            clickSearch() {
                console.log(this.searchForm);
            },
            resetSearchForm(formName) {
                this.$refs[formName].resetFields();
            },
            handleClick(row) {
                console.log(row);
                this.dialogVisible = true;
            },
            confirmDelete(row) {
                console.log("确定删除", row);
            },
            handleCurrentChange(page) {
                console.log("想要查看:", page);
            },
            clickAddDialog() {
                this.dialogFormVisible = true;
            },
        }
    }
</script>

<style scoped>

</style>
src/views/msg/Push.vue
<template>
    <div style="padding: 20px;">
        <el-card class="box-card">
            <el-form :inline="true" class="demo-form-inline" size="small" :model="searchForm" ref="searchForm">
                <el-form-item label="标题" prop="title">
                    <el-input placeholder="标题" v-model="searchForm.title"></el-input>
                </el-form-item>

                <el-form-item label="类型" prop="category">
                    <el-select placeholder="类型" v-model="searchForm.category">
                        <el-option v-for="item in categoryOptions" :key="item.value" :label="item.label"
                                   :value="item.value"></el-option>
                        <el-option label="区域二" value="beijing"></el-option>
                    </el-select>
                </el-form-item>

                <el-form-item>
                    <el-button size="small" type="primary" @click="clickSearch">筛选</el-button>
                    <el-button size="small" @click="resetSearchForm('searchForm')">重置</el-button>
                </el-form-item>

            </el-form>

        </el-card>

        <el-card class="box-card" style="margin-top: 25px;">
            <div slot="header" class="clearfix">
                <span><i class="el-icon-s-grid"></i> 消息列表</span>
                <el-button style="float: right;" type="primary" size="small" @click="clickAddDialog">
                    <i class="el-icon-circle-plus-outline"></i> 操作按钮
                </el-button>
            </div>
            <div>
                <el-table :data="tableData" border style="width: 100%">
                    <el-table-column prop="date" label="日期"></el-table-column>
                    <el-table-column prop="name" label="姓名"></el-table-column>
                    <el-table-column prop="address" label="地址"></el-table-column>
                    <el-table-column label="状态">
                        <template slot-scope="scope">
                            <el-tag v-if="scope.row.status === 1" type="success">成功</el-tag>
                            <el-tag v-else type="danger">失败</el-tag>
                        </template>
                    </el-table-column>
                    <el-table-column label="操作">
                        <template slot-scope="scope">
                            <el-button @click="handleClick(scope.row)" type="text" size="small">查看</el-button>

                            <el-popconfirm title="这是一段内容确定删除吗?" @confirm="confirmDelete(scope.row)">
                                <el-button slot="reference" type="text" size="small">删除</el-button>
                            </el-popconfirm>
                        </template>
                    </el-table-column>
                </el-table>
            </div>
            <el-row type="flex" justify="end" style="margin-top: 30px;">
                <el-pagination
                        :total="page.totalCount"
                        :page-size="page.perPageSize"
                        background
                        layout="prev, pager, next,jumper"
                        @current-change="handleCurrentChange"
                >
                </el-pagination>
            </el-row>
        </el-card>


        <el-dialog title="收货地址" :visible.sync="dialogFormVisible">
            <el-form label-position="left" label-width="80px" :model="addForm">
                <el-form-item label="活动名称" prop="x1">
                    <el-input autocomplete="off" v-model="addForm.x1"></el-input>
                </el-form-item>
                <el-form-item label="活动区域" prop="x2">
                    <el-select placeholder="请选择活动区域" v-model="addForm.x2">
                        <el-option label="区域一" value="shanghai"></el-option>
                        <el-option label="区域二" value="beijing"></el-option>
                    </el-select>
                </el-form-item>
            </el-form>
            <div slot="footer" class="dialog-footer">
                <el-button @click="dialogFormVisible = false">取 消</el-button>
                <el-button type="primary" @click="dialogFormVisible = false">确 定</el-button>
            </div>
        </el-dialog>

        <el-dialog title="提示" :visible.sync="dialogVisible" width="30%">
            <span>这是一段信息</span>
            <span slot="footer" class="dialog-footer">
                <el-button @click="dialogVisible = false">取 消</el-button>
                <el-button type="primary" @click="dialogVisible = false">确 定</el-button>
              </span>
        </el-dialog>
    </div>
</template>

<script>
    export default {
        name: "Sop",
        data() {
            return {
                searchForm: {
                    title: "",
                    category: ""
                },
                categoryOptions: [
                    {
                        value: '1',
                        label: '黄金糕'
                    }, {
                        value: '2',
                        label: '双皮奶'
                    }, {
                        value: '3',
                        label: '蚵仔煎'
                    }, {
                        value: '4',
                        label: '龙须面'
                    }, {
                        value: '5',
                        label: '北京烤鸭'
                    }],
                tableData: [
                    {
                        date: '2016-05-02',
                        name: '王小虎',
                        province: '上海',
                        city: '普陀区',
                        address: '上海市普陀区金沙江路 1518 弄',
                        zip: 200333,
                        status:1
                    }, {
                        date: '2016-05-04',
                        name: '王小虎',
                        province: '上海',
                        city: '普陀区',
                        address: '上海市普陀区金沙江路 1517 弄',
                        zip: 200333,
                        status:2
                    }, {
                        date: '2016-05-01',
                        name: '王小虎',
                        province: '上海',
                        city: '普陀区',
                        address: '上海市普陀区金沙江路 1519 弄',
                        zip: 200333,
                        status:1
                    }, {
                        date: '2016-05-03',
                        name: '王小虎',
                        province: '上海',
                        city: '普陀区',
                        address: '上海市普陀区金沙江路 1516 弄',
                        zip: 200333,
                        status:1
                    }],
                page: {
                    totalCount: 10000,
                    perPageSize: 20
                },
                dialogFormVisible: false,
                addForm: {
                    x1: "",
                    x2: ""
                },
                dialogVisible: false
            }
        },
        methods: {
            clickSearch() {
                console.log(this.searchForm);
            },
            resetSearchForm(formName) {
                this.$refs[formName].resetFields();
            },
            handleClick(row) {
                console.log(row);
                this.dialogVisible = true;
            },
            confirmDelete(row) {
                console.log("确定删除", row);
            },
            handleCurrentChange(page) {
                console.log("想要查看:", page);
            },
            clickAddDialog() {
                this.dialogFormVisible = true;
            },
        }
    }
</script>

<style scoped>

</style>
src/views/msg/Sop.vue

 

<template>
    <div>
       <router-view></router-view>
    </div>
</template>

<script>
    export default {
        name: "Activity"
    }
</script>

<style scoped>

</style>
src/views/task/Activity.vue
<template>
    <div style="padding: 20px;">
        <el-row type="flex" justify="end">
            <el-button type="success" size="small"><i class="el-icon-setting"></i> 保存</el-button>
        </el-row>
        <el-tabs tab-position="left" v-model="activeName" @tab-click="handleClick">
            <el-tab-pane label="活动设置" name="tab1">活动设置</el-tab-pane>
            <el-tab-pane label="参与公众号" name="tab2">参与公众号</el-tab-pane>
            <el-tab-pane label="奖励设置" name="tab3">奖励设置</el-tab-pane>
            <el-tab-pane label="海报设置" name="tab4">海报设置</el-tab-pane>
            <el-tab-pane label="进度消息" name="tab5">进度消息</el-tab-pane>
            <el-tab-pane label="其他消息" name="tab6">其他消息</el-tab-pane>
        </el-tabs>
    </div>
</template>

<script>
    export default {
        name: "ActivityCreate",
        data() {
            return {
                activeName: "tab2"
            }
        },
        created() {
            const loading = this.$loading({
                lock: true,
                text: '努力加载中',
                spinner: 'el-icon-loading'
            });

            setTimeout(() => {
                loading.close();
            }, 2000);
        },
        methods: {
            handleClick(tab, event) {
                console.log(tab, event);
            }
        }
    }
</script>

<style scoped>

</style>
src/views/task/ActivityCreate.vue
<template>
    <div style="padding: 20px">
        <router-link :to="{name:'ActivityCreate'}">
            <el-button type="primary" size="small"><i class="el-icon-circle-plus-outline"></i> 新建活动</el-button>
        </router-link>

        <el-row style="margin-top: 25px;">
            <el-form :inline="true" class="demo-form-inline" size="small" :model="searchForm" ref="searchForm">


                <el-form-item label="活动状态" prop="category">
                    <el-select placeholder="全部状态" v-model="searchForm.category">
                        <el-option v-for="item in categoryOptions" :key="item.value" :label="item.label"
                                   :value="item.value"></el-option>
                        <el-option label="区域二" value="beijing"></el-option>
                    </el-select>
                </el-form-item>

                <el-form-item label="公众号" prop="category">
                    <el-select placeholder="全部公众号" v-model="searchForm.category">
                        <el-option v-for="item in categoryOptions" :key="item.value" :label="item.label"
                                   :value="item.value"></el-option>
                        <el-option label="区域二" value="beijing"></el-option>
                    </el-select>
                </el-form-item>

                <el-form-item label="活动名称" prop="title">
                    <el-input placeholder="活动名称" v-model="searchForm.title"></el-input>
                </el-form-item>
                <el-form-item>
                    <el-button size="small" type="primary">筛选</el-button>
                    <el-button size="small">重置</el-button>
                </el-form-item>

            </el-form>

        </el-row>

        <el-row :gutter="20">
            <el-col style="width: 240px;margin-bottom: 20px;" v-for="(o, index) in 12" :key="o">
                <el-card :body-style="{ padding: '0px' }">
                    <img style="height: 160px;width: 100%;"
                         src="https://shadow.elemecdn.com/app/element/hamburger.9cf7b091-55e9-11e9-a976-7f4d0b07eef6.png"
                         class="image">
                    <div style="padding: 14px;">
                        <span>好吃的汉堡{{index}}</span>
                        <el-row style="margin-top: 8px;">
                            <el-button icon="el-icon-search" size="mini" circle></el-button>
                            <el-button icon="el-icon-edit" size="mini" circle></el-button>
                            <el-button icon="el-icon-check" size="mini" circle></el-button>
                            <el-button icon="el-icon-message" size="mini" circle></el-button>
                        </el-row>
                    </div>
                </el-card>
            </el-col>
        </el-row>
    </div>
</template>

<script>
    export default {
        name: "ActivityList",
        data() {
            return {
                searchForm: {
                    title: "",
                    category: ""
                },
                categoryOptions: [
                    {
                        value: '1',
                        label: '黄金糕'
                    }, {
                        value: '2',
                        label: '双皮奶'
                    }, {
                        value: '3',
                        label: '蚵仔煎'
                    }, {
                        value: '4',
                        label: '龙须面'
                    }, {
                        value: '5',
                        label: '北京烤鸭'
                    }],
                currentDate: new Date()
            }
        },
        created() {
            this.axios.get("/base/test/").then(res => {
                console.log("请求成功", res);
            }).catch(reason => {
                console.log('请求失败', reason);
                return reason;
            })
        }

    }
</script>

<style scoped>

    .image {
        width: 100%;
        display: block;
    }

</style>
src/views/task/ActivityList.vue
<template>
    <div style="padding: 20px;">
        <el-card class="box-card">
            <el-form :inline="true" class="demo-form-inline" size="small" :model="searchForm" ref="searchForm">

                <el-form-item label="当前任务" prop="category" style="margin-bottom: 0">
                    <el-select placeholder="全部任务" v-model="searchForm.task" @change="changeTask">
                        <el-option v-for="item in categoryOptions" :key="item.value" :label="item.label"
                                   :value="item.value"></el-option>
                        <el-option label="区域二" value="beijing"></el-option>
                    </el-select>
                </el-form-item>


                <el-form-item label="推广码" prop="category" style="margin-bottom: 0">
                    <el-select placeholder="全部渠道" v-model="searchForm.category">
                        <el-option v-for="item in categoryOptions" :key="item.value" :label="item.label"
                                   :value="item.value"></el-option>
                        <el-option label="区域二" value="beijing"></el-option>
                    </el-select>
                </el-form-item>

            </el-form>

        </el-card>

        <!--   <el-button @click="selectedOne">点我</el-button>-->
        <el-row style="margin-top: 30px;">

            <el-row justify="end" type="flex" style="float: right;z-index: 1">
                <el-input
                        style="margin-right: 10px;"
                        size="small"
                        placeholder="请输入内容"
                        suffix-icon="el-icon-search"
                        v-model="keySearch">
                </el-input>
                <el-button size="small" type="primary">导出</el-button>
                <el-button size="small" type="primary" @click="addToBlackList">移入黑名单</el-button>
                <el-button size="small" type="primary">移出黑名单</el-button>
            </el-row>

            <el-tabs v-model="activeName" type="card">
                <el-tab-pane label="参与用户" name="first">

                    <el-table ref="myTable" :data="tableData" style="width: 100%"
                              @selection-change="handleSelectionChange">
                        <el-table-column type="selection" width="55"></el-table-column>
                        <el-table-column prop="date" label="日期"></el-table-column>
                        <el-table-column prop="name" label="姓名"></el-table-column>
                        <el-table-column prop="address" label="地址"></el-table-column>
                        <el-table-column label="状态">
                            <template slot-scope="scope">
                                <el-tag v-if="scope.row.status === 1" type="success">成功</el-tag>
                                <el-tag v-else type="danger">失败</el-tag>
                            </template>
                        </el-table-column>
                        <el-table-column label="操作">
                            <template slot-scope="scope">
                                <el-button @click="handleClick(scope.row)" type="text" size="small">查看</el-button>

                                <el-popconfirm title="这是一段内容确定删除吗?" @confirm="confirmDelete(scope.row)">
                                    <el-button slot="reference" type="text" size="small">删除</el-button>
                                </el-popconfirm>
                            </template>
                        </el-table-column>
                    </el-table>

                    <el-row type="flex" justify="end" style="margin-top: 30px;">
                        <el-pagination
                                :total="page.totalCount"
                                :page-size="page.perPageSize"
                                background
                                layout="prev, pager, next,jumper"
                                @current-change="handleCurrentChange"
                        >
                        </el-pagination>
                    </el-row>
                </el-tab-pane>


                <el-tab-pane label="黑名单" name="second">
                    <el-table :data="tableData" border style="width: 100%">
                        <el-table-column prop="date" label="日期"></el-table-column>
                        <el-table-column prop="name" label="姓名"></el-table-column>
                        <el-table-column prop="address" label="地址"></el-table-column>
                        <el-table-column label="状态">
                            <template slot-scope="scope">
                                <el-tag v-if="scope.row.status === 1" type="success">成功</el-tag>
                                <el-tag v-else type="danger">失败</el-tag>
                            </template>
                        </el-table-column>
                        <el-table-column label="操作">
                            <template slot-scope="scope">
                                <el-button @click="handleClick(scope.row)" type="text" size="small">查看</el-button>

                                <el-popconfirm title="这是一段内容确定删除吗?" @confirm="confirmDelete(scope.row)">
                                    <el-button slot="reference" type="text" size="small">删除</el-button>
                                </el-popconfirm>
                            </template>
                        </el-table-column>
                    </el-table>
                    <el-row type="flex" justify="end" style="margin-top: 30px;">
                        <el-pagination
                                :total="page.totalCount"
                                :page-size="page.perPageSize"
                                background
                                layout="prev, pager, next,jumper"
                                @current-change="handleCurrentChange"
                        >
                        </el-pagination>
                    </el-row>
                </el-tab-pane>
            </el-tabs>

        </el-row>


        <el-dialog title="收货地址" :visible.sync="dialogFormVisible">
            <el-form label-position="left" label-width="80px" :model="addForm">
                <el-form-item label="活动名称" prop="x1">
                    <el-input autocomplete="off" v-model="addForm.x1"></el-input>
                </el-form-item>
                <el-form-item label="活动区域" prop="x2">
                    <el-select placeholder="请选择活动区域" v-model="addForm.x2">
                        <el-option label="区域一" value="shanghai"></el-option>
                        <el-option label="区域二" value="beijing"></el-option>
                    </el-select>
                </el-form-item>
            </el-form>
            <div slot="footer" class="dialog-footer">
                <el-button @click="dialogFormVisible = false">取 消</el-button>
                <el-button type="primary" @click="dialogFormVisible = false">确 定</el-button>
            </div>
        </el-dialog>

        <el-dialog title="提示" :visible.sync="dialogVisible" width="30%">
            <span>这是一段信息</span>
            <span slot="footer" class="dialog-footer">
                <el-button @click="dialogVisible = false">取 消</el-button>
                <el-button type="primary" @click="dialogVisible = false">确 定</el-button>
              </span>
        </el-dialog>
    </div>
</template>

<script>
    export default {
        name: "Fans",
        data() {
            return {
                keySearch: "",
                activeName: "first",
                searchForm: {
                    task: "3",
                    category: ""
                },
                categoryOptions: [
                    {
                        value: '11',
                        label: '黄金糕'
                    }, {
                        value: '12',
                        label: '双皮奶'
                    }, {
                        value: '3',
                        label: '蚵仔煎'
                    }, {
                        value: '4',
                        label: '龙须面'
                    }, {
                        value: '5',
                        label: '北京烤鸭'
                    }],
                tableData: [
                    {
                        date: '2016-05-02',
                        name: '王小虎',
                        province: '上海',
                        city: '普陀区',
                        address: '上海市普陀区金沙江路 1518 弄',
                        zip: 200333,
                        status: 1
                    }, {
                        date: '2016-05-04',
                        name: '王小虎',
                        province: '上海',
                        city: '普陀区',
                        address: '上海市普陀区金沙江路 1517 弄',
                        zip: 200333,
                        status: 2
                    }, {
                        date: '2016-05-01',
                        name: '王小虎',
                        province: '上海',
                        city: '普陀区',
                        address: '上海市普陀区金沙江路 1519 弄',
                        zip: 200333,
                        status: 1
                    }, {
                        date: '2016-05-03',
                        name: '王小虎',
                        province: '上海',
                        city: '普陀区',
                        address: '上海市普陀区金沙江路 1516 弄',
                        zip: 200333,
                        status: 1
                    }],
                page: {
                    totalCount: 10000,
                    perPageSize: 20
                },
                dialogFormVisible: false,
                addForm: {
                    x1: "",
                    x2: ""
                },
                dialogVisible: false,
                checkDataList: []
            }
        },
        mounted() {
            this.$refs.myTable.toggleRowSelection(this.tableData[3]);
        },
        methods: {
            clickSearch() {
                console.log(this.searchForm);
            },
            resetSearchForm(formName) {
                this.$refs[formName].resetFields();
            },
            handleClick(row) {
                console.log(row);
                this.dialogVisible = true;
            },
            confirmDelete(row) {
                console.log("确定删除", row);
            },
            handleCurrentChange(page) {
                console.log("想要查看:", page);
            },
            clickAddDialog() {
                this.dialogFormVisible = true;
            },
            changeTask(obj) {
                console.log("修改任务", obj);
            },
            handleSelectionChange(valueList) {
                console.log(valueList);
                this.checkDataList = valueList;
            },
            selectedOne() {
                this.$refs.myTable.toggleRowSelection(this.tableData[2]);
            },
            addToBlackList() {
                // 获取已经选中的数据
                console.log('移入黑名单', this.checkDataList);
            }
        }
    }
</script>

<style scoped>

</style>
src/views/task/Fans.vue
<template>
    <div style="padding: 20px;">
        <el-card class="box-card">
            <el-form :inline="true" class="demo-form-inline" size="small" :model="searchForm" ref="searchForm">
                <el-form-item label="标题" prop="title">
                    <el-input placeholder="标题" v-model="searchForm.title"></el-input>
                </el-form-item>

                <el-form-item label="类型" prop="category">
                    <el-select placeholder="类型" v-model="searchForm.category">
                        <el-option v-for="item in categoryOptions" :key="item.value" :label="item.label"
                                   :value="item.value"></el-option>
                        <el-option label="区域二" value="beijing"></el-option>
                    </el-select>
                </el-form-item>

                <el-form-item>
                    <el-button size="small" type="primary" @click="clickSearch">筛选</el-button>
                    <el-button size="small" @click="resetSearchForm('searchForm')">重置</el-button>
                </el-form-item>

            </el-form>

        </el-card>

        <el-card class="box-card" style="margin-top: 25px;">
            <div slot="header" class="clearfix">
                <span><i class="el-icon-s-grid"></i> 消息列表</span>
                <el-button style="float: right;" type="primary" size="small" @click="clickAddDrawer">
                    <i class="el-icon-circle-plus-outline"></i> 新建推广码
                </el-button>
            </div>
            <div>
                <el-table :data="tableData" border style="width: 100%">
                    <el-table-column prop="date" label="日期"></el-table-column>
                    <el-table-column prop="name" label="姓名"></el-table-column>
                    <el-table-column prop="address" label="地址"></el-table-column>
                    <el-table-column label="二维码">

                        <template slot-scope="scope">
                            <el-popover
                                    placement="right"
                                    trigger="hover">
                                <div>
                                    <el-image
                                            style="width: 140px; height: 140px"
                                            :src="scope.row.url"
                                            fit="fit"></el-image>
                                </div>
                                <el-image slot="reference" style="width: 40px; height: 40px" :src="scope.row.url"
                                          fit="fit"></el-image>
                            </el-popover>

                        </template>

                    </el-table-column>
                    <el-table-column label="操作">
                        <template slot-scope="scope">
                            <el-button @click="handleClick(scope.row)" type="text" size="small">查看</el-button>

                            <el-button @click="handleEditClick(scope.row)" type="text" size="small">编辑</el-button>


                            <el-popconfirm style="display: inline-block;margin-left: 10px;" title="这是一段内容确定删除吗?" @confirm="confirmDelete(scope.row)">
                                <el-button slot="reference" type="text" size="small">删除</el-button>
                            </el-popconfirm>

                        </template>
                    </el-table-column>
                </el-table>
            </div>
            <el-row type="flex" justify="end" style="margin-top: 30px;">
                <el-pagination
                        :total="page.totalCount"
                        :page-size="page.perPageSize"
                        background
                        layout="prev, pager, next,jumper"
                        @current-change="handleCurrentChange"
                >
                </el-pagination>
            </el-row>
        </el-card>


        <el-dialog title="提示" :visible.sync="dialogVisible" width="30%">
            <span>这是一段信息</span>
            <span slot="footer" class="dialog-footer">
                <el-button @click="dialogVisible = false">取 消</el-button>
                <el-button type="primary" @click="dialogVisible = false">确 定</el-button>
              </span>
        </el-dialog>


        <el-drawer title="我是标题" :visible.sync="drawerVisible" :before-close="handleDrawerClose" direction="ltr">
            <div style="padding: 25px;">
                <el-form label-position="left" label-width="80px" :model="addForm" size="small">
                    <el-form-item label="活动名称" prop="x1">
                        <el-input autocomplete="off" v-model="addForm.x1"></el-input>
                    </el-form-item>
                    <el-form-item label="活动区域" prop="x2">
                        <el-select placeholder="请选择活动区域" v-model="addForm.x2">
                            <el-option label="区域一" value="shanghai"></el-option>
                            <el-option label="区域二" value="beijing"></el-option>
                        </el-select>
                    </el-form-item>
                    <el-form-item>
                        <el-button @click="dialogFormVisible = false">取 消</el-button>
                        <el-button type="primary" @click="dialogFormVisible = false">确 定</el-button>
                    </el-form-item>
                </el-form>
            </div>
        </el-drawer>

    </div>
</template>

<script>
    export default {
        name: "Promo",
        data() {
            return {
                drawerVisible: false,
                searchForm: {
                    title: "",
                    category: ""
                },
                categoryOptions: [
                    {
                        value: '1',
                        label: '黄金糕'
                    }, {
                        value: '2',
                        label: '双皮奶'
                    }, {
                        value: '3',
                        label: '蚵仔煎'
                    }, {
                        value: '4',
                        label: '龙须面'
                    }, {
                        value: '5',
                        label: '北京烤鸭'
                    }],
                tableData: [
                    {
                        date: '2016-05-02',
                        name: '王小虎',
                        province: '上海',
                        city: '普陀区',
                        address: '上海市普陀区金沙江路 1518 弄',
                        zip: 200333,
                        url: 'https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg',
                        status: 1
                    }, {
                        date: '2016-05-04',
                        name: '王小虎',
                        province: '上海',
                        city: '普陀区',
                        address: '上海市普陀区金沙江路 1517 弄',
                        zip: 200333,
                        url: 'https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg',
                        status: 2
                    }, {
                        date: '2016-05-01',
                        name: '王小虎',
                        province: '上海',
                        city: '普陀区',
                        address: '上海市普陀区金沙江路 1519 弄',
                        zip: 200333,
                        url: 'https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg',
                        status: 1
                    }, {
                        date: '2016-05-03',
                        name: '王小虎',
                        province: '上海',
                        city: '普陀区',
                        address: '上海市普陀区金沙江路 1516 弄',
                        zip: 200333,
                        url: 'https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg',
                        status: 1
                    }],
                page: {
                    totalCount: 10000,
                    perPageSize: 20
                },
                dialogFormVisible: false,
                addForm: {
                    x1: "",
                    x2: ""
                },
                dialogVisible: false
            }
        },
        methods: {
            clickSearch() {
                console.log(this.searchForm);
            },
            resetSearchForm(formName) {
                this.$refs[formName].resetFields();
            },
            handleClick(row) {
                console.log(row);
                this.dialogVisible = true;
            },
            confirmDelete(row) {
                console.log("确定删除", row);
            },
            handleCurrentChange(page) {
                console.log("想要查看:", page);
            },
            clickAddDrawer() {
                this.drawerVisible = true;
            },
            handleDrawerClose(done) {
                console.log("要关闭了");
                done(); // 关闭
            },
            handleEditClick(row){
                console.log(row);
                this.drawerVisible = true;
            }
        }
    }
</script>

<style scoped>

</style>
src/views/task/Promo.vue
<template>
    <div style="padding: 20px;">
        <el-card class="box-card" shadow="never">
            <el-form :inline="true" class="demo-form-inline" size="small" :model="searchForm" ref="searchForm">

                <el-form-item label="当前任务" prop="category" style="margin-bottom: 0">
                    <el-select placeholder="全部任务" v-model="searchForm.task" @change="changeTask">
                        <el-option v-for="item in categoryOptions" :key="item.value" :label="item.label"
                                   :value="item.value"></el-option>
                        <el-option label="区域二" value="beijing"></el-option>
                    </el-select>
                </el-form-item>


                <el-form-item label="推广码" prop="category" style="margin-bottom: 0">
                    <el-select placeholder="全部渠道" v-model="searchForm.category">
                        <el-option v-for="item in categoryOptions" :key="item.value" :label="item.label"
                                   :value="item.value"></el-option>
                        <el-option label="区域二" value="beijing"></el-option>
                    </el-select>
                </el-form-item>

            </el-form>

        </el-card>

        <el-row style="margin-top: 30px;" :gutter="20">
            <el-col :span="12">

                <el-row type="flex" justify="space-between" :gutter="20" style="flex-wrap: wrap">
                    <el-col :span="12">
                        <el-card shadow="never" class="stat-panel">
                            <div class="row">
                                <el-row type="flex" justify="space-between">
                                    <div>
                                        <div style="font-size: 40px;font-weight: bold">0</div>
                                        <div>今日新增</div>
                                    </div>
                                    <div>
                                        <i class="el-icon-attract" style="font-size: 60px;color: #0c8eff"></i>
                                    </div>
                                </el-row>
                                <el-row type="flex" justify="space-between">
                                    <div>昨日数据:0</div>
                                    <div>累计:23</div>
                                </el-row>
                            </div>
                        </el-card>
                    </el-col>
                    <el-col :span="12">
                        <el-card shadow="never" class="stat-panel">
                            <div class="row">
                                <el-row type="flex" justify="space-between">
                                    <div>
                                        <div style="font-size: 40px;font-weight: bold">0</div>
                                        <div>今日新增</div>
                                    </div>
                                    <div>
                                        <i class="el-icon-attract" style="font-size: 60px;color: #0c8eff"></i>
                                    </div>
                                </el-row>
                                <el-row type="flex" justify="space-between">
                                    <div>昨日数据:0</div>
                                    <div>累计:23</div>
                                </el-row>
                            </div>
                        </el-card>
                    </el-col>
                    <el-col :span="12" style="margin-top: 8px">
                        <el-card shadow="never" class="stat-panel">
                            <div class="row">
                                <el-row type="flex" justify="space-between">
                                    <div>
                                        <div style="font-size: 40px;font-weight: bold">0</div>
                                        <div>今日新增</div>
                                    </div>
                                    <div>
                                        <i class="el-icon-attract" style="font-size: 60px;color: #0c8eff"></i>
                                    </div>
                                </el-row>
                                <el-row type="flex" justify="space-between">
                                    <div>昨日数据:0</div>
                                    <div>累计:23</div>
                                </el-row>
                            </div>
                        </el-card>
                    </el-col>
                    <el-col :span="12" style="margin-top: 8px">
                        <el-card shadow="never" class="stat-panel">
                            <div class="row">
                                <el-row type="flex" justify="space-between">
                                    <div>
                                        <div style="font-size: 40px;font-weight: bold">0</div>
                                        <div>今日新增</div>
                                    </div>
                                    <div>
                                        <i class="el-icon-attract" style="font-size: 60px;color: #0c8eff"></i>
                                    </div>
                                </el-row>
                                <el-row type="flex" justify="space-between">
                                    <div>昨日数据:0</div>
                                    <div>累计:23</div>
                                </el-row>
                            </div>
                        </el-card>
                    </el-col>
                </el-row>

            </el-col>
            <el-col :span="12">

                <el-card class="box-card" shadow="never">
                    <highcharts :options="opt1" style="height: 330px;min-width: 300px"></highcharts>
                </el-card>

            </el-col>
        </el-row>


        <el-row style="margin-top: 30px;" :gutter="20" type="flex" justify="space-between">
            <el-col :xs="12">
                <el-card class="box-card" shadow="never">
                    <div slot="header">
                        <span>xx统计情况</span>
                    </div>
                    <highcharts :options="opt2" style="height: 330px;min-width: 300px"></highcharts>
                </el-card>
            </el-col>
            <el-col :xs="12">
                <el-card class="box-card" shadow="never">
                    <div slot="header">
                        <span>裂变情况</span>
                    </div>
                    <highcharts :options="opt3" style="height: 330px;min-width: 300px"></highcharts>
                </el-card>
            </el-col>
        </el-row>

    </div>
</template>

<script>
    export default {
        name: "Stat",
        data() {
            return {
                searchForm: {
                    task: "3",
                    category: ""
                },
                categoryOptions: [
                    {
                        value: '11',
                        label: '黄金糕'
                    }, {
                        value: '12',
                        label: '双皮奶'
                    }, {
                        value: '3',
                        label: '蚵仔煎'
                    }, {
                        value: '4',
                        label: '龙须面'
                    }, {
                        value: '5',
                        label: '北京烤鸭'
                    }],
                opt1: {
                    title: {
                        text: '2010 ~ 2016 年太阳能行业就业人员发展情况'
                    },
                    subtitle: {
                        text: '数据来源:thesolarfoundation.com'
                    },
                    yAxis: {
                        title: {
                            text: '就业人数'
                        }
                    },
                    legend: {
                        layout: 'vertical',
                        align: 'right',
                        verticalAlign: 'middle'
                    },
                    plotOptions: {
                        series: {
                            label: {
                                connectorAllowed: false
                            },
                            pointStart: 2010
                        }
                    },
                    series: [{
                        name: '安装,实施人员',
                        data: [43934, 52503, 57177, 69658, 97031, 119931, 137133, 154175]
                    }, {
                        name: '工人',
                        data: [24916, 24064, 29742, 29851, 32490, 30282, 38121, 40434]
                    }, {
                        name: '销售',
                        data: [11744, 17722, 16005, 19771, 20185, 24377, 32147, 39387]
                    }, {
                        name: '项目开发',
                        data: [null, null, 7988, 12169, 15112, 22452, 34400, 34227]
                    }, {
                        name: '其他',
                        data: [12908, 5948, 8105, 11248, 8989, 11816, 18274, 18111]
                    }],
                    responsive: {
                        rules: [{
                            condition: {
                                maxWidth: 500
                            },
                            chartOptions: {
                                legend: {
                                    layout: 'horizontal',
                                    align: 'center',
                                    verticalAlign: 'bottom'
                                }
                            }
                        }]
                    }
                },
                opt2: {
                    chart: {
                        plotBackgroundColor: null,
                        plotBorderWidth: null,
                        plotShadow: false,
                        type: 'pie'
                    },
                    title: {
                        text: '2018 年浏览器市场份额'
                    },
                    tooltip: {
                        pointFormat: '{series.name}: <b>{point.percentage:.1f}%</b>'
                    },
                    plotOptions: {
                        pie: {
                            allowPointSelect: true,
                            cursor: 'pointer',
                            dataLabels: {
                                enabled: false
                            },
                            showInLegend: true
                        }
                    },
                    series: [{
                        name: 'Brands',
                        colorByPoint: true,
                        data: [{
                            name: 'Chrome',
                            y: 61.41,
                            sliced: true,
                            selected: true
                        }, {
                            name: 'Internet Explorer',
                            y: 11.84
                        }, {
                            name: 'Firefox',
                            y: 10.85
                        }, {
                            name: 'Edge',
                            y: 4.67
                        }, {
                            name: 'Safari',
                            y: 4.18
                        }, {
                            name: 'Other',
                            y: 7.05
                        }]
                    }]
                },
                opt3: {
                    chart: {
                        type: 'column'
                    },
                    title: {
                        text: '月平均降雨量'
                    },
                    subtitle: {
                        text: '数据来源: WorldClimate.com'
                    },
                    xAxis: {
                        categories: [
                            '一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'
                        ],
                        crosshair: true
                    },
                    yAxis: {
                        min: 0,
                        title: {
                            text: '降雨量 (mm)'
                        }
                    },
                    tooltip: {
                        // head + 每个 point + footer 拼接成完整的 table
                        headerFormat: '<span style="font-size:10px">{point.key}</span><table>',
                        pointFormat: '<tr><td style="color:{series.color};padding:0">{series.name}: </td>' +
                            '<td style="padding:0"><b>{point.y:.1f} mm</b></td></tr>',
                        footerFormat: '</table>',
                        shared: true,
                        useHTML: true
                    },
                    plotOptions: {
                        column: {
                            borderWidth: 0
                        }
                    },
                    series: [{
                        name: '东京',
                        data: [49.9, 71.5, 106.4, 129.2, 144.0, 176.0, 135.6, 148.5, 216.4, 194.1, 95.6, 54.4]
                    }, {
                        name: '纽约',
                        data: [83.6, 78.8, 98.5, 93.4, 106.0, 84.5, 105.0, 104.3, 91.2, 83.5, 106.6, 92.3]
                    }, {
                        name: '伦敦',
                        data: [48.9, 38.8, 39.3, 41.4, 47.0, 48.3, 59.0, 59.6, 52.4, 65.2, 59.3, 51.2]
                    }, {
                        name: '柏林',
                        data: [42.4, 33.2, 34.5, 39.7, 52.6, 75.5, 57.4, 60.4, 47.6, 39.1, 46.8, 51.1]
                    }]
                }

            }
        }
    }
</script>

<style scoped>
    .stat-panel .row {
        height: 140px;
        display: flex;
        flex-direction: column;
        justify-content: space-between;
    }
</style>
src/views/task/Stat.vue
<template>
    <div>
        <el-menu class="sub-menu" mode="horizontal" :default-active="subActiveRouter" router>
            <el-menu-item index="Activity" :route="{name:'ActivityList'}"><i class="el-icon-coin"></i>活动管理</el-menu-item>
            <el-menu-item index="Promo" :route="{name:'Promo'}"><i class="el-icon-data-analysis"></i>推广码</el-menu-item>
            <el-menu-item index="Stat" :route="{name:'Stat'}"><i class="el-icon-document"></i>数据统计</el-menu-item>
            <el-menu-item index="Fans" :route="{name:'Fans'}"><i class="el-icon-setting"></i>参与粉丝</el-menu-item>
        </el-menu>

        <router-view></router-view>
    </div>
</template>

<script>
    export default {
        name: "TaskLayout",
        data() {
            return {
                subActiveRouter: ""
            }
        },
        watch:{
            $route:function (to) {
                // console.log('--->',to);
                this.subActiveRouter = to.matched[2].name;
            }
        },
        mounted(){
            // 获取当前的所有路由
            this.subActiveRouter = this.$route.matched[2].name;
        }
    }
</script>

<style scoped>
    .sub-menu .el-menu-item {
        line-height: 40px;
        height: 40px;
        vertical-align: middle;
        font-size: 13px;
    }

    .sub-menu .el-menu-item i {
        margin-top: -3px;
    }
</style>
src/views/task/TaskLayout.vue

 

<template>
    <div class="home">
        <div>
            <el-menu class="el-menu-demo" mode="horizontal" :default-active="rootActiveRouter"
                     background-color="#545c64"
                     text-color="#fff" active-text-color="#ffd04b" router>
                <el-menu-item>媒体宝系统</el-menu-item>

                <el-menu-item index="Task" :route="{name:'Activity'}">任务宝</el-menu-item>

                <el-menu-item index="Msg" :route="{name:'Push'}">消息宝</el-menu-item>

                <el-menu-item index="Auth" :route="{name:'Auth'}">公众号授权</el-menu-item>

                <el-submenu class="right">
                    <template slot="title">{{username}}</template>
                    <el-menu-item index="Info" :route="{name:'Info'}">个人信息</el-menu-item>
                    <el-menu-item index="Login" @click="goTo">注销</el-menu-item>
                </el-submenu>

            </el-menu>
        </div>
    </div>
</template>

<script>
    // @ is an alias to /src
    // import HelloWorld from '@/components/HelloWorld.vue'

    export default {
        name: 'Home',
        components: {
            // HelloWorld
        }
    }
</script>
src/views/Home.vue
<template>
    <div>
        <!--顶部菜单-->
        <div>
            <el-menu class="el-menu-demo" mode="horizontal" background-color="#545c64"
                     :default-active="rootActiveRouter"
                     text-color="#fff" active-text-color="#ffd04b" router>
                <el-menu-item>媒体宝系统</el-menu-item>
                <el-menu-item index="Task" :route="{name:'ActivityList'}">任务宝</el-menu-item>
                <el-menu-item index="Msg" :route="{name:'Push'}">消息宝</el-menu-item>
                <el-menu-item index="Auth" :route="{name:'Auth'}">授权</el-menu-item>

                <el-submenu index="5" style="float: right">
                    <template slot="title">{{username}}</template>
                    <el-menu-item index="5-1">个人中心</el-menu-item>
                    <el-menu-item index="5-2">注销</el-menu-item>
                </el-submenu>
            </el-menu>
        </div>
        <div>
            <router-view></router-view>
        </div>


    </div>
</template>

<script>
    export default {
        name: "Layout",
        data() {
            return {
                rootActiveRouter: ""
            }
        },
        mounted() {
            // 获取当前的所有路由
            this.rootActiveRouter = this.$route.matched[1].name;
        },
        computed: {
            username() {
                return this.$store.state.username;
            }
        }
    }
</script>

<style scoped>

</style>
src/views/Layout.vue
<template>
    <div class="main">
        <div class="loginBox">
            <div class="tabBoxSwitch">
                <ul class="tabBoxSwitchUl">
                    <li :class="tabSelected === index?'tab-active' : ''" v-for="(txt,index) in tabList" :key="index"
                        @click="tabSelected=index">{{txt}}
                    </li>
                </ul>
            </div>

            <div v-show="tabSelected===0">

                <el-form :model="userForm" :rules="userRules" ref="userForm" >
                <!--<el-form :model="userForm" :rules="userRules" ref="userForm"  label-width="80px" label-position="left">-->
                    <!--<el-form-item label="用户名:">-->
                        <!--<el-input></el-input>-->
                    <!--</el-form-item>-->


                    <el-form-item prop="username" style="margin-top: 24px;" :error="userFormError.username">
                        <el-input v-model="userForm.username" placeholder="用户名或手机号"></el-input>
                    </el-form-item>
                    <el-form-item prop="password" :error="userFormError.password">
                        <el-input v-model="userForm.password" placeholder="密码" show-password></el-input>
                    </el-form-item>
                    <el-form-item>
                        <el-button @click="submitForm('userForm')" type="primary" size="medium">登 录</el-button>
                    </el-form-item>
                </el-form>
            </div>

            <div v-show="tabSelected===1">
                <el-form :model="smsForm" :rules="smsRules" ref="smsForm">
                    <el-form-item prop="phone" style="margin-top: 24px;">
                        <el-input v-model="smsForm.phone" placeholder="手机号"></el-input>
                    </el-form-item>
                    <el-form-item prop="code">
                        <el-row type="flex" justify="space-between">
                            <el-input v-model="smsForm.code" placeholder="验证码"></el-input>
                            <el-button :disabled="btnSmsDisabled" @click="sendSmsCode" style="margin-left: 10px;">
                                {{btnSmsText}}
                            </el-button>
                        </el-row>

                    </el-form-item>
                    <el-form-item>
                        <el-button @click="submitForm('smsForm')" type="primary" size="medium">登 录</el-button>
                    </el-form-item>
                </el-form>
            </div>

        </div>
    </div>
</template>

<script>
    export default {
        name: "Login",
        data() {
            return {
                tabSelected: 0,
                tabList: ["密码登录", "免密码登录"],
                userForm: {
                    username: "",
                    password: ""
                },
                userFormError: {
                    username: "",
                    password: ""
                },
                userRules: {
                    username: [
                        {required: true, message: '请输入用户名或手机', trigger: 'blur'},
                    ],
                    password: [
                        {required: true, message: '请输入密码', trigger: 'blur'},
                    ],
                },
                smsForm: {
                    phone: "",
                    code: ""
                },
                smsRules: {
                    phone: [
                        {required: true, message: '请输入手机号', trigger: 'blur'},
                        {pattern: /^1[3456789]\d{9}$/, message: '手机号格式错误', trigger: 'blur'},
                    ],
                    code: [
                        {required: true, message: '验证码', trigger: 'blur'},
                    ],
                },

                btnSmsDisabled: false,
                btnSmsText: "发送验证码"
            }
        },
        methods: {
            submitForm(formName) {
                // 清空原来的错误
                this.clearCustomFormError();

                // 执行验证规则
                this.$refs[formName].validate((valid) => {
                    if (!valid) {
                        //console.log("验证未通过");
                        return false;
                    }
                    // console.log("验证通过");
                    // 验证通过,向后端的API发送请求
                    this.axios.post("/base/auth/", this.userForm).then(res => {
                        // res.data = {code:1000, detail:"...."}
                        // res.data = {code:0, detail:"....", data:{ username:"用户名", token:"jwt"}}
                        if (res.data.code === 0) {
                            // 登录成功:写入cookie、写入state
                            this.$store.commit("login", res.data.data);
                            this.$router.push({path: "/"})
                            return
                        }
                        // 1000,字段错误,把相关错误信息现在标签上
                        if (res.data.code === 1000) {
                            // 不好弄,API获取数据,错误显示表单。
                            // detail = { username:['错误',] ,password: [11,22] }
                            this.validateFormFailed(res.data.detail);
                            return;
                        }
                        // 1001,整体错误,整体显示
                        if (res.data.code === 1001) {
                            this.$message.error(res.data.detail);
                        } else {
                            this.$message.error("请求失败");
                        }

                    });
                });
            },
            sendSmsCode() {
                this.$refs.smsForm.validateField("phone", (error) => {
                    if (error) {
                        return false;
                    }
                    // 验证通过拿到手机号,向后台发送请求 -> 发送验证码
                    // 禁用按钮
                    this.btnSmsDisabled = true;
                    // 设置倒计时
                    let txt = 60;
                    let interval = window.setInterval(() => {
                        txt -= 1;
                        this.btnSmsText = `${txt}秒后重发`
                        if (txt < 1) {
                            this.btnSmsText = "重新发送";
                            this.btnSmsDisabled = false;
                            window.clearInterval(interval);
                        }
                    }, 1000);

                })
            },
            validateFormFailed(errorData) {
                for (let fieldName in errorData) {
                    let error = errorData[fieldName][0];
                    this.userFormError[fieldName] = error;
                }
            },
            clearCustomFormError() {
                for (let key in this.userFormError) {
                    this.userFormError[key] = ""
                }

            },
        }
    }
</script>

<style scoped>
    .main {
        width: 100%;
        height: 100vh;
        background-color: #2E3E9C;

        display: flex;
        flex-direction:column;
        justify-content: center;
        align-items: center;
    }

    .loginBox {
        background-color: #FFFFFF;
        box-shadow: 0 1px 3px rgba(26, 26, 26, 0.1);
        border-radius: 2px;
        width: 380px;
        min-height: 200px;
        padding: 0 24px 20px;
    }


    .tabBoxSwitch .tabBoxSwitchUl {
        list-style: none;
        padding: 0;
        margin: 0;
    }

    .tabBoxSwitch .tabBoxSwitchUl li {
        display: inline-block;
        height: 60px;
        font-size: 16px;
        line-height: 60px;
        margin-right: 24px;
        cursor: pointer;
    }

    .tab-active {
        position: relative;
        color: #1a1a1a;
        font-weight: 600;
        font-synthesis: style;
    }


    .tab-active::before {
        display: block;
        position: absolute;
        bottom: 0;
        content: "";
        width: 100%;
        height: 3px;
        background-color: #0084ff;
    }
</style>
src/views/Login.vue
<template>
    <div>
        <el-empty description="页面没找到"></el-empty>
    </div>
</template>

<script>
    export default {
        name: "NotFound"
    }
</script>

<style scoped>

</style>
src/views/NotFound.vue

 

<template>
  <div id="app">
      <router-view></router-view>
  </div>
</template>

<script>

export default {
  name: 'app',
  components: {

  }
}
</script>

<style>
    body{
        margin: 0;
    }
</style>
src/App.vue
import Vue from 'vue'
import App from './App.vue'
import './plugins/cookie'
import router from './router'
import './plugins/axios'
import store from './store'
import './plugins/element.js'

import HighchartsVue from 'highcharts-vue'

Vue.use(HighchartsVue)

Vue.config.productionTip = false

new Vue({
    router,
    store,
    render: h => h(App)
}).$mount('#app')
src/main.js

 

module.exports = {
  lintOnSave:false, //关闭语法检查
  devServer: {
      disableHostCheck: true,
  }
}
vue.config.js

 

posted @ 2022-08-04 06:11  silencio。  阅读(10)  评论(0编辑  收藏  举报