zhousheng %!s(int64=6) %!d(string=hai) anos
pai
achega
c9d0dbf64b
Modificáronse 31 ficheiros con 3359 adicións e 323 borrados
  1. 2 1
      TEAMModelOS.SmartClass/ClientApp/app.js
  2. BIN=BIN
      TEAMModelOS.SmartClass/ClientApp/assets/image/0.png
  3. BIN=BIN
      TEAMModelOS.SmartClass/ClientApp/assets/image/1.png
  4. 14 4
      TEAMModelOS.SmartClass/ClientApp/components/smart-class/headers.vue
  5. 5 0
      TEAMModelOS.SmartClass/ClientApp/router/routes.js
  6. 2434 0
      TEAMModelOS.SmartClass/ClientApp/static/commentList.json
  7. 3 180
      TEAMModelOS.SmartClass/ClientApp/static/lessonList.json
  8. 4 4
      TEAMModelOS.SmartClass/ClientApp/view/app.vue
  9. 293 0
      TEAMModelOS.SmartClass/ClientApp/view/smart-class/CommentVideo.vue
  10. 8 2
      TEAMModelOS.SmartClass/ClientApp/view/smart-class/LessonDetails.vue
  11. 138 63
      TEAMModelOS.SmartClass/ClientApp/view/smart-class/LiveBroadcast.vue
  12. 4 2
      TEAMModelOS.SmartClass/ClientApp/view/smart-class/LoginPage.vue
  13. 2 5
      TEAMModelOS.SmartClass/ClientApp/view/smart-class/MainPage.vue
  14. 1 1
      TEAMModelOS.SmartClass/ClientApp/view/smart-class/ReviewActivity.vue
  15. 2 1
      TEAMModelOS.SmartClass/ClientApp/view/smart-class/Video.vue
  16. 105 0
      TEAMModelOS.SmartClass/ClientApp/view/smart-class/calendar.vue
  17. 4 4
      TEAMModelOS.SmartClass/ClientApp/view/smart-class/index.vue
  18. 5 5
      TEAMModelOS.SmartClass/ClientApp/view/smart-class/notice.vue
  19. 1 1
      TEAMModelOS.SmartClass/Views/Shared/_Layout.cshtml
  20. 35 6
      TEAMModelOS.SmartClass/package.json
  21. 14 2
      TEAMModelOS.SmartClass/webpack.config.js
  22. 16 3
      TEAMModelOS.SmartClass/webpack.config.vendor.js
  23. BIN=BIN
      TEAMModelOS.SmartTeach/ClientApp/assets/image/resource/login_bg.jpg
  24. BIN=BIN
      TEAMModelOS.SmartTeach/ClientApp/assets/image/resource/login_pwd.png
  25. BIN=BIN
      TEAMModelOS.SmartTeach/ClientApp/assets/image/resource/login_switchover.gif
  26. BIN=BIN
      TEAMModelOS.SmartTeach/ClientApp/assets/image/resource/login_user.png
  27. 4 3
      TEAMModelOS.SmartTeach/ClientApp/common/headers.vue
  28. 4 2
      TEAMModelOS.SmartTeach/ClientApp/router/routes.js
  29. 261 0
      TEAMModelOS.SmartTeach/ClientApp/view/resource/login.vue
  30. 0 34
      TEAMModelOS.SmartTeach/ClientApp/view/zone/index.vue
  31. BIN=BIN
      TEAMModelOS.TeachZone/ClientApp/assets/image/refresh_hover.png

+ 2 - 1
TEAMModelOS.SmartClass/ClientApp/app.js

@@ -21,7 +21,8 @@ Vue.use(VideoPlayer);
 //新添加的
 //新添加的
 import vuescroll from 'vue-scroll'
 import vuescroll from 'vue-scroll'
 import echarts from 'echarts'
 import echarts from 'echarts'
-
+//import FullCalendar from 'vue-full-calendar'
+//Vue.use(FullCalendar);
 //全局API请求
 //全局API请求
 Vue.prototype.$api = apiTools;
 Vue.prototype.$api = apiTools;
 Vue.prototype.$post = post;
 Vue.prototype.$post = post;

BIN=BIN
TEAMModelOS.SmartClass/ClientApp/assets/image/0.png


BIN=BIN
TEAMModelOS.SmartClass/ClientApp/assets/image/1.png


+ 14 - 4
TEAMModelOS.SmartClass/ClientApp/components/smart-class/headers.vue

@@ -1,16 +1,18 @@
 <template>
 <template>
   <div class="headerContainer">
   <div class="headerContainer">
     <div class="header center-row">
     <div class="header center-row">
-      <img src="http://ttkt.sxedu.org:70/upload/setting/0/0.png?_=1557194799800" />
+      <img src="../../assets/image/1.png" />
       <ul>
       <ul>
         <li :class="this.$route.path ==  '/main/index' || activeIndex == 0 ? 'li-active':''" @click="handleMenuClick(0,'index')">首页</li>
         <li :class="this.$route.path ==  '/main/index' || activeIndex == 0 ? 'li-active':''" @click="handleMenuClick(0,'index')">首页</li>
         <li :class="this.$route.path ==  '/main/notice' || activeIndex == 1? 'li-active':''" @click="handleMenuClick(1,'notice')">通知公告</li>
         <li :class="this.$route.path ==  '/main/notice' || activeIndex == 1? 'li-active':''" @click="handleMenuClick(1,'notice')">通知公告</li>
-        <li :class="this.$route.path ==  '/main/reviewActivity' || activeIndex == 2? 'li-active':''" @click="handleMenuClick(2,'reviewActivity')">评审活动</li> 
+        <li :class="this.$route.path ==  '/main/reviewActivity' || activeIndex == 2? 'li-active':''" @click="handleMenuClick(2,'reviewActivity')">评审活动</li>
         <li :class="this.$route.path ==  '/main/PastReview' || activeIndex == 3? 'li-active':''" @click="handleMenuClick(3,'PastReview')">往届回顾</li>
         <li :class="this.$route.path ==  '/main/PastReview' || activeIndex == 3? 'li-active':''" @click="handleMenuClick(3,'PastReview')">往届回顾</li>
         <li :class="this.$route.path ==  '/main/LiveBroadcast' || activeIndex == 4? 'li-active':''" @click="handleMenuClick(4,'LiveBroadcast')">天天直播</li>
         <li :class="this.$route.path ==  '/main/LiveBroadcast' || activeIndex == 4? 'li-active':''" @click="handleMenuClick(4,'LiveBroadcast')">天天直播</li>
         <li :class="this.$route.path ==  '/main/Lessons' || activeIndex == 5? 'li-active':''" @click="handleMenuClick(5,'Lessons')">优课汇聚</li>
         <li :class="this.$route.path ==  '/main/Lessons' || activeIndex == 5? 'li-active':''" @click="handleMenuClick(5,'Lessons')">优课汇聚</li>
       </ul>
       </ul>
-      <span class="btn-login"  @click="handleMenuClick(6,'/login')">登录</span>
+      <span class="btn-login" v-if="isLogin == 1" >欢迎&nbsp;{{userName}}!</span>
+      <Icon type="md-power" v-if="isLogin == 1" @click="loginOut" style="margin-left:30px;" size="20" color="white" />
+      <span class="btn-login" v-else @click="handleMenuClick(6,'/login')">登录</span>
     </div>
     </div>
   </div>
   </div>
 </template>
 </template>
@@ -20,6 +22,8 @@
     name: "headers",
     name: "headers",
     data() {
     data() {
       return {
       return {
+        userName: '',
+        isLogin:'',
         activeIndex: sessionStorage.getItem('_activeIndex') || 0
         activeIndex: sessionStorage.getItem('_activeIndex') || 0
       }
       }
     },
     },
@@ -32,9 +36,15 @@
         this.activeIndex = index;
         this.activeIndex = index;
         sessionStorage.setItem('_activeIndex', index);
         sessionStorage.setItem('_activeIndex', index);
         this.$router.push(route);
         this.$router.push(route);
+      },
+      loginOut() {
+        localStorage.clear();
+        this.isLogin = 0;
       }
       }
     },
     },
     mounted() {
     mounted() {
+      this.userName = localStorage.getItem("userName");
+      this.isLogin = localStorage.getItem("isLogin");
       this.$eventBus.$on('activeIndex', (index) => {
       this.$eventBus.$on('activeIndex', (index) => {
         this.activeIndex = index;
         this.activeIndex = index;
       })
       })
@@ -63,7 +73,7 @@
       list-style:none;
       list-style:none;
       color:#aaa;
       color:#aaa;
       padding: 0 20px;
       padding: 0 20px;
-      margin-right:160px;
+      /*margin-right:20px;*/
     }
     }
 
 
       .header ul li {
       .header ul li {

+ 5 - 0
TEAMModelOS.SmartClass/ClientApp/router/routes.js

@@ -82,6 +82,11 @@ export const routes = [
         name: 'video',
         name: 'video',
         path: 'video',
         path: 'video',
         component: resolve => require(['@/view/smart-class/Video'], resolve), //路由懒加载
         component: resolve => require(['@/view/smart-class/Video'], resolve), //路由懒加载
+      },
+      {
+        name: 'commentVideo',
+        path: 'commentVideo',
+        component: resolve => require(['@/view/smart-class/CommentVideo'], resolve), //路由懒加载
       }
       }
     ]
     ]
   }
   }

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 2434 - 0
TEAMModelOS.SmartClass/ClientApp/static/commentList.json


+ 3 - 180
TEAMModelOS.SmartClass/ClientApp/static/lessonList.json

@@ -1319,126 +1319,8 @@
     "viwActivityTypeTip": "新媒体新技术",
     "viwActivityTypeTip": "新媒体新技术",
     "workHonor": null
     "workHonor": null
   },
   },
-  {
-    "activityStatus": 0,
-    "activityStatusTip": "未开始",
-    "autoChangeViewActivityStatus": true,
-    "commentCount": 0,
-    "cover": null,
-    "coverHash": null,
-    "coverUri": null,
-    "employeeName": "张锋",
-    "employeeNo": "354011",
-    "endTime": {
-      "date": 10,
-      "day": 5,
-      "hours": 10,
-      "minutes": 15,
-      "month": 4,
-      "nanos": 0,
-      "seconds": 0,
-      "time": 1557454500000,
-      "timezoneOffset": -480,
-      "year": 119
-    },
-    "id": 526,
-    "name": "2019051001直播",
-    "ownUnit": "柯桥区教师发展中心",
-    "parentCategoryId": 1,
-    "parentCategoryName": "语文",
-    "parentGradeId": 5,
-    "parentGradeName": "二年级",
-    "parentGradeSectionId": 1,
-    "parentGradeSectionName": "小学",
-    "parentProjectId": 490,
-    "parentProjectName": "《小马过河》",
-    "parentTeachePlateId": 2,
-    "parentTeachePlateName": "天喻互动课堂",
-    "school": null,
-    "schoolName": "绍兴市柯桥区杨汛桥紫薇小学",
-    "schoolNo": "2133006455",
-    "score": null,
-    "speaker": "胡常妹",
-    "startTime": {
-      "date": 10,
-      "day": 5,
-      "hours": 9,
-      "minutes": 35,
-      "month": 4,
-      "nanos": 0,
-      "seconds": 0,
-      "time": 1557452100000,
-      "timezoneOffset": -480,
-      "year": 119
-    },
-    "timeRangeTip": "2019.05.10 09:35 - 05.10 10:15",
-    "timeRangeTipHHmm": "09:35 - 10:15",
-    "viewActivityAwardSetList": [],
-    "viewCount": 0,
-    "viwActivityType": 0,
-    "viwActivityTypeTip": "新媒体新技术",
-    "workHonor": null
-  },
-  {
-    "activityStatus": 0,
-    "activityStatusTip": "未开始",
-    "autoChangeViewActivityStatus": true,
-    "commentCount": 0,
-    "cover": null,
-    "coverHash": null,
-    "coverUri": null,
-    "employeeName": "叶水良",
-    "employeeNo": "32795",
-    "endTime": {
-      "date": 9,
-      "day": 4,
-      "hours": 10,
-      "minutes": 15,
-      "month": 4,
-      "nanos": 0,
-      "seconds": 0,
-      "time": 1557368100000,
-      "timezoneOffset": -480,
-      "year": 119
-    },
-    "id": 470,
-    "name": "2019050902直播",
-    "ownUnit": "柯桥区教师发展中心",
-    "parentCategoryId": 45,
-    "parentCategoryName": "道德与法治",
-    "parentGradeId": 4,
-    "parentGradeName": "一年级",
-    "parentGradeSectionId": 1,
-    "parentGradeSectionName": "小学",
-    "parentProjectId": 145,
-    "parentProjectName": "《让我自己来整理》",
-    "parentTeachePlateId": 2,
-    "parentTeachePlateName": "天喻互动课堂",
-    "school": null,
-    "schoolName": "绍兴市柯桥区齐贤中心小学",
-    "schoolNo": "2133006415",
-    "score": null,
-    "speaker": "王利萍",
-    "startTime": {
-      "date": 9,
-      "day": 4,
-      "hours": 9,
-      "minutes": 35,
-      "month": 4,
-      "nanos": 0,
-      "seconds": 0,
-      "time": 1557365700000,
-      "timezoneOffset": -480,
-      "year": 119
-    },
-    "timeRangeTip": "2019.05.09 09:35 - 05.09 10:15",
-    "timeRangeTipHHmm": "09:35 - 10:15",
-    "viewActivityAwardSetList": [],
-    "viewCount": 0,
-    "viwActivityType": 0,
-    "viwActivityTypeTip": "新媒体新技术",
-    "workHonor": null
-  },
+  
+  
   {
   {
     "activityStatus": 0,
     "activityStatus": 0,
     "activityStatusTip": "未开始",
     "activityStatusTip": "未开始",
@@ -1559,66 +1441,7 @@
     "viwActivityTypeTip": "新媒体新技术",
     "viwActivityTypeTip": "新媒体新技术",
     "workHonor": null
     "workHonor": null
   },
   },
-  {
-    "activityStatus": 2,
-    "activityStatusTip": "已结束",
-    "autoChangeViewActivityStatus": true,
-    "commentCount": 28,
-    "cover": null,
-    "coverHash": null,
-    "coverUri": null,
-    "employeeName": "徐丽萍",
-    "employeeNo": "31440",
-    "endTime": {
-      "date": 8,
-      "day": 3,
-      "hours": 10,
-      "minutes": 20,
-      "month": 4,
-      "nanos": 0,
-      "seconds": 0,
-      "time": 1557282000000,
-      "timezoneOffset": -480,
-      "year": 119
-    },
-    "id": 473,
-    "name": "2019050801直播",
-    "ownUnit": "柯桥区教师发展中心",
-    "parentCategoryId": 1,
-    "parentCategoryName": "语文",
-    "parentGradeId": 7,
-    "parentGradeName": "四年级",
-    "parentGradeSectionId": 1,
-    "parentGradeSectionName": "小学",
-    "parentProjectId": 452,
-    "parentProjectName": "阅读拓展课《窗边的小豆豆》",
-    "parentTeachePlateId": 2,
-    "parentTeachePlateName": "天喻互动课堂",
-    "school": null,
-    "schoolName": "绍兴市柯桥区漓渚镇中心小学",
-    "schoolNo": "2133006375",
-    "score": null,
-    "speaker": "钱飞飞",
-    "startTime": {
-      "date": 8,
-      "day": 3,
-      "hours": 9,
-      "minutes": 40,
-      "month": 4,
-      "nanos": 0,
-      "seconds": 0,
-      "time": 1557279600000,
-      "timezoneOffset": -480,
-      "year": 119
-    },
-    "timeRangeTip": "2019.05.08 09:40 - 05.08 10:20",
-    "timeRangeTipHHmm": "09:40 - 10:20",
-    "viewActivityAwardSetList": [],
-    "viewCount": 55,
-    "viwActivityType": 0,
-    "viwActivityTypeTip": "新媒体新技术",
-    "workHonor": "青年教师标乒"
-  },
+  
   {
   {
     "activityStatus": 2,
     "activityStatus": 2,
     "activityStatusTip": "已结束",
     "activityStatusTip": "已结束",

+ 4 - 4
TEAMModelOS.SmartClass/ClientApp/view/app.vue

@@ -30,25 +30,25 @@
     }
     }
   }
   }
 </script>
 </script>
-<style scoped>
+<style>
   html, body, #app {
   html, body, #app {
     height: 100% !important;
     height: 100% !important;
     user-select: none;
     user-select: none;
-    background:rgb(248,248,248);
   }
   }
 
 
   .main-content {
   .main-content {
     position: relative;
     position: relative;
     width: 100%;
     width: 100%;
     min-width: 1200px;
     min-width: 1200px;
-    min-height: 768px;
+    min-height: 100% !important;
     display: flex;
     display: flex;
     flex-direction: column;
     flex-direction: column;
     align-items: center;
     align-items: center;
-    background:rgb(248,248,248);
+    background:rgb(128, 128, 128);
   }
   }
   .content {
   .content {
     width:100%;
     width:100%;
+    height:100%;
   }
   }
   .logo {
   .logo {
     width: 200px;
     width: 200px;

+ 293 - 0
TEAMModelOS.SmartClass/ClientApp/view/smart-class/CommentVideo.vue

@@ -0,0 +1,293 @@
+<template>
+  <div class="video-page">
+    <!--<div class="video-title">
+      <h3 class="video-title-h3">12月03日直播</h3>
+    </div>-->
+    <div class="video-info">
+
+      <div class="comment-video-src">
+        <div>
+          <p style=" font-size: 14px; margin-bottom: 20px;"><span class="title-header">标题 : <span class="title-content">创新实验室(学科教室)课例20190508直播</span></span> <span class="title-header">主讲人 : 林燕<span class="title-content"></span></span> <span class="liveStatus">播放成功</span></p>
+        </div>
+        <video controls="controls" width="780" style="display:block;"
+               src="https://teammodelstorage.blob.core.chinacloudapi.cn/teammodelcontest/20190516/acalssOne%E7%BD%91%E9%A1%B5%E7%99%BB%E5%BD%95%E5%AD%A6%E4%B9%A0%E6%96%B9%E6%B3%95.mp4">
+          您的浏览器不支持 video 标签。
+        </video>
+        <p class="average-score">作品当前平均分 : <span>未评</span></p>
+      </div>
+
+      <div class="comment-video-detail-info">
+        <Tabs value="name1">
+          <TabPane label="观课评论" name="name1">
+            <div class="review-pane">
+              <div class="review-list" v-for="(item,index) in commmentList" :key="index">
+                <span class="reviewlist-title">
+                  {{item.employeeName}} :&nbsp;
+                </span> <span class="reviewlist-content"><span>{{item.content}}</span> <span class="reviewlist-time">({{item.createTimeTip}})</span> <!----></span>
+              </div>
+            </div>
+            <div style="position: relative; padding-top: 20px;"><div class="lastest-comment" style="display: none;">查看最新评论</div> <textarea placeholder="发表您的评论" maxlength="250" class="publish-review"></textarea> <span class="submit-review">提交</span></div>
+          </TabPane>
+          <TabPane label="专家点评" name="name2">专家点评</TabPane>
+        </Tabs>
+      </div>
+    </div>
+    <div class="video-other" style="display:none;">
+      <h3 class="video-title-h3">推荐作品</h3>
+    </div>
+    <div class="videos-wrap" style="display:none;">
+      <div class="video-item" v-for="(item , index) in videos" @click="showVideo(index)">
+        <img src="../../assets/image/default-act.png" width="95%" />
+        <p>{{item.title}}</p>
+      </div>
+    </div>
+  </div>
+</template>
+<script>
+  import rewardList from '@/static/rewardList.json'
+  import CList from '@/static/commentList.json'
+  export default {
+    data() {
+      return {
+        routerData: {},
+        rewardDatas: [],
+        commmentList:[],
+        videos: [
+          {
+            title:'12月14日直播'
+          },
+          {
+            title:'12月14日直播'
+          },
+          {
+            title:'12月14日直播'
+          },
+          {
+            title:'12月14日直播'
+          },
+          {
+            title:'12月14日直播'
+          },
+          {
+            title:'12月14日直播'
+          },
+          {
+            title:'12月14日直播'
+          },
+          {
+            title:'12月14日直播'
+          }
+        ]
+      }
+    },
+    methods: {
+      showVideo(index) {
+        //alert(index);
+        this.$router.push(
+          {
+            name: 'video',
+            query: {
+              rewardIndex: index
+            }
+          }
+        );
+      }
+    },
+    mounted() {
+      let index = this.$route.query.rewardIndex;
+      //alert(index);
+      this.commmentList = CList.list;
+      this.rewardDatas = rewardList.data.list;
+      if (index == undefined) {
+        this.routerData = this.rewardDatas[0];
+      } else {
+        this.routerData = this.rewardDatas[index];
+      }
+      
+    },
+    
+    watch: {
+      $route() {
+        let index = this.$route.query.rewardIndex;
+        //alert(index);
+        if (index == undefined) {
+          this.routerData = this.rewardDatas[0];
+        } else {
+          this.routerData = this.rewardDatas[index];
+        }
+      }
+    }
+  }
+</script>
+<style scoped>
+  .video-page {
+    width: 1200px;
+    margin: 100px auto;
+    font-family:none;
+  }
+
+  .video-title {
+    margin-bottom: 20px;
+    height: 20px;
+  }
+
+    .video-title-h3 {
+      height: 20px;
+      font-size: 20px;
+      line-height: 20px;
+      border-left: 6px solid #37b1fa;
+      padding-left: 12px;
+    }
+
+  .video-info {
+    width: 100%;
+    display: table;
+  }
+  .comment-video-detail-info {
+    width:400px;
+    background:#ffffff;
+    display:table-cell;
+    vertical-align:top;
+    padding:20px 10px 20px 30px;
+    position:relative;
+    border-left: 15px solid rgb(241,242,243);
+  }
+    .comment-video-detail-info .ivu-form-item {
+      margin-bottom:8px;
+    }
+    .comment-video-detail-info .ivu-form .ivu-form-item-label {
+      font-size:14px;
+      color:#999999;
+    }
+    .comment-video-detail-info .ivu-form-item-content {
+      font-size: 14px;
+      color: #ffffff;
+    }
+  .comment-video-src {
+    display:table-cell;
+    width:780px;
+    box-sizing:border-box;
+    padding:20px 20px;
+    background:#FFFFFF;
+  }
+  .download-video {
+    text-align:center;
+    position:absolute;
+    width:100%;
+    bottom:20px;
+    left:0;
+  }
+  .video-other {
+    margin-top:20px;
+  }
+  .videos-wrap {
+    margin:0px -10px 0px -10px;
+  }
+  .video-item {
+    width: 25%;
+    display: inline-block;
+    padding: 0px 10px;
+    margin-top:20px;
+    cursor:pointer;
+  }
+
+    .video-item p {
+      font-size: 16px;
+      color: #000;
+      margin-top: 10px;
+      text-decoration: none;
+      text-indent: 8px;
+    }
+  .title-header {
+    color: #666;
+    margin-right: 30px;
+    display: inline-block;
+  }
+  .liveStatus {
+    color: #33aafe;
+    float: right;
+  }
+
+  .review-pane {
+    height: 300px;
+    background-color: #fff;
+    overflow-y: auto;
+    position: relative;
+  }
+  .review-list {
+    overflow: hidden;
+    font-size: 14px;
+    margin: 8px 10px;
+    padding-bottom: 8px;
+    border-bottom: 1px solid #f6f6f6;
+  }
+
+  .reviewlist-title {
+    float: left;
+    width: 22%;
+    color: #999;
+    text-align: right;
+    padding-right: 5px;
+  }
+
+  .reviewlist-content {
+    float: left;
+    color: #444;
+    width: 76%;
+    font-size: 14px;
+    word-break: break-all;
+  }
+
+  .lastest-comment {
+    position: absolute;
+    top: -5px;
+    right: 20px;
+    padding: 5px;
+    color: #666;
+    z-index: 999;
+    cursor: pointer;
+  }
+
+  .publish-review {
+    padding: 10px;
+    background-color: #f1f2f3;
+    border: 1px solid #d7d8da;
+    font-size: 14px;
+    color: #333;
+    width: 100%;
+    height: 100px;
+    resize: none;
+    outline: none;
+    box-sizing: border-box;
+  }
+
+  .submit-review {
+    margin-top: 8px;
+    color: #fff;
+    background-color: #409eff;
+    border-color: #409eff;
+    margin-right: 10px;
+    display: inline-block;
+    float: right;
+    cursor: pointer;
+    width: 45px;
+    text-align: center;
+    height: 22px;
+    line-height: 22px;
+    border-radius: 2px;
+  }
+
+  .reviewlist-time {
+    font-size: 12px;
+    color: #ccc;
+  }
+  .average-score {
+    margin-top: 20px;
+    color: #666;
+    font-size: 14px;
+  }
+
+  .average-score span {
+    color: #fd8f45;
+  }
+</style>

+ 8 - 2
TEAMModelOS.SmartClass/ClientApp/view/smart-class/LessonDetails.vue

@@ -12,7 +12,7 @@
           <div class="activity-brief-title">
           <div class="activity-brief-title">
             <span>{{activityInfo.name}}</span>
             <span>{{activityInfo.name}}</span>
             <span class="status" style="background: #999;">{{activityInfo.activityStatusTip}}</span>
             <span class="status" style="background: #999;">{{activityInfo.activityStatusTip}}</span>
-            <Button type="primary" size="large">进入点播</Button>
+            <Button type="primary" size="large" @click="gotoVideo">进入点播</Button>
           </div>
           </div>
           <div class="activity-brief-info center-row">
           <div class="activity-brief-info center-row">
             <div class="brief-info-left">
             <div class="brief-info-left">
@@ -97,7 +97,13 @@
 
 
     },
     },
     methods: {
     methods: {
-
+      gotoVideo() {
+        this.$router.push(
+          {
+            path:'commentVideo'
+          }
+        );
+      }
     },
     },
     mounted() {
     mounted() {
       let myChart = this.$echarts.init(document.getElementById('views'));
       let myChart = this.$echarts.init(document.getElementById('views'));

+ 138 - 63
TEAMModelOS.SmartClass/ClientApp/view/smart-class/LiveBroadcast.vue

@@ -6,7 +6,7 @@
           <Button type="primary">新媒体新技术</Button>
           <Button type="primary">新媒体新技术</Button>
           <Button type="success">创新实验室</Button>
           <Button type="success">创新实验室</Button>
         </div>
         </div>
-        <div class="condition-wrap-right">
+        <div class="condition-wrap-right" style="display:none;">
           <Select v-model="yearDefault" size="large" style="width:100px">
           <Select v-model="yearDefault" size="large" style="width:100px">
             <Option v-for="item in years" :value="item" :key="item">{{ item }}</Option>
             <Option v-for="item in years" :value="item" :key="item">{{ item }}</Option>
           </Select>
           </Select>
@@ -16,23 +16,31 @@
           <Button size="large">返回今天</Button>
           <Button size="large">返回今天</Button>
         </div>
         </div>
       </div>
       </div>
-      <full-calendar :config="config"
-                     :events="fcEvents"
-                     ref="calendar">
-      </full-calendar>
+
+
+      <Tooltip :content="eventContent" placement="right" transfer max-width="300px">
+        <full-calendar :config="config"
+                       :events="fcEvents"
+                       ref="calendar"
+                       @dayClick="getDay">
+        </full-calendar>
+      </Tooltip>
+      <br><br>
     </div>
     </div>
   </div>
   </div>
 </template>
 </template>
 <script>
 <script>
-  import FullCalendar  from 'vue-full-calendar'
-  //import 'fullcalendar/dist/fullcalendar.css'
+  import { FullCalendar }  from 'vue-full-calendar'
+  import 'fullcalendar/dist/fullcalendar.css'
   export default {
   export default {
     components: {
     components: {
       FullCalendar
       FullCalendar
     },
     },
     data() {
     data() {
+      const self = this;
       return {
       return {
-        yearDefault:'2019年',
+        eventContent: "",
+        yearDefault: '2019年',
         years: [
         years: [
           "2012年",
           "2012年",
           "2013年",
           "2013年",
@@ -62,36 +70,48 @@
           '11月',
           '11月',
           '12月',
           '12月',
         ],
         ],
-        fcEvents: [
-        ],
-       config: {
-        firstDay:'1',//以周日为每周的第一天
-        // weekends: true,//是否在日历中显示周末
-        locale: 'zh-cn',//语言
-        defaultView: 'month',//默认按月显示
-        height: 'auto',//高度
-        fixedWeekCount:false,//是否固定显示六周
-        // weekMode:"liquid",//周数不定,每周的高度可变,整个日历高度不变
-        allDaySlot:false,
-        // allDay:true,
-        header: {//表头信息
-          left: 'prev, next, today',
-          center: 'title',
-          right: 'hide, custom'
-        },
-      },
-        lessonList:[]
+        _this:null,
+        fcEvents: [],
+        config: {
+          firstDay: '7',//以周日为每周的第一天
+          // weekends: true,//是否在日历中显示周末
+          locale: 'zh-cn',//语言
+          defaultView: 'month',//默认按月显示
+          height: 'auto',//高度
+          fixedWeekCount: false,//是否固定显示六周
+          // weekMode:"liquid",//周数不定,每周的高度可变,整个日历高度不变
+          allDaySlot: false,
+          eventLimit: 1,
+          // allDay:true,
+          header: {//表头信息
+            left: 'prev, next, today',
+            center: 'title',
+            right: 'hide, custom'
+          },
+          dayClick: function getDay(day, jsEvent) {
+              console.log(day);
+              console.log(jsEvent);
+          },
+          eventClick:(day, jsEvent)=> {
+            this.$router.push( { path: 'lessonDetails' } );
+          },
+          eventMouseover: function (event, jsEvent, view) {
+            self.eventContent = event.title;
+          },
+         },
+        lessonList: []
       }
       }
     },
     },
+
     methods: {
     methods: {
-      getDay(day, jsEvent) {
-        console.log(day);
-        console.log(jsEvent);
-      }
+      getDay(event, jsEvent, view) {
+      },
     },
     },
     mounted() {
     mounted() {
+      this._this = this;
       this.lessonList = require("@/static/lessonList.json");
       this.lessonList = require("@/static/lessonList.json");
       for (let i = 0; i < this.lessonList.length; i++) {
       for (let i = 0; i < this.lessonList.length; i++) {
+      
         var sdate = new Date(this.lessonList[i].startTime.time);
         var sdate = new Date(this.lessonList[i].startTime.time);
         let sY = sdate.getFullYear() + '-';
         let sY = sdate.getFullYear() + '-';
         let sM = (sdate.getMonth() + 1 < 10 ? '0' + (sdate.getMonth() + 1) : sdate.getMonth() + 1) + '-';
         let sM = (sdate.getMonth() + 1 < 10 ? '0' + (sdate.getMonth() + 1) : sdate.getMonth() + 1) + '-';
@@ -100,38 +120,54 @@
         let eY = edate.getFullYear() + '-';
         let eY = edate.getFullYear() + '-';
         let eM = (edate.getMonth() + 1 < 10 ? '0' + (edate.getMonth() + 1) : edate.getMonth() + 1) + '-';
         let eM = (edate.getMonth() + 1 < 10 ? '0' + (edate.getMonth() + 1) : edate.getMonth() + 1) + '-';
         let eD = edate.getDate() + ' ';
         let eD = edate.getDate() + ' ';
-        this.fcEvents.push({
-          title:'名称:'+this.lessonList[i].viwActivityTypeTip,
-          start: sY + sM + sD,
-          end: eY + eM + eD
-        });
-        this.fcEvents.push({
-          title:'学校:'+this.lessonList[i].schoolName,
-          start: sY + sM + sD,
-          end: eY + eM + eD
-        });
-        this.fcEvents.push({
-          title:'主讲人:'+this.lessonList[i].employeeName,
-          start: sY + sM + sD,
-          end: eY + eM + eD
-        });
-        this.fcEvents.push({
-          title:'学科:'+this.lessonList[i].parentCategoryName,
-          start: sY + sM + sD,
-          end: eY + eM + eD
-        });
-        this.fcEvents.push({
-          title:'课题:'+this.lessonList[i].parentProjectName,
-          start: sY + sM + sD,
-          end: eY + eM + eD
-        });
-        this.fcEvents.push({
-          title:'时间:'+this.lessonList[i].timeRangeTipHHmm,
-          start: sY + sM + sD,
-          end: eY + eM + eD
-        });
+
+        let dateArr = this.fcEvents.map(item => item.start);
+
+        //如果已存在
+        if (dateArr.indexOf(sY + sM + sD) == -1) {
+          this.fcEvents.push({
+            title: '名称:' + this.lessonList[i].name
+              + ' \n 学校:' + this.lessonList[i].schoolName
+              + ' \n 主讲人:' + this.lessonList[i].employeeName
+              + ' \n 学科:' + this.lessonList[i].parentCategoryName
+              + ' \n 课题:' + this.lessonList[i].parentProjectName
+              + ' \n 时间:' + this.lessonList[i].timeRangeTipHHmm
+              + ' \n ',
+            start: sY + sM + sD,
+            end: eY + eM + eD
+          });
+        } else {
+          let index = dateArr.indexOf(sY + sM + sD);
+          let newEvent = {
+            title:  this.lessonList[i].name + ' \n\n 等多个活动',
+            start: sY + sM + sD,
+            end: eY + eM + eD,
+            renderHeader: (h, params) => {
+              return h('div', [
+                h('span', params.column.title),
+                h('Tooltip', {
+                  props: {
+                    content: '您希望展示的提示语',
+                    transfer: true,
+                    maxWidth: '220',
+                    theme: 'light'
+                  }
+                }, [
+                  h('Icon', {
+                    props: {
+                      type: 'md-help-circle',
+                      color: "#c8c8c8",
+                      size: "20"
+                    },
+                    class: {iconClass: true}
+                  })
+                ]),
+              ])
+            }
+          }
+          this.fcEvents.splice(index, 1,newEvent);
+        }
       }
       }
-      console.log(this.lessonList);
     }
     }
   }
   }
 </script>
 </script>
@@ -191,7 +227,46 @@
     /*.review-main /deep/ .full-calendar-body .dates .dates-events .events-week .events-day .event-box .more-link {
     /*.review-main /deep/ .full-calendar-body .dates .dates-events .events-week .events-day .event-box .more-link {
       display:none;
       display:none;
     }*/
     }*/
-
+    .review-main /deep/ .fc-event, .fc-event:hover {
+      color:black;
+    }
+    .review-main /deep/ .fc-day-grid-event .fc-time{
+      display:none;
+    }
+    .review-main /deep/ .fc-event, .fc-event-dot {
+      background:none;
+    }
+    .review-main /deep/ .fc-event {
+      border:none;
+    }
+    .review-main /deep/ .fc-content {
+      padding-left:5px;
+    }
+    .review-main /deep/ .fc-title {
+      width: 140px;
+      display: block;
+      overflow: hidden;
+      text-overflow: ellipsis;
+      white-space: nowrap;
+    }
+    .review-main /deep/ .fc-day-header {
+      background: -webkit-linear-gradient(#E1E7EC, #B9C6D1); /* Safari 5.1 - 6.0 */
+      background: -o-linear-gradient(#E1E7EC, #B9C6D1); /* Opera 11.1 - 12.0 */
+      background: -moz-linear-gradient(#E1E7EC, #B9C6D1); /* Firefox 3.6 - 15 */
+      background: linear-gradient(#E1E7EC, #B9C6D1); /* 标准的语法 */
+      height: 40px;
+      line-height: 40px;
+    }
+    .review-main /deep/ .fc-other-month {
+      background: linear-gradient( -45deg, #ecf0f4 25%, #ffffff 0, #ffffff 50%, #ecf0f4 0, #ecf0f4 75%, #ffffff 0 ); /* 标准的语法(必须放在最后) */
+      background-size: 20px 20px;
+    }
+    .review-main /deep/ .fc-left {
+      float:right;
+    }
+    .review-main /deep/ .fc-widget-content:hover {
+      /*background:#eee;*/
+    }
    .condition-wrap {
    .condition-wrap {
     display:flex;
     display:flex;
     flex-direction:row;
     flex-direction:row;

+ 4 - 2
TEAMModelOS.SmartClass/ClientApp/view/smart-class/LoginPage.vue

@@ -23,7 +23,7 @@
                 <Button @click="handleSubmit" type="primary" long>登录</Button>
                 <Button @click="handleSubmit" type="primary" long>登录</Button>
               </FormItem>
               </FormItem>
             </Form>
             </Form>
-            <p class="login-tip">输入任意用户名和密码即可</p>
+            <!--<p class="login-tip">输入任意用户名和密码即可</p>-->
           </div>
           </div>
         </Card>
         </Card>
       </div>
       </div>
@@ -56,7 +56,7 @@
     data() {
     data() {
       return {
       return {
         form: {
         form: {
-          userName: 'super_admin',
+          userName: '',
           password: ''
           password: ''
         }
         }
       }
       }
@@ -73,6 +73,8 @@
       handleSubmit() {
       handleSubmit() {
         this.$refs.loginForm.validate((valid) => {
         this.$refs.loginForm.validate((valid) => {
           if (valid) {
           if (valid) {
+            localStorage.setItem("userName", this.form.userName);
+            localStorage.setItem("isLogin", 1);
             if (this.password == 'habook') {
             if (this.password == 'habook') {
               this.$router.push({ path: '/main' });
               this.$router.push({ path: '/main' });
             } else {
             } else {

+ 2 - 5
TEAMModelOS.SmartClass/ClientApp/view/smart-class/MainPage.vue

@@ -22,9 +22,6 @@
       }
       }
     },
     },
     methods: {
     methods: {
-
-
-
     },
     },
     mounted() {
     mounted() {
     }
     }
@@ -40,11 +37,11 @@
     position: relative;
     position: relative;
     width: 100%;
     width: 100%;
     min-width: 1200px;
     min-width: 1200px;
-    min-height: 768px;
+    min-height: 100%;
     display: flex;
     display: flex;
     flex-direction: column;
     flex-direction: column;
     align-items: center;
     align-items: center;
-    background: rgb(248,248,248);
+    background: rgb(241,242,243);
   }
   }
 
 
   .content {
   .content {

+ 1 - 1
TEAMModelOS.SmartClass/ClientApp/view/smart-class/ReviewActivity.vue

@@ -56,7 +56,7 @@
       },
       },
 
 
       goDetails() {
       goDetails() {
-        this.$router.push('/activityDetails')
+        this.$router.push('activityDetails')
       }
       }
 
 
 
 

+ 2 - 1
TEAMModelOS.SmartClass/ClientApp/view/smart-class/Video.vue

@@ -131,7 +131,8 @@
     }
     }
   }
   }
 </script>
 </script>
-<style>
+<style scoped>
+
   .video-page {
   .video-page {
     width: 1200px;
     width: 1200px;
     margin: 100px auto;
     margin: 100px auto;

+ 105 - 0
TEAMModelOS.SmartClass/ClientApp/view/smart-class/calendar.vue

@@ -0,0 +1,105 @@
+<template>
+  <div class="hello">
+    <el-date-picker size='small' v-model="selectDate" type="month"
+      placeholder="选择月" value-format="yyyy-MM">
+    </el-date-picker>
+    <el-button size='small' @click='changeDate'>确定</el-button>
+    <full-calendar  
+      :config="config" 
+      :events="events"
+      ref="calendar" 
+      @event-selected='eventClick' 
+      @day-click="dayClick">
+    </full-calendar> 
+    <add-schedule v-if="isAdd" :isAdd='isAdd' :editItem='editItem' @add='addItem' @close='isAdd = false'></add-schedule>
+  </div>
+</template>
+<script>
+import { FullCalendar } from 'vue-full-calendar'
+import 'fullcalendar/dist/fullcalendar.css'
+import addSchedule from '@/components/calendar/add.vue'
+
+export default {
+   data () {
+    return {
+      isAdd:false,
+      selectDate:'',//日期选择器选中的月份
+      config: {
+        firstDay:'0',//以周日为每周的第一天
+        // weekends: true,//是否在日历中显示周末
+        locale: 'zh-cn',//语言
+        defaultView: 'month',//默认按月显示
+        height: 'auto',//高度
+        fixedWeekCount:false,//是否固定显示六周
+        // weekMode:"liquid",//周数不定,每周的高度可变,整个日历高度不变
+        allDaySlot:false,
+        // allDay:true,
+        header: {//表头信息
+          left: 'prev, next, today',
+          center: 'title',
+          right: 'hide, custom'
+        },
+      },
+      events: [{
+        id:1,
+        title:'出差',
+        start:'2019-04-03',
+        end:'2019-04-05'
+      }, {
+        id:2,
+        title:'春游',
+        start:'2019-04-12',
+      }],
+      newItem:{},
+      editItem:{}
+    }
+  },
+  components : { FullCalendar, addSchedule },
+  methods:{
+    changeDate(){
+      // this.$refs.calendar.fireMethod('gotoDate', this.selectDate)
+      this.$refs.calendar.fireMethod('prev');
+    },
+    eventClick(event){ //events的点击事件
+      this.editItem = event
+      this.isAdd = true
+    },
+    dayClick(date, jsEvent, view){ //日期的点击事件
+      this.editItem = {}
+      this.isAdd = true
+    },
+    addItem(detail){
+      this.newItem = JSON.parse(detail)
+      if(this.editItem.id){//如果是编辑,就删掉该条
+        this.events.forEach( (el,ind)=>{
+          if(el.id == this.editItem.id){
+            this.events.splice(ind,1)
+          }
+        })
+      }
+      this.events.push({
+        id : this.editItem.id?this.editItem.id:this.setUuid(),
+        title : this.newItem.title,
+        start : this.newItem.period[0],
+        end : this.newItem.period[1],
+      })
+    },
+    setUuid(){
+        var s = [];
+        var hexDigits = "0123456789abcdef";
+        for(var i = 0; i < 36; i++){ s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1); }
+        s[14] = "4";  
+        s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1); 
+        s[8] = s[13] = s[18] = s[23];
+        var uuid = s.join("");
+        return uuid;
+    },
+   
+  },
+}
+</script>
+
+<!-- Add "scoped" attribute to limit CSS to this component only -->
+<style scoped>
+
+</style>

+ 4 - 4
TEAMModelOS.SmartClass/ClientApp/view/smart-class/index.vue

@@ -100,19 +100,19 @@
     },
     },
     methods: {
     methods: {
       handleNoticeClick() {
       handleNoticeClick() {
-        this.$router.push('/noticeDetails');
+        this.$router.push('noticeDetails');
         this.$eventBus.$emit("activeIndex", 1);
         this.$eventBus.$emit("activeIndex", 1);
       },
       },
       handleActivityClick() {
       handleActivityClick() {
-        this.$router.push('/activityDetails');
+        this.$router.push('activityDetails');
         this.$eventBus.$emit("activeIndex", 2);
         this.$eventBus.$emit("activeIndex", 2);
       },
       },
       goNotice() {
       goNotice() {
-        this.$router.push('/notice');
+        this.$router.push('notice');
         this.$eventBus.$emit("activeIndex", 1);
         this.$eventBus.$emit("activeIndex", 1);
       },
       },
       goActivity() {
       goActivity() {
-        this.$router.push('/reviewActivity');
+        this.$router.push('reviewActivity');
         this.$eventBus.$emit("activeIndex", 2);
         this.$eventBus.$emit("activeIndex", 2);
       }
       }
 
 

+ 5 - 5
TEAMModelOS.SmartClass/ClientApp/view/smart-class/notice.vue

@@ -19,7 +19,7 @@
     <div class="right-box center-col">
     <div class="right-box center-col">
       <p class="title">{{typeName}}</p>
       <p class="title">{{typeName}}</p>
       <Table :columns="newColumns" :data="noticeList" @on-row-click="rowClick" no-data-text="暂无数据"></Table>
       <Table :columns="newColumns" :data="noticeList" @on-row-click="rowClick" no-data-text="暂无数据"></Table>
-      <Page :total="50" show-elevator show-total />
+      <Page :total="noticeList.length" show-elevator show-total />
     </div>
     </div>
   </div>
   </div>
 
 
@@ -44,12 +44,12 @@
             key: 'startTime'
             key: 'startTime'
           }
           }
         ],
         ],
-        noticeList: []
+        noticeList: noticeList.list
       }
       }
     },
     },
 
 
     created() {
     created() {
-      this.getList(1);
+      this.getList(0);
     },
     },
     methods: {
     methods: {
       getList(type) {
       getList(type) {
@@ -57,7 +57,7 @@
         var newArray = list.filter(function(item){
         var newArray = list.filter(function(item){
             return item.noticeTypeId == type;
             return item.noticeTypeId == type;
         });
         });
-        this.noticeList = newArray;
+        this.noticeList = type==0 ? list : newArray;
       },
       },
 
 
       handleMenuClick(index,typeId,name) {
       handleMenuClick(index,typeId,name) {
@@ -68,7 +68,7 @@
 
 
       rowClick(data) {
       rowClick(data) {
         this.$router.push({
         this.$router.push({
-          path:'/noticeDetails',
+          path:'noticeDetails',
           query:{
           query:{
             id:data.id
             id:data.id
           }
           }

+ 1 - 1
TEAMModelOS.SmartClass/Views/Shared/_Layout.cshtml

@@ -5,7 +5,7 @@
     <meta charset="utf-8" />
     <meta charset="utf-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
     <title>@ViewData["Title"]智慧课堂管理平台</title>
     <title>@ViewData["Title"]智慧课堂管理平台</title>
-    <link rel="stylesheet" href="~/dist/style.css" asp-append-version="true" />
+    @*<link rel="stylesheet" href="~/dist/style.css" asp-append-version="true" />*@
     <link rel="icon" type="image/x-icon" class="js-site-favicon" href="https://account.habookaclass.biz/dist/6854ccd21afb6b1f994e1556c2360dd8.ico">
     <link rel="icon" type="image/x-icon" class="js-site-favicon" href="https://account.habookaclass.biz/dist/6854ccd21afb6b1f994e1556c2360dd8.ico">
     @*<link rel="stylesheet" href="~/dist/vendor.css" asp-append-version="true" />
     @*<link rel="stylesheet" href="~/dist/vendor.css" asp-append-version="true" />
         <environment names="Staging,Production">
         <environment names="Staging,Production">

+ 35 - 6
TEAMModelOS.SmartClass/package.json

@@ -26,18 +26,17 @@
     "jwt-decode": "^2.2.0",
     "jwt-decode": "^2.2.0",
     "less": "^3.9.0",
     "less": "^3.9.0",
     "vue": "^2.6.9",
     "vue": "^2.6.9",
+    "vue-calendar-component": "^2.7.4",
     "vue-full-calendar": "^2.7.0",
     "vue-full-calendar": "^2.7.0",
     "vue-fullcalendar": "^1.0.9",
     "vue-fullcalendar": "^1.0.9",
     "vue-infinite-loading": "^2.4.3",
     "vue-infinite-loading": "^2.4.3",
-    "vue-loader": "^15.7.0",
     "vue-router": "^3.0.2",
     "vue-router": "^3.0.2",
     "vue-scroll": "^2.1.9",
     "vue-scroll": "^2.1.9",
-    "vue-server-renderer": "^2.6.9",
-    "vue-template-compiler": "^2.6.9",
-    "vue-template-loader": "^1.0.0",
     "vue-video-player": "^5.0.2",
     "vue-video-player": "^5.0.2",
     "vuex": "^3.1.0",
     "vuex": "^3.1.0",
-    "vuex-router-sync": "^5.0.0"
+    "vuex-router-sync": "^5.0.0",
+    "vue-jlunar-datepicker": "^2.3.0",
+    "vue-lunar-full-calendar": "^1.2.2"
   },
   },
   "devDependencies": {
   "devDependencies": {
     "@babel/core": "^7.2.2",
     "@babel/core": "^7.2.2",
@@ -60,9 +59,19 @@
     "@fortawesome/free-solid-svg-icons": "^5.7.0",
     "@fortawesome/free-solid-svg-icons": "^5.7.0",
     "@fortawesome/vue-fontawesome": "^0.1.5",
     "@fortawesome/vue-fontawesome": "^0.1.5",
     "aspnet-webpack": "^3.0.0",
     "aspnet-webpack": "^3.0.0",
+    "autoprefixer": "^7.1.2",
+    "babel-core": "^6.22.1",
     "babel-eslint": "^10.0.1",
     "babel-eslint": "^10.0.1",
+    "babel-helper-vue-jsx-merge-props": "^2.0.3",
     "babel-loader": "^8.0.5",
     "babel-loader": "^8.0.5",
     "babel-plugin-import": "^1.11.0",
     "babel-plugin-import": "^1.11.0",
+    "babel-plugin-syntax-jsx": "^6.18.0",
+    "babel-plugin-transform-runtime": "^6.22.0",
+    "babel-plugin-transform-vue-jsx": "^3.5.0",
+    "babel-preset-env": "^1.3.2",
+    "babel-preset-stage-2": "^6.22.0",
+    "chalk": "^2.0.1",
+    "copy-webpack-plugin": "^4.0.1",
     "cross-env": "^5.2.0",
     "cross-env": "^5.2.0",
     "css-loader": "^2.1.1",
     "css-loader": "^2.1.1",
     "eslint": "^5.15.2",
     "eslint": "^5.15.2",
@@ -73,19 +82,39 @@
     "eslint-plugin-promise": "^4.0.1",
     "eslint-plugin-promise": "^4.0.1",
     "eslint-plugin-standard": "^4.0.0",
     "eslint-plugin-standard": "^4.0.0",
     "event-source-polyfill": "^1.0.5",
     "event-source-polyfill": "^1.0.5",
+    "extract-text-webpack-plugin": "^3.0.0",
     "file-loader": "^3.0.1",
     "file-loader": "^3.0.1",
     "font-awesome": "^4.7.0",
     "font-awesome": "^4.7.0",
+    "friendly-errors-webpack-plugin": "^1.6.1",
+    "html-webpack-plugin": "^2.30.1",
     "less-loader": "^4.1.0",
     "less-loader": "^4.1.0",
     "mini-css-extract-plugin": "^0.5.0",
     "mini-css-extract-plugin": "^0.5.0",
+    "node-notifier": "^5.1.2",
     "node-sass": "^4.12.0",
     "node-sass": "^4.12.0",
     "optimize-css-assets-webpack-plugin": "^5.0.1",
     "optimize-css-assets-webpack-plugin": "^5.0.1",
+    "ora": "^1.2.0",
+    "portfinder": "^1.0.13",
+    "postcss-import": "^11.0.0",
+    "postcss-loader": "^2.0.8",
+    "postcss-url": "^7.2.1",
+    "rimraf": "^2.6.0",
     "sass-loader": "^7.1.0",
     "sass-loader": "^7.1.0",
+    "semver": "^5.3.0",
+    "shelljs": "^0.7.6",
     "style-loader": "^0.23.1",
     "style-loader": "^0.23.1",
+    "uglifyjs-webpack-plugin": "^1.1.1",
     "url-loader": "^1.1.2",
     "url-loader": "^1.1.2",
     "vue-i18n": "^8.9.0",
     "vue-i18n": "^8.9.0",
+    "vue-loader": "^15.7.0",
+    "vue-server-renderer": "^2.6.9",
+    "vue-style-loader": "^3.1.2",
+    "vue-template-compiler": "^2.6.9",
+    "vue-template-loader": "^1.0.0",
     "webpack": "^4.29.0",
     "webpack": "^4.29.0",
+    "webpack-bundle-analyzer": "^2.9.0",
     "webpack-cli": "^3.3.0",
     "webpack-cli": "^3.3.0",
     "webpack-dev-server": "^3.1.14",
     "webpack-dev-server": "^3.1.14",
-    "webpack-hot-middleware": "^2.21.2"
+    "webpack-hot-middleware": "^2.21.2",
+    "webpack-merge": "^4.1.0"
   }
   }
 }
 }

+ 14 - 2
TEAMModelOS.SmartClass/webpack.config.js

@@ -41,8 +41,20 @@ module.exports = () => {
     },
     },
     module: {
     module: {
       rules: [
       rules: [
-        { test: /\.vue$/, include: /ClientApp/, use: 'vue-loader' },
-        { test: /\.js$/, include: /ClientApp/, use: 'babel-loader' },
+        {
+          test: /\.vue$/, use: 'vue-loader', include: [
+            //path.resolve(__dirname, '/ClientApp/'),
+            //path.resolve(__dirname, '/node_modules/'),
+            path.resolve(__dirname, '/')
+          ]
+        },
+        {
+          test: /\.js$/, use: 'babel-loader', include: [
+            //path.resolve(__dirname, '/ClientApp/'),
+            //path.resolve(__dirname, '/node_modules/'),
+            path.resolve(__dirname, '/')
+          ]
+        },
         { test: /\.css$/, use: isDevBuild ? ['style-loader', 'css-loader'] : [MiniCssExtractPlugin.loader, 'css-loader'] },
         { test: /\.css$/, use: isDevBuild ? ['style-loader', 'css-loader'] : [MiniCssExtractPlugin.loader, 'css-loader'] },
         { test: /\.(png|jpg|jpeg|gif|svg)$/, use: 'url-loader?limit=25000' },
         { test: /\.(png|jpg|jpeg|gif|svg)$/, use: 'url-loader?limit=25000' },
         { test: /\.(eot|ttf|woff|woff2)$/, loader: 'file-loader' },
         { test: /\.(eot|ttf|woff|woff2)$/, loader: 'file-loader' },

+ 16 - 3
TEAMModelOS.SmartClass/webpack.config.vendor.js

@@ -2,7 +2,7 @@ const path = require('path')
 const webpack = require('webpack')
 const webpack = require('webpack')
 const MiniCssExtractPlugin = require('mini-css-extract-plugin')
 const MiniCssExtractPlugin = require('mini-css-extract-plugin')
 const OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin')
 const OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin')
-
+const VueLoaderPlugin = require('vue-loader/lib/plugin')
 module.exports = () => {
 module.exports = () => {
   // console.log('Building vendor files for \x1b[33m%s\x1b[0m', process.env.NODE_ENV)
   // console.log('Building vendor files for \x1b[33m%s\x1b[0m', process.env.NODE_ENV)
 
 
@@ -20,8 +20,20 @@ module.exports = () => {
     },
     },
     module: {
     module: {
       rules: [
       rules: [
-        { test: /\.vue$/, include: /ClientApp/, use: 'vue-loader' },
-        { test: /\.js$/, include: /ClientApp/, use: 'babel-loader' },
+        {
+          test: /\.vue$/, use: 'vue-loader', include: [
+            //path.resolve(__dirname, '/ClientApp/'),
+            //path.resolve(__dirname, '/node_modules/'),
+            path.resolve(__dirname, '/')
+          ]
+        },
+        {
+          test: /\.js$/, use: 'babel-loader', include: [
+            //path.resolve(__dirname, '/ClientApp/'),
+            //path.resolve(__dirname, '/node_modules/'),
+            path.resolve(__dirname, '/')
+          ]
+        },
         { test: /\.css$/, use: isDevBuild ? ['style-loader', 'css-loader'] : [MiniCssExtractPlugin.loader, 'css-loader'] },
         { test: /\.css$/, use: isDevBuild ? ['style-loader', 'css-loader'] : [MiniCssExtractPlugin.loader, 'css-loader'] },
         { test: /\.(png|jpg|jpeg|gif|svg)$/, use: 'url-loader?limit=25000' },
         { test: /\.(png|jpg|jpeg|gif|svg)$/, use: 'url-loader?limit=25000' },
         { test: /\.(eot|ttf|woff|woff2)$/, loader: 'file-loader' },
         { test: /\.(eot|ttf|woff|woff2)$/, loader: 'file-loader' },
@@ -38,6 +50,7 @@ module.exports = () => {
       library: '[name]_[hash]'
       library: '[name]_[hash]'
     },
     },
     plugins: [
     plugins: [
+      new VueLoaderPlugin(),
       extractCSS,
       extractCSS,
       new OptimizeCSSPlugin({
       new OptimizeCSSPlugin({
         cssProcessorOptions: {
         cssProcessorOptions: {

BIN=BIN
TEAMModelOS.SmartTeach/ClientApp/assets/image/resource/login_bg.jpg


BIN=BIN
TEAMModelOS.SmartTeach/ClientApp/assets/image/resource/login_pwd.png


BIN=BIN
TEAMModelOS.SmartTeach/ClientApp/assets/image/resource/login_switchover.gif


BIN=BIN
TEAMModelOS.SmartTeach/ClientApp/assets/image/resource/login_user.png


+ 4 - 3
TEAMModelOS.SmartTeach/ClientApp/common/headers.vue

@@ -10,7 +10,6 @@
         </div>
         </div>
       </div>
       </div>
       <div class="header_right">
       <div class="header_right">
-        <div class="login_btn"><button>登录</button></div>
         <div class="helper"><button>教学助手</button></div>
         <div class="helper"><button>教学助手</button></div>
       </div>
       </div>
     </div>
     </div>
@@ -44,9 +43,11 @@
     height: 75px;
     height: 75px;
   }
   }
   .header_right {
   .header_right {
-    width: 400px;;
+    width: 200px;
     float: left;
     float: left;
     height: 75px;
     height: 75px;
+    padding-left:7%;
+    padding-top:5px;
   }
   }
   .logo_img {
   .logo_img {
     float: left;
     float: left;
@@ -89,7 +90,7 @@
       font-size:18px;
       font-size:18px;
     }
     }
   .helper {
   .helper {
-    width: 30%;
+    width: 100%;
     display: block;
     display: block;
     float: left;
     float: left;
     padding-top:22px;
     padding-top:22px;

+ 4 - 2
TEAMModelOS.SmartTeach/ClientApp/router/routes.js

@@ -8,10 +8,11 @@ import Details from '@/view/resource/resourceindex/details.vue'
 import Videodetails from '@/view/resource/resourceindex/videodetails.vue'
 import Videodetails from '@/view/resource/resourceindex/videodetails.vue'
 import Activity from '@/view/resource/activity'
 import Activity from '@/view/resource/activity'
 import ActivityGuide from '@/view/resource/activity_guide.vue'
 import ActivityGuide from '@/view/resource/activity_guide.vue'
-import ActivityShow from '@/view/resource/activity_show.vue'   
+import ActivityShow from '@/view/resource/activity_show.vue'
 import ActivityRank from '@/view/resource/activity_rank.vue'
 import ActivityRank from '@/view/resource/activity_rank.vue'
 import ActivityCertificate from '@/view/resource/activity_certificate.vue'
 import ActivityCertificate from '@/view/resource/activity_certificate.vue'
 import ActivityDetails from '@/view/resource/activity_details.vue'
 import ActivityDetails from '@/view/resource/activity_details.vue'
+import Login from '@/view/resource/login.vue'
 import HomePage from '@/view/resource/HomePage'
 import HomePage from '@/view/resource/HomePage'
 import Teacher from '@/view/resource/Teacher'
 import Teacher from '@/view/resource/Teacher'
 import TeacherZone from '@/view/resource/TeacherZone'
 import TeacherZone from '@/view/resource/TeacherZone'
@@ -37,7 +38,8 @@ export const routes = [
   { name: 'ActivityRank', path: '/activityrank', component: ActivityRank },
   { name: 'ActivityRank', path: '/activityrank', component: ActivityRank },
   { name: 'ActivityCertificate', path: '/activitycertificate', component: ActivityCertificate },
   { name: 'ActivityCertificate', path: '/activitycertificate', component: ActivityCertificate },
   { name: 'ActivityDetails', path: '/activitydetails', component: ActivityDetails },
   { name: 'ActivityDetails', path: '/activitydetails', component: ActivityDetails },
-  { name: 'HomePage', path: '', component: HomePage },
+  { name: 'Login', path: '/login', component: Login },
+  { name: 'HomePage', path: '/HomePage', component: HomePage },
   { name: 'Teacher', path: '/Teacher', component: Teacher },
   { name: 'Teacher', path: '/Teacher', component: Teacher },
   {
   {
     name: 'TeacherZone', path: '/TeacherZone', component: TeacherZone, redirect: "/TeacherZone/ZonesHome",
     name: 'TeacherZone', path: '/TeacherZone', component: TeacherZone, redirect: "/TeacherZone/ZonesHome",

+ 261 - 0
TEAMModelOS.SmartTeach/ClientApp/view/resource/login.vue

@@ -0,0 +1,261 @@
+<template>
+  <div class="activity_container">
+    <Header></Header>
+    <Activitycommon></Activitycommon>
+    <div class="login">
+      <div class="login_box">
+        <div class="py_m_login" id="m_login">
+          <form id="artLogin" method="post" message_id="_user_login_tips" autocomplete="off">
+            <div class="item-newLogo-rect">
+              <a href="###" class="logoCaseTab" id="logoCaseTab"></a>
+              <div class="passWord-case dis_none" name="LoginRect" style="display: block;">
+                <h4>空间登录</h4>
+                <div id="_user_login_tips" class="err-tips" style="display: none;"><em class="close fr"></em><i class="ico"></i><k></k></div>
+                <ul class="inputlist clearfix">
+                  <li class="u_inputtext">
+                    <input type="text" id="info_username-1" name="account" tabindex="1" placeholder="用户名/邮箱/手机号">
+                  </li>
+                  <li class="u_inputpassword">
+                    <input type="password" id="info_password-1" name="pwd" tabindex="2" placeholder="请输入您的密码">
+                  </li>
+                </ul>
+                <div class="login_other_rect clearfix">
+                  <div class="rememberMe fl">
+                    <p class="fl"><span style="margin-right: 17px;"></span></p>自动登录
+                  </div>
+                  <input type="hidden" id="remember" name="remember" value="0">
+                  <p class="fr">
+                    <a href="" target="_top" style="color:#3c637c;">忘记密码?</a>
+                    <a href="" target="_top" style="color:#3c637c;">立即注册!</a>
+                  </p>
+                </div>
+                <input id="User_portal_login" type="button" value="立即登录" class="m_btn">
+              </div>
+              <!--扫码部分 start-->
+              <!--扫码部分 end-->
+            </div>
+          </form>
+        </div>
+      </div>
+    </div>
+    <Footer></Footer>
+  </div>
+</template>
+<script>
+import Header from '@/common/headers.vue'
+  import Footer from '@/common/footer.vue'
+  export default {
+    components: {
+      Header,
+      Footer,
+    },
+    data() {
+      return {
+
+      }
+    }
+  }
+</script>   
+<style scoped>
+  .login {
+    width:100%;
+    height:700px;
+    background:url(../../assets/image/resource/login_bg.jpg) no-repeat;
+    background-size:cover;
+  }
+  .login_box {
+    width:1200px;
+    height:700px;
+    margin:0 auto;
+    position:relative;
+  }
+  .py_m_login {
+    width: 412px;
+    height: 376px;
+    overflow: hidden;
+    zoom: 1;
+    background: rgba(230,245,255,.8);
+  }
+  .py_m_login .item-newLogo-rect {
+    position: relative;
+    top: 0px;
+    right: 0px;
+    padding: 30px 38px 30px 40px;
+  }
+   .py_m_login {
+    display: block;
+    position: absolute;
+    right: 0;
+    top: 50%;
+    -moz-transform: translateY(-50%);
+    -webkit-transform: translateY(-50%);
+    -ms-transform: translateY(-50%);
+    -o-transform: translateY(-50%);
+    transform: translateY(-50%);
+  }
+    .py_m_login .item-newLogo-rect {
+      position: relative;
+      top: 0px;
+      right: 0px;
+      padding: 30px 38px 30px 40px;
+    }
+    .py_m_login .logoCaseTab {
+      position: absolute;
+      top: 10px;
+      right: 10px;
+      display: block;
+      width: 52px;
+      height: 52px;
+      /*background: url(../../assets/image/resource/login_switchover.gif) no-repeat 0px 0px;*/
+      -webkit-transition: all .5s;
+      -moz-transition: all .5s;
+      transition: all .5s;
+    }
+    .py_m_login .logoTips {
+      background: #ddf3ff;
+      line-height: 27px;
+      border: #34b5f8 solid 1px;
+      color: #34b5f8;
+      padding: 0px 6px 0px 9px;
+      position: absolute;
+      top: 10px;
+      right: 67px;
+    }
+      .py_m_login .logoTips .ico1 {
+        width: 14px;
+        height: 18px;
+        vertical-align: middle;
+        margin-right: 7px;
+        display: inline-block;
+        margin-top: -2px;
+      }
+      .py_m_login .logoTips .ico2 {
+        width: 6px;
+        height: 12px;
+        position: absolute;
+        top: 9px;
+        right: -6px;
+      }
+    .py_m_login .logoTips {
+      background: #ddf3ff;
+      line-height: 27px;
+      border: #34b5f8 solid 1px;
+      color: #34b5f8;
+      padding: 0px 6px 0px 9px;
+      position: absolute;
+      top: 10px;
+      right: 67px;
+    }
+    .py_m_login h4 {
+      font-size: 25px;
+      line-height: 25px;
+      padding-bottom: 8px;
+      font-weight: normal;
+      color: #4997c8;
+    }
+     .err-tips {
+      position: absolute;
+      top: 30px;
+      left: 38px;
+      height: 30px;
+      border: #ffc3b9 solid 1px;
+      line-height: 30px;
+      color: #555;
+      background: #fef2f2;
+      width: 332px;
+    }
+  ol, ul, li {
+    list-style: none;
+  }
+  .py_m_login .passWord-case .inputlist li.u_inputtext {
+    background: url(../../assets/image/resource/login_user.png) no-repeat left top #fff;
+  }
+  .py_m_login .passWord-case .inputlist li {
+    width: 332px;
+    height: 44px;
+    border-radius: 5px;
+    border: #b4d1ec solid 1px;
+    background: #fff;
+    margin-top: 20px;
+  }
+    .py_m_login .passWord-case .inputlist li input {
+      float: left;
+      width: 250px;
+      line-height: 42px;
+      height: 42px;
+      margin: 0 0px 0px 68px;
+      border: 0px;
+      font-size: 14px;
+      background: none;
+    }
+    .py_m_login .passWord-case .inputlist li.u_inputpassword {
+      background: url(../../assets/image/resource/login_pwd.png) no-repeat left top #fff;
+    }
+  .py_m_login .passWord-case .login_other_rect {
+    height: 24px;
+    line-height: 24px;
+    margin-top: 15px;
+  }
+  .py_m_login .passWord-case .rememberMe {
+    color: #3c637c;
+    cursor: pointer;
+    float: left;
+  }
+    .py_m_login .passWord-case .rememberMe p {
+      width: 40px;
+      height: 24px;
+      border-radius: 12px;
+      margin-right: 7px;
+      cursor: pointer;
+      background: #b2d1df;
+      float: left;
+    }
+    .py_m_login .passWord-case .rememberMe span {
+      float: right;
+      width: 20px;
+      height: 20px;
+      border-radius: 11px;
+      background: #fff;
+      margin: 2px 17px 0px 0px;
+      margin-right: 17px;
+    }
+  input, select, textarea {
+    color: #222;
+    font-size: 12px;
+    line-height: 140%;
+    resize: none;
+    outline: none;
+    font-family: "microsoft yahei";
+  }
+  .fr {
+    float: right;
+  }
+  a, a:visited {
+    text-decoration: none;
+  }
+  .py_m_login .passWord-case .m_btn {
+    display: block;
+    width: 100%;
+    height: 50px;
+    text-align: center;
+    line-height: 50px;
+    background: #15ae4d;
+    font-size: 22px;
+    color: #fff;
+    border-radius: 5px;
+    border: 0px;
+    cursor: pointer;
+    margin-top: 15px;
+  }
+  .py_m_login .passWord-case .no_account {
+    padding-top: 26px;
+    text-align: center;
+    color: #3c637c;
+  }
+    .py_m_login .passWord-case .no_account a.a1 {
+      margin: 0 24px 0 5px;
+    }
+    .py_m_login .passWord-case .no_account a {
+      color: #ff8400;
+    }
+</style>

+ 0 - 34
TEAMModelOS.SmartTeach/ClientApp/view/zone/index.vue

@@ -1,34 +0,0 @@
-<style>
-</style>
-<template>
-  <div id="app">
-    <div class="header">
-555
-    </div>
-    <div class="left">
-
-    </div>
-    <div class="main">
-
-    </div>
-    <div class="footer">
-
-    </div>
-
-  </div>
-</template>
-<script>
-
-  export default {
-
-    data() {
-      return {
-
-      }
-    },
-      mounted() {
-
-      }
-    }
-</script>
-

BIN=BIN
TEAMModelOS.TeachZone/ClientApp/assets/image/refresh_hover.png