lex-xin 5 years ago
parent
commit
a89918f1b5

+ 36 - 0
src/api/contentManager.js

@@ -0,0 +1,36 @@
+// 通用设置api文件
+import request from '@/utils/request'
+import qs from 'qs'
+let api = '/api-cms'
+// 资讯列表分页查询
+export function newsList(data) {
+    return request({
+        url: api + '/news/list',
+        method: 'get',
+        params: data
+    })
+}
+// 更新资讯
+export function newsUpdate(data) {
+    return request({
+        url: api + '/news/update',
+        method: 'post',
+        data: qs.stringify(data)
+    })
+}
+// 新增资讯
+export function newsAdd(data) {
+    return request({
+        url: api + '/news/add',
+        method: 'post',
+        data: qs.stringify(data)
+    })
+}
+// 查询资讯详情
+export function newsQueryId(data) {
+    return request({
+        url: api + '/news/query/' + data.id,
+        method: 'post'
+    })
+}
+

+ 9 - 0
src/api/journal.js

@@ -21,3 +21,12 @@ export function sysMessageList(data) {
     })
 } 
 
+// 获取所有消息列表
+export function setRead(data) {
+    return request({
+        url: api + '/sysMessage/setRead',
+        method: 'post',
+        data: qs.stringify(data)
+    })
+} 
+

+ 5 - 2
src/router/index.js

@@ -69,6 +69,9 @@ export const asyncRoutes = {
   Layout: Layout,
   // 首页
   main: () => import('@/views/main/index'),
+  // 内容管理
+  contentManager: () => import('@/views/contentManager/index'),
+  contentOperation: () => import('@/views/contentManager/contentOperation'),
   // 系统日志
   journal: () => import('@/views/journal/index'),
   // 乐团管理
@@ -158,7 +161,7 @@ export const asyncRoutes = {
   // 小班课设置
   setImprovement: () => import('@/views/teamBuild/teamSeting/components/setImprovement'),
   // 乐团修改 @/views/resetTeaming/index
-  resetTeaming: () => import('@/views/resetTeaming/index')
-
+  resetTeaming: () => import('@/views/resetTeaming/index'),
+  
 }
 export default router

+ 1 - 1
src/utils/request.js

@@ -45,7 +45,7 @@ function tryHideFullScreenLoading () {
 const service = axios.create({
   baseURL: '', // url = base url + request url
   // withCredentials: true, // send cookies when cross-domain requests
-  timeout: 6000 // request timeout
+  timeout: 7000 // request timeout
 })
 // { fullscreen: true, text: '努力加载中', spinner: 'el-icon-loading' }
 // request interceptor

+ 123 - 0
src/views/contentManager/components/activity.vue

@@ -0,0 +1,123 @@
+<template>
+  <div>
+    <!-- 头部展示 -->
+    <!-- <div class="headWrap">
+      <div class="left">
+        <div class="headItem">
+          <p>本月请假:<span>12345</span></p>
+        </div>
+      </div>
+      <div class="right">
+      </div>
+    </div> -->
+    <!-- 搜索标题 -->
+    <el-form :inline="true"
+             class="searchForm"
+             v-model="searchForm">
+      <el-form-item>
+        <el-date-picker style="width: 400px;"
+          v-model="courseDate"
+          type="daterange"
+          value-format="yyyy-MM-dd"
+          @change="searchCourseDate"
+          range-separator="至"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item>
+        <el-button @click="getList" type="danger">搜索</el-button>
+        <el-button @click="onReSet" type="primary">重置</el-button>
+      </el-form-item>
+    </el-form>
+    <!-- 列表 -->
+    <div class="tableWrap">
+      <el-table :data='tableList' :header-cell-style="{background:'#EDEEF0',color:'#444'}">
+        <el-table-column align='center' prop="createTime"
+                         label="请假发起时间">
+        </el-table-column>
+        <el-table-column align='center'
+                         label="请假时间">
+          <template slot-scope="scope">
+            {{ scope.row.startTime }} - {{ scope.row.endTime }}
+          </template>
+        </el-table-column>
+        <el-table-column align='center' prop="remark"
+                         label="请假说明">
+        </el-table-column>
+      </el-table>
+      <pagination :total="pageInfo.total"
+                :page.sync="pageInfo.page"
+                :limit.sync="pageInfo.limit"
+                :page-sizes="pageInfo.page_size"
+                @pagination="getList" />
+    </div>
+  </div>
+</template>
+<script>
+import { teacherLeaveRecordQuery } from '@/api/teacherManager'
+import pagination from '@/components/Pagination/index'
+import store from '@/store'
+import { attendance } from '@/utils/searchArray'
+export default {
+  components: {
+    pagination
+  },
+  data () {
+    return {
+      attendance: attendance,
+      courseDate: null,
+      searchForm: {
+        startTime: null,
+        endTime: null,
+      },
+      tableList: [],
+      tableList: [],
+      organId: store.getters.organ,
+      teacherId: this.$route.query.teacherId,
+      pageInfo: {
+        // 分页规则
+        limit: 10, // 限制显示条数
+        page: 1, // 当前页
+        total: 1, // 总条数
+        page_size: [10, 20, 40, 50] // 选择限制显示条数
+      }
+    }
+  },
+  mounted() {
+    this.getList()
+  },
+  methods: {
+    getList() {
+      let params = this.searchForm
+      params.rows = this.pageInfo.limit
+      params.page = this.pageInfo.page,
+      params.teacherId = this.teacherId
+      teacherLeaveRecordQuery(params).then(res => {
+        if(res.code == 200) {
+          this.tableList = res.data.rows
+          this.pageInfo.total = res.data.total
+        }
+      })
+    },
+    searchCourseDate(value) {
+      if(value) {
+        this.searchForm.startTime = value[0]
+        this.searchForm.endTime = value[1]
+      } else {
+        this.searchForm.startTime = null
+        this.searchForm.endTime = null
+      }
+    },
+    onReSet() {
+      this.courseDate = null
+      this.searchForm = {
+        startTime: null,
+        endTime: null,
+      }
+    }
+  }
+}
+</script>
+<style lang="scss">
+</style>

+ 94 - 0
src/views/contentManager/components/banner.vue

@@ -0,0 +1,94 @@
+<template>
+  <div>
+    <!-- 头部展示 -->
+    <!-- <div class="headWrap">
+      <div class="left">
+        <div class="headItem">
+          <p>本月请假:<span>12345</span></p>
+        </div>
+      </div>
+      <div class="right">
+      </div>
+    </div> -->
+    <!-- 搜索标题 -->
+    <div @click="openTeaching('create')"
+           class='newBand'>新建</div>
+    <!-- 列表 -->
+    <div class="tableWrap">
+      <el-table :data='tableList' :header-cell-style="{background:'#EDEEF0',color:'#444'}">
+        <el-table-column align='center' prop="createTime"
+                         label="轮播图">
+        </el-table-column>
+        <el-table-column align='center'
+                         label="跳转连接">
+          <template slot-scope="scope">
+            {{ scope.row.startTime }} - {{ scope.row.endTime }}
+          </template>
+        </el-table-column>
+        <el-table-column align='center' prop="remark"
+                         label="是否使用">
+        </el-table-column>
+        <el-table-column align='center' prop="remark"
+                         label="操作">
+            <template slot-scope="scope">
+              <el-button type="text">删除</el-button>
+              <el-button type="text">停用</el-button>
+            </template>
+        </el-table-column>
+      </el-table>
+      <pagination :total="pageInfo.total"
+                :page.sync="pageInfo.page"
+                :limit.sync="pageInfo.limit"
+                :page-sizes="pageInfo.page_size"
+                @pagination="getList" />
+    </div>
+  </div>
+</template>
+<script>
+import { teacherLeaveRecordQuery } from '@/api/teacherManager'
+import pagination from '@/components/Pagination/index'
+import store from '@/store'
+export default {
+  components: {
+    pagination
+  },
+  data () {
+    return {
+      tableList: [],
+      organId: store.getters.organ,
+      teacherId: this.$route.query.teacherId,
+      pageInfo: {
+        // 分页规则
+        limit: 10, // 限制显示条数
+        page: 1, // 当前页
+        total: 1, // 总条数
+        page_size: [10, 20, 40, 50] // 选择限制显示条数
+      }
+    }
+  },
+  mounted() {
+    this.getList()
+  },
+  methods: {
+    getList() {
+      let params = this.searchForm
+      params.rows = this.pageInfo.limit
+      params.page = this.pageInfo.page,
+      params.teacherId = this.teacherId
+      teacherLeaveRecordQuery(params).then(res => {
+        if(res.code == 200) {
+          this.tableList = res.data.rows
+          this.pageInfo.total = res.data.total
+        }
+      })
+    },
+    openTeaching(type, rows) {
+        this.$router.push({
+            path: '/contentManager/contentOperation'
+        })
+    }
+  }
+}
+</script>
+<style lang="scss">
+</style>

+ 123 - 0
src/views/contentManager/components/information.vue

@@ -0,0 +1,123 @@
+<template>
+  <div>
+    <!-- 头部展示 -->
+    <!-- <div class="headWrap">
+      <div class="left">
+        <div class="headItem">
+          <p>本月请假:<span>12345</span></p>
+        </div>
+      </div>
+      <div class="right">
+      </div>
+    </div> -->
+    <!-- 搜索标题 -->
+    <el-form :inline="true"
+             class="searchForm"
+             v-model="searchForm">
+      <el-form-item>
+        <el-date-picker style="width: 400px;"
+          v-model="courseDate"
+          type="daterange"
+          value-format="yyyy-MM-dd"
+          @change="searchCourseDate"
+          range-separator="至"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item>
+        <el-button @click="getList" type="danger">搜索</el-button>
+        <el-button @click="onReSet" type="primary">重置</el-button>
+      </el-form-item>
+    </el-form>
+    <!-- 列表 -->
+    <div class="tableWrap">
+      <el-table :data='tableList' :header-cell-style="{background:'#EDEEF0',color:'#444'}">
+        <el-table-column align='center' prop="createTime"
+                         label="请假发起时间">
+        </el-table-column>
+        <el-table-column align='center'
+                         label="请假时间">
+          <template slot-scope="scope">
+            {{ scope.row.startTime }} - {{ scope.row.endTime }}
+          </template>
+        </el-table-column>
+        <el-table-column align='center' prop="remark"
+                         label="请假说明">
+        </el-table-column>
+      </el-table>
+      <pagination :total="pageInfo.total"
+                :page.sync="pageInfo.page"
+                :limit.sync="pageInfo.limit"
+                :page-sizes="pageInfo.page_size"
+                @pagination="getList" />
+    </div>
+  </div>
+</template>
+<script>
+import { teacherLeaveRecordQuery } from '@/api/teacherManager'
+import pagination from '@/components/Pagination/index'
+import store from '@/store'
+import { attendance } from '@/utils/searchArray'
+export default {
+  components: {
+    pagination
+  },
+  data () {
+    return {
+      attendance: attendance,
+      courseDate: null,
+      searchForm: {
+        startTime: null,
+        endTime: null,
+      },
+      tableList: [],
+      tableList: [],
+      organId: store.getters.organ,
+      teacherId: this.$route.query.teacherId,
+      pageInfo: {
+        // 分页规则
+        limit: 10, // 限制显示条数
+        page: 1, // 当前页
+        total: 1, // 总条数
+        page_size: [10, 20, 40, 50] // 选择限制显示条数
+      }
+    }
+  },
+  mounted() {
+    this.getList()
+  },
+  methods: {
+    getList() {
+      let params = this.searchForm
+      params.rows = this.pageInfo.limit
+      params.page = this.pageInfo.page,
+      params.teacherId = this.teacherId
+      teacherLeaveRecordQuery(params).then(res => {
+        if(res.code == 200) {
+          this.tableList = res.data.rows
+          this.pageInfo.total = res.data.total
+        }
+      })
+    },
+    searchCourseDate(value) {
+      if(value) {
+        this.searchForm.startTime = value[0]
+        this.searchForm.endTime = value[1]
+      } else {
+        this.searchForm.startTime = null
+        this.searchForm.endTime = null
+      }
+    },
+    onReSet() {
+      this.courseDate = null
+      this.searchForm = {
+        startTime: null,
+        endTime: null,
+      }
+    }
+  }
+}
+</script>
+<style lang="scss">
+</style>

+ 293 - 0
src/views/contentManager/contentOperation.vue

@@ -0,0 +1,293 @@
+<template>
+  <div class="m-container">
+    <h2>
+      <el-page-header @back="onCancel" :content="(pageType == 'create' ? '添加' : '修改') + '商品'"></el-page-header>
+    </h2>
+    
+    <div class="m-core">
+      <el-form :model="form" :rules="rules" ref="form" label-width="120px" style="width: 500px">
+        <el-form-item label="品牌" prop="brand">
+          <el-input v-model="form.brand"></el-input>
+        </el-form-item>
+        <el-form-item label="商品名称" prop="name">
+          <el-input  v-model="form.name"></el-input>
+        </el-form-item>
+        <el-form-item label="商品类型" prop="type">
+          <el-select v-model="form.type">
+              <el-option label="乐器" value="INSTRUMENT"></el-option>
+              <el-option label="辅件" value="ACCESSORIES"></el-option>
+              <el-option label="教材" value="TEACHING"></el-option>
+              <el-option label="教谱" value="STAFF"></el-option>
+              <el-option label="其它" value="OTHER"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="商品分类" prop="goodsCategoryId">
+          <el-select v-model="form.goodsCategoryId">
+              <el-option
+                v-for="item in categoryList"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value">
+              </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="商品型号" prop="specification">
+          <el-input v-model="form.specification" ></el-input>
+        </el-form-item>
+        <el-form-item label="商品价格" prop="marketPrice">
+          <el-input type="number" v-model="form.marketPrice" ></el-input>
+        </el-form-item>
+        <el-form-item label="商品团购价" prop="groupPurchasePrice">
+          <el-input type="number" v-model="form.groupPurchasePrice" ></el-input>
+        </el-form-item>
+        <el-form-item label="商品采购价" prop="discountPrice">
+          <el-input type="number" v-model="form.discountPrice" ></el-input>
+        </el-form-item>
+        <el-form-item label="商品图片" prop="image">
+          <el-upload
+            class="avatar-uploader"
+            action="/api-web/uploadFile"
+            :headers="headers"
+            :show-file-list="false"
+            :on-success="handleAvatarSuccess"
+            :before-upload="beforeAvatarUpload">
+            <img v-if="form.image" :src="form.image" class="avatar">
+            <i v-else class="el-icon-plus avatar-uploader-icon"></i>
+        </el-upload>
+        </el-form-item>
+        <el-form-item label="商品描述" prop="desc">
+          <el-input type="textarea" v-model="form.desc" ></el-input>
+        </el-form-item>
+        <el-form-item>
+          <el-button @click="onSubmit('form')" type="primary">立即{{ pageType == "create" ? '创建' : '修改' }}</el-button>
+          <el-button @click="onReSet('form')">重置</el-button>
+        </el-form-item>
+      </el-form>
+    </div>
+  </div>
+</template>
+<script>
+import { categoryListTree, goodsAdd, goodsUpdate, goodsSingleQuery } from '@/api/businessManager'
+import store from '@/store'
+import { getToken } from '@/utils/auth'
+let validPrice = (rule, value,callback)=>{
+    if (!value){
+        callback(new Error('请输入金额'))
+    }else  if (value < 0){
+        callback(new Error('输入金额必须大于0'))
+    }else if(value >= 100000) {
+        callback(new Error('输入金额必须小于100000'))
+    }else {
+      callback()
+    }
+}
+export default {
+  data () {
+    return {
+      categoryList: [],
+      pageType: this.$route.query.type,
+      organId: store.getters.organ,
+      headers: {
+        Authorization: getToken()
+      },
+      form: {
+        // brand: 'xxxl',
+        // name: '长号',
+        // type: 'INSTRUMENT',
+        // goodsCategoryId: 7,
+        // specification: 'xxxeed',
+        // marketPrice: 10000,
+        // groupPurchasePrice: 9000,
+        // discountPrice: 8000,
+        // image: null,
+        // desc: 'C调、法式键、曲列、E键、白铜按键、台湾镍白'
+        brand: null,
+        name: null,
+        type: null,
+        goodsCategoryId: null,
+        specification: null,
+        marketPrice: null,
+        groupPurchasePrice: null,
+        discountPrice: null,
+        image: null,
+        desc: null
+      },
+      rules: {
+        brand: [{ required: true, message: '请输入品牌', trigger: 'blur' },
+          { min: 3, max: 30, message: '长度在 3 到 30 个字符', trigger: 'blur' }],
+        name: [{ required: true, message: '请输入商品名称', trigger: 'blur' },
+          { min: 3, max: 30, message: '长度在 3 到 30 个字符', trigger: 'blur' }],
+        type: [{ required: true, message: '请选择商品分类', trigger: 'change' }],
+        goodsCategoryId: [{ required: true, message: '请选择商品类型', trigger: 'change' }],
+        specification: [{ required: true, message: '请输入商品型号', trigger: 'blur' },
+          { min: 3, max: 30, message: '长度在 3 到 30 个字符', trigger: 'blur' }],
+        marketPrice: [{ required: true, validator: validPrice, trigger: 'blur' }],
+        groupPurchasePrice: [{ required: true, validator: validPrice, trigger: 'blur' }],
+        discountPrice: [{ required: true, validator: validPrice, trigger: 'blur' }],
+        // marketPrice: [{ required: true, message: '请输入商品价格', trigger: 'blur' }],
+        // groupPurchasePrice: [{ required: true, message: '请输入商品团购价', trigger: 'blur' }],
+        // discountPrice: [{ required: true, message: '请输入商品采购价', trigger: 'blur' }],
+        image: [{ required: true, message: '请选择图片', trigger: 'blur' }],
+        desc: [{ required: true, message: '请输入商品描述', trigger: 'blur' }]
+      }
+    }
+  },
+  mounted() {
+    this.getList()
+    this.getCatagory()
+  },
+  methods: {
+    onSubmit(formName) {
+      this.$refs[formName].validate((valid) => {
+        if (valid) {
+          if (this.pageType == 'create') {
+            if(this.form.id) { // 判断有没有Id,如果有则删除
+              delete this.form.id
+            }
+            this.form.status = 'YES' // 默认上架
+            goodsAdd(this.form).then(res => {
+              this.messageTips('添加', res)
+            })
+          } else if (this.pageType == 'update') {
+            goodsUpdate(this.form).then(res => {
+              this.messageTips('修改', res)
+            })
+          }
+        } else {
+          return false
+        }
+      })
+    },
+    messageTips(title, res) {
+      if(res.code == 200) {
+        this.$message({
+          message: title + '成功',
+          type: 'success'
+        })
+        this.$router.push('/shopManager/shopManager')
+      } else {
+        this.$message.error(res.msg)
+      }
+    },
+    onCancel() {
+      this.$router.push('/shopManager/shopManager')
+    },
+    onReSet(formName) {
+      this.$refs[formName].resetFields()
+    },
+    getList() {
+      if(this.pageType == 'create') return false
+      goodsSingleQuery(this.$route.query.id).then(res => {
+        console.log(res)
+        if(res.code == 200) {
+          let result = res.data
+          console.log(result)
+          this.form = {
+            id: result.id,
+            brand: result.brand,
+            name: result.name,
+            type: result.type,
+            goodsCategoryId: result.goodsCategoryId,
+            specification: result.specification,
+            marketPrice: result.marketPrice,
+            groupPurchasePrice: result.groupPurchasePrice,
+            discountPrice: result.discountPrice,
+            image: result.image,
+            desc: result.desc
+          }
+        }
+      })
+    },
+    getCatagory() {
+      categoryListTree({
+        delFlag: 0,
+        rows: 9999
+      }).then(res => {
+        let result = res.data
+        if(res.code == 200) {
+          let tempArray = []
+          result.rows.forEach(row => {
+            tempArray.push({
+              label: row.name,
+              value: row.id
+            })
+          })
+          this.categoryList = tempArray
+        }
+      })
+    },
+    handleAvatarSuccess(res, file) {
+      this.form.image = res.data.url
+        
+    },
+    beforeAvatarUpload(file) {
+      const imageType = {
+        'image/png': true,
+        'image/jpeg': true 
+      }
+      const isImage = imageType[file.type]
+      const isLt2M = file.size / 1024 / 1024 < 2
+
+      if (!isImage) {
+        this.$message.error('只能上传图片格式!')
+      }
+      if (!isLt2M) {
+        this.$message.error('上传头像图片大小不能超过 2MB!')
+      }
+      return isImage && isLt2M;
+    },
+  }
+}
+</script>
+<style lang="scss" scoped>
+.el-button--primary {
+  background: #14928a;
+  border-color: #14928a;
+  color: #fff;
+  &:hover, &:active, &:focus {
+    background: #14928a;
+    border-color: #14928a;
+    color: #FFF;
+  }
+}
+.el-row {
+  margin-top: 40px;
+}
+.el-col {
+  display: flex;
+  align-items: center;
+  margin-bottom: 20px;
+  justify-content: flex-end;
+  margin-right: 50%;
+}
+.el-input-group {
+  width: 200px;
+  margin: 0 20px;
+}
+/deep/.el-tree-node__content {
+  height: 40px !important;
+}
+/deep/.avatar-uploader .el-upload {
+    border: 1px dashed #d9d9d9;
+    border-radius: 6px;
+    cursor: pointer;
+    position: relative;
+    overflow: hidden;
+  }
+  .avatar-uploader .el-upload:hover {
+    border-color: #409EFF;
+  }
+  .avatar-uploader-icon {
+    font-size: 28px;
+    color: #8c939d;
+    width: 120px;
+    height: 120px;
+    line-height: 120px;
+    text-align: center;
+  }
+  .avatar {
+    width: 120px;
+    height: 120px;
+    display: block;
+  }
+</style>

+ 47 - 0
src/views/contentManager/index.vue

@@ -0,0 +1,47 @@
+<template>
+  <div class='m-container'>
+    <h2> 内容管理 </h2>
+    <div class="m-core">
+      <el-tabs v-model="activeName"
+               type="card"
+               @tab-click="handleClick">
+        <el-tab-pane label="BANNER管理"
+                     name="0">
+          <banner v-if="activeStatus[0]" />
+        </el-tab-pane>
+        <el-tab-pane label="精彩活动"
+                     name="1">
+          <activity v-if="activeStatus[1]" />
+        </el-tab-pane>
+        <el-tab-pane label="热门咨询"
+                     name="2">
+          <information v-if="activeStatus[2]" />
+        </el-tab-pane>
+      </el-tabs>
+    </div>
+  </div>
+</template>
+<script>
+import banner from './components/banner'
+import activity from './components/activity'
+import information from './components/information'
+export default {
+  components: { banner, activity, information },
+  name: 'teacherDetail',
+  data () {
+    return {
+      teacherName: this.$route.query.teacherName,
+      activeName: "0",
+      activeStatus: [true, false, false]
+    }
+  },
+  methods: {
+    handleClick (val, event) {
+      this.activeName = val.name
+      this.activeStatus[val.name] = true
+    }
+  }
+}
+</script>
+<style lang="scss">
+</style>

+ 2 - 3
src/views/journal/index.vue

@@ -22,7 +22,6 @@
           <leaveOperation v-if="activeStatus[3]" />
         </el-tab-pane>
       </el-tabs>
-
     </div>
   </div>
 </template>
@@ -37,8 +36,8 @@ export default {
   },
   data () {
     return {
-      activeIndex: '0',
-      activeStatus: [true, false, false, false]
+      activeIndex: '1',
+      activeStatus: [false, true, false, false]
     }
   },
   methods: {

+ 69 - 71
src/views/journal/journalItem.vue

@@ -1,94 +1,53 @@
 <template>
   <div class='infoWrap'>
-    <div class="left">
-      <div class="unread"> <img :src="img.boxicon"
+    <div class="left" style="width: 110px;">
+      <div class="unread" @click="onLookMessage('all')">全部</div>
+      <div class="unread" @click="onLookMessage('0')"> <img :src="img.boxicon"
              alt=""> 未读消息
         <div class="count" v-if="noReadMessage >= 1">{{ noReadMessage }}</div>
       </div>
-      <div class="read">
+      <div class="read" @click="onLookMessage('1')">
         <img :src="img.bookicon"
              alt="">
         已读消息</div>
-      <div class="recovery">
+      <!-- <div class="recovery">
         <img :src="img.trashicon"
              alt="">
-        回收站</div>
+        回收站</div> -->
     </div>
     <div class="middle">
-      <div class="msgItem">
-        <h6 class="type">审批</h6>
-        <h4 class="name">黄老师 <span class='time'>10:03</span>
-          <div class="dot"></div>
+      <div class="msgItem" :class="[isCheckMessage == item.id ? 'active' : '']" @click="onClickRead(item)" v-for="(item, index) in dataList" :key="index">
+        <!-- <h6 class="type">审批</h6> -->
+        <h4 class="name">系统消息 <span class='time'>{{ item.createOn }}</span>
+          <div class="dot" v-if="item.readStatus == 0"></div>
         </h4>
-        <p class='msg'>那家纯四季花城教学总结爱喝酒收到货就暗示的看见爱上大家超级好吃就撒客户看见爱上当看见那家纯四季花城教学总结爱喝酒收到货就暗示的看见爱上大家超级好吃就撒客户看见爱上当看见</p>
+        <p class='msg'>{{ item.content }}</p>
       </div>
-      <div class="msgItem active">
-        <h6 class="type">审批</h6>
-        <h4 class="name">黄老师 <span class='time'>10:03</span>
-          <div class="dot"></div>
-        </h4>
-        <p class='msg'>那家纯四季花城教学总结爱喝酒收到货就暗示的看见爱上大家超级好吃就撒客户看见爱上当看见那家纯四季花城教学总结爱喝酒收到货就暗示的看见爱上大家超级好吃就撒客户看见爱上当看见</p>
-      </div>
-
-      <el-pagination
-        small
+      <el-pagination style="text-align: right"
+        small v-if="dataList.length > 0"
+        @current-change="onChange"
         :hide-on-single-page="pageInfo.isSinglePage"
         layout="prev, pager, next"
-        :total="50">
+        :total="pageInfo.total">
       </el-pagination>
     </div>
-    <div class="right">
+    <div class="right" v-if="showRight">
       <div class="rightWrap">
-        <img src="@/assets/images/base/placehorder-icon.png"
+        <!-- <img src="@/assets/images/base/placehorder-icon.png"
              class="header"
-             alt="">
+             alt=""> -->
         <div class="info">
-          <h2>黄老师<span>【185****2109】</span></h2>
-          <p class="subMsg">发至 <span class='san'></span> <span style="margin-left:30px">我</span></p>
+          <h2>系统消息</h2>
           <div class="textWrap">
-            <p>审批事项: 合班</p>
-            <p>开始时间: 2019-09-01 09:00</p>
-            <p>结束时间: 2019-09-01 09:00</p>
-            <p>备注:班人数较少较少班人数较少较少班人数较少较少班人数较少较少班人数较少较少班人数较少较少班人数较少较少班人数较少较少</p>
+            <p>{{ showMessage.content }}</p>
           </div>
-          <div class="timeline">
-            <el-timeline>
-              <el-timeline-item placement='center'>
-                <div class='timeMsg'>
-                  <p class="name">我</p>
-                  <p class='status'>审批中</p>
-                </div>
-                <div slot='dot'>
-                  <img class='dot'
-                       src="@/assets/images/base/clock.png"
-                       alt="">
-                </div>
-              </el-timeline-item>
-              <el-timeline-item placement='center'>
-                <div class='timeMsg'>
-                  <p class="name">我</p>
-                  <p class='status'>审批中</p>
-                </div>
-                <div slot='dot'>
-                  <img class='dot'
-                       src="@/assets/images/base/clock.png"
-                       alt="">
-                </div>
-              </el-timeline-item>
-            </el-timeline>
-          </div>
-
         </div>
       </div>
-      <div class="infoFoot">
-        <div class="noBtn">拒绝</div>
-        <div class="yesBtn">同意</div>
-      </div>
     </div>
   </div>
 </template>
 <script>
-import { queryCountOfUnread, sysMessageList } from '@/api/journal'
+import { queryCountOfUnread, sysMessageList, setRead } from '@/api/journal'
 export default {
   data () {
     return {
@@ -109,11 +68,15 @@ export default {
         total: 0,
       },
       noReadMessage: 0, // 未读消息
-      dataList: []
+      dataList: [],
+      isCheckMessage: null,
+      showRight: false,
+      showMessage: {}
     }
   },
   mounted() {
     this.__init()
+    this.sysMessageList()
   },
   methods: {
     __init() {
@@ -123,27 +86,59 @@ export default {
           if(res.data && res.data.SYSTEM) {
             this.noReadMessage = res.data.SYSTEM
           }
-          
         }
       })
     },
-    sysMessageList() {
+    sysMessageList() { // 列表
       sysMessageList({
         group: 'SYSTEM',
         rows: this.pageInfo.limit,
-        page: this.pageInfo.page
+        page: this.pageInfo.page,
+        readStatus: this.pageInfo.readStatus
       }).then(res => {
-        console.log(res)
         if(res.code == 200) {
           this.dataList = res.data.rows
           this.pageInfo.total = res.data.total
         }
       })
+    },
+    onChange(page) { // 分页
+      this.pageInfo.page = page
+      this.sysMessageList()
+    },
+    onLookMessage(type) { // 查看对应的数据
+      if(type == "all") {
+        this.pageInfo.readStatus = null
+      } else {
+        this.pageInfo.readStatus = type
+      }
+      this.pageInfo.page = 1
+      this.showRight = false
+      this.showMessage = {}
+      this.isCheckMessage = null
+      this.sysMessageList()
+    },
+    onClickRead(item) {
+      this.isCheckMessage = item.id
+      
+      if(item.readStatus == 1) {
+        this.showRight = true
+        this.showMessage = item
+      } else {
+        setRead({ id: item.id }).then(res => {
+          let result = res.data
+          if(res.code == 200) {
+            this.showRight = true
+            this.showMessage = item
+            item.readStatus = 1
+          }
+        })
+      }
     }
   }
 }
 </script>
-<style lang="scss">
+<style lang="scss" scoped>
 .infoWrap {
   display: flex;
   flex-direction: row;
@@ -167,8 +162,8 @@ export default {
     .unread {
       position: relative;
       img {
-        width: 26px;
-        height: 25px;
+        width: 25px;
+        height: 24px;
       }
       .count {
         position: absolute;
@@ -184,6 +179,9 @@ export default {
         top: 8px;
       }
     }
+    .unread, .read, .recovery {
+      cursor: pointer;
+    }
     .read {
       img {
         width: 20px;
@@ -198,7 +196,7 @@ export default {
     }
   }
   .middle {
-    width: 390px;
+    // width: 100%;
     margin-left: 76px;
     padding-top: 50px;
     overflow: auto;

+ 34 - 16
src/views/journal/studentComplain.vue

@@ -1,18 +1,15 @@
 <template>
   <div class='infoWrap'>
     <div class="left">
-      <div class="unread"> <img :src="img.boxicon"
+      <div class="unread" @click="onLookMessage('all')">全部</div>
+      <div class="unread" @click="onLookMessage('0')"> <img :src="img.boxicon"
              alt=""> 未读消息
         <div class="count" v-if="noReadMessage >= 1">{{ noReadMessage }}</div>
       </div>
-      <div class="read">
+      <div class="read" @click="onLookMessage('1')">
         <img :src="img.bookicon"
              alt="">
         已读消息</div>
-      <div class="recovery">
-        <img :src="img.trashicon"
-             alt="">
-        回收站</div>
     </div>
     <div class="middle">
       <div class="msgItem">
@@ -93,15 +90,21 @@ export default {
         boxicon: require('@/assets/images/base/boxicon.png'),
         Hboxicon: require('@/assets/images/base/boxicon-h.png')
       },
-      activities: [{
-
-      }],
+      activities: [{ }],
+      pageInfo: {
+        isSinglePage: false, // 是否只有一页
+        limit: 10,
+        page: 1,
+        readStatus: null,
+        total: 0,
+      },
       noReadMessage: 0, // 未读消息
       dataList: []
     }
   },
   mounted() {
     this.__init()
+    this.sysMessageList()
   },
   methods: {
     __init() {
@@ -109,25 +112,40 @@ export default {
       queryCountOfUnread().then(res => {
         if(res.code == 200) {
           if(res.data && res.data.SYSTEM) {
-            this.noReadMessage = res.data.SYSTEM
+            this.noReadMessage = res.data.STUDENT
           }
-          
         }
       })
-
+    },
+    sysMessageList() { // 列表
       sysMessageList({
-        search: 'SYSTEM'
+        group: 'STUDENT',
+        rows: this.pageInfo.limit,
+        page: this.pageInfo.page,
+        readStatus: this.pageInfo.readStatus
       }).then(res => {
-        console.log(res)
         if(res.code == 200) {
           this.dataList = res.data.rows
+          this.pageInfo.total = res.data.total
         }
       })
-    }
+    },
+    onLookMessage(type) { // 查看对应的数据
+      if(type == "all") {
+        this.pageInfo.readStatus = null
+      } else {
+        this.pageInfo.readStatus = type
+      }
+      this.pageInfo.page = 1
+      this.showRight = false
+      this.showMessage = {}
+      this.isCheckMessage = null
+      this.sysMessageList()
+    },
   }
 }
 </script>
-<style lang="scss">
+<style lang="scss" scoped>
 .infoWrap {
   display: flex;
   flex-direction: row;

+ 3 - 2
src/views/main/index.vue

@@ -201,13 +201,14 @@ export default {
   flex-direction: row;
   justify-content: flex-start;
   align-items: center;
+  flex-wrap: wrap;
   .item {
-    width: 303px;
+    width: 333px;
     height: 137px;
     padding: 22px 28px 20px;
     box-shadow: 0px 8px 20px 0px rgba(0, 0, 0, 0.1);
     border-radius: 6px;
-    margin-right: 30px;
+    margin: 0 15px 3rem;
     h4 {
       display: flex;
       flex-direction: row;

+ 29 - 10
src/views/teacherManager/teacherDetail/components/courseInfo1.vue

@@ -3,13 +3,13 @@
     <div class="tableWrap tableMargin">
       <el-table :data='teamList'
                 :header-cell-style="{background:'#EDEEF0',color:'#444'}">
-        <el-table-column label="VIP编号" prop="vipClassId">
+        <el-table-column label="VIP编号" prop="id">
         </el-table-column>
-        <el-table-column label="VIP课名称" prop="vipClassName">
+        <el-table-column label="VIP课名称" prop="name">
         </el-table-column>
         <el-table-column label="VIP课状态">
           <template slot-scope="scope">
-            {{ scope.row.status | coursesStatus }}
+            {{ scope.row.status | formatterStatus}}
           </template>
         </el-table-column>
         <el-table-column label="班级人数" prop="studentNum">
@@ -20,18 +20,21 @@
             线下:{{ scope.row.offlineClassesUnitPrice }}
           </template>
         </el-table-column>
-        <el-table-column label="活动方案" prop="activityName">
+        <el-table-column label="活动方案" prop="vipGroupActivityName">
         </el-table-column>
         <el-table-column label="剩余课时">
           <template slot-scope="scope">
-            {{ scope.row.totalClassTimes - scope.row.currentClassTimes }}
+            <p>{{scope.row.currentClassTimes + '/' + scope.row.totalClassTimes}}</p>
           </template>
         </el-table-column>
-        <el-table-column label="月均消耗" prop="monthAvg">
+        <el-table-column label="月均消耗">
+          <template slot-scope="scope">
+            {{ scope.row.monthConsumeRate }}%
+          </template>
         </el-table-column>
         <el-table-column label="开课时间">
           <template slot-scope="scope">
-            {{ scope.row.paymentExpireDate | formatTimer }}
+            {{scope.row.courseStartDate | formatterTime}}
           </template>
         </el-table-column>
         <el-table-column label="截止时间">
@@ -41,7 +44,7 @@
         </el-table-column>
         <el-table-column label="申请时间">
           <template slot-scope="scope">
-            {{ scope.row.createDate | formatTimer }}
+            {{scope.row.createTime | formatterTime}}
           </template>
         </el-table-column>
       </el-table>
@@ -54,7 +57,8 @@
   </div>
 </template>
 <script>
-import { getTeacherVipClass } from '@/api/teacherManager'
+// import { getTeacherVipClass } from '@/api/teacherManager'
+import { getVipList } from '@/api/vipSeting'
 import pagination from '@/components/Pagination/index'
 import store from '@/store'
 export default {
@@ -80,7 +84,7 @@ export default {
   },
   methods: {
     getList() {
-      getTeacherVipClass({ 
+      getVipList({ 
         rows: this.pageInfo.limit,
         page: this.pageInfo.page,
         teacherId: this.teacherId
@@ -91,6 +95,21 @@ export default {
         }
       })
     }
+  },
+  filters: {
+    formatterTime (val) {
+      let result
+      if (val) {
+        result = val.split(' ')[0];
+      } else {
+        result = ''
+      }
+      return result
+    },
+    formatterStatus (val) {
+      let arr = ["未开始", "报名中", "报名结束", '取消', '停止']
+      return arr[val];
+    }
   }
 }
 </script>

+ 11 - 11
src/views/teacherManager/teacherOperation/components/salarySet.vue

@@ -12,7 +12,7 @@
           </el-table-column>
           <el-table-column label="默认课酬-主教">
             <template slot-scope="scope">
-              <el-input v-show="scope.row.courseScheduleType != 'HIGH'" v-model="scope.row.mainTeacher30MinSalary" placeholder="请输入课酬">
+              <el-input :disabled="scope.row.courseScheduleType == 'HIGH'" v-model="scope.row.mainTeacher30MinSalary" placeholder="请输入课酬">
                 <template slot="append" v-if="scope.row.courseScheduleType == 'HIGH'">元/45分钟</template>
                 <template slot="append" v-else-if="scope.row.courseScheduleType == 'CLASSROOM'">元/40分钟</template>
                 <template slot="append" v-else>元/30分钟</template>
@@ -21,7 +21,7 @@
           </el-table-column>
           <el-table-column label="默认课酬-助教">
             <template slot-scope="scope">
-              <el-input v-show="scope.row.courseScheduleType != 'HIGH'" v-model="scope.row.assistantTeacher30MinSalary" placeholder="请输入课酬">
+              <el-input :disabled="scope.row.courseScheduleType == 'HIGH'" v-model="scope.row.assistantTeacher30MinSalary" placeholder="请输入课酬">
                 <template slot="append" v-if="scope.row.courseScheduleType == 'HIGH'">元/45分钟</template>
                 <template slot="append" v-else-if="scope.row.courseScheduleType == 'CLASSROOM'">元/40分钟</template>
                 <template slot="append" v-else>元/30分钟</template>
@@ -30,14 +30,14 @@
           </el-table-column>
           <el-table-column label="3.0课酬-主教">
             <template slot-scope="scope">
-              <el-input v-show="scope.row.courseScheduleType != 'CLASSROOM'" v-model="scope.row.mainTeacher90MinSalary" placeholder="请输入课酬">
+              <el-input :disabled="scope.row.courseScheduleType == 'CLASSROOM'" v-model="scope.row.mainTeacher90MinSalary" placeholder="请输入课酬">
                 <template slot="append">元/{{ (scope.row.courseScheduleType == 'HIGH' || scope.row.courseScheduleType == 'CLASSROOM') ? 45 : 90 }}分钟</template>
               </el-input>
             </template>
           </el-table-column>
           <el-table-column label="3.0课酬-助教">
             <template slot-scope="scope">
-              <el-input v-show="scope.row.courseScheduleType != 'CLASSROOM'" v-model="scope.row.assistantTeacher90MinSalary" placeholder="请输入课酬">
+              <el-input :disabled="scope.row.courseScheduleType == 'CLASSROOM'" v-model="scope.row.assistantTeacher90MinSalary" placeholder="请输入课酬">
                 <template slot="append">元/{{ (scope.row.courseScheduleType == 'HIGH' || scope.row.courseScheduleType == 'CLASSROOM') ? 45 : 90 }}分钟</template>
               </el-input>
             </template>
@@ -83,13 +83,6 @@ export default {
       teamTable: [{
         assistantTeacher30MinSalary: 0,
         assistantTeacher90MinSalary: 0,
-        courseScheduleType: "CLASSROOM",
-        mainTeacher30MinSalary: 0,
-        mainTeacher90MinSalary: 0,
-        userId: this.teacherId
-      }, {
-        assistantTeacher30MinSalary: 0,
-        assistantTeacher90MinSalary: 0,
         courseScheduleType: "SINGLE",
         mainTeacher30MinSalary: 0,
         mainTeacher90MinSalary: 0,
@@ -129,6 +122,13 @@ export default {
         mainTeacher30MinSalary: 0,
         mainTeacher90MinSalary: 0,
         userId: this.teacherId
+      }, {
+        assistantTeacher30MinSalary: 0,
+        assistantTeacher90MinSalary: 0,
+        courseScheduleType: "CLASSROOM",
+        mainTeacher30MinSalary: 0,
+        mainTeacher90MinSalary: 0,
+        userId: this.teacherId
       }],
       vipTable: [],
       musicGroupTable: [],

+ 3 - 1
src/views/teacherManager/teacherOperation/components/teacherOperation.vue

@@ -320,6 +320,9 @@ export default {
                 if(this.pageType == 'update') {
                     this.topForm.id = this.teacherId
                     teacherUpdate(this.topForm).then(res => {
+                        if(res.code == 200) {
+                            this.$emit('onTeacher')
+                        }
                         this.messageTips('修改', res)
                     })
                 } else if(this.pageType == 'create') {
@@ -328,7 +331,6 @@ export default {
                     }
                     teacherAdd(this.topForm).then(res => {
                         if(res.code == 200) {
-                            console.log(res)
                             this.$emit('onTeacher', res.data)
                         }
                         this.messageTips('添加', res)

+ 7 - 1
src/views/teacherManager/teacherOperation/index.vue

@@ -47,13 +47,19 @@ export default {
       this.$router.push('/business/teacherList')
     },
     onTeacher(id) {
-        if(id) {
+        let type = this.$route.query.type
+        if(type == 'update') {
+          this.activeName = "1"
+          this.activeStatus[1] = true
+        } else {
+          if(id) {
             this.isCreate = true // 当保存课酬时基本信息不能点
             this.isTeacher = false
             this.teacherId = id
             this.activeName = "1"
             this.activeStatus[1] = true
         }
+        }
     }
   },