Ver Fonte

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

nihao há 5 anos atrás
pai
commit
ac14112584

+ 56 - 0
src/layout/class/studentList.vue

@@ -0,0 +1,56 @@
+<template>
+  <div id="studentList">
+    <el-row>
+      <el-col :span="24" class="list" v-for="(item, index) in studentList" :key="index">
+        <el-col :span="20" class="name">
+          <p>{{ item.name }}</p>
+          <p>{{ item.faculty }}&nbsp;{{ item.major }}</p>
+        </el-col>
+        <el-col :span="3" class="gender">
+          <p>{{ item.gender }}</p>
+          <p v-if="item.job">{{ item.job }}</p>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'studentList',
+  props: {
+    studentList: null,
+  },
+  components: {},
+  data: () => ({}),
+  created() {},
+  computed: {},
+  methods: {},
+};
+</script>
+
+<style lang="less" scoped>
+p {
+  padding: 0;
+  margin: 0;
+}
+.list {
+  background: #fff;
+  margin: 0 5px 5px 5px;
+  width: 97%;
+  padding: 0 10px;
+  border-radius: 15px;
+}
+.name {
+  padding: 10px 0 0 0;
+}
+.name p {
+  padding: 0 0 10px 0;
+}
+.gender {
+  padding: 10px 0 0 0;
+}
+.gender p {
+  padding: 0 0 10px 0;
+}
+</style>

+ 87 - 0
src/layout/class/teaStudentList.vue

@@ -0,0 +1,87 @@
+<template>
+  <div id="teaStudentList">
+    <el-row>
+      <el-col :span="24" class="list" v-for="(item, index) in studentList" :key="index">
+        <el-col :span="18" class="name">
+          <p>{{ item.name }}</p>
+          <p>{{ item.faculty }}&nbsp;{{ item.major }}</p>
+        </el-col>
+        <el-col :span="3" class="gender">
+          <p>{{ item.gender }}</p>
+          <p v-if="item.job">{{ item.job }}</p>
+        </el-col>
+        <el-col :span="3" class="btn">
+          <el-link :underline="false" @click="onClick()">指派</el-link>
+        </el-col>
+      </el-col>
+      <van-dialog v-model="show" title="指派学生职务" :showConfirmButton="false">
+        <van-form @submit="onSubmit">
+          <van-field v-model="form.name" name="学生名称" disabled />
+          <van-field v-model="form.job" placeholder="请输入职务" />
+          <div style="margin: 16px;">
+            <van-button round block type="info" native-type="submit">
+              提交
+            </van-button>
+          </div>
+        </van-form>
+      </van-dialog>
+    </el-row>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'teaStudentList',
+  props: {
+    studentList: null,
+    show: null,
+    form: null,
+  },
+  components: {},
+  data: () => ({}),
+  created() {},
+  computed: {},
+  methods: {
+    onClick() {
+      this.$emit('clickUpdate');
+    },
+    onSubmit() {
+      this.$emit('submit', { data: this.form });
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+p {
+  padding: 0;
+  margin: 0;
+}
+.list {
+  background: #fff;
+  margin: 0 5px 5px 5px;
+  width: 97%;
+  padding: 0 10px;
+  border-radius: 15px;
+}
+.name {
+  padding: 10px 0 0 0;
+}
+.name p {
+  padding: 0 0 10px 0;
+}
+.gender {
+  padding: 10px 0 0 0;
+}
+.gender p {
+  padding: 0 0 10px 0;
+}
+.btn {
+  padding: 22px 0;
+  text-align: center;
+}
+/deep/.btn .el-link {
+  color: #1e90ff;
+  font-size: 18px;
+}
+</style>

+ 11 - 3
src/layout/index/footInfo.vue

@@ -1,7 +1,7 @@
 <template>
   <div id="footInfo">
     <el-row>
-      <el-col :span="24">
+      <!-- <el-col :span="24">
         <el-col :span="6" class="link">
           <el-link :underline="false" @click="$router.push({ path: '/' })">
             <i class="el-icon-s-home"></i>
@@ -26,7 +26,13 @@
             <p>个人信息</p>
           </el-link>
         </el-col>
-      </el-col>
+      </el-col> -->
+      <van-tabbar v-model="active">
+        <van-tabbar-item to="/" icon="home-o">首页</van-tabbar-item>
+        <van-tabbar-item to="/class/index" icon="friends-o">班级名单</van-tabbar-item>
+        <van-tabbar-item to="/question/index" icon="question-o">问卷调查</van-tabbar-item>
+        <van-tabbar-item to="/user/index" icon="user-o">个人信息</van-tabbar-item>
+      </van-tabbar>
     </el-row>
   </div>
 </template>
@@ -36,7 +42,9 @@ export default {
   name: 'footInfo',
   props: {},
   components: {},
-  data: () => ({}),
+  data: () => ({
+    active: 0,
+  }),
   created() {},
   computed: {},
   methods: {},

+ 69 - 0
src/layout/user/checkList.vue

@@ -0,0 +1,69 @@
+<template>
+  <div id="checkList">
+    <el-row>
+      <el-col :span="24" class="top">
+        <el-col :span="18" class="title textOver"> {{ info.classid }}考勤管理 </el-col>
+        <el-col :span="6" class="btn">
+          <el-button type="primary" @click="$router.push({ path: '/user/checkDetail' })">考勤</el-button>
+        </el-col>
+      </el-col>
+      <el-col :span="24" class="list" v-for="(item, index) in info.attend" :key="index">
+        <el-col :span="20" class="picker">
+          <p>{{ item.date }}</p>
+          <p>{{ item.time }}</p>
+        </el-col>
+        <el-col :span="4" class="status">
+          {{ item.status === '0' ? '未签到' : item.status === '1' ? '签到' : item.status === '2' ? '迟到' : '缺勤' }}
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'checkList',
+  props: {
+    info: null,
+  },
+  components: {},
+  data: () => ({}),
+  created() {},
+  computed: {},
+  methods: {},
+};
+</script>
+
+<style lang="less" scoped>
+p {
+  padding: 0;
+  margin: 0;
+}
+.top {
+  height: 50px;
+  line-height: 50px;
+  background-color: #fff;
+  margin: 0 0 10px 0;
+  border-bottom: 1px solid #ccc;
+}
+.top .title {
+  padding: 0 15px;
+  font-size: 20px;
+}
+.top .btn {
+  text-align: center;
+}
+.list {
+  width: 97%;
+  padding: 15px;
+  background-color: #fff;
+  border-radius: 15px;
+  margin: 0 5px 5px 5px;
+}
+.picker p {
+  padding: 2px 0;
+}
+.status {
+  padding: 15px 0;
+}
+</style>

+ 3 - 0
src/layout/user/clickBtn.vue

@@ -5,6 +5,9 @@
         <el-col :span="24" class="native">
           <van-cell is-link @click="$router.push({ path: '/user/leave' })">请假</van-cell>
         </el-col>
+        <el-col :span="24" class="native">
+          <van-cell is-link @click="$router.push({ path: '/user/checkWork' })">考勤</van-cell>
+        </el-col>
       </el-col>
     </el-row>
   </div>

+ 6 - 0
src/router/index.js

@@ -53,6 +53,12 @@ const routes = [
     name: 'user',
     component: () => import('../views/user/leaveReason.vue'),
   },
+  // 个人信息-考勤管理
+  {
+    path: '/user/checkWork',
+    name: 'user',
+    component: () => import('../views/user/checkWork.vue'),
+  },
 ];
 
 const router = new VueRouter({

+ 38 - 0
src/store/attendance.js

@@ -0,0 +1,38 @@
+import Vue from 'vue';
+import Vuex from 'vuex';
+import _ from 'lodash';
+Vue.use(Vuex);
+const api = {
+  checkInfo: `/api/train/attendance`,
+};
+const state = () => ({});
+const mutations = {};
+
+const actions = {
+  async query({ commit }, { skip = 0, limit, ...info } = {}) {
+    const res = await this.$axios.$get(`${api.checkInfo}`, { skip, limit, ...info });
+    return res;
+  },
+  async create({ commit }, payload) {
+    const res = await this.$axios.$post(`${api.checkInfo}`, payload);
+    return res;
+  },
+  async fetch({ commit }, payload) {
+    const res = await this.$axios.$get(`${api.checkInfo}/${payload}`);
+    return res;
+  },
+  async update({ commit }, { id, ...data }) {
+    const res = await this.$axios.$post(`${api.checkInfo}/update/${id}`, data);
+    return res;
+  },
+  async delete({ commit }, payload) {
+    const res = await this.$axios.$delete(`${api.checkInfo}/${payload}`);
+    return res;
+  },
+};
+export default {
+  namespaced: true,
+  state,
+  mutations,
+  actions,
+};

+ 2 - 1
src/store/index.js

@@ -1,12 +1,13 @@
 import Vue from 'vue';
 import Vuex from 'vuex';
 import leave from './leave';
-
+import attendance from './attendance';
 Vue.use(Vuex);
 
 export default new Vuex.Store({
   modules: {
     leave,
+    attendance,
   },
   state: {}, //变量
   mutations: {}, //同步方法

+ 109 - 5
src/views/class/index.vue

@@ -1,19 +1,123 @@
 <template>
   <div id="index">
-    <p>index</p>
+    <el-row>
+      <el-col :span="24" class="info">
+        <el-col :span="24" class="top">
+          <el-col :span="15" class="title">
+            班级学生名单
+          </el-col>
+          <el-col :span="9" class="btn">
+            <el-button type="primary" @click="$router.push({ path: '/' })">上成绩</el-button>
+          </el-col>
+        </el-col>
+        <el-col :span="24" class="main">
+          <span v-if="role === '学生'">
+            <studentList :studentList="studentList"></studentList>
+          </span>
+          <span v-if="role === '班主任'">
+            <teaStudentList :studentList="studentList" :show="show" :form="form" @clickUpdate="clickDialog" @submit="submitUpdate"></teaStudentList>
+          </span>
+        </el-col>
+        <el-col :span="24" class="foot">
+          <footInfo></footInfo>
+        </el-col>
+      </el-col>
+    </el-row>
   </div>
 </template>
 
 <script>
+import footInfo from '@/layout/index/footInfo.vue';
+import studentList from '@/layout/class/studentList.vue';
+import teaStudentList from '@/layout/class/teaStudentList.vue';
+
 export default {
   name: 'index',
   props: {},
-  components: {},
-  data: () => ({}),
+  components: {
+    studentList, //学生列表
+    teaStudentList, //班主任学生列表
+    footInfo, //底部信息
+  },
+  data: () => ({
+    studentList: [
+      {
+        name: '刘裕',
+        gender: '男',
+        faculty: '计算机学院',
+        major: '应用软件技术专业',
+        job: '班長',
+      },
+      {
+        name: '刘裕',
+        gender: '男',
+        faculty: '计算机学院',
+        major: '应用软件技术专业',
+        job: '學委',
+      },
+      {
+        name: '刘裕',
+        gender: '男',
+        faculty: '计算机学院',
+        major: '应用软件技术专业',
+      },
+    ],
+    role: '班主任',
+    show: false,
+    form: {
+      name: '流域',
+      job: '',
+    },
+  }),
   created() {},
   computed: {},
-  methods: {},
+  methods: {
+    clickDialog() {
+      this.show = true;
+    },
+    submitUpdate(form) {
+      console.log(form);
+      this.show = false;
+    },
+  },
 };
 </script>
 
-<style lang="less" scoped></style>
+<style lang="less" scoped>
+.info {
+  width: 100%;
+  min-height: 667px;
+  position: relative;
+  background-color: #edeae8;
+}
+.top {
+  height: 50px;
+  line-height: 50px;
+  margin: 0 0 10px 0;
+  background: #fff;
+}
+.top .title {
+  padding: 0 15px;
+  font-size: 20px;
+}
+.top .btn {
+  text-align: right;
+  padding: 0 30px;
+}
+.main {
+  margin: 0 0 50px 0;
+}
+.list {
+  height: 100px;
+  background-color: #fff;
+  margin: 0 0 5px 0;
+}
+.foot {
+  width: 100%;
+  height: 50px;
+  position: absolute;
+  bottom: 0;
+  border-top: 1px solid #ccc;
+  background-color: #fff;
+}
+</style>

+ 57 - 0
src/views/user/checkWork.vue

@@ -0,0 +1,57 @@
+<template>
+  <div id="checkWork">
+    <el-row>
+      <el-col :span="24" class="info">
+        <el-col :span="24" class="main">
+          <checkList :info="info"></checkList>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import checkList from '@/layout/user/checkList.vue';
+import { createNamespacedHelpers, mapGetters } from 'vuex';
+const { mapActions: mapCheck } = createNamespacedHelpers('attendance');
+export default {
+  name: 'checkWork',
+  props: {},
+  components: {
+    checkList,
+  },
+  data: () => ({
+    info: {
+      classid: '1234560',
+      attend: [
+        {
+          date: '2020-02-19',
+          time: '8:30',
+          status: '0',
+        },
+      ],
+    },
+  }),
+  created() {
+    this.searchInfo();
+  },
+  computed: {},
+  methods: {
+    ...mapCheck(['query']),
+    async searchInfo({ skip = 0, limit = 10, ...info } = {}) {
+      const res = await this.query({ skip, limit, ...info });
+      console.log(res.data);
+      // this.$set(this, `leaveList`, res.data);
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.info {
+  width: 100%;
+  min-height: 667px;
+  position: relative;
+  background-color: #edeae8;
+}
+</style>

+ 1 - 3
src/views/user/leave.vue

@@ -39,7 +39,6 @@ export default {
     ...mapLeave(['query']),
     async searchInfo({ skip = 0, limit = 10, ...info } = {}) {
       const res = await this.query({ skip, limit, ...info });
-      // console.log(res.data);
       this.$set(this, `leaveList`, res.data);
     },
   },
@@ -49,9 +48,8 @@ export default {
 <style lang="less" scoped>
 .info {
   width: 100%;
-  height: 100vh;
+  min-height: 667px;
   position: relative;
-  overflow: hidden;
   background-color: #edeae8;
 }
 .top {

+ 121 - 3
src/views/user/personalDetail.vue

@@ -1,6 +1,71 @@
 <template>
   <div id="personalDetail">
-    <p>个人信息</p>
+    <el-row>
+      <el-col :span="24" class="info">
+        <el-col :span="24" class="top">
+          学生个人信息
+        </el-col>
+        <el-col :span="24" class="message">
+          <p>
+            <span class="title">姓名:</span><span class="content">{{ messInfo.name }}</span>
+          </p>
+          <p>
+            <span class="title">身份证号:</span><span class="content">{{ messInfo.id_number }}</span>
+          </p>
+          <p>
+            <span class="title">性别:</span><span class="content">{{ messInfo.gender }}</span>
+          </p>
+          <p>
+            <span class="title">民族:</span><span class="content">{{ messInfo.nation }}</span>
+          </p>
+          <p>
+            <span class="title">手机号:</span><span class="content">{{ messInfo.phone }}</span>
+          </p>
+          <p>
+            <span class="title">学校名称:</span><span class="content">{{ messInfo.school_name }}</span>
+          </p>
+          <p>
+            <span class="title">院系:</span><span class="content">{{ messInfo.faculty }}</span>
+          </p>
+          <p>
+            <span class="title">专业:</span><span class="content">{{ messInfo.major }}</span>
+          </p>
+          <p>
+            <span class="title">入学年份:</span><span class="content">{{ messInfo.entry_year }}</span>
+          </p>
+          <p>
+            <span class="title">毕业年份:</span><span class="content">{{ messInfo.finish_year }}</span>
+          </p>
+          <p>
+            <span class="title">在校担任职务:</span><span class="content">{{ messInfo.school_job }}</span>
+          </p>
+          <p>
+            <span class="title">QQ:</span><span class="content">{{ messInfo.qq }}</span>
+          </p>
+          <p>
+            <span class="title">E-mail:</span><span class="content">{{ messInfo.email }}</span>
+          </p>
+          <p>
+            <span class="title" style="position: relative;top: -20px;">家庭所在地:</span><span class="content">{{ messInfo.family_place }}</span>
+          </p>
+          <p>
+            <span class="title">职务:</span><span class="content">{{ messInfo.job }}</span>
+          </p>
+          <p>
+            <span class="title">所在期数:</span><span class="content">{{ messInfo.termid }}</span>
+          </p>
+          <p>
+            <span class="title">所在批次:</span><span class="content">{{ messInfo.batchid }}</span>
+          </p>
+          <p>
+            <span class="title">所在班级:</span><span class="content">{{ messInfo.classid }}</span>
+          </p>
+          <p>
+            <span class="title">所在寝室:</span><span class="content">{{ messInfo.bedroomid }}</span>
+          </p>
+        </el-col>
+      </el-col>
+    </el-row>
   </div>
 </template>
 
@@ -9,11 +74,64 @@ export default {
   name: 'personalDetail',
   props: {},
   components: {},
-  data: () => ({}),
+  data: () => ({
+    messInfo: {
+      name: '刘裕',
+      id_number: '220182199603257019',
+      phone: '17319450324',
+      gender: '男',
+      nation: '汉',
+      school_name: '吉林大学',
+      faculty: '计算机学院',
+      major: '应用软件技术专业',
+      entry_year: '2002',
+      finish_year: '2006',
+      school_job: '班长',
+      qq: '1345526645',
+      email: '17319450324@163.com',
+      family_place: '吉林省长春市朝阳区力旺广场B座16楼',
+      job: '班长',
+      termid: '期id',
+      batchid: '批次id',
+      classid: '班级id',
+      bedroomid: '寝室id',
+    },
+  }),
   created() {},
   computed: {},
   methods: {},
 };
 </script>
 
-<style lang="less" scoped></style>
+<style lang="less" scoped>
+p {
+  padding: 0;
+  margin: 0;
+}
+.info {
+  width: 100%;
+  height: 100%;
+  background-color: #edeae8;
+}
+.info .top {
+  text-align: center;
+  padding: 15px 0;
+  font-size: 30px;
+}
+.message {
+  padding: 0 0 10px 15px;
+}
+.message p {
+  padding: 5px 0;
+}
+.message p .title {
+  display: inline-block;
+  text-align: left;
+  width: 110px;
+}
+.message p .content {
+  display: inline-block;
+  text-align: left;
+  width: 235px;
+}
+</style>