Browse Source

Merge branch 'master' of http://git.cc-lotus.info/new_train/train-dirtea

reloaded 4 years ago
parent
commit
eb3fc58412

+ 1 - 1
.env

@@ -1,5 +1,5 @@
 VUE_APP_AXIOS_BASE_URL = ''
 VUE_APP_ROOT_URL=/admin/
-VUE_APP_MODULE='student'
+VUE_APP_MODULE='mobiledirtea'
 VUE_APP_USER_TYPE = '4'
 VUE_APP_LIMIT = 10

+ 67 - 0
src/layout/class/achieve.vue

@@ -0,0 +1,67 @@
+<template>
+  <div id="achieve">
+    <el-row>
+      <el-col :span="24">
+        <van-tabs v-model="active">
+          <van-tab title="平时成绩">
+            <peaceAchieve v-on="$listeners" :peaceAchieveList="peaceAchieveList" :showPicker="showPicker" :peaceScore="peaceScore"></peaceAchieve>
+          </van-tab>
+          <van-tab title="作业成绩">
+            <homeworkAchiece
+              v-on="$listeners"
+              :lesslist="lesslist"
+              :lesson="lesson"
+              :achieveList="achieveList"
+              :deptList="deptList"
+              :show="show"
+              :form="form"
+              :names="names"
+              :score="score"
+            ></homeworkAchiece>
+          </van-tab>
+        </van-tabs>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import peaceAchieve from '@/layout/class/achieveList/peaceAchieve.vue';
+import homeworkAchiece from '@/layout/class/achieveList/homeworkAchiece.vue';
+export default {
+  name: 'achieve',
+  props: {
+    peaceAchieveList: null, //平时成绩
+    showPicker: null, //平時成绩显示
+    peaceScore: null, //平时成绩分数
+    achieveList: null, //作业成绩
+    show: null, //显示弹框
+    form: null, //修改form
+    deptList: null,
+    lesson: null,
+    lesslist: null,
+    names: null,
+    score: null,
+  },
+  components: {
+    peaceAchieve, //平時成績
+    homeworkAchiece, //作业成绩
+  },
+  data: () => ({
+    active: 0,
+  }),
+  created() {},
+  computed: {},
+  methods: {},
+};
+</script>
+
+<style lang="less" scoped>
+/deep/.van-tabs__line {
+  width: 50% !important;
+  background-color: #405ffe;
+}
+/deep/.van-tab--active {
+  color: #405ffe;
+}
+</style>

+ 137 - 0
src/layout/class/achieveList/homeworkAchiece.vue

@@ -0,0 +1,137 @@
+<template>
+  <div id="homeworkAchiece">
+    <el-row>
+      <el-col :span="24" class="list">
+        <van-collapse v-model="openCollapse">
+          <van-collapse-item :name="index" v-for="(item, index) in achieveList" :key="index">
+            <div slot="title" class="title" @click="clickcds(item.id)">
+              <span class="name">{{ item.stuname }}</span>
+            </div>
+            <van-row v-for="(tag, index) in item.lesson" :key="index">
+              <el-col :span="18">
+                <van-col :span="24" class="score"> 名称:{{ tag.name }} </van-col>
+                <van-col :span="24" class="score"> 作业分: {{ tag.score }}分</van-col>
+              </el-col>
+              <el-col :span="6" class="anniu">
+                <van-col :span="3" class="score">
+                  <van-button v-if="user.job == '学委' || user.type == '3'" type="primary" size="mini" @click="clickBtn(tag.taskid, tag.name, tag.score)"
+                    >上成绩</van-button
+                  >
+                </van-col>
+              </el-col>
+            </van-row>
+          </van-collapse-item>
+        </van-collapse>
+      </el-col>
+    </el-row>
+    <van-dialog v-model="show" title="学生成绩上传" :showConfirmButton="false">
+      <van-form @submit="onSubmit">
+        <span class="lesson">课程名称</span><span class="lesson">{{ names }}</span>
+        <van-field v-model="form.score" name="作业分数" :value="score" label="作业分数" placeholder="请输入作业分数" />
+        <div style="margin: 16px;">
+          <van-button round block type="info" native-type="submit">
+            提交
+          </van-button>
+        </div>
+      </van-form>
+    </van-dialog>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers, mapGetters } from 'vuex';
+export default {
+  name: 'homeworkAchiece',
+  props: {
+    achieveList: null,
+    show: null,
+    form: null,
+    lessonList: null,
+    deptList: null,
+    lesson: null,
+    lesslist: null,
+    names: null,
+    score: null,
+  },
+  components: {},
+  data: () => ({
+    ruleForm: {
+      region: '',
+    },
+    value: '',
+    columns: ['杭州', '宁波', '温州', '嘉兴', '湖州'],
+    showPicker: false,
+    openCollapse: [],
+  }),
+  created() {},
+  computed: { ...mapState(['user']) },
+  methods: {
+    onConfirm(value) {
+      this.value = value;
+      this.showPicker = false;
+    },
+    clickcds(id) {
+      console.log(id);
+      this.$emit('submitss', { id: id });
+    },
+    clickBtn(taskid, name, score) {
+      console.log(taskid);
+      console.log(name);
+
+      this.$emit('clickDialog', { id: taskid, name: name, score: score });
+    },
+    onSubmit() {
+      this.$emit('submit', { data: this.form });
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+p {
+  padding: 0;
+  margin: 0;
+}
+.list {
+  margin: 5px;
+  width: 97%;
+  padding: 0 10px;
+  border-radius: 15px;
+}
+.list .title {
+  float: left;
+  width: 100%;
+}
+.list .name {
+  float: left;
+  width: 80%;
+  font-size: 20px;
+}
+/deep/.van-cell {
+  border-top-left-radius: 10px;
+  border-top-right-radius: 10px;
+}
+/deep/.van-collapse-item__content {
+  border-bottom-left-radius: 10px;
+  border-bottom-right-radius: 10px;
+  padding: 5px 10px;
+}
+/deep/.van-collapse-item {
+  margin: 0 0 10px 0;
+}
+/deep/.el-collapse-item__content {
+  padding: 10px 0 10px 0;
+}
+.list .score {
+  padding: 5px 0;
+  font-size: 18px;
+}
+.anniu {
+  padding: 20px 0 0 0;
+}
+.lesson {
+  font-size: 14px;
+  padding: 0 21px 0 16px;
+  color: #323233;
+}
+</style>

+ 68 - 0
src/layout/class/achieveList/peaceAchieve.vue

@@ -0,0 +1,68 @@
+<template>
+  <div id="peaceAchieve">
+    <el-row>
+      <el-col :span="24" class="info">
+        <el-col :span="24" class="list" v-for="(item, index) in peaceAchieveList" :key="index">
+          <el-col :span="12" class="name">
+            {{ item.name }}
+          </el-col>
+          <el-col :span="8" class="score">
+            <span>分数:{{ item.selfscore }}分</span>
+          </el-col>
+          <el-col :span="4" class="score">
+            <el-button type="primary" v-if="user.job == '学委' || user.type == '3'" size="mini" @click="showBtn(item.id)" round>选择</el-button>
+          </el-col>
+        </el-col>
+      </el-col>
+    </el-row>
+    <van-popup v-model="showPicker" position="bottom">
+      <van-picker show-toolbar :columns="columns" @confirm="onConfirm" @cancel="showPicker = false" />
+    </van-popup>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers, mapGetters } from 'vuex';
+export default {
+  name: 'peaceAchieve',
+  props: {
+    peaceAchieveList: null,
+    showPicker: null,
+    peaceScore: null,
+  },
+  components: {},
+  data: () => ({
+    columns: ['1', '2', '3', '4', '5', '7', '8', '9', '10'],
+  }),
+  created() {},
+  computed: {
+    ...mapState(['user']),
+  },
+  methods: {
+    showBtn(id) {
+      this.$emit('showBtn', id);
+    },
+    onConfirm(value) {
+      this.$emit('onConfirm', value);
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.info {
+  padding: 0 30px;
+}
+.list {
+  border-bottom: 1px dashed #333;
+}
+.list .name {
+  padding: 15px 15px;
+}
+.list .score {
+  padding: 15px 0;
+}
+.list .score span {
+  padding: 0 7px 0 0;
+}
+</style>

+ 2 - 0
src/layout/class/headClassList.vue

@@ -6,6 +6,8 @@
           <el-col :span="16" class="mess">
             <p>班级:{{ item.name }}</p>
             <p>班级人数:{{ item.number }}</p>
+
+            <p>期:{{ item.term }} 开始时间:{{ item.startdate }}</p>
           </el-col>
           <el-col :span="8" class="btn">
             <el-button type="primary" @click="clickStu(item.id)" round>班级信息</el-button>

+ 0 - 17
src/layout/class/stuList.vue

@@ -1,17 +0,0 @@
-<template>
-  <div id="stuList"></div>
-</template>
-
-<script>
-export default {
-  name: 'stuList',
-  props: {},
-  components: {},
-  data: () => ({}),
-  created() {},
-  computed: {},
-  methods: {},
-};
-</script>
-
-<style lang="less" scoped></style>

+ 6 - 0
src/router/index.js

@@ -54,6 +54,12 @@ const routes = [
     meta: { title: '班级信息', isleftarrow: true },
     component: () => import('../views/class/classStuList.vue'),
   },
+  //学生名单
+  {
+    path: '/class/achieve',
+    meta: { title: '班级成绩', isleftarrow: true },
+    component: () => import('../views/class/achieve.vue'),
+  },
   // 个人中心-请假&退出管理
   {
     path: '/user/teaLeave',

+ 0 - 1
src/store/index.js

@@ -22,7 +22,6 @@ import util from '@frame/store/util';
 import attendance from '@frame/store/attendance';
 import leave from '@frame/store/leave';
 import uploadtask from '@frame/store/uploadtask';
-
 import * as ustate from '@frame/store/user/state';
 import * as umutations from '@frame/store/user/mutations';
 Vue.use(Vuex);

+ 282 - 0
src/views/class/achieve.vue

@@ -0,0 +1,282 @@
+<template>
+  <div id="achieve">
+    <el-row>
+      <el-col :span="24" class="style">
+        <el-col :span="24" class="top">
+          <!-- <topInfo></topInfo> -->
+          <NavBar v-show="navShow" :title="title" :isleftarrow="isleftarrow"> </NavBar>
+        </el-col>
+        <el-col :span="24" class="main">
+          <achieves
+            @clickDialog="opensave"
+            @submit="onsave"
+            :peaceAchieveList="peaceAchieveList"
+            :showPicker="showPicker"
+            :peaceScore="peaceScore"
+            @showBtn="showBtn"
+            @onConfirm="onConfirm"
+            :achieveList="achieveList"
+            @submitss="onsist"
+            :show="show"
+            :form="form"
+            :deptList="deptList"
+            :lesson="lesson"
+            :lesslist="lesslist"
+            :names="names"
+            :score="score"
+          ></achieves>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import NavBar from '@/layout/common/topInfo.vue';
+import achieves from './info/achieve.vue';
+import { mapState, createNamespacedHelpers, mapGetters } from 'vuex';
+const { mapActions: mapStudent } = createNamespacedHelpers('student');
+const { mapActions: mapClass } = createNamespacedHelpers('classes');
+const { mapActions: mapLesson } = createNamespacedHelpers('lesson');
+const { mapActions: mapUploadtask } = createNamespacedHelpers('uploadtask');
+const { mapActions: mapSubject } = createNamespacedHelpers('subject');
+
+export default {
+  name: 'achieve',
+  props: {},
+  components: {
+    NavBar, //头部导航
+    achieves, //班级学生成绩列表
+  },
+  data: () => ({
+    peaceAchieveList: [],
+    showPicker: false,
+    peaceScore: '',
+    studid: '',
+    lesson: [],
+    lesslist: [],
+    names: '',
+    score: '',
+    deptList: [],
+    achieveList: [],
+    show: false,
+    form: {},
+    title: '',
+    isleftarrow: '',
+    transitionName: 'fade',
+    navShow: true,
+    // 修改
+    stuid: '',
+    taskid: '',
+    subname: '',
+    task: [],
+  }),
+  created() {
+    this.search();
+    this.searchinfo();
+  },
+  computed: {
+    ...mapState(['user']),
+    classid() {
+      return this.$route.query.classid;
+    },
+  },
+  mounted() {
+    this.title = this.$route.meta.title;
+    this.isleftarrow = this.$route.meta.isleftarrow;
+  },
+  watch: {
+    $route(to, from) {
+      this.title = to.meta.title;
+      this.isleftarrow = to.meta.isleftarrow;
+    },
+  },
+  methods: {
+    ...mapStudent({ list: 'query', add: 'create', fet: 'fetch', updates: 'update' }),
+    ...mapClass({ classinfo: 'fetch', classlist: 'query' }),
+    ...mapLesson({ lessoninfo: 'fetch', lessonlist: 'query' }),
+    ...mapUploadtask({ uploadtaskinfo: 'fetch', uploadtasklist: 'query', uploadtaskupdate: 'update' }),
+    ...mapSubject({ subjectinfo: 'fetch', subjectlist: 'query' }),
+    // 平时成绩学生名单查询+作业成绩学生名单查询
+    async search() {
+      let classid;
+      if (this.user.type === '1') classid = this.classid;
+      else classid = this.user.classid;
+      const res = await this.list({ classid });
+      console.log(res.data);
+      this.$set(this, `peaceAchieveList`, res.data);
+      let classsid = this.user.classid;
+      const result = await this.uploadtasklist({ classsid });
+
+      for (const accc of res.data) {
+        var arr = result.data.filter(item => item.studentid === accc.id);
+      }
+
+      // let lessons = [];
+      let lessone = [];
+      let stus = [];
+      for (const val of result.data) {
+        let newsid = val.lessonid;
+        console.log(newsid);
+
+        let classid = this.user.classid;
+        //查询这个班的课程
+        const lessonInfo = await this.lessonlist({ classid });
+
+        for (const hic of lessonInfo.data) {
+          //过滤出有作业的科目
+          console.log(hic);
+          var fff = hic.lessons.filter(item => item.subid === newsid);
+          console.log(fff);
+
+          for (const less of fff) {
+            console.log(less.subname);
+
+            this.$set(this, `subname`, less.subname);
+          }
+        }
+        val.subName = this.subname;
+
+        const stuInfo = await this.fet(val.studentid);
+
+        if (stuInfo.data.name) {
+          val.stuName = stuInfo.data.name;
+          //创建学生名字相关数组
+          let stu = [{ stuname: stuInfo.data.name, id: val.studentid, lesson: [] }];
+          //合并数组
+
+          stus = [...stu, ...stus];
+
+          //去掉重复数组对象
+          var appArray = _.uniqBy(stus, _.isEqual);
+
+          console.log(appArray);
+
+          //合并数组
+          this.$set(this, `achieveList`, appArray);
+          let lessonss = [{ name: this.subname, id: val.studentid, taskid: val.id, score: val.score }];
+          lessone = [...lessonss, ...lessone];
+        }
+
+        for (const ss of appArray) {
+          var vre = lessone.filter(item => item.id === ss.id);
+
+          ss.lesson = vre;
+        }
+        // for (const eee of appArray) {
+        //   eee.less = lessone;
+        //   var qq = eee.less.filter(item => item.id === eee.id);
+
+        // }
+      }
+      this.$set(this, `task`, appArray);
+    },
+    // 学委上作业分+存储学生id
+    clickAchieve({ id }) {
+      this.$set(this, `stuid`, id);
+      this.show = true;
+    },
+    // 学委上作业分提交
+    async submitAchieve(form) {
+      this.form.id = this.stuid;
+      let data = this.form;
+      const res = await this.uploadtaskupdate(data);
+      this.show = false;
+    },
+    // 平时成绩上分显示+学生id
+    showBtn(id) {
+      this.$set(this, `studid`, id);
+      this.showPicker = true;
+    },
+    // 给学生上分
+    async onConfirm(peaceScore) {
+      let data = {};
+      data.id = this.studid;
+      data.selfscore = Number(peaceScore) + Number(peaceScore);
+      const res = await this.updates(data);
+      this.$message({
+        message: '平时成绩上分成功',
+        type: 'success',
+      });
+      this.showPicker = false;
+      this.search();
+    },
+    //  作业成绩列表
+    async searchinfo({ ...info } = {}) {
+      // let classid = this.user.classid;
+      // const result = await this.uploadtasklist({ classid });
+      // const res = await this.list({ classid });
+      // for (const accc of res.data) {
+      //   var arr = result.data.filter(item => item.studentid === accc.id);
+      // }
+      // // let lessons = [];
+      // let lessone = [];
+      // let stus = [];
+      // for (const val of result.data) {
+      //   let newsid = val.lessonid;
+      //   let classid = this.user.classid;
+      //   //查询这个班的课程
+      //   const lessonInfo = await this.lessonlist({ classid });
+      //   for (const hic of lessonInfo.data) {
+      //     //过滤出有作业的科目
+      //     var fff = hic.lessons.filter(item => item._id === newsid);
+      //     for (const less of fff) {
+      //       this.$set(this, `subname`, less.subname);
+      //     }
+      //   }
+      //   val.subName = this.subname;
+      //   const stuInfo = await this.fet(val.studentid);
+      //   val.stuName = stuInfo.data.name;
+      //   //创建学生名字相关数组
+      //   let stu = [{ stuname: stuInfo.data.name, id: val.studentid }];
+      //   //合并数组
+      //   stus = [...stu, ...stus];
+      //   //去掉重复数组对象
+      //   var appArray = _.uniqWith(stus, _.isEqual);
+      //   //合并数组
+      //   this.$set(this, `achieveList`, appArray);
+      //   let lessonss = [{ name: this.subname, id: val.studentid, taskid: val.id, score: val.score, less: [] }];
+      //   lessone = [...lessonss, ...lessone];
+      //   var appArrayss = _.uniqWith(lessone, _.isEqual);
+      //   this.$set(this, `task`, lessone);
+      //   console.log(appArrayss);
+      // }
+    },
+    //为了获取当前点击学生id和当前学生上传的作业
+    async onsist({ id }) {
+      console.log(id);
+
+      var arr = this.task.filter(item => item.id === id);
+
+      this.$set(this, `lesson`, arr);
+    },
+    async opensave({ id, name, score }) {
+      this.show = true;
+      this.$set(this, `names`, name);
+      this.$set(this.form, `score`, score);
+      this.$set(this, `taskid`, id);
+    },
+    async onsave(form) {
+      this.form.id = this.taskid;
+      let res = await this.uploadtaskupdate(this.form);
+      this.show = false;
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.style {
+  width: 100%;
+  min-height: 667px;
+  position: relative;
+  background-color: #eeeeee;
+}
+.top {
+  height: 46px;
+  overflow: hidden;
+}
+.main {
+  min-height: 570px;
+}
+</style>

+ 1 - 1
src/views/class/classStuList.vue

@@ -25,7 +25,7 @@
 
 <script>
 import NavBar from '@/layout/common/topInfo.vue';
-import headStuList from '@/layout/class/headStuList.vue';
+import headStuList from './info/headStuList.vue';
 import { mapState, createNamespacedHelpers, mapGetters } from 'vuex';
 const { mapActions: mapStudent } = createNamespacedHelpers('student');
 export default {

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

@@ -19,7 +19,7 @@
 <script>
 import NavBar from '@/layout/common/topInfo.vue';
 import footInfo from '@/layout/common/footInfo.vue';
-import headClassList from '@/layout/class/headClassList.vue';
+import headClassList from './info/headClassList.vue';
 import { mapState, createNamespacedHelpers, mapGetters } from 'vuex';
 const { mapActions: mapGroup } = createNamespacedHelpers('group');
 const { mapActions: mapStudent } = createNamespacedHelpers('student');

+ 67 - 0
src/views/class/info/achieve.vue

@@ -0,0 +1,67 @@
+<template>
+  <div id="achieve">
+    <el-row>
+      <el-col :span="24">
+        <van-tabs v-model="active">
+          <van-tab title="平时成绩">
+            <peaceAchieve v-on="$listeners" :peaceAchieveList="peaceAchieveList" :showPicker="showPicker" :peaceScore="peaceScore"></peaceAchieve>
+          </van-tab>
+          <van-tab title="作业成绩">
+            <homeworkAchiece
+              v-on="$listeners"
+              :lesslist="lesslist"
+              :lesson="lesson"
+              :achieveList="achieveList"
+              :deptList="deptList"
+              :show="show"
+              :form="form"
+              :names="names"
+              :score="score"
+            ></homeworkAchiece>
+          </van-tab>
+        </van-tabs>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import peaceAchieve from './achieveList/peaceAchieve.vue';
+import homeworkAchiece from './achieveList/homeworkAchiece.vue';
+export default {
+  name: 'achieve',
+  props: {
+    peaceAchieveList: null, //平时成绩
+    showPicker: null, //平時成绩显示
+    peaceScore: null, //平时成绩分数
+    achieveList: null, //作业成绩
+    show: null, //显示弹框
+    form: null, //修改form
+    deptList: null,
+    lesson: null,
+    lesslist: null,
+    names: null,
+    score: null,
+  },
+  components: {
+    peaceAchieve, //平時成績
+    homeworkAchiece, //作业成绩
+  },
+  data: () => ({
+    active: 0,
+  }),
+  created() {},
+  computed: {},
+  methods: {},
+};
+</script>
+
+<style lang="less" scoped>
+/deep/.van-tabs__line {
+  width: 50% !important;
+  background-color: #405ffe;
+}
+/deep/.van-tab--active {
+  color: #405ffe;
+}
+</style>

+ 137 - 0
src/views/class/info/achieveList/homeworkAchiece.vue

@@ -0,0 +1,137 @@
+<template>
+  <div id="homeworkAchiece">
+    <el-row>
+      <el-col :span="24" class="list">
+        <van-collapse v-model="openCollapse">
+          <van-collapse-item :name="index" v-for="(item, index) in achieveList" :key="index">
+            <div slot="title" class="title" @click="clickcds(item.id)">
+              <span class="name">{{ item.stuname }}</span>
+            </div>
+            <van-row v-for="(tag, index) in item.lesson" :key="index">
+              <el-col :span="18">
+                <van-col :span="24" class="score"> 名称:{{ tag.name }} </van-col>
+                <van-col :span="24" class="score"> 作业分: {{ tag.score }}分</van-col>
+              </el-col>
+              <el-col :span="6" class="anniu">
+                <van-col :span="3" class="score">
+                  <van-button v-if="user.job == '学委' || user.type == '3'" type="primary" size="mini" @click="clickBtn(tag.taskid, tag.name, tag.score)"
+                    >上成绩</van-button
+                  >
+                </van-col>
+              </el-col>
+            </van-row>
+          </van-collapse-item>
+        </van-collapse>
+      </el-col>
+    </el-row>
+    <van-dialog v-model="show" title="学生成绩上传" :showConfirmButton="false">
+      <van-form @submit="onSubmit">
+        <span class="lesson">课程名称</span><span class="lesson">{{ names }}</span>
+        <van-field v-model="form.score" name="作业分数" :value="score" label="作业分数" placeholder="请输入作业分数" />
+        <div style="margin: 16px;">
+          <van-button round block type="info" native-type="submit">
+            提交
+          </van-button>
+        </div>
+      </van-form>
+    </van-dialog>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers, mapGetters } from 'vuex';
+export default {
+  name: 'homeworkAchiece',
+  props: {
+    achieveList: null,
+    show: null,
+    form: null,
+    lessonList: null,
+    deptList: null,
+    lesson: null,
+    lesslist: null,
+    names: null,
+    score: null,
+  },
+  components: {},
+  data: () => ({
+    ruleForm: {
+      region: '',
+    },
+    value: '',
+    columns: ['杭州', '宁波', '温州', '嘉兴', '湖州'],
+    showPicker: false,
+    openCollapse: [],
+  }),
+  created() {},
+  computed: { ...mapState(['user']) },
+  methods: {
+    onConfirm(value) {
+      this.value = value;
+      this.showPicker = false;
+    },
+    clickcds(id) {
+      console.log(id);
+      this.$emit('submitss', { id: id });
+    },
+    clickBtn(taskid, name, score) {
+      console.log(taskid);
+      console.log(name);
+
+      this.$emit('clickDialog', { id: taskid, name: name, score: score });
+    },
+    onSubmit() {
+      this.$emit('submit', { data: this.form });
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+p {
+  padding: 0;
+  margin: 0;
+}
+.list {
+  margin: 5px;
+  width: 97%;
+  padding: 0 10px;
+  border-radius: 15px;
+}
+.list .title {
+  float: left;
+  width: 100%;
+}
+.list .name {
+  float: left;
+  width: 80%;
+  font-size: 20px;
+}
+/deep/.van-cell {
+  border-top-left-radius: 10px;
+  border-top-right-radius: 10px;
+}
+/deep/.van-collapse-item__content {
+  border-bottom-left-radius: 10px;
+  border-bottom-right-radius: 10px;
+  padding: 5px 10px;
+}
+/deep/.van-collapse-item {
+  margin: 0 0 10px 0;
+}
+/deep/.el-collapse-item__content {
+  padding: 10px 0 10px 0;
+}
+.list .score {
+  padding: 5px 0;
+  font-size: 18px;
+}
+.anniu {
+  padding: 20px 0 0 0;
+}
+.lesson {
+  font-size: 14px;
+  padding: 0 21px 0 16px;
+  color: #323233;
+}
+</style>

+ 68 - 0
src/views/class/info/achieveList/peaceAchieve.vue

@@ -0,0 +1,68 @@
+<template>
+  <div id="peaceAchieve">
+    <el-row>
+      <el-col :span="24" class="info">
+        <el-col :span="24" class="list" v-for="(item, index) in peaceAchieveList" :key="index">
+          <el-col :span="12" class="name">
+            {{ item.name }}
+          </el-col>
+          <el-col :span="8" class="score">
+            <span>分数:{{ item.selfscore }}分</span>
+          </el-col>
+          <el-col :span="4" class="score">
+            <el-button type="primary" v-if="user.job == '学委' || user.type == '3'" size="mini" @click="showBtn(item.id)" round>选择</el-button>
+          </el-col>
+        </el-col>
+      </el-col>
+    </el-row>
+    <van-popup v-model="showPicker" position="bottom">
+      <van-picker show-toolbar :columns="columns" @confirm="onConfirm" @cancel="showPicker = false" />
+    </van-popup>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers, mapGetters } from 'vuex';
+export default {
+  name: 'peaceAchieve',
+  props: {
+    peaceAchieveList: null,
+    showPicker: null,
+    peaceScore: null,
+  },
+  components: {},
+  data: () => ({
+    columns: ['1', '2', '3', '4', '5', '7', '8', '9', '10'],
+  }),
+  created() {},
+  computed: {
+    ...mapState(['user']),
+  },
+  methods: {
+    showBtn(id) {
+      this.$emit('showBtn', id);
+    },
+    onConfirm(value) {
+      this.$emit('onConfirm', value);
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.info {
+  padding: 0 30px;
+}
+.list {
+  border-bottom: 1px dashed #333;
+}
+.list .name {
+  padding: 15px 15px;
+}
+.list .score {
+  padding: 15px 0;
+}
+.list .score span {
+  padding: 0 7px 0 0;
+}
+</style>

src/layout/class/classInfo.vue → src/views/class/info/classInfo.vue


+ 202 - 0
src/views/class/info/classStuList.vue

@@ -0,0 +1,202 @@
+<template>
+  <div id="classStuList">
+    <el-row>
+      <el-col :span="24" class="style">
+        <el-col :span="24" class="top">
+          <NavBar v-show="navShow" :title="title" :isleftarrow="isleftarrow"> </NavBar>
+        </el-col>
+        <el-col :span="24" class="main">
+          <headStuList
+            :headStuList="headStuList"
+            :assignShow="assignShow"
+            :assignForm="assignForm"
+            :job_list="job_list"
+            @assign="clickAssign"
+            @outForm="outAssignShow"
+            @onForm="onAssignShow"
+            @handleClose="handleClose"
+            :classid="this.id"
+          ></headStuList>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import NavBar from '@/layout/common/topInfo.vue';
+import headStuList from './info/headStuList.vue';
+import { mapState, createNamespacedHelpers, mapGetters } from 'vuex';
+const { mapActions: mapStudent } = createNamespacedHelpers('student');
+export default {
+  name: 'classStuList',
+  props: {},
+  components: {
+    NavBar, //头部导航
+    headStuList, //学生列表
+  },
+  data: () => ({
+    headStuList: [],
+    assignShow: false,
+    assignForm: {},
+    job_list: [],
+
+    job1: [
+      {
+        name: '班长',
+      },
+      {
+        name: '学委',
+      },
+      {
+        name: '普通学生',
+      },
+    ],
+    job2: [
+      {
+        name: '班长',
+      },
+
+      {
+        name: '普通学生',
+      },
+    ],
+
+    job3: [
+      {
+        name: '学委',
+      },
+
+      {
+        name: '普通学生',
+      },
+    ],
+
+    job4: [
+      {
+        name: '普通学生',
+      },
+    ],
+
+    title: '',
+    isleftarrow: '',
+    navShow: true,
+  }),
+  created() {
+    this.searchInfo();
+  },
+  computed: {
+    id() {
+      return this.$route.query.id;
+    },
+    ...mapState(['user']),
+  },
+  mounted() {
+    this.title = this.$route.meta.title;
+    this.isleftarrow = this.$route.meta.isleftarrow;
+  },
+  watch: {
+    $route(to, from) {
+      this.title = to.meta.title;
+      this.isleftarrow = to.meta.isleftarrow;
+    },
+  },
+  methods: {
+    ...mapStudent({ list: 'query', add: 'create', fet: 'fetch', updates: 'update' }),
+    // 查询学生列表-并带有职务
+    async searchInfo() {
+      let classid = this.id;
+      const res = await this.list({ classid });
+      console.log(res.data);
+
+      if (this.$checkRes(res)) {
+        this.$set(this, `headStuList`, res.data);
+      }
+    },
+    //点击派遣
+    async clickAssign({ id, item }) {
+      var banzhang = this.headStuList.filter(item => item.job == '班长');
+      var xuewei = this.headStuList.filter(item => item.job == '学委');
+      console.log(banzhang);
+      console.log(xuewei.length);
+
+      if (xuewei.length == '1') {
+        if (banzhang.length == '2') {
+          if (item.job == '班长') {
+            this.$set(this, `job_list`, this.job2);
+          } else if (item.job == '学委') {
+            this.$set(this, `job_list`, this.job3);
+          } else {
+            this.$set(this, `job_list`, this.job4);
+          }
+        } else if (banzhang.length < '2') {
+          console.log('cc');
+
+          if (item.job == '学委') {
+            this.$set(this, `job_list`, this.job1);
+          } else {
+            this.$set(this, `job_list`, this.job2);
+          }
+        } else if (xuewei.length == '0') {
+        }
+      } else if (xuewei.length == '0') {
+        console.log('a');
+
+        if (banzhang.length == '0') {
+          this.$set(this, `job_list`, this.job1);
+        } else if (banzhang.length == '2') {
+          if (item.job == '班长') {
+            this.$set(this, `job_list`, this.job1);
+          } else {
+            this.$set(this, `job_list`, this.job3);
+          }
+        } else {
+          this.$set(this, `job_list`, this.job1);
+        }
+      }
+
+      this.assignShow = true;
+      const res = await this.fet(id);
+      this.$set(this, `assignForm`, res.data);
+    },
+    //指派职务
+    async onAssignShow(assignForm) {
+      console.log(assignForm);
+
+      let data = this.assignForm;
+
+      let res = await this.updates(data);
+      if (this.$checkRes(res)) {
+        this.$message({
+          message: '成功',
+          type: 'success',
+        });
+      }
+      this.outAssignShow();
+      this.searchInfo();
+    },
+    outAssignShow() {
+      this.assignShow = false;
+    },
+    handleClose() {
+      this.assignShow = false;
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.style {
+  width: 100%;
+  min-height: 667px;
+  position: relative;
+  background-color: #f9fafc;
+}
+.top {
+  height: 46px;
+  overflow: hidden;
+}
+.main {
+  min-height: 570px;
+}
+</style>

+ 58 - 0
src/views/class/info/headClassList.vue

@@ -0,0 +1,58 @@
+<template>
+  <div id="headClassList">
+    <el-row>
+      <el-col :span="24">
+        <el-col :span="24" class="list" v-for="(item, index) in headClassList" :key="index">
+          <el-col :span="16" class="mess">
+            <p>班级:{{ item.name }}</p>
+            <p>班级人数:{{ item.number }}</p>
+
+            <p>期:{{ item.term }} 开始时间:{{ item.startdate }}</p>
+          </el-col>
+          <el-col :span="8" class="btn">
+            <el-button type="primary" @click="clickStu(item.id)" round>班级信息</el-button>
+          </el-col>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'headClassList',
+  props: {
+    headClassList: null,
+  },
+  components: {},
+  data: () => ({}),
+  created() {},
+  computed: {},
+  methods: {
+    clickStu(id) {
+      this.$emit('clickStu', id);
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+p {
+  padding: 0;
+  margin: 0;
+}
+.list {
+  background: #fff;
+  margin: 10px;
+  width: 94%;
+  padding: 10px;
+  border-radius: 20px;
+}
+.list .mess p {
+  padding: 5px 0;
+}
+.list .btn {
+  padding: 20px 0;
+  text-align: center;
+}
+</style>

+ 96 - 0
src/views/class/info/headStuList.vue

@@ -0,0 +1,96 @@
+<template>
+  <div id="headStuList">
+    <el-row type="flex" justify="center" style="padding:10px 0">
+      <el-col :span="6">
+        <el-button type="primary" plain size="mini" @click.native="$router.push({ path: '/class/achieve', query: { classid: $attrs.classid } })">
+          查看平时成绩
+        </el-button>
+      </el-col>
+    </el-row>
+    <el-row>
+      <el-col :span="24" class="info">
+        <el-col :span="6" class="list" v-for="(item, index) in headStuList" :key="index" @click.native="clickAssign(item)">
+          <p class="name" :style="`font-size:${changeNum(item.name)}px`">{{ item.name }}</p>
+          <p class="job" v-if="item.job">{{ item.job }}<i class="el-icon-circle-check"></i></p>
+        </el-col>
+      </el-col>
+    </el-row>
+    <el-dialog title="指派职务" width="90%" :visible.sync="assignShow" :before-close="handleClose">
+      <el-form :model="assignForm">
+        <el-form-item label="学生姓名">
+          {{ assignForm.name }}
+        </el-form-item>
+        <el-form-item label="学生职务">
+          <el-select v-model="assignForm.job" placeholder="请选择学生职务">
+            <el-option v-for="(item, index) in job_list" :key="index" :label="item.name" :value="item.name"></el-option>
+          </el-select>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="outAssignShow">取 消</el-button>
+        <el-button type="primary" @click="onAssignShow">确 定</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'headStuList',
+  props: {
+    headStuList: null,
+    assignForm: null,
+    assignShow: null,
+    job_list: null,
+  },
+  components: {},
+  data: () => ({}),
+  created() {},
+  computed: {},
+  methods: {
+    clickAssign(item) {
+      let id = item.id;
+
+      this.$emit('assign', { id, item });
+    },
+    outAssignShow() {
+      this.$emit('outForm');
+    },
+    onAssignShow(id) {
+      this.$emit('onForm', { data: this.assignForm });
+    },
+    handleClose() {
+      this.$emit('handleClose');
+    },
+    changeNum(name) {
+      if (name.length >= 5) {
+        return 10;
+      } else {
+        return 15;
+      }
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+p {
+  padding: 0;
+  margin: 0;
+}
+.info {
+  margin: 15px 0 0 0;
+}
+.list {
+  text-align: center;
+  border: 1px solid #2c69fe;
+  width: 70px;
+  margin: 0 11px 10px 12px;
+  padding: 5px 0px;
+  border-radius: 10px;
+}
+.list .job {
+  font-size: 10px;
+  color: #405ffe;
+}
+</style>

+ 2 - 2
vue.config.js

@@ -2,8 +2,8 @@ const path = require('path');
 const question = path.resolve(__dirname, '../question-examine');
 const frame = path.resolve(__dirname, '../frame');
 module.exports = {
-  publicPath: process.env.NODE_ENV === 'development' ? '/' : '/student',
-  outputDir: 'student',
+  publicPath: process.env.NODE_ENV === 'development' ? '/' : '/mobiledirtea',
+  outputDir: 'mobiledirtea',
   configureWebpack: config => {
     Object.assign(config, {
       // 开发生产共同配置