lsc 2 年 前
コミット
4158535c93
47 ファイル変更6097 行追加9 行削除
  1. 49 0
      dist/www/CocoRoboDesktop/drawingboard-master/README.md
  2. 215 0
      dist/www/CocoRoboDesktop/drawingboard-master/drawingboard/check-bak.html
  3. 487 0
      dist/www/CocoRoboDesktop/drawingboard-master/drawingboard/check.html
  4. 48 0
      dist/www/CocoRoboDesktop/drawingboard-master/drawingboard/demo/loadimg.html
  5. 121 0
      dist/www/CocoRoboDesktop/drawingboard-master/drawingboard/demo/writingpad.html
  6. BIN
      dist/www/CocoRoboDesktop/drawingboard-master/drawingboard/image/check/all-true.png
  7. BIN
      dist/www/CocoRoboDesktop/drawingboard-master/drawingboard/image/check/change-icon.png
  8. BIN
      dist/www/CocoRoboDesktop/drawingboard-master/drawingboard/image/check/confirm-icon.png
  9. BIN
      dist/www/CocoRoboDesktop/drawingboard-master/drawingboard/image/check/default-head-blue.png
  10. BIN
      dist/www/CocoRoboDesktop/drawingboard-master/drawingboard/image/check/error-tag.png
  11. BIN
      dist/www/CocoRoboDesktop/drawingboard-master/drawingboard/image/check/help-icon.png
  12. BIN
      dist/www/CocoRoboDesktop/drawingboard-master/drawingboard/image/check/homework-answer-icon.png
  13. BIN
      dist/www/CocoRoboDesktop/drawingboard-master/drawingboard/image/check/homework-entry-icon.png
  14. BIN
      dist/www/CocoRoboDesktop/drawingboard-master/drawingboard/image/check/logo.png
  15. BIN
      dist/www/CocoRoboDesktop/drawingboard-master/drawingboard/image/check/pwd0.png
  16. BIN
      dist/www/CocoRoboDesktop/drawingboard-master/drawingboard/image/check/right-tag.png
  17. BIN
      dist/www/CocoRoboDesktop/drawingboard-master/drawingboard/image/check/sign-out-icon.png
  18. BIN
      dist/www/CocoRoboDesktop/drawingboard-master/drawingboard/image/check/true-icon.png
  19. BIN
      dist/www/CocoRoboDesktop/drawingboard-master/drawingboard/image/check/work-original.jpg.filepart
  20. BIN
      dist/www/CocoRoboDesktop/drawingboard-master/drawingboard/image/check/work-total-icon.png
  21. BIN
      dist/www/CocoRoboDesktop/drawingboard-master/drawingboard/image/wrong-small-sel.png
  22. 68 0
      dist/www/CocoRoboDesktop/drawingboard-master/drawingboard/index.html
  23. 47 0
      dist/www/CocoRoboDesktop/drawingboard-master/drawingboard/js/canvasZoom.js
  24. 305 0
      dist/www/CocoRoboDesktop/drawingboard-master/drawingboard/js/check-bak.js
  25. 269 0
      dist/www/CocoRoboDesktop/drawingboard-master/drawingboard/js/check/canvas.js
  26. 9 0
      dist/www/CocoRoboDesktop/drawingboard-master/drawingboard/js/check/config.js
  27. 17 0
      dist/www/CocoRoboDesktop/drawingboard-master/drawingboard/js/check/fontsize.js
  28. 0 0
      dist/www/CocoRoboDesktop/drawingboard-master/drawingboard/js/check/qiniu.min.js
  29. 287 0
      dist/www/CocoRoboDesktop/drawingboard-master/drawingboard/js/demo.js
  30. 0 0
      dist/www/CocoRoboDesktop/drawingboard-master/drawingboard/js/fabric.min.js
  31. 1 0
      dist/www/CocoRoboDesktop/drawingboard-master/drawingboard/js/jquery.min.js
  32. 0 0
      dist/www/CocoRoboDesktop/drawingboard-master/drawingboard/js/tools/md5.min.js
  33. 109 0
      dist/www/CocoRoboDesktop/drawingboard-master/drawingboard/js/tools/upload.js
  34. 5 0
      dist/www/CocoRoboDesktop/drawingboard-master/drawingboard/js/tools/uuid.js
  35. 29 0
      dist/www/CocoRoboDesktop/drawingboard-master/drawingboard/test.html
  36. 305 0
      dist/www/CocoRoboDesktop/index.html
  37. 104 0
      dist/www/CocoRoboDesktop/jsMemo/index.html
  38. 281 0
      dist/www/CocoRoboDesktop/jsMemo/js/app.js
  39. 14 5
      src/App.vue
  40. BIN
      src/assets/case.png
  41. 682 0
      src/components/pages/CaseDesignGM.vue
  42. 374 0
      src/components/pages/classGM.vue
  43. 529 0
      src/components/pages/dataGM.vue
  44. 5 3
      src/components/pages/library.vue
  45. 528 0
      src/components/pages/libraryGM.vue
  46. 1165 0
      src/components/pages/studentGM.vue
  47. 44 1
      src/router/index.js

+ 49 - 0
dist/www/CocoRoboDesktop/drawingboard-master/README.md

@@ -0,0 +1,49 @@
+## 简介 ##
+基于canvas的高级画板程序.
+
+## 在线演示 ##
+
+高级画板:https://vipstone.github.io/drawingboard/drawingboard/index.html
+
+作业批改:https://vipstone.github.io/drawingboard/drawingboard/check.html
+
+## 功能 ##
+- 全局绘制颜色选择<br />
+- 护眼模式、网格模式切换<br />
+- 自由绘制<br />
+- 画箭头<br />
+- 画直线<br />
+- 画虚线<br />
+- 画圆/椭圆/矩形/直角三角形/普通三角形/等边三角形<br />
+- 文字输入<br />
+- 图片展示及相关移动、缩放等操作<br />
+- 删除功能<br />
+- 支持画板同比缩放
+- 支持图形即时显示
+
+## 高级功能 ##
+<br /> 按Shift键,画垂直、水平直线;
+<br /> 按Shift键,椭圆和正圆自由切换;
+<br /> 按Shift键,等腰三角形和等边自由切换;
+<br /> 按Shift键,等边直角三角形和直角三角形自由切换;
+<br /> 按Shift键,正方形和长方形自由切换;
+
+**附fabric.js使用笔记:**[点击打开](https://github.com/vipstone/drawingboard/blob/master/fabricjs%E4%BD%BF%E7%94%A8%E7%AC%94%E8%AE%B0.md)
+
+
+
+## 功能预览 ##
+![](https://raw.githubusercontent.com/vipstone/drawingboard/master/drawingboard/image/demoPreview.gif)
+
+
+<br />
+<br />
+<font color=red size=4 face="宋体">各位大侠如果觉得不错,欢迎点击star!</font>
+
+## todo ##
+
+mac下样式问题兼容
+
+添加撤销功能
+
+

+ 215 - 0
dist/www/CocoRoboDesktop/drawingboard-master/drawingboard/check-bak.html

@@ -0,0 +1,215 @@
+<html>
+
+<head>
+    <meta charset="UTF-8">
+    <title>作业批改 - 旧版</title>
+    <link rel="stylesheet" href="css/index.css">
+    <link rel="stylesheet" href="http://cdn.staticfile.org/semantic-ui/2.3.1/semantic.css">
+</head>
+
+<body style="background-color: #E5E4E5;overflow-x: hidden;">
+
+    <div style="margin-top:10px;">
+        <div style="width:50px;float:left;">
+            <ul id="toolsul" class="tools">
+
+                <li data-type="right" class="active" title="整题正确">
+                    <i class="icon-right-select" data-default='icon-right-black'></i>
+                </li>
+                <li data-type="wrong" title="整题错误">
+                    <i class="icon-wrong-black" data-default='icon-wrong-black'></i>
+                </li>
+                <li data-type="smallright" title="题目内单个正确">
+                    <i class="icon-right-small-black" data-default='icon-right-small-black'></i>
+                </li>
+                <li data-type="smallwrong" title="题目内单个错误">
+                    <i class="icon-wrong-small-black" data-default='icon-wrong-small-black'></i>
+                </li>
+                <li data-type="rectangle" title="错题圈定">
+                    <i class="icon-tools icon-square-black" data-default="icon-tools icon-square-black"></i>
+                </li>
+
+                <li data-type="remove" title="橡皮擦">
+                    <i class="icon-tools icon-remove-black" data-default='icon-tools icon-remove-black'></i>
+                </li>
+
+                <li onclick="cutFun()" title="成绩查看">
+                    <i class="icon-submit-black" data-default='icon-submit-black'></i>
+                </li>
+            </ul>
+
+        </div>
+        <div id="canvasDiv" class="canvasDiv" style="width:auto;height: auto;">
+            <canvas id="c" height="890">请使用支持HTML5的浏览器</canvas>
+        </div>
+        <div style="color:red;margin-top: 10px;margin-left: 60px;">注意:错题必须使用工具栏“错题圈定”圈定错题。</div>
+        <div id="wrongImg"></div>
+
+
+
+    </div>
+
+    <script src="/js/jquery.min.js"></script>
+    <script src="/js/fabric.min.js"></script>
+    <script src="js/check-bak.js"></script>
+    <script src="js/canvasZoom.js"></script>
+    <script src="https://unpkg.com/qiniu-js@2.2.2/dist/qiniu.min.js"></script>
+    <script src="http://cdn.staticfile.org/semantic-ui/2.3.1/semantic.js"></script>
+    <script>
+
+        var qiniuToken = undefined;
+        jQuery.ajax({
+            type: "GET",
+            cache: false,
+            dataType: "jsonp",
+            url: 'http://127.0.0.1:8360/qiniu/gettoken',
+            data: {},
+            success: function (res) {
+                qiniuToken = res.token;
+            }
+        });
+
+
+        canvas.on("mouse:up", function () {
+            if (window.drawType && (window.drawType == "wrong" || window.drawType == "smallwrong")) {
+                //错题批注
+                // $('.ui.modal').modal();
+            }
+        });
+
+        function cutFun() {
+            var objs = canvas.getObjects();
+            var checkObj = [];
+            for (var i = 0; i < objs.length; i++) {
+                if (objs[i].type && objs[i].type != 'image') {
+                    checkObj.push(objs[i]);
+                }
+            }
+            checkObj.sort(function (x, y) { return x.top - y.top; }); //根据控件top排序
+
+            var checkJson = [];
+            var itemSmallRight = 0, itemSmallWrong = 0, prevSmallType = true;
+            for (var i = 0; i < checkObj.length; i++) {
+                switch (checkObj[i].type) {
+                    case 'smallright':
+                        ++itemSmallRight;
+                        break;
+                    case 'smallwrong':
+                        ++itemSmallWrong;
+                        break;
+                    case 'right':
+                    case 'wrong':
+                    case 'rectangle': //框
+                        prevSmallType = false;
+                        break;
+                    default:
+                        break;
+                }
+                if (prevSmallType == false || i == (checkObj.length - 1)) {
+                    //上一个为整题对/错 || 最后一题
+                    if (itemSmallRight > 0 || itemSmallWrong > 0) {
+                        checkJson.push({ 'r': 0, 'w': 0, 'sr': itemSmallRight, 'sw': itemSmallWrong, 'url': '' });
+                        itemSmallRight = 0, itemSmallWrong = 0;
+                    }
+                    prevSmallType = true;
+                }
+                //录入本次大题
+                if (checkObj[i].type == 'right') {
+                    checkJson.push({ 'r': 1, 'w': 0, 'sr': 0, 'sw': 0, 'url': '' });
+                } else if (checkObj[i].type == 'wrong') {
+                    checkJson.push({ 'r': 0, 'w': 1, 'sr': 0, 'sw': 0, 'url': '' });
+                }
+                //圈定的错图上传
+                if (checkObj[i].type == 'rectangle') {
+                    toImgUpload(checkObj[i], checkObj[i].left, checkObj[i].top, checkObj[i].width, checkObj[i].height);
+                }
+            }
+
+            // var msg = "";
+            // for (var i = 0; i < checkJson.length; i++) {
+            //     msg += ("第" + (i + 1) + "题:");
+            //     if (checkJson[i].r) {
+            //         msg += "全对";
+            //     } else if (checkJson[i].w) {
+            //         msg += "全错";
+            //     } else {
+            //         msg += "对:" + checkJson[i].sr + "个" + ",错:" + checkJson[i].sw + "个";
+            //     }
+            //     msg += "\n";
+            // }
+            // if (msg) {
+            //     alert(msg);
+            // }
+
+        }
+
+        //转换成图片并上传
+        function toImgUpload(cObj, left, top, width, height) {
+            canvas.remove(cObj);
+            var base64 = canvas.toDataURL({
+                format: 'png',
+                left: left - 12,
+                top: top - 10,
+                width: width,
+                height: height
+            });
+
+            // data:image/png;base64,
+
+            jQuery("#wrongImg").append('<img src="' + base64 + '"/><br />');
+            canvas.add(cObj);
+
+            //上传,返回地址
+            var putExtra = {
+                fname: "",
+                params: {},
+                mimeType: [] || null
+            };
+            var config = {
+                useCdnDomain: true
+            };
+            // var contentType = 'image/png';
+            // var blob = base64ToBlob(base64.replace('data:image/png;base64,', ''), contentType);
+
+            // var observable = qiniu.upload(blob, "test5.png", qiniuToken, putExtra, config);
+            // var subscription = observable.subscribe({
+            //     next(res) {
+            //         console.log(res);
+            //     },
+            //     error(err) {
+            //         console.log(err);
+            //     },
+            //     complete(res) {
+            //         console.log(res);
+            //     }
+            // });
+
+            // return "";
+        }
+
+        //base64转blob
+        function base64ToBlob(base64, contentType, sliceSize) {
+            contentType = contentType || '';
+            sliceSize = sliceSize || 512;
+            var byteCharacters = atob(base64);
+            var byteArrays = [];
+
+            for (var offset = 0; offset < byteCharacters.length; offset += sliceSize) {
+                var slice = byteCharacters.slice(offset, offset + sliceSize);
+                var byteNumbers = new Array(slice.length);
+                for (var i = 0; i < slice.length; i++) {
+                    byteNumbers[i] = slice.charCodeAt(i);
+                }
+                var byteArray = new Uint8Array(byteNumbers);
+                byteArrays.push(byteArray);
+            }
+            var blob = new Blob(byteArrays, { type: contentType });
+            return blob;
+        }
+
+
+    </script>
+
+</body>
+
+</html>

+ 487 - 0
dist/www/CocoRoboDesktop/drawingboard-master/drawingboard/check.html

@@ -0,0 +1,487 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="maximum-scale=1.0,minimum-scale=1.0,user-scalable=0,width=device-width,initial-scale=1.0"
+    />
+    <title>作业批改</title>
+    <link rel="stylesheet" type="text/css" href="../css/api.css" />
+    <link rel="stylesheet" type="text/css" href="../css/style.css" />
+    <link rel="stylesheet" type="text/css" href="../css/check.css" />
+</head>
+
+<body id="data-box">
+    <div class="container">
+        <div class="fn-left handle_menu_wrap">
+            <div class="menu_title">
+                工具
+            </div>
+            <div id="tools" class="handle_btn_list">
+                <div class="handle_btn active" data-type="right">
+                    <div class="handle_btn_img">
+                        <img src="../image/check/all-true.png" class="center-self" alt="">
+                    </div>
+                    <div class="handle_btn_name">
+                        全对
+                    </div>
+                </div>
+                <div class="handle_btn" data-type="rectangle">
+                    <div class="handle_btn_img">
+                        <img src="../image/check/label-icon.png" class="center-self" alt="">
+                    </div>
+                    <div class="handle_btn_name">
+                        错题标注
+                    </div>
+                </div>
+                <div class="handle_btn" data-type="wrong">
+                    <div class="handle_btn_img">
+                        <img src="../image/check/all-wrong.png" class="center-self" alt="">
+                    </div>
+                    <div class="handle_btn_name">
+                        全错
+                    </div>
+                </div>
+                <div class="handle_btn" data-type="smallright">
+                    <div class="handle_btn_img">
+                        <img src="../image/check/true-icon.png" class="center-self" alt="">
+                    </div>
+                    <div class="handle_btn_name">
+                        正确处
+                    </div>
+                </div>
+                <div class="handle_btn" data-type="smallwrong">
+                    <div class="handle_btn_img">
+                        <img src="../image/check/wrong-icon.png" class="center-self" alt="">
+                    </div>
+                    <div class="handle_btn_name">
+                        错误处
+                    </div>
+                </div>
+                <div class="handle_btn" data-type="remove">
+                    <div class="handle_btn_img">
+                        <img src="../image/check/erasure-icon.png" class="center-self" alt="">
+                    </div>
+                    <div class="handle_btn_name">
+                        擦除
+                    </div>
+                </div>
+                <div class="handle_btn" data-type="help">
+                    <div class="handle_btn_img">
+                        <img src="../image/check/help-icon.png" class="center-self" alt="">
+                    </div>
+                    <div class="handle_btn_name">
+                        帮助
+                    </div>
+                </div>
+            </div>
+        </div>
+        <div class="fn-right correct_main">
+            <div class="wrong_list_wrap">
+                <div class="wrong_list_title">
+                    <i class="before_icon fn-left"></i>
+                    <div>错题</div>
+                </div>
+                <div class="wrong_list">
+                    <div id="errMsg" class="wrong_list_inner">
+
+                    </div>
+                </div>
+            </div>
+            <div class="main_score">
+                <div class="main_score_title">
+                    <i class="before_icon fn-left"></i>
+                    <div>字迹评分</div>
+                </div>
+                <div id="fontScore" class="main_score_num_list fn-clear">
+                    <div class="main_score_num_item fn-left active">1</div>
+                    <div class="main_score_num_item fn-left">2</div>
+                    <div class="main_score_num_item fn-left">3</div>
+                    <div class="main_score_num_item fn-left">4</div>
+                    <div class="main_score_num_item fn-left">5</div>
+                    <div class="main_score_num_item fn-left">6</div>
+                    <div class="main_score_num_item fn-left">7</div>
+                    <div class="main_score_num_item fn-left">8</div>
+                    <div class="main_score_num_item fn-left">9</div>
+                    <div class="main_score_num_item fn-left">10</div>
+                </div>
+            </div>
+            <div id="subBut" class="small_btn_blue confirm">
+                确认完成
+            </div>
+            <div id="moreBtn" class="more_btn"></div>
+            <div id="moreDiv" class="other_btn_wrap fn-hide">
+                <div id="expBtn" class="mark_exce">
+                    异常标记
+                </div>
+                <div id="giveupBtn" class="give_up">
+                    放弃任务
+                </div>
+            </div>
+        </div>
+        <div class="fn-right preview">
+            <div id="simgDiv" class="swiper-container">
+
+            </div>
+            <div class="homework_total center-self-x">
+                <span id="currentNum">1</span>/
+                <span id="sumNum">1</span>
+            </div>
+        </div>
+        <div class="view">
+            <div id="canvasDiv" class="swiper-container center-self-x">
+            </div>
+        </div>
+    </div>
+
+    <div id="maskDiv" class="mask_modal" style="display: none;">
+        <div class="top">
+            <div style="width: 100%;padding-left: 30%;padding-top: 20%">数据提交中,请稍等...</div>
+        </div>
+    </div>
+
+
+    <div id="errModal" class="mark_error_modal fn-hide">
+        <div class="top"></div>
+        <div class="mark_error_box center-self">
+            <div class="mark_error_box_title">
+                <div class="fn-left">
+                    选择错误标签
+                </div>
+                <div id="hideModal" class="fn-right close_icon fn-clear fn-hide">
+                    <img src="../image/check/close-icon.png" class="fn-left" alt="">
+                </div>
+            </div>
+            <div id="errTags" class="wrong_label_list">
+
+            </div>
+            <div id="errVerify" class="small_btn_blue center-self-x confirm_mark">
+                确认
+            </div>
+        </div>
+    </div>
+    <div id="testImg">
+
+    </div>
+</body>
+<script type="text/javascript" src="../js/check/fontsize.js"></script>
+<script type="text/javascript" src="../js/jquery.min.js"></script>
+<script type="text/javascript" src="../js/check/qiniu.min.js"></script>
+<script type="text/javascript" src="js/fabric.min.js"></script>
+<script type="text/javascript" src="js/check/canvas.js"></script>
+<script type="text/javascript" src="js/check/config.js"></script>
+<script type="text/javascript" src="js/tools/md5.min.js"></script>
+<script type="text/javascript" src="js/tools/uuid.js"></script>
+<script type="text/javascript" src="js/tools/upload.js"></script>
+
+<script type="text/javascript">
+    jQuery(function () {
+        var canvasInit = []; //已经初始化的canvas
+        var uploadImageArray = []; //需要上传的图片集合{"name":"xxx","base64":"xxx"}
+        var errTagType = {
+            '语文': ['遗漏', '理解不清晰', '粗心大意', '审题不清', '基础不牢', '积累不够', '运用错误', '区分错误', '缺乏逻辑'],
+            '数学': ['计算错误', '审题错误', '遗漏', '基础不牢固', '粗心大意', '概念不清', '换算错误', '公式不熟练', '缺乏解题技巧', '书写不端正'],
+            '英语': ['粗心大意', '审题错误', '基础不牢固', '书写不规范', '单词拼写错误', '遗漏', '介词搭配错误', '单复数错误']
+        };
+
+        var img = decodeURIComponent(getUrlParam('img')); //图片集合
+        var subject = decodeURIComponent(getUrlParam('subject')); //科目
+        if (!img && JSON.parse(img)) {
+            alert("网络错误");
+        }
+        img = JSON.parse(img);
+        jQuery('#sumNum').text(img.length);
+        var simgEle = "";
+        for (var i = 0; i < img.length; i++) {
+            if (i == 0) {
+                jQuery("#canvasDiv").append('<canvas id="c0" height="1100" width="825"></canvas>');
+                canvasInit.push("c0");
+                switchCanvas(img[i].i, 0);
+                simgEle += '<div class="swiper-slide swiper-slide-visible swiper-slide-active active-nav">';
+            } else {
+                simgEle += '<div class="swiper-slide swiper-slide-visible">';
+            }
+            simgEle += ('<div class="slide_inner"><img src="' + img[i].s + '" class="center-self"></div></div>');
+        }
+        jQuery("#simgDiv").append(simgEle);
+
+        //点击缩略图
+        jQuery(".swiper-slide-visible").on("click", function () {
+            var _index = jQuery(this).index(),
+                _cid = "c" + _index;
+            if (canvasInit.indexOf(_cid) == -1) {
+                jQuery("#canvasDiv").append('<canvas id="' + _cid + '" height="1100" width="825"></canvas>');
+                canvasInit.push(_cid);
+            }
+            jQuery(this).addClass("active-nav").siblings().removeClass("active-nav");
+            switchCanvas(img[_index].i, _index);
+            jQuery("#currentNum").text(1 + _index);
+        });
+
+        //隐藏弹窗
+        jQuery("#hideModal").on("click", function () {
+            jQuery("#errModal").addClass("fn-hide");
+        });
+
+        //弹窗科目错误设置
+        if (subject && errTagType[subject] && errTagType[subject].length > 0) {
+            for (var i = 0; i < errTagType[subject].length; i++) {
+                jQuery('#errTags').append('<div name="etag" class="wrong_label fn-left">' + errTagType[subject][i] + '</div>');
+            }
+        }
+
+        //错误标签点击
+        jQuery("div[name=etag]").on("click", function () {
+            jQuery(this).toggleClass("active");
+        });
+
+        //错误标签选定
+        jQuery("#errVerify").on("click", function () {
+            var errTags = jQuery('#errTags').find(".active");
+            if (errTags.length <= 0) {
+                alert('请先选中标签!');
+                return false;
+            }
+            var errSonEle = '<div class="wrong_item">';
+            errSonEle += ' <i class="serial_number fn-left" value="' + appErrCount + '">' + appErrCount + '</i>';
+            errSonEle += '<div class="wrong_content fn-clear">';
+            for (var i = 0; i < errTags.length; i++) {
+                errSonEle += '<div class="wrong_label fn-left">' + jQuery(errTags[i]).text() + '</div>';
+            }
+            errSonEle += '</div></div>';
+            jQuery("#errMsg").prepend(errSonEle);
+            jQuery("#errModal").addClass("fn-hide");
+        });
+
+        //绑定工具事件
+        jQuery("#tools").find(".handle_btn").on("click", function () {
+            //设置样式
+            jQuery(this).addClass("active").siblings().removeClass("active");
+            drawType = jQuery(this).attr("data-type");
+            // window.drawType = drawType;
+            canvas.isDrawingMode = false;
+            if (drawType == "pen") {
+                canvas.isDrawingMode = true;
+            } else if (drawType == "remove") {
+                canvas.selection = true;
+                canvas.skipTargetFind = false;
+                canvas.selectable = true;
+            } else if (drawType == "help") {
+                jQuery("#c").toggleClass("fn-hide");
+            }
+            else {
+                canvas.skipTargetFind = true; //画板元素不能被选中
+                canvas.selection = false; //画板不显示选中
+            }
+        });
+
+        //get七牛token
+        var qiniuToken = undefined;
+        jQuery.ajax({
+            type: "GET",
+            cache: false,
+            dataType: "jsonp",
+            url: config.tokenURL,
+            data: {},
+            success: function (res) {
+                qiniuToken = res.token;
+            }
+        });
+
+        //提交作业
+        jQuery("#subBut").on("click", function () {
+            jQuery("#maskDiv").show();
+            var fs = jQuery("#fontScore").find("div.active").index() + 1;
+            if (fs <= 0) {
+                alert("操作失败,请先选择字迹评分!");
+                return false;
+            }
+            if (true) { //TODO:confirm("确认作业批改完成?")
+                var checkJson = {
+                    "pages": [],
+                    "font": fs,
+                    "callback": {
+                        "task_id": (getUrlParam("task_id") || ""),
+                        "task_list_id": (getUrlParam("task_list_id") || ""),
+                        "userinfo": (getUrlParam("userinfo") || ""),
+                        "type": (getUrlParam("type") || "")
+                    }
+                };
+                window.checkJson = undefined;
+                for (var i = 0; i < canvasArr.length; i++) {
+                    if (canvasArr[i]) {
+                        var canvasJson = {
+                            "question": [],
+                            "page": {
+                                "img": "",
+                                "imgorg": "",
+                                "w": 0,
+                                "h": 0,
+                                "index": i
+                            }
+                        };
+                        var objs = canvasArr[i].getObjects();
+                        var checkObj = [];
+                        for (var j = 0; j < objs.length; j++) {
+                            if (objs[j].type && objs[j].type != 'image') {
+                                checkObj.push(objs[j]);
+                            } else {
+                                var _imgName = md5(uuid.uuid() + new Date().getTime()) + ".png";
+                                canvasJson.page.imgorg = objs[j]._element.src;
+                                canvasJson.page.img = config.imgDomain + _imgName;
+                                canvasJson.page.w = objs[j].width;
+                                canvasJson.page.h = objs[j].height;
+                                addUploadImg(canvasArr[i], objs[j], _imgName, false);
+                            }
+                        }
+
+                        checkObj.sort(function (x, y) { return x.top - y.top; }); //根据控件top排序
+
+                        var itemSmallRight = 0, itemSmallWrong = 0, prevSmallType = true, errImg = "", errIndexs = [];
+                        for (var j = 0; j < checkObj.length; j++) {
+                            switch (checkObj[j].type) {
+                                case 'smallright':
+                                    ++itemSmallRight;
+                                    errIndexs.push(checkObj[j].eindex);
+                                    break;
+                                case 'smallwrong':
+                                    ++itemSmallWrong;
+                                    errIndexs.push(checkObj[j].eindex);
+                                    break;
+                                case 'right':
+                                case 'wrong':
+                                    prevSmallType = false;
+                                    break;
+                                case 'rectangle': //框
+                                    var _imgName = md5(uuid.uuid() + new Date().getTime()) + ".png";
+                                    errImg = config.imgDomain + _imgName;
+                                    addUploadImg(canvasArr[i], checkObj[j], _imgName, true);
+                                    prevSmallType = false;
+                                    break;
+                                default:
+                                    break;
+                            }
+                            if (prevSmallType == false || j == (checkObj.length - 1)) {
+                                //下一题为整题对/错 || 最后一题 (结算上一题[小错/对])
+                                if (itemSmallRight > 0 || itemSmallWrong > 0) {
+                                    var errJson = [];
+                                    if (errIndexs.length > 0) {
+                                        for (var m = 0; m < errIndexs.length; m++) {
+                                            var _eindex = errIndexs[m];
+                                            var txt = getErrTagsByIndex(_eindex);
+                                            errJson.push({
+                                                "id": _eindex + 1,
+                                                "desc": txt,
+                                                "x": checkObj[m].left,
+                                                "y": checkObj[m].top
+                                            });
+                                        }
+                                    }
+                                    canvasJson.question.push({ 'r': 0, 'w': 0, 'sr': itemSmallRight, 'sw': itemSmallWrong, 'eimg': errImg, 'err': errJson });
+                                    errImg = "";
+                                    errIndexs = [];
+                                    itemSmallRight = 0, itemSmallWrong = 0;
+                                }
+                                prevSmallType = true;
+                            }
+                            //录入本次大题
+                            if (checkObj[j].type == 'right') {
+                                canvasJson.question.push({ 'r': 1, 'w': 0, 'sr': 0, 'sw': 0, 'eimg': '', 'err': [] });
+                            } else if (checkObj[j].type == 'wrong') {
+                                var errJson = [];
+                                var _eindex = checkObj[j].eindex;
+                                var txt = getErrTagsByIndex(_eindex);
+                                errJson[0] = {
+                                    "id": _eindex + 1,
+                                    "desc": txt,
+                                    "x": checkObj[j].left,
+                                    "y": checkObj[j].top
+                                };
+                                canvasJson.question.push({ 'r': 0, 'w': 1, 'sr': 0, 'sw': 0, 'eimg': errImg, 'err': errJson });
+                                errImg = "";
+                            }
+                        }
+                        checkJson.pages.push(canvasJson);
+                    } else {
+                        //这里的图片没有点击初始化
+                    }
+                }
+                window.checkJson = JSON.stringify(checkJson);
+
+                //上传图片+请求服务器
+                uploadImg(uploadImageArray, qiniuToken);
+            }
+        });
+        //更多操作
+        jQuery("#moreBtn").on("click", function () {
+            jQuery("#moreDiv").toggleClass("fn-hide");
+        });
+        //异常订单
+        jQuery("#expBtn").on("click", function () {
+            jQuery("#moreDiv").toggleClass("fn-hide");
+            if (confirm("确认为异常订单?")) {
+                //TODO:业务
+            }
+        });
+        //放弃订单
+        jQuery("#giveupBtn").on("click", function () {
+            jQuery("#moreDiv").toggleClass("fn-hide");
+            if (confirm("确认为放弃订单?")) {
+                //TODO:业务
+            }
+        });
+        //字体打分
+        jQuery("#fontScore").find("div").on("click", function () {
+            jQuery(this).addClass("active").siblings().removeClass("active");
+
+        });
+        //获取url中的参数
+        function getUrlParam(name) {
+            var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
+            var r = window.location.search.substr(1).match(reg);
+            if (r != null) return decodeURI(r[2]);
+            return null;
+        }
+        //添加上传图片 (isRemove:类型bool,是否需要移除截图在添加)
+        function addUploadImg(canvas, canvasControl, imgName, isRemove) {
+            if (isRemove) {
+                canvas.remove(canvasControl);
+            }
+            var base64 = canvas.toDataURL({
+                format: 'png',
+                left: canvasControl.left,
+                top: canvasControl.top,
+                width: canvasControl.width,
+                height: canvasControl.height
+            });
+
+            uploadImageArray.push({ "name": imgName, "base64": base64 });
+
+            // jQuery("#testImg").append('<img src="' + base64 + '"/><br />');
+
+            if (isRemove) {
+                canvas.add(canvasControl);
+            }
+        }
+        //获取错误标签描述集合(根据标号)
+        function getErrTagsByIndex(eindex) {
+            var txt = "";
+            var txtCt = jQuery('#errMsg').find('.wrong_item > i[value="' + (eindex + 1) + '"]').siblings().find('div');
+            for (var k = 0; k < txtCt.length; k++) {
+                txt += txtCt.eq(k).text();
+
+                if (k != (txtCt.length - 1)) {
+                    txt += ",";
+                }
+            }
+            return txt;
+        }
+
+    });
+
+
+
+
+</script>
+
+</html>

+ 48 - 0
dist/www/CocoRoboDesktop/drawingboard-master/drawingboard/demo/loadimg.html

@@ -0,0 +1,48 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <meta http-equiv="X-UA-Compatible" content="ie=edge">
+    <title>画板</title>
+    <style>
+        .canvas {
+            border: 1px solid rgb(170, 170, 170);
+            cursor: pointer;
+        }
+
+        .mgTop {
+            margin-top: 30px;
+            text-align: center;
+        }
+    </style>
+    <script src="https://cdn.bootcss.com/fabric.js/2.2.3/fabric.min.js"></script>
+</head>
+
+<body style="padding-left: 10px;text-align:center;">
+
+    <h1>图片加载</h1>
+
+    <div class="mgTop">
+        <canvas id="freeCanvas" class="canvas"></canvas>
+    </div>
+
+    <script>
+        var canvas = new fabric.Canvas("freeCanvas", {
+            isDrawingMode: false,
+            selection: false,
+            width: 1000,
+            height: 600
+        });
+
+        fabric.Image.fromURL('../image/tools-28.png', function (img) {
+            img.scaleToHeight(224 / 2, false);  //缩放图片高度
+            img.scaleToWidth(168 / 2, false);   //缩放图片宽度
+            canvas.add(img);
+        });
+
+    </script>
+</body>
+
+</html>

+ 121 - 0
dist/www/CocoRoboDesktop/drawingboard-master/drawingboard/demo/writingpad.html

@@ -0,0 +1,121 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+    <meta charset="UTF-8">
+    <title>手写板绘制</title>
+    <style>
+        .canvas {
+            border: 1px solid rgb(170, 170, 170);
+            cursor: pointer;
+        }
+
+        .mgTop {
+            margin-top: 30px;
+            text-align: center;
+        }
+    </style>
+    <script src="../js/fabric.min.js"></script>
+</head>
+
+<body style="padding-left: 10px;text-align:center;">
+
+    <h1>手写板测试</h1>
+
+    <div class="mgTop">
+        <canvas width="1880" height="1329" id="freeCanvas" class="canvas"></canvas>
+    </div>
+
+    <button style="display: none;" onclick="toData()"> 转换 </button>
+
+    <button onclick="clearCanvas()"> 清空画板 </button>
+
+    <script>
+        var canvas = new fabric.Canvas("freeCanvas", {
+            isDrawingMode: true,
+            selection: false,
+            width: 1880,
+            height: 1329
+        });
+
+        window.open("http://cmd.com/setpadcanvas?" + canvas.width + "&" + canvas.height);
+
+        function toData() {
+            console.log(canvas.toJSON());
+            console.log(drawingPath.path);
+        }
+
+        var invalidCoord = -1000000; //无效的坐标值
+        var prevX = invalidCoord, prevY = invalidCoord; //绘制中上一个节点的x,y
+        var drawingIndex = 0; //绘制对象的下标
+        var drawingPath = undefined;
+        var drawColor = '#E34F51',
+            strokeWidth = 2,
+            tempCount = 0;
+
+        //手写板绘制 type:M=>开始绘制 Q=>绘制中 L=>结束绘制
+        function writingPad(type, x, y) {
+
+            // window.open("http://cmd.com/WriteLog?writingPad—type:" + type + " x:" + x + " y:" + y);
+
+            if (type) {
+                switch (type.toLowerCase()) {
+                    case 'm':
+                        //开始绘制
+                        drawingPath = new fabric.Path('M ' + x + ' ' + y + ' ', {
+                            stroke: drawColor,
+                            fill: "rgba(255, 255, 255, 0)",
+                            strokeWidth: strokeWidth
+                        });
+                        canvas.add(drawingPath);
+                        break;
+                    case 'q':
+                        //绘制中
+                        if (drawingPath) {
+                            if (prevX == invalidCoord || prevY == invalidCoord) {
+                                prevX = x, prevY = y;
+                            } else {
+                                ++tempCount;
+                                if (tempCount % 2) {
+                                    drawingPath.path.push(["Q", prevX, prevY, x, y]);
+                                    var _path = drawingPath.path;
+                                    canvas.remove(_path); //先移除
+                                    //再添加(变相实现更新)
+                                    drawingPath = new fabric.Path(_path, {
+                                        stroke: drawColor,
+                                        fill: "rgba(255, 255, 255, 0)",
+                                        strokeWidth: strokeWidth
+                                    });
+                                    canvas.add(drawingPath);
+                                    prevX = invalidCoord, prevY = invalidCoord;
+
+                                    // window.open("http://cmd.com/WriteLog?drawingPath—type:" + type + " x:" + x + " y:" + y);
+
+                                }
+                            }
+                        } else {
+                            alert('绘制失败:画板异常,请重新连接画板重试!');
+                        }
+                        break;
+                    case 'l':
+                        //结束绘制
+                        drawingPath.path.push(["L", x, y]);
+                        // canvas.loadFromJSON(canvas.toJSON());
+                        drawingPath = undefined;
+                        prevX = invalidCoord, prevY = invalidCoord;
+                        tempCount = 0;
+                        break;
+                    default:
+                        break;
+                }
+            }
+        }
+
+        function clearCanvas() {
+            canvas.clear();
+        }
+
+    </script>
+</body>
+
+</html>

BIN
dist/www/CocoRoboDesktop/drawingboard-master/drawingboard/image/check/all-true.png


BIN
dist/www/CocoRoboDesktop/drawingboard-master/drawingboard/image/check/change-icon.png


BIN
dist/www/CocoRoboDesktop/drawingboard-master/drawingboard/image/check/confirm-icon.png


BIN
dist/www/CocoRoboDesktop/drawingboard-master/drawingboard/image/check/default-head-blue.png


BIN
dist/www/CocoRoboDesktop/drawingboard-master/drawingboard/image/check/error-tag.png


BIN
dist/www/CocoRoboDesktop/drawingboard-master/drawingboard/image/check/help-icon.png


BIN
dist/www/CocoRoboDesktop/drawingboard-master/drawingboard/image/check/homework-answer-icon.png


BIN
dist/www/CocoRoboDesktop/drawingboard-master/drawingboard/image/check/homework-entry-icon.png


BIN
dist/www/CocoRoboDesktop/drawingboard-master/drawingboard/image/check/logo.png


BIN
dist/www/CocoRoboDesktop/drawingboard-master/drawingboard/image/check/pwd0.png


BIN
dist/www/CocoRoboDesktop/drawingboard-master/drawingboard/image/check/right-tag.png


BIN
dist/www/CocoRoboDesktop/drawingboard-master/drawingboard/image/check/sign-out-icon.png


BIN
dist/www/CocoRoboDesktop/drawingboard-master/drawingboard/image/check/true-icon.png


BIN
dist/www/CocoRoboDesktop/drawingboard-master/drawingboard/image/check/work-original.jpg.filepart


BIN
dist/www/CocoRoboDesktop/drawingboard-master/drawingboard/image/check/work-total-icon.png


BIN
dist/www/CocoRoboDesktop/drawingboard-master/drawingboard/image/wrong-small-sel.png


+ 68 - 0
dist/www/CocoRoboDesktop/drawingboard-master/drawingboard/index.html

@@ -0,0 +1,68 @@
+<html>
+
+<head>
+    <meta charset="UTF-8">
+    <title>高级画板程序(canvas) - 授课系统</title>
+    <link rel="stylesheet" href="css/index.css">
+</head>
+
+<body style="background-color: #E5E4E5;;overflow-x: hidden;">
+
+    <div style="margin-top:10px;">
+        <div style="width:50px;float:left;">
+            <ul id="toolsul" class="tools">
+                <li id="toolsPencil" data-type="pen" class="active">
+                    <i class="icon-tools icon-pen-select" data-default='icon-tools icon-pen-black'></i>
+                </li>
+                <li data-type="arrow">
+                    <i class="icon-tools icon-arrow-black" data-default='icon-tools icon-arrow-black'></i>
+                </li>
+                <li data-type="line">
+                    <i class="icon-tools icon-line-black" data-default='icon-tools icon-line-black'></i>
+                </li>
+                <li data-type="dottedline">
+                    <i class="icon-tools icon-dottedline-black" data-default='icon-tools icon-dottedline-black'></i>
+                </li>
+                <li data-type="circle">
+                    <i class="icon-tools icon-circle-black" data-default='icon-tools icon-circle-black'></i>
+                </li>
+                <li data-type="ellipse">
+                    <i class="icon-tools icon-ellipse-black" data-default='icon-tools icon-ellipse-black'></i>
+                </li>
+                <li class="hide" data-type="square">
+                    <i class="icon-tools icon-square-black" data-default='icon-tools icon-square-black'></i>
+                </li>
+                <li data-type="rectangle">
+                    <i class="icon-tools icon-rectangle-black" data-default='icon-tools icon-rectangle-black'></i>
+                </li>
+                <li data-type="rightangle">
+                    <i class="icon-tools icon-rightangle-black" data-default='icon-tools icon-rightangle-black'></i>
+                </li>
+                <li data-type="equilateral">
+                    <i class="icon-tools icon-equilateral-black" data-default='icon-tools icon-equilateral-black'></i>
+                </li>
+                <li class="hide" data-type="isosceles">
+                    <i class="icon-tools icon-isosceles-black" data-default='icon-tools icon-isosceles-black'></i>
+                </li>
+                <li data-type="text">
+                    <i class="icon-tools icon-text-black" data-default='icon-tools icon-text-black'></i>
+                </li>
+                <li data-type="remove">
+                    <i class="icon-tools icon-remove-black" data-default='icon-tools icon-remove-black'></i>
+                </li>
+            </ul>
+
+        </div>
+        <div id="canvasDiv" class="canvasDiv" style="width:95%;">
+            <canvas id="c" width="1920" height="1080">请使用支持HTML5的浏览器</canvas>
+        </div>
+    </div>
+
+    <script src="https://cdn.bootcss.com/jquery/1.9.1/jquery.min.js"></script>
+    <script src="https://cdn.bootcss.com/fabric.js/2.1.0/fabric.min.js"></script>
+    <script src="js/demo.js"></script>
+    <script src="js/canvasZoom.js"></script>
+
+</body>
+
+</html>

+ 47 - 0
dist/www/CocoRoboDesktop/drawingboard-master/drawingboard/js/canvasZoom.js

@@ -0,0 +1,47 @@
+//配置
+var config = function() {
+  return {
+    height: 1080, //默认画板高、宽
+    width: 1920,
+    canvasParentId: "canvasDiv",
+    canvasId: "c"
+  };
+};
+
+//初次设置画板
+(function() {
+  setZoom(window.canvas);
+})();
+
+//设置缩放
+function setZoom(canvas) {
+  var canvasDiv = jQuery("#" + config().canvasParentId);
+  var zoom = 1;
+  var eleHeight = canvasDiv.height(),
+    eleWidth = canvasDiv.width(),
+    cHeight = canvas.height,
+    cWidth = canvas.width;
+  var height = eleHeight > cHeight ? eleHeight : cHeight;
+  var width = eleWidth > cWidth ? eleWidth : cWidth;
+  if (width > height) {
+    //横版
+    width = eleWidth;
+    height = eleHeight;
+    zoom = width / config().width;
+  } else {
+    //竖版
+    height = height * eleHeight / config().height * 0.8;
+    zoom = height / config().height;
+  }
+  canvas.setZoom(zoom);
+  canvas.setWidth(width);
+  canvas.setHeight(height);
+
+  window.zoom = zoom;
+  canvas.renderAll();
+}
+
+//监听窗体变化
+window.onresize = function() {
+  setZoom(window.canvas);
+};

+ 305 - 0
dist/www/CocoRoboDesktop/drawingboard-master/drawingboard/js/check-bak.js

@@ -0,0 +1,305 @@
+(function () {
+  //变量声明
+  var mouseFrom = {},
+    mouseTo = {},
+    drawType = 'right', //画板绘制类型
+    canvasObjectIndex = 0,
+    textbox = null;
+  var drawWidth = 2; //笔触宽度
+  var color = "#E34F51"; //画笔颜色
+  var drawingObject = null; //当前绘制对象
+  var moveCount = 1; //绘制移动计数器
+  var doDrawing = false; // 绘制状态
+  var rightColor = "#006400", wrongColor = "#E34F51";
+
+  //初始化画板
+  var canvas = new fabric.Canvas("c", {
+    isDrawingMode: false,
+    skipTargetFind: true,
+    selectable: false,
+    selection: false
+  });
+
+  fabric.Image.fromURL('http://icdn.apigo.cn/paper.png?1', function (img) {
+    canvas.add(img);
+  }, { crossOrigin: 'anonymous' });
+
+  window.canvas = canvas;
+  window.zoom = window.zoom ? window.zoom : 1;
+  window.drawType = drawType;
+
+  canvas.freeDrawingBrush.color = color; //设置自由绘颜色
+  canvas.freeDrawingBrush.width = drawWidth;
+
+  //绑定画板事件
+  canvas.on("mouse:down", function (options) {
+    var xy = transformMouse(options.e.offsetX, options.e.offsetY);
+    mouseFrom.x = xy.x;
+    mouseFrom.y = xy.y;
+    doDrawing = true;
+  });
+  canvas.on("mouse:up", function (options) {
+    var xy = transformMouse(options.e.offsetX, options.e.offsetY);
+    mouseTo.x = xy.x;
+    mouseTo.y = xy.y;
+    drawing();
+    drawingObject = null;
+    moveCount = 1;
+    doDrawing = false;
+  });
+  canvas.on("mouse:move", function (options) {
+    if (moveCount % 2 && !doDrawing) {
+      //减少绘制频率
+      return;
+    }
+    moveCount++;
+    var xy = transformMouse(options.e.offsetX, options.e.offsetY);
+    mouseTo.x = xy.x;
+    mouseTo.y = xy.y;
+    drawing();
+  });
+
+  canvas.on("selection:created", function (e) {
+    if (e.target._objects) {
+      //多选删除
+      var etCount = e.target._objects.length;
+      for (var etindex = 0; etindex < etCount; etindex++) {
+        if (e.target._objects[etindex].type == "image") {
+          continue;
+        }
+        canvas.remove(e.target._objects[etindex]);
+      }
+    } else {
+      //单选删除
+      if (e.target.type != "image") {
+        canvas.remove(e.target);
+      }
+    }
+    canvas.discardActiveObject(); //清楚选中框
+  });
+
+  //坐标转换
+  function transformMouse(mouseX, mouseY) {
+    return { x: mouseX / window.zoom, y: mouseY / window.zoom };
+  }
+
+  //绑定工具事件
+  jQuery("#toolsul")
+    .find("li")
+    .on("click", function () {
+      //设置样式
+      jQuery("#toolsul")
+        .find("li>i")
+        .each(function () {
+          jQuery(this).attr("class", jQuery(this).attr("data-default"));
+        });
+      jQuery(this)
+        .addClass("active")
+        .siblings()
+        .removeClass("active");
+      jQuery(this)
+        .find("i")
+        .attr(
+          "class",
+          jQuery(this)
+            .find("i")
+            .attr("class")
+            .replace("black", "select")
+        );
+      drawType = jQuery(this).attr("data-type");
+      window.drawType = drawType;
+      canvas.isDrawingMode = false;
+      if (textbox) {
+        //退出文本编辑状态
+        textbox.exitEditing();
+        textbox = null;
+      }
+      if (drawType == "pen") {
+        canvas.isDrawingMode = true;
+      } else if (drawType == "remove") {
+        canvas.selection = true;
+        canvas.skipTargetFind = false;
+        canvas.selectable = true;
+      } else {
+        canvas.skipTargetFind = true; //画板元素不能被选中
+        canvas.selection = false; //画板不显示选中
+      }
+    });
+
+  //绘画方法
+  function drawing() {
+    if (drawingObject) {
+      canvas.remove(drawingObject);
+    }
+    var canvasObject = null;
+    switch (drawType) {
+      case "arrow": //箭头
+        canvasObject = new fabric.Path(drawArrow(mouseFrom.x, mouseFrom.y, mouseTo.x, mouseTo.y, 30, 30), {
+          stroke: color,
+          fill: "rgba(255,255,255,0)",
+          strokeWidth: drawWidth
+        });
+        break;
+      case "line": //直线
+        canvasObject = new fabric.Line([mouseFrom.x, mouseFrom.y, mouseTo.x, mouseTo.y], {
+          stroke: color,
+          strokeWidth: drawWidth
+        });
+        break;
+      case "dottedline": //虚线
+        canvasObject = new fabric.Line([mouseFrom.x, mouseFrom.y, mouseTo.x, mouseTo.y], {
+          strokeDashArray: [3, 1],
+          stroke: color,
+          strokeWidth: drawWidth
+        });
+        break;
+      case "text":
+        textbox = new fabric.Textbox("", {
+          left: mouseFrom.x - 60,
+          top: mouseFrom.y - 20,
+          width: 150,
+          fontSize: 18,
+          borderColor: "#2c2c2c",
+          fill: color,
+          hasControls: false
+        });
+        canvas.add(textbox);
+        textbox.enterEditing();
+        textbox.hiddenTextarea.focus();
+        break;
+      case 'right': //整题正确
+        var step = 30;
+        var path =
+          "M " +
+          (mouseFrom.x - step) +
+          " " +
+          (mouseFrom.y - step) +
+          " L " +
+          mouseFrom.x +
+          " " +
+          mouseFrom.y +
+          " L " +
+          (mouseFrom.x + step * 2) +
+          " " +
+          (mouseFrom.y - step * 2);
+        canvasObject = new fabric.Path(path, {
+          stroke: rightColor,
+          strokeWidth: drawWidth,
+          fill: "rgba(255, 255, 255, 0)"
+        });
+        break;
+      case 'wrong': //整题错误
+        var step = 30;
+        var path =
+          "M " +
+          (mouseFrom.x - step) +
+          " " +
+          (mouseFrom.y - step) +
+          " L " +
+          (mouseFrom.x + step) +
+          " " +
+          (mouseFrom.y + step) +
+          "M " +
+          (mouseFrom.x + step) +
+          " " +
+          (mouseFrom.y - step) +
+          " L " +
+          (mouseFrom.x - step) +
+          " " +
+          (mouseFrom.y + step);
+        canvasObject = new fabric.Path(path, {
+          stroke: wrongColor,
+          strokeWidth: drawWidth,
+          fill: "rgba(255, 255, 255, 0)"
+        });
+        break;
+      case 'smallright': //题目内单个正确
+        var step = 10;
+        var path =
+          "M " +
+          (mouseFrom.x - step) +
+          " " +
+          (mouseFrom.y - step) +
+          " L " +
+          mouseFrom.x +
+          " " +
+          mouseFrom.y +
+          " L " +
+          (mouseFrom.x + step * 2) +
+          " " +
+          (mouseFrom.y - step * 2);
+        canvasObject = new fabric.Path(path, {
+          stroke: rightColor,
+          strokeWidth: drawWidth,
+          fill: "rgba(255, 255, 255, 0)"
+        });
+        break;
+      case 'smallwrong': //题目内单个错误
+        var step = 10;
+        var path =
+          "M " +
+          (mouseFrom.x - step) +
+          " " +
+          (mouseFrom.y - step) +
+          " L " +
+          (mouseFrom.x + step) +
+          " " +
+          (mouseFrom.y + step) +
+          "M " +
+          (mouseFrom.x + step) +
+          " " +
+          (mouseFrom.y - step) +
+          " L " +
+          (mouseFrom.x - step) +
+          " " +
+          (mouseFrom.y + step);
+        canvasObject = new fabric.Path(path, {
+          stroke: wrongColor,
+          strokeWidth: drawWidth,
+          fill: "rgba(255, 255, 255, 0)"
+        });
+        break;
+      case "remove":
+        break;
+      default:
+        break;
+    }
+    if (canvasObject) {
+      // canvasObject.index = getCanvasObjectIndex();
+      canvasObject.type = drawType;
+      canvas.add(canvasObject); //.setActiveObject(canvasObject)
+      drawingObject = canvasObject;
+    }
+  }
+
+  //绘制箭头方法
+  function drawArrow(fromX, fromY, toX, toY, theta, headlen) {
+    theta = typeof theta != "undefined" ? theta : 30;
+    headlen = typeof theta != "undefined" ? headlen : 10;
+    // 计算各角度和对应的P2,P3坐标
+    var angle = Math.atan2(fromY - toY, fromX - toX) * 180 / Math.PI,
+      angle1 = (angle + theta) * Math.PI / 180,
+      angle2 = (angle - theta) * Math.PI / 180,
+      topX = headlen * Math.cos(angle1),
+      topY = headlen * Math.sin(angle1),
+      botX = headlen * Math.cos(angle2),
+      botY = headlen * Math.sin(angle2);
+    var arrowX = fromX - topX,
+      arrowY = fromY - topY;
+    var path = " M " + fromX + " " + fromY;
+    path += " L " + toX + " " + toY;
+    arrowX = toX + topX;
+    arrowY = toY + topY;
+    path += " M " + arrowX + " " + arrowY;
+    path += " L " + toX + " " + toY;
+    arrowX = toX + botX;
+    arrowY = toY + botY;
+    path += " L " + arrowX + " " + arrowY;
+    return path;
+  }
+
+  //获取画板对象的下标
+  function getCanvasObjectIndex() {
+    return canvasObjectIndex++;
+  }
+})();

+ 269 - 0
dist/www/CocoRoboDesktop/drawingboard-master/drawingboard/js/check/canvas.js

@@ -0,0 +1,269 @@
+//变量声明
+var mouseFrom = {},
+  mouseTo = {},
+  drawType = 'right', //画板绘制类型
+  canvasObjectIndex = 0;
+var drawWidth = 2; //笔触宽度
+var modifySize = 20, modifySmallSize = 10; //大/小 | 对/错画笔直径大小
+var color = "#E34F51"; //画笔颜色
+var drawingObject = null; //当前绘制对象
+var moveCount = 1; //绘制移动计数器
+var doDrawing = false; // 绘制状态
+var rightColor = "#008B00", wrongColor = "#E34F51";
+// var modifyImg = null;//当前批改的图片
+var appErrCount = 0;//全局错误个数
+var errTextBoxArray = new Array();
+var canvasArr = [];  //所有(fabric产生)的canvas对象
+
+
+//切换画板
+function switchCanvas(url, index) {
+  var canvasId = "c" + index;
+  jQuery("#canvasDiv").find("div").addClass("fn-hide");
+  jQuery("#canvasDiv").find("div").eq(index).removeClass("fn-hide");
+  if (canvasArr[index]) {
+    //canvas已经存在
+    window.canvas = canvasArr[index];
+    return false;
+  }
+  var canvas = new fabric.Canvas(canvasId, {
+    isDrawingMode: false,
+    skipTargetFind: true,
+    selectable: false,
+    selection: false
+  });
+  fabric.Image.fromURL(url, function (img) {
+    canvas.add(img);
+  }, { crossOrigin: 'anonymous' });
+  canvasArr[index] = canvas;
+  canvas.freeDrawingBrush.color = color; //设置自由绘颜色
+  canvas.freeDrawingBrush.width = drawWidth;
+  window.canvas = canvas;
+
+  //绑定画板事件
+  canvas.on("mouse:down", function (options) {
+    var xy = transformMouse(options.e.offsetX, options.e.offsetY);
+    mouseFrom.x = xy.x;
+    mouseFrom.y = xy.y;
+    doDrawing = true;
+  });
+  canvas.on("mouse:up", function (options) {
+    var xy = transformMouse(options.e.offsetX, options.e.offsetY);
+    mouseTo.x = xy.x;
+    mouseTo.y = xy.y;
+    drawing();
+    drawingObject = null;
+    moveCount = 1;
+    doDrawing = false;
+    if (drawType.indexOf("wrong") != -1) {
+      //有错题
+      jQuery("#errModal").removeClass("fn-hide");
+      jQuery("#errModal").find("div[name=etag]").removeClass("active");
+      ++appErrCount;
+      var addLeft = 10, addTop = 25;
+      if (drawType == "wrong") {
+        addLeft = 25;
+        addTop = 30;
+      }
+      var textbox = new fabric.Textbox(appErrCount.toString(), {
+        left: mouseFrom.x + addLeft,
+        top: mouseFrom.y - addTop,
+        fontSize: 18,
+        borderColor: "#2c2c2c",
+        fill: color,
+        hasControls: false,
+        eindex: (appErrCount - 1),
+        type: "textbox"
+      });
+      canvas.add(textbox);
+      errTextBoxArray[appErrCount] = textbox;
+    }
+  });
+  canvas.on("mouse:move", function (options) {
+    if (moveCount % 2 && !doDrawing) {
+      //减少绘制频率
+      return;
+    }
+    moveCount++;
+    var xy = transformMouse(options.e.offsetX, options.e.offsetY);
+    mouseTo.x = xy.x;
+    mouseTo.y = xy.y;
+    drawing();
+  });
+  canvas.on("selection:created", function (e) {
+    if (e.target._objects) {
+      //多选删除
+      var etCount = e.target._objects.length;
+      for (var etindex = 0; etindex < etCount; etindex++) {
+        if (e.target._objects[etindex].type == "image" || e.target._objects[etindex].type == "textbox") {
+          continue;
+        }
+        var eindex = e.target._objects[etindex].eindex;
+        canvas.remove(errTextBoxArray[(1 + eindex)]); //移除对应右上角的数字
+        delete errTextBoxArray[(1 + eindex)];
+
+        canvas.remove(e.target._objects[etindex]);
+
+        //移除作业批注
+        var errMsgChildren = jQuery("#errMsg").children();
+        errMsgChildren.eq(errMsgChildren.length - 1 - eindex).addClass("fn-hide");
+      }
+    } else {
+      //单选删除
+      if (e.target.type != "image" && e.target.type != "textbox") {
+        var eindex = e.target.eindex;
+        canvas.remove(errTextBoxArray[(1 + eindex)]); //移除对应右上角的数字
+        delete errTextBoxArray[(1 + eindex)];
+        canvas.remove(e.target);
+
+        //移除作业批注
+        var errMsgChildren = jQuery("#errMsg").children();
+        errMsgChildren.eq(errMsgChildren.length - 1 - eindex).addClass("fn-hide");
+
+      }
+    }
+    canvas.discardActiveObject(); //清楚选中框
+  });
+
+
+}
+
+window.zoom = window.zoom ? window.zoom : 1;
+// window.drawType = drawType;
+
+//坐标转换
+function transformMouse(mouseX, mouseY) {
+  return { x: mouseX / window.zoom, y: mouseY / window.zoom };
+}
+
+//绘画方法
+function drawing() {
+  if (drawingObject) {
+    canvas.remove(drawingObject);
+  }
+  var canvasObject = null;
+  switch (drawType) {
+    case 'right': //整题正确
+      var path =
+        "M " +
+        (mouseFrom.x - modifySize) +
+        " " +
+        (mouseFrom.y - modifySize) +
+        " L " +
+        mouseFrom.x +
+        " " +
+        mouseFrom.y +
+        " L " +
+        (mouseFrom.x + modifySize * 2) +
+        " " +
+        (mouseFrom.y - modifySize * 2);
+      canvasObject = new fabric.Path(path, {
+        stroke: rightColor,
+        strokeWidth: drawWidth,
+        fill: "rgba(255, 255, 255, 0)"
+      });
+      break;
+    case 'wrong': //整题错误
+      var path =
+        "M " +
+        (mouseFrom.x - modifySize) +
+        " " +
+        (mouseFrom.y - modifySize) +
+        " L " +
+        (mouseFrom.x + modifySize) +
+        " " +
+        (mouseFrom.y + modifySize) +
+        "M " +
+        (mouseFrom.x + modifySize) +
+        " " +
+        (mouseFrom.y - modifySize) +
+        " L " +
+        (mouseFrom.x - modifySize) +
+        " " +
+        (mouseFrom.y + modifySize);
+      canvasObject = new fabric.Path(path, {
+        stroke: wrongColor,
+        strokeWidth: drawWidth,
+        eindex: appErrCount,
+        fill: "rgba(255, 255, 255, 0)"
+      });
+
+      // canvas.add();
+      break;
+    case 'smallright': //题目内单个正确
+      var path =
+        "M " +
+        (mouseFrom.x - modifySmallSize) +
+        " " +
+        (mouseFrom.y - modifySmallSize) +
+        " L " +
+        mouseFrom.x +
+        " " +
+        mouseFrom.y +
+        " L " +
+        (mouseFrom.x + modifySmallSize * 2) +
+        " " +
+        (mouseFrom.y - modifySmallSize * 2);
+      canvasObject = new fabric.Path(path, {
+        stroke: rightColor,
+        strokeWidth: drawWidth,
+        fill: "rgba(255, 255, 255, 0)"
+      });
+      break;
+    case 'smallwrong': //题目内单个错误
+      var path =
+        "M " +
+        (mouseFrom.x - modifySmallSize) +
+        " " +
+        (mouseFrom.y - modifySmallSize) +
+        " L " +
+        (mouseFrom.x + modifySmallSize) +
+        " " +
+        (mouseFrom.y + modifySmallSize) +
+        "M " +
+        (mouseFrom.x + modifySmallSize) +
+        " " +
+        (mouseFrom.y - modifySmallSize) +
+        " L " +
+        (mouseFrom.x - modifySmallSize) +
+        " " +
+        (mouseFrom.y + modifySmallSize);
+      canvasObject = new fabric.Path(path, {
+        stroke: wrongColor,
+        strokeWidth: drawWidth,
+        eindex: appErrCount,
+        fill: "rgba(255, 255, 255, 0)"
+      });
+      break;
+    case "rectangle": //圈题
+      canvasObject = new fabric.Rect({
+        top: mouseFrom.y,
+        left: mouseFrom.x,
+        width: (mouseTo.x - mouseFrom.x),
+        height: (mouseTo.y - mouseFrom.y),
+        stroke: color,
+        strokeWidth: drawWidth,
+        fill: "rgba(255, 255, 255, 0)"
+      });
+      break;
+    case "remove":
+      break;
+    case "help":
+
+      break;
+    default:
+
+      break;
+  }
+  if (canvasObject) {
+    // canvasObject.index = getCanvasObjectIndex();
+    canvasObject.type = drawType;
+    canvas.add(canvasObject); //.setActiveObject(canvasObject)
+    drawingObject = canvasObject;
+  }
+}
+
+//获取画板对象的下标
+function getCanvasObjectIndex() {
+  return canvasObjectIndex++;
+}

+ 9 - 0
dist/www/CocoRoboDesktop/drawingboard-master/drawingboard/js/check/config.js

@@ -0,0 +1,9 @@
+/**
+ * 服务器地址
+ */
+var config = {
+    tokenURL: 'http://172.16.10.79:8360/qiniu/gettoken',
+    checkURL: 'http://third.172.16.11.49.xip.io/wq.php/record/correct',
+    imgDomain: 'http://img.yousi.com/',  //图片域名
+    callbackURL: 'http://172.16.10.78:7777/index/content/homework_main.html'
+};

+ 17 - 0
dist/www/CocoRoboDesktop/drawingboard-master/drawingboard/js/check/fontsize.js

@@ -0,0 +1,17 @@
+(function (doc, win) {
+    var docEl = doc.documentElement,
+        resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize',
+        recalc = function () {
+            var clientWidth = docEl.clientWidth;
+            if (!clientWidth) return;
+            if(clientWidth>=3200){
+                docEl.style.fontSize = '100px';
+            }else{
+                docEl.style.fontSize = 100 * (clientWidth / 3200) + 'px';
+            }
+        };
+
+    if (!doc.addEventListener) return;
+    win.addEventListener(resizeEvt, recalc, false);
+    doc.addEventListener('DOMContentLoaded', recalc, false);
+})(document, window);

ファイルの差分が大きいため隠しています
+ 0 - 0
dist/www/CocoRoboDesktop/drawingboard-master/drawingboard/js/check/qiniu.min.js


+ 287 - 0
dist/www/CocoRoboDesktop/drawingboard-master/drawingboard/js/demo.js

@@ -0,0 +1,287 @@
+(function () {
+  //变量声明
+  var mouseFrom = {},
+    mouseTo = {},
+    drawType = null,
+    canvasObjectIndex = 0,
+    textbox = null;
+  var drawWidth = 2; //笔触宽度
+  var color = "#E34F51"; //画笔颜色
+  var drawingObject = null; //当前绘制对象
+  var moveCount = 1; //绘制移动计数器
+  var doDrawing = false; // 绘制状态
+
+  //初始化画板
+  var canvas = new fabric.Canvas("c", {
+    isDrawingMode: true,
+    skipTargetFind: true,
+    selectable: false,
+    selection: false
+  });
+
+  window.canvas = canvas;
+  window.zoom = window.zoom ? window.zoom : 1;
+
+  canvas.freeDrawingBrush.color = color; //设置自由绘颜色
+  canvas.freeDrawingBrush.width = drawWidth;
+
+  //绑定画板事件
+  canvas.on("mouse:down", function (options) {
+    var xy = transformMouse(options.e.offsetX, options.e.offsetY);
+    mouseFrom.x = xy.x;
+    mouseFrom.y = xy.y;
+    doDrawing = true;
+  });
+  canvas.on("mouse:up", function (options) {
+    var xy = transformMouse(options.e.offsetX, options.e.offsetY);
+    mouseTo.x = xy.x;
+    mouseTo.y = xy.y;
+    // drawing();
+    drawingObject = null;
+    moveCount = 1;
+    doDrawing = false;
+  });
+  canvas.on("mouse:move", function (options) {
+    if (moveCount % 2 && !doDrawing) {
+      //减少绘制频率
+      return;
+    }
+    moveCount++;
+    var xy = transformMouse(options.e.offsetX, options.e.offsetY);
+    mouseTo.x = xy.x;
+    mouseTo.y = xy.y;
+    drawing();
+  });
+
+  canvas.on("selection:created", function (e) {
+    if (e.target._objects) {
+      //多选删除
+      var etCount = e.target._objects.length;
+      for (var etindex = 0; etindex < etCount; etindex++) {
+        canvas.remove(e.target._objects[etindex]);
+      }
+    } else {
+      //单选删除
+      canvas.remove(e.target);
+    }
+    canvas.discardActiveObject(); //清楚选中框
+  });
+
+  //坐标转换
+  function transformMouse(mouseX, mouseY) {
+    return { x: mouseX / window.zoom, y: mouseY / window.zoom };
+  }
+
+  //绑定工具事件
+  jQuery("#toolsul")
+    .find("li")
+    .on("click", function () {
+      //设置样式
+      jQuery("#toolsul")
+        .find("li>i")
+        .each(function () {
+          jQuery(this).attr("class", jQuery(this).attr("data-default"));
+        });
+      jQuery(this)
+        .addClass("active")
+        .siblings()
+        .removeClass("active");
+      jQuery(this)
+        .find("i")
+        .attr(
+          "class",
+          jQuery(this)
+            .find("i")
+            .attr("class")
+            .replace("black", "select")
+        );
+      drawType = jQuery(this).attr("data-type");
+      canvas.isDrawingMode = false;
+      if (textbox) {
+        //退出文本编辑状态
+        textbox.exitEditing();
+        textbox = null;
+      }
+      if (drawType == "pen") {
+        canvas.isDrawingMode = true;
+      } else if (drawType == "remove") {
+        canvas.selection = true;
+        canvas.skipTargetFind = false;
+        canvas.selectable = true;
+      } else {
+        canvas.skipTargetFind = true; //画板元素不能被选中
+        canvas.selection = false; //画板不显示选中
+      }
+    });
+
+  //绘画方法
+  function drawing() {
+    if (drawingObject) {
+      canvas.remove(drawingObject);
+    }
+    var canvasObject = null;
+    switch (drawType) {
+      case "arrow": //箭头
+        canvasObject = new fabric.Path(drawArrow(mouseFrom.x, mouseFrom.y, mouseTo.x, mouseTo.y, 30, 30), {
+          stroke: color,
+          fill: "rgba(255,255,255,0)",
+          strokeWidth: drawWidth
+        });
+        break;
+      case "line": //直线
+        canvasObject = new fabric.Line([mouseFrom.x, mouseFrom.y, mouseTo.x, mouseTo.y], {
+          stroke: color,
+          strokeWidth: drawWidth
+        });
+        break;
+      case "dottedline": //虚线
+        canvasObject = new fabric.Line([mouseFrom.x, mouseFrom.y, mouseTo.x, mouseTo.y], {
+          strokeDashArray: [3, 1],
+          stroke: color,
+          strokeWidth: drawWidth
+        });
+        break;
+      case "circle": //正圆
+        var left = mouseFrom.x,
+          top = mouseFrom.y;
+        var radius = Math.sqrt((mouseTo.x - left) * (mouseTo.x - left) + (mouseTo.y - top) * (mouseTo.y - top)) / 2;
+        canvasObject = new fabric.Circle({
+          left: left,
+          top: top,
+          stroke: color,
+          fill: "rgba(255, 255, 255, 0)",
+          radius: radius,
+          strokeWidth: drawWidth
+        });
+        break;
+      case "ellipse": //椭圆
+        var left = mouseFrom.x,
+          top = mouseFrom.y;
+        var radius = Math.sqrt((mouseTo.x - left) * (mouseTo.x - left) + (mouseTo.y - top) * (mouseTo.y - top)) / 2;
+        canvasObject = new fabric.Ellipse({
+          left: left,
+          top: top,
+          stroke: color,
+          fill: "rgba(255, 255, 255, 0)",
+          originX: "center",
+          originY: "center",
+          rx: Math.abs(left - mouseTo.x),
+          ry: Math.abs(top - mouseTo.y),
+          strokeWidth: drawWidth
+        });
+        break;
+      case "square": //TODO:正方形(后期完善)
+        break;
+      case "rectangle": //长方形
+        var path =
+          "M " +
+          mouseFrom.x +
+          " " +
+          mouseFrom.y +
+          " L " +
+          mouseTo.x +
+          " " +
+          mouseFrom.y +
+          " L " +
+          mouseTo.x +
+          " " +
+          mouseTo.y +
+          " L " +
+          mouseFrom.x +
+          " " +
+          mouseTo.y +
+          " L " +
+          mouseFrom.x +
+          " " +
+          mouseFrom.y +
+          " z";
+        canvasObject = new fabric.Path(path, {
+          left: left,
+          top: top,
+          stroke: color,
+          strokeWidth: drawWidth,
+          fill: "rgba(255, 255, 255, 0)"
+        });
+        //也可以使用fabric.Rect
+        break;
+      case "rightangle": //直角三角形
+        var path = "M " + mouseFrom.x + " " + mouseFrom.y + " L " + mouseFrom.x + " " + mouseTo.y + " L " + mouseTo.x + " " + mouseTo.y + " z";
+        canvasObject = new fabric.Path(path, {
+          left: left,
+          top: top,
+          stroke: color,
+          strokeWidth: drawWidth,
+          fill: "rgba(255, 255, 255, 0)"
+        });
+        break;
+      case "equilateral": //等边三角形
+        var height = mouseTo.y - mouseFrom.y;
+        canvasObject = new fabric.Triangle({
+          top: mouseFrom.y,
+          left: mouseFrom.x,
+          width: Math.sqrt(Math.pow(height, 2) + Math.pow(height / 2.0, 2)),
+          height: height,
+          stroke: color,
+          strokeWidth: drawWidth,
+          fill: "rgba(255,255,255,0)"
+        });
+        break;
+      case "isosceles":
+        break;
+      case "text":
+        textbox = new fabric.Textbox("", {
+          left: mouseFrom.x - 60,
+          top: mouseFrom.y - 20,
+          width: 150,
+          fontSize: 18,
+          borderColor: "#2c2c2c",
+          fill: color,
+          hasControls: false
+        });
+        canvas.add(textbox);
+        textbox.enterEditing();
+        textbox.hiddenTextarea.focus();
+        break;
+      case "remove":
+        break;
+      default:
+        break;
+    }
+    if (canvasObject) {
+      // canvasObject.index = getCanvasObjectIndex();
+      canvas.add(canvasObject); //.setActiveObject(canvasObject)
+      drawingObject = canvasObject;
+    }
+  }
+
+  //绘制箭头方法
+  function drawArrow(fromX, fromY, toX, toY, theta, headlen) {
+    theta = typeof theta != "undefined" ? theta : 30;
+    headlen = typeof theta != "undefined" ? headlen : 10;
+    // 计算各角度和对应的P2,P3坐标
+    var angle = Math.atan2(fromY - toY, fromX - toX) * 180 / Math.PI,
+      angle1 = (angle + theta) * Math.PI / 180,
+      angle2 = (angle - theta) * Math.PI / 180,
+      topX = headlen * Math.cos(angle1),
+      topY = headlen * Math.sin(angle1),
+      botX = headlen * Math.cos(angle2),
+      botY = headlen * Math.sin(angle2);
+    var arrowX = fromX - topX,
+      arrowY = fromY - topY;
+    var path = " M " + fromX + " " + fromY;
+    path += " L " + toX + " " + toY;
+    arrowX = toX + topX;
+    arrowY = toY + topY;
+    path += " M " + arrowX + " " + arrowY;
+    path += " L " + toX + " " + toY;
+    arrowX = toX + botX;
+    arrowY = toY + botY;
+    path += " L " + arrowX + " " + arrowY;
+    return path;
+  }
+
+  //获取画板对象的下标
+  function getCanvasObjectIndex() {
+    return canvasObjectIndex++;
+  }
+})();

ファイルの差分が大きいため隠しています
+ 0 - 0
dist/www/CocoRoboDesktop/drawingboard-master/drawingboard/js/fabric.min.js


ファイルの差分が大きいため隠しています
+ 1 - 0
dist/www/CocoRoboDesktop/drawingboard-master/drawingboard/js/jquery.min.js


ファイルの差分が大きいため隠しています
+ 0 - 0
dist/www/CocoRoboDesktop/drawingboard-master/drawingboard/js/tools/md5.min.js


+ 109 - 0
dist/www/CocoRoboDesktop/drawingboard-master/drawingboard/js/tools/upload.js

@@ -0,0 +1,109 @@
+//图片上传 (uploadImageArray = [{"name":"xxx","base64":"xxx"}])
+function uploadImg(uploadImageArray, qiniuToken) {
+    if (uploadImageArray && uploadImageArray.length > 0 && qiniuToken) {
+        //上传,返回地址
+        var putExtra = {
+            fname: "",
+            params: {},
+            mimeType: [] || null
+        };
+        var config = {
+            useCdnDomain: true
+        };
+        window.WinSuccCount = 0;
+        window.WinUploadImgCount = uploadImageArray.length;
+        for (var i = 0; i < uploadImageArray.length; i++) {
+            doUpload(uploadImageArray[i].name, uploadImageArray[i].base64.replace('data:image/png;base64,', ''), qiniuToken);
+        }
+    }
+}
+
+//图片上传七牛云
+function doUpload(name, base64, qiniuToken) {
+    //图片上传(base64模式直传)
+    var urlkey = toBase64(name); //自定义文件名必须是base64格式的
+    var url = "http://upload.qiniup.com/putb64/-1/key/" + urlkey; //非华东空间需要根据注意事项-修改上传域名(upload.qiniup.com)
+    var xhr = new XMLHttpRequest();
+    xhr.onreadystatechange = function () {
+        if (xhr.readyState == 4) {
+            //返回信息
+            console.log(xhr.responseText);
+
+            //检测是否上传完毕,提交请求给服务器
+            ++window.WinSuccCount;
+            if (window.WinUploadImgCount == window.WinSuccCount) {
+                reqCheckServer();
+                window.WinSuccCount = 0;
+                window.WinUploadImgCount = 0;
+            }
+        }
+    }
+    xhr.open("POST", url, true);
+    xhr.setRequestHeader("Content-Type", "application/octet-stream");
+    xhr.setRequestHeader("Authorization", "UpToken " + qiniuToken);
+    xhr.send(base64);
+}
+
+//提交作业批改(php)
+function reqCheckServer() {
+    if (window.checkJson) {
+        // prompt("最终结果", window.checkJson);
+        jQuery.ajax({
+            type: "POST",
+            url: config.checkURL,
+            data: { "param": window.checkJson },
+            success: function (res) {
+                location.href = config.callbackURL;
+                console.log(res);
+            }
+        });
+        jQuery("#maskDiv").hide();
+    }
+}
+
+function toBase64(data) {
+    var toBase64Table = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
+    var base64Pad = '=';
+    var result = '';
+    var length = data.length;
+    var i;
+    for (i = 0; i < (length - 2); i += 3) {
+        result += toBase64Table[data.charCodeAt(i) >> 2];
+        result += toBase64Table[((data.charCodeAt(i) & 0x03) << 4) + (data.charCodeAt(i + 1) >> 4)];
+        result += toBase64Table[((data.charCodeAt(i + 1) & 0x0f) << 2) + (data.charCodeAt(i + 2) >> 6)];
+        result += toBase64Table[data.charCodeAt(i + 2) & 0x3f];
+    }
+    if (length % 3) {
+        i = length - (length % 3);
+        result += toBase64Table[data.charCodeAt(i) >> 2];
+        if ((length % 3) == 2) {
+            result += toBase64Table[((data.charCodeAt(i) & 0x03) << 4) + (data.charCodeAt(i + 1) >> 4)];
+            result += toBase64Table[(data.charCodeAt(i + 1) & 0x0f) << 2];
+            result += base64Pad;
+        } else {
+            result += toBase64Table[(data.charCodeAt(i) & 0x03) << 4];
+            result += base64Pad + base64Pad;
+        }
+    }
+    return result;
+}
+
+//base64转blob
+function base64ToBlob(base64, contentType, sliceSize) {
+    contentType = contentType || '';
+    sliceSize = sliceSize || 512;
+    var byteCharacters = atob(base64);
+    var byteArrays = [];
+
+    for (var offset = 0; offset < byteCharacters.length; offset += sliceSize) {
+        var slice = byteCharacters.slice(offset, offset + sliceSize);
+        var byteNumbers = new Array(slice.length);
+        for (var i = 0; i < slice.length; i++) {
+            byteNumbers[i] = slice.charCodeAt(i);
+        }
+        var byteArray = new Uint8Array(byteNumbers);
+        byteArrays.push(byteArray);
+    }
+    var blob = new Blob(byteArrays, { type: contentType });
+    return blob;
+}

+ 5 - 0
dist/www/CocoRoboDesktop/drawingboard-master/drawingboard/js/tools/uuid.js

@@ -0,0 +1,5 @@
+/**
+ * 注意:这不是真正的GUID,无法在Javascript中生成真正的GUID,因为它们依赖于浏览器不公开的本地计算机的属性。
+ * 可以配合时间戳:md5(uuid.uuid() + new Date().getTime())重复性更小
+ */
+(function(){var _uuid={uuid:function(){var s=[];var hexDigits="0123456789abcdef";for(var i=0;i<36;i++){s[i]=hexDigits.substr(Math.floor(Math.random()*16),1)}s[14]="4";s[19]=hexDigits.substr((s[19]&3)|8,1);s[8]=s[13]=s[18]=s[23]="-";var uuid=s.join("");return uuid}};this.uuid=_uuid})();

+ 29 - 0
dist/www/CocoRoboDesktop/drawingboard-master/drawingboard/test.html

@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+    <meta charset="UTF-8">
+    <title>test页面</title>
+</head>
+
+<body>
+
+    <script type="text/javascript" src="../js/jquery.min.js"></script>
+    <script type="text/javascript" src="../js/check/qiniu.min.js"></script>
+
+    <button>提交</button>
+
+    <script>
+        jQuery.ajax({
+            type: "POST",
+            url: "http://third.172.16.11.49.xip.io/wq.php/Record/wrongQuestion",
+            data: { "roomid": "111" },
+            success: function (res) {
+                console.log(res);
+            }
+        });
+
+    </script>
+</body>
+
+</html>

+ 305 - 0
dist/www/CocoRoboDesktop/index.html

@@ -0,0 +1,305 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wb="http://open.weibo.com/wb" style="overflow: hidden;">
+
+<head>
+    <meta http-equiv="P3P" content='CP="IDC DSP COR CURa ADMa  OUR IND PHY ONL COM STA"' />
+    <meta name="msapplication-window" content="width=1360;height=768" />
+    <meta http-equiv="Cache-Control" content="no-transform" />
+    <meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1" />
+    <meta name="renderer" content="webkit" />
+    <meta name="application-name" content="智慧课堂平台" />
+    <meta name="msapplication-tooltip" content="智慧课堂平台" />
+    <meta http-equiv="pragma" content="no-cache" />
+    <meta http-equiv="Cache-Control" content="no-cache, must-revalidate" />
+    <meta http-equiv="expires" content="Wed, 26 Feb 1997 08:21:57 GMT" />
+    <meta name="msapplication-window" content="width=100%;height=100%" />
+    <meta name="format-detection" content="telephone=no" />
+    <meta name="viewport" content="width=1024, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" />
+    <meta name="viewport"
+        content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no, target-densitydpi=device-dpi" />
+    <meta name="viewport" content="width=device-width, target-densityDpi=medium-dpi" />
+    <meta name="viewport"
+        content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no" />
+    <meta name="viewport" content="width=device-width,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no" />
+    <meta content="yes" name="apple-mobile-web-app-capable" />
+    <meta content="telephone=no" name="format-detection" />
+    <meta name="apple-mobile-web-app-status-bar-style" content="black" />
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    <meta property="wb:webmaster" content="31656711026d7228" />
+    <meta property="qc:admins" content="103224276361473636" />
+    <meta name="baidu-tc-cerfication" content="2380c76f3aa8a080de8fda7e2659a58b" />
+    <link rel="apple-touch-icon-precomposed" sizes="72x72" href="" />
+    <link rel="apple-touch-icon-precomposed" sizes="144x144" href="" />
+    <link href="img/favicon.ico" rel="Shortcut Icon" />
+    <title>智慧平台</title>
+    <link href="css/Desktop/Desktop.css" rel="stylesheet" type="text/css" />
+    <link href="./css/Desktop/Desktop.css" rel="stylesheet" type="text/css" />
+    <link href="css/Desktop/Taskbar.css" rel="stylesheet" type="text/css" />
+
+    <link href="./css/Controls/Upload.css" rel="stylesheet" type="text/css" />
+    <link href="./css/Controls/Basic/Face.css" rel="stylesheet" type="text/css" />
+    <link href="./css/Controls/Basic/Music.css" rel="stylesheet" type="text/css" />
+    <link href="./css/Controls/Basic/Calendar.css" rel="stylesheet" type="text/css" />
+    <link href="./css/DomanSystem/DomanSystem.css" rel="stylesheet" type="text/css" />
+    <script type="text/javascript">
+        document.domain = document.domain.split(".").slice(-2).join(".");
+    </script>
+    <meta name="viewport" id="viewportMeta">
+    <script>
+        var initViewport = function (height, width) {
+            var metaEl = document.querySelector("#viewportMeta");
+            var content = "height=" + height + ",width=" + width + ",initial-scale=1.0,user-scalable=no";
+            metaEl.setAttribute('name', 'viewport');
+            metaEl.setAttribute('content', content);
+        }
+        var realHeight = window.innerHeight > window.innerWidth ? window.innerWidth : window.innerHeight
+        var realWidth = window.innerHeight > window.innerWidth ? window.innerHeight : window.innerWidth
+        initViewport(realHeight, realWidth);
+    </script>
+</head>
+
+<body scroll="no" class="U_MD_D_NotText Scrollbar" style="overflow: hidden;">
+    <!-- 应用窗体 -->
+    <div id="U_MD_Home" class="U_MD_Home" __top__="false" unselectable="on" contenteditable="false">
+        <div class="UD_Dtop" id="UD_Dtop" __top__="false">
+            <div class="U_MD_D" id="U_MD_D" __top__="false">
+                <div id="U_MD_D_BG" __top__="false">
+                </div>
+                <div class="U_MD_D_K" id="U_MD_D_K" __top__="false">
+                </div>
+                <div class="U_MD_D_RW" onmouseover="U.MD.D.I.displayTaskbar(this)"
+                    onmouseout="U.MD.D.I.hiddenTaskbarout(this)">
+                    <div class="U_MD_D_RW_L">
+                        <div class="U_MD_D_RW_I">
+                            <div class="U_MD_D_RW_IO" title="点击隐藏" onclick="U.MD.D.I.hiddenTaskbar(this);">
+                                <img class="U_MD_D_RW_CD" src="./img/clickdown.png" alt="Alternate Text" />
+                            </div>
+                        </div>
+                    </div>
+                    <div id="U_MD_D_RW">
+                    </div>
+                    <div class="U_MD_D_RW_R">
+                        <div class="U_MD_D_RW_GU">
+                            <img class="U_MD_D_RW_GU_g" src="./img/goUp.png" alt="Alternate Text" />
+                        </div>
+                        <div class="U_MD_D_RW_GD">
+                            <img class="U_MD_D_RW_GD_g" src="./img/goDown.png" alt="Alternate Text" />
+                        </div>
+                    </div>
+                </div>
+                <div class="U_MD_D_BD" __top__="false" style="max-width: 165px;">
+                    <div class="U_MD_D_BDA">
+                        <!-- <div class="U_MD_D_BDI U_Img" id="U_MD_D_BDI" title="登录">
+                        </div> -->
+                        <div class="U_MD_D_BDL" id="U_MD_D_BDL" style="width: auto !important;">
+                            <div class="login" onclick="U.MD.U.L.login();" title="登录">
+                                登录
+                            </div>
+                            <div class="register" onclick="U.MD.U.L.register();" title="注册" style="margin-left: 5px;">
+                                注册
+                            </div>
+                            <div class="avatar"><img src="./img/icon/avatar.png" alt=""></div>
+                            <div class="userName"
+                                style="max-width: 86px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;">
+                            </div>
+                            <div class="exit" onclick="U.MD.U.LO.logoutSystem();" title="退出"
+                                style="display: none;margin-left: 5px;color: #888888;">
+                                退出
+                            </div>
+                        </div>
+                    </div>
+                    <!-- <div class="U_MD_D_BD_QRcode">
+                        <img class="U_MD_D_BD_QRcodeImg" src="./img/qrcodeIogo.png" alt="Alternate Text" />
+                    </div> -->
+                    <div class="U_MD_D_BD_QRcodeShare">
+                        <img class="U_MD_D_BD_QRcodeShareImg" src="./img/QRcodeShare.png" alt="Alternate Text" />
+                    </div>
+                </div>
+                <div class="U_MD_D_B" __top__="false" id="U_MD_D_B">
+                    <div class="U_MD_D_BZ" onclick="U.MD.D.A.aboutUs();">
+                        关于我们
+                    </div>
+                </div>
+            </div>
+        </div>
+        <div class="U_MD_D_AG">
+            <div class="U_MD_D_AG_P" id="U_MD_D_AG_P" onselectstart="U.UF.EV.stopBubble();">
+                <pre style="word-wrap: break-word; word-break: break-all; text-align: left;">
+云端注册服务条款
+尊敬的用户,欢迎您注册成为云端用户。在注册前请您仔细阅读如下服务条款:
+本服务协议双方为本网站与云端用户,本服务协议具有合同效力。
+您确认本服务协议后,本服务协议即在您和本网站之间产生法律效力。
+请您务必在注册之前认真阅读全部服务协议内容
+如有任何疑问,可向本网站咨询。
+无论您事实上是否在注册之前认真阅读了本服务协议,
+只要您点击协议正本下方的”注册“按钮并按照本网站注册程序成功注册为用户,
+您的行为仍然表示您同意并签署了本服务协议。
+1.本网站服务条款的确认和接纳本网站各项服务的所有权和运作权归本网站拥有。
+2.用户必须:
+    (1)自行配备上网的所需设备,包括个人电脑、调制解调器或其他必备上网装置。
+    (2)自行负担个人上网所支付的与此服务有关的电话费用、网络费用。
+3.用户在本网站上交易平台上不得发布下列违法信息:
+    (1)反对宪法所确定的基本原则的;
+    (2).危害国家安全,泄露国家秘密,颠覆国家政权,破坏国家统一的;
+    (3).损害国家荣誉和利益的;
+    (4).煽动民族仇恨、民族歧视,破坏民族团结的;
+    (5).破坏国家宗教政策,宣扬邪教和封建迷信的;
+    (6).散布谣言,扰乱社会秩序,破坏社会稳定的;
+    (7).散布淫秽、色情、赌博、暴力、凶杀、恐怖或者教唆犯罪的;
+    (8).侮辱或者诽谤他人,侵害他人合法权益的;
+    (9).含有法律、行政法规禁止的其他内容的。
+4.有关个人资料
+用户同意:
+    (1) 提供及时、详尽及准确的个人资料。
+    (2).同意接收来自本网站的信息。
+    (3) 不断更新注册资料,符合及时、详尽准确的要求。所有原始键入的资料将引用为注册资料。
+    (4)云端不公开用户的姓名、地址、电子邮箱和笔名,以下情况除外:
+        (a)用户授权本网站透露这些信息。
+        (b)相应的法律及程序要求本网站提供用户的个人资料。
+如果用户提供的资料包含有不正确的信息,本网站保留结束用户使用本网站信息服务资格的权利。
+5. 用户在注册时应当选择稳定性及安全性相对较好的电子邮箱
+并且同意接受并阅读本网站发往用户的各类电子邮件。
+如用户未及时从自己的电子邮箱接受电子邮件或因用户电子邮箱或用户电子邮件接收及阅读程序本身的问题使电子邮件无法正常接收或阅读的,
+只要本网站成功发送了电子邮件,
+应当视为用户已经接收到相关的电子邮件。
+电子邮件在发信服务器上所记录的发出时间视为送达时间。
+6.服务条款的修改
+本网站有权在必要时修改服务条款,本网站服务条款一旦发生变动,将会在重要页面上提示修改内容。
+如果不同意所改动的内容,用户可以主动取消获得的本网站信息服务。如果用户继续享用本网站信息服务,
+则视为接受服务条款的变动。本网站保留随时修改或中断服务而不需通知用户的权利。
+本网站行使修改或中断服务的权利,不需对用户或第三方负责。
+7.用户隐私制度
+尊重用户个人隐私是本网站的一项基本政策。所以,本网站一定不会在未经合法用户授权时公开、编辑或透露其注册资料及保存在本网站中的非公开内容,
+除非有法律许可要求或本网站在诚信的基础上认为透露这些信息在以下四种情况是必要的:
+    (1) 遵守有关法律规定,遵从本网站合法服务程序。
+    (2) 保持维护本网站的商标所有权。
+    (3) 在紧急情况下竭力维护用户个人和社会大众的隐私安全。
+    (4)符合其他相关的要求。本网站保留发布会员人口分析资询的权利。
+8.用户的帐号、密码和安全性
+你一旦注册成功成为用户,你将得到一个密码和帐号。
+如果你不保管好自己的帐号和密码安全,将负全部责任。
+另外,每个用户都要对其帐户中的所有活动和事件负全责。
+你可随时根据指示改变你的密码,也可以结束旧的帐户重开一个新帐户。
+用户同意若发现任何非法使用用户帐号或安全漏洞的情况,请立即通告本网站。
+9. 拒绝提供担保
+用户明确同意信息服务的使用由用户个人承担风险。
+本网站不担保服务不会受中断,对服务的及时性,安全性,出错发生都不作担保,但会在能力范围内,避免出错。
+10.有限责任
+本网站对任何直接、间接、偶然、特殊及继起的损害不负责任,这些损害来自:不正当使用本网站服务,
+或用户传送的信息不符合规定等。这些行为都有可能导致本网站形象受损,
+所以本网站事先提出这种损害的可能性,同时会尽量避免这种损害的发生。
+11.信息的储存及限制
+本网站有判定用户的行为是否符合本网站服务条款的要求和精神的权利,
+如果用户违背本网站服务条款的规定,本网站有权中断其服务的帐号。
+12.用户管理
+ 用户必须遵循:
+    (1) 使用信息服务不作非法用途。
+    (2) 不干扰或混乱网络服务。
+    (3) 遵守所有使用服务的网络协议、规定、程序和惯例。用户的行为准则是以因特网法规,政策、程序和惯例为根据的。
+13.保障
+用户同意保障和维护本网站全体成员的利益,负责支付由用户使用超出服务范围引起的律师费用,
+违反服务条款的损害补偿费用,其它人使用用户的电脑、帐号和其它知识产权的追索费。
+14.结束服务
+用户或本网站可随时根据实际情况中断一项或多项服务。
+本网站不需对任何个人或第三方负责而随时中断服务。
+用户若反对任何服务条款的建议或对后来的条款修改有异议,或对本网站服务不满,
+用户可以行使如下权利:
+    (1) 不再使用本网站信息服务。
+    (2) 通知本网站停止对该用户的服务。
+结束用户服务后,用户使用本网站服务的权利马上中止。
+从那时起,用户没有权利,本网站也没有义务传送任何未处理的信息或未完成的服务给用户或第三方。
+15.通告
+所有发给用户的通告都可通过重要页面的公告或电子邮件或常规的信件传送。
+服务条款的修改、服务变更、或其它重要事件的通告都会以此形式进行。
+16.信息内容的所有权
+本网站定义的信息内容包括:文字、软件、声音、相片、录象、图表;
+在广告中全部内容;本网站为用户提供的其它信息。
+所有这些内容受版权、商标、标签和其它财产所有权法律的保护。
+所以,用户只能在本网站和广告商授权下才能使用这些内容,而不能擅自复制、再造这些内容、或创造与内容有关的派生产品。
+17.法律
+本网站信息服务条款要与中华人民共和国的法律解释一致。
+用户和本网站一致同意服从本网站所在地有管辖权的法院管辖。
+如发生本网站服务条款与中华人民共和国法律相抵触时,则这些条款将完全按法律规定重新解释,而其它条款则依旧保持对用户的约束力。</pre>
+            </div>
+        </div>
+        <script src="./uform.js" type="text/javascript"></script>
+        <!--通用函数区域 -->
+        <!--注册命名空间 -->
+        <script src="./js/UForm/Main.js" type="text/javascript"></script>
+        <!--通用函数区域 -->
+        <script src="./js/UForm/Common.js" type="text/javascript"></script>
+        <script src="./js/UForm/Element.js" type="text/javascript"></script>
+        <script src="./js/UForm/Cookie.js" type="text/javascript"></script>
+        <script src="./js/UForm/Event.js" type="text/javascript"></script>
+        <!--字符串处理区域 -->
+        <script src="./js/UForm/Type.js" type="text/javascript"></script>
+        <!--js获取客服端的信息 -->
+        <script src="./js/UForm/ClientInfo.js" type="text/javascript"></script>
+        <!--选择器 -->
+        <script src="./js/UForm/Selector.js" type="text/javascript"></script>
+        <!--浏览器兼容处理 -->
+        <script src="./js/UForm/Compatible.js" type="text/javascript"></script>
+        <!--数据处理 -->
+        <script src="./js/UForm/Json.js" type="text/javascript"></script>
+        <!--动态加载 -->
+        <script src="./js/UForm/DynamicLoad.js" type="text/javascript"></script>
+        <script src="./js/UForm/MainStart.js" type="text/javascript"></script>
+        <!--封装好的上传 -->
+        <script src="./js/UForm/UPload.js" type="text/javascript"></script>
+        <!--最新的图片预览 -->
+        <script src="./js/UForm/Image.js" type="text/javascript"></script>
+        <!--ajax加载局域 -->
+        <script src="./js/UForm/Ajax.js" type="text/javascript"></script>
+        <!--导航切换效果 -->
+        <script src="./js/Common/Switch.js" type="text/javascript"></script>
+        <!--分页控件 -->
+        <script src="./js/Controls/Basic/Page.js" type="text/javascript"></script>
+        <!--时间处理区域 -->
+        <script src="./js/UForm/Date.js" type="text/javascript"></script>
+        <!--Ajax 前进后退 -->
+        <script src="./js/UForm/Navigation.js" type="text/javascript"></script>
+        <!--窗体操作使用 -->
+        <script src="./js/UForm/WindowFunction.js" type="text/javascript"></script>
+        <!--数学函数 -->
+        <script src="./js/UForm/Math.js" type="text/javascript"></script>
+        <!--跨域加载1473 -->
+        <script src="./js/UForm/CrossDomain.js" type="text/javascript"></script>
+        <!--编辑器功能 -->
+        <script src="./js/UForm/Editor.js" type="text/javascript"></script>
+        <!--加密函数区域 -->
+        <script src="./js/UForm/Encrypted.js" type="text/javascript"></script>
+        <!--二维码-->
+        <script src="./js/UForm/QRCode.js" type="text/javascript"></script>
+        <!--广告区域 -->
+        <script src="./js/Common/Advertisement.js" type="text/javascript"></script>
+        <!--事件 -->
+        <script src="./js/Common/Common.js" type="text/javascript"></script>
+        <!--网盘上传 -->
+        <script src="./js/Common/Permission.js" type="text/javascript"></script>
+        <!--网盘权限 -->
+        <script src="./js/Common/Upload.js" type="text/javascript"></script>
+        <!--数据处理 -->
+        <!--url引导 -->
+        <script src="./js/Common/Url.js" type="text/javascript"></script>
+        <!--桌面参数 -->
+        <!--初始化桌面 -->
+        <script src="./js/Desktop/Onload.js" type="text/javascript"></script>
+        <!--桌面应用 -->
+        <script src="./js/Desktop/DeskTop.js" type="text/javascript"></script>
+        <!--任务栏 -->
+        <script src="./js/Desktop/taskbar.js" type="text/javascript"></script>
+        <!--背景设置 -->
+        <script src="./js/Desktop/Background.js" type="text/javascript"></script>
+        <!--计时器 -->
+        <script src="./js/Common/Timer.js" type="text/javascript"></script>
+        <script src="./js/Office/Office.js" type="text/javascript"></script>
+        <script src="./js/Office/Word/WordEditor.js" type="text/javascript"></script>
+        <!--txt使用 -->
+        <script src="./js/Text/Text.js" type="text/javascript"></script>
+        <!--轮训服务-->
+        <script src="./js/Office/Poll.js" type="text/javascript"></script>
+    </div>
+</body>
+
+</html>

+ 104 - 0
dist/www/CocoRoboDesktop/jsMemo/index.html

@@ -0,0 +1,104 @@
+<!DOCTYPE html>
+<html lang="zh-CN">
+
+<head>
+    <meta charset="UTF-8" />
+    <title>js便笺</title>
+    <style type="text/css">
+        body {
+            margin: 0;
+            padding: 0;
+            background-color: #fff;
+        }
+        
+        .note-container {
+            position: absolute;
+            width: 300px;
+            height: 400px;
+            background-color: #f1f180;
+            box-shadow: 0 3px 20px rgba(0, 0, 0, .25);
+            border-radius: 5px;
+            overflow: hidden;
+            box-shadow: 0 0 20px #000;
+        }
+        
+        .note-title {
+            position: relative;
+            width: 100%;
+            color: #000;
+            background-color: #e4be32;
+            user-select: none;
+            cursor: default;
+        }
+        
+        .note-title h6 {
+            margin: 0;
+            padding-left: 15px;
+            font-size: 16px;
+            font-weight: 700;
+            height: 40px;
+            line-height: 40px;
+        }
+        
+        .note-title .btn-close {
+            position: absolute;
+            height: 40px;
+            width: 40px;
+            line-height: 40px;
+            right: 0;
+            top: 0;
+            color: #000;
+            text-align: center;
+            text-decoration: none;
+        }
+        
+        .note-title .btn-close:hover {
+            background-color: #c3a01e;
+            color: #fff;
+        }
+        
+        .note-content {
+            height: 300px;
+            padding: 10px;
+            overflow-y: auto;
+            outline: none;
+        }
+        
+        .note-footer {
+            height: 40px;
+            line-height: 40px;
+            display: -webkit-flex;
+            display: -moz-flex;
+            display: -ms-flex;
+            display: -o-flex;
+            display: flex;
+        }
+        
+        .note-footer .btn-new,
+        .note-footer .btn-remove {
+            flex: 1;
+            width: 40px;
+            height: 40px;
+            color: #333;
+            text-align: center;
+            font-size: 16px;
+            font-weight: 700;
+            text-decoration: none;
+            outline: none;
+            border: none;
+            background-color: #e4be32;
+        }
+        
+        .note-footer .btn-new:hover,
+        .note-footer .btn-remove:hover {
+            opacity: 0.7;
+            color: #fff;
+        }
+    </style>
+    <script type="text/javascript" src="js/app.js"></script>
+</head>
+
+<body>
+</body>
+
+</html>

+ 281 - 0
dist/www/CocoRoboDesktop/jsMemo/js/app.js

@@ -0,0 +1,281 @@
+(function(global, noGlobal) {
+
+  class StickyNote {
+    constructor(options) {
+      this.init(options);
+    }
+
+    init(options) {
+      Object.assign(this, config, options);
+      this.id = this.id ? this.id : new Date().getTime();
+      StickyNote.top = Math.max(StickyNote.top, this.layer);
+      if(!this.root) {
+        this.root = document.body;
+      }
+      this.container = document.createElement('div');
+      this.container.classList.add(this.className || 'note-container');
+      this.root.appendChild(this.container);
+      this.render();
+      this.bindEvent();
+    }
+
+    save() {
+      this.content = this.noteContent.innerHTML;
+      store.set(this.id, {
+        content: this.content || '',
+        postTime: new Date().getTime(),
+        x: this.x,
+        y: this.y,
+        layer: this.layer
+      });
+    }
+
+    close() {
+      if (this.root) {
+        this.root.removeChild(this.container);
+      }
+    }
+
+    bindEvent() {
+      var pos = {}, self = this, canMove = false;
+      addEvent(this.titleBar, 'mousedown', function(e) {
+        pos.x = e.clientX - self.container.offsetLeft;
+        pos.y = e.clientY - self.container.offsetTop;
+        if (e.button == 0) {
+          canMove = true;
+        }
+      });
+      addEvent(document, 'mousemove', function(e) {
+        if (!canMove) return;
+        var
+        x = Math.min( document.documentElement.clientWidth - self.width, Math.max(e.clientX - pos.x, 0)),
+        y = Math.min( document.documentElement.clientHeight - self.height, Math.max(e.clientY - pos.y, 0));
+
+        self.container.style.left = x  + 'px';
+        self.container.style.top = y + 'px';
+      });
+      addEvent(document, 'mouseup', function(e) {
+        canMove = false;
+      });
+
+      addEvent(self.noteContent, 'keyup', function(e) {
+        self.save();
+      });
+
+      addEvent(self.btnClose, 'click', function(e) {
+        self.close();
+        self.save();
+      })
+
+      addEvent(self.btnNew, 'click', function(e) {
+        var x = self.x,
+            y = self.y,
+            maxWidth = document.documentElement.clientWidth - self.width,
+            maxHeight = document.documentElement.clientHeight - self.height;
+        if ( x >= maxWidth || x < 0 ) {
+          vx *= -1;
+        }
+
+        if ( y >= maxHeight || y < 0 ) {
+          vy *= -1;
+        }
+
+        x = x + 20 * vx;
+        y = y + 20 * vy;
+
+        new StickyNote({
+          root: self.root,
+          x: x,
+          y: y,
+          layer: StickyNote.top++
+        });
+      });
+      addEvent(self.btnRemove, 'click', function(e) {
+        store.remove(self.id);
+        self.close();
+      })
+
+      addEvent(self.container, 'mousedown', function(e) {
+        if (e.button != 0) return;
+        self.layer = StickyNote.top++;
+        self.container.style.zIndex = self.layer;
+      });
+
+      addEvent(self.container, 'mouseup', function(e) {
+        self.x = self.container.offsetLeft || 0;
+        self.y = self.container.offsetTop || 0;
+        self.save();
+      });
+    }
+
+    render() {
+      var self = this;
+      self.container.innerHTML = template.replace(/\{\{([^\}]+)\}\}/g, ($0, $1) =>  self[$1]);
+      self.titleBar = self.container.querySelector('.note-title');
+      self.noteContent = self.container.querySelector('.note-content');
+      self.btnClose = self.container.querySelector('.btn-close');
+      self.btnNew = self.container.querySelector('.btn-new');
+      self.btnRemove = self.container.querySelector('.btn-remove');
+      self.container.style.position = 'absolute';
+      self.container.style.left = self.x + 'px';
+      self.container.style.top = self.y + 'px';
+      self.noteContent.innerHTML = self.content;
+      self.container.data = self;
+      self.container.style.zIndex = self.layer;
+      self.save();
+    }
+  }
+
+  StickyNote.top = 0;
+  var vx = 1, vy = 1;
+  const config = {
+    id: null,
+    root: null,
+    title: '便笺',
+    btnCloseTip: '关闭',
+    textBtnNew: '新建笔记',
+    textBtnRemove: '删除笔记',
+    container: null,
+    titleBar: null,
+    width: 300,
+    height: 400,
+    x: 0,
+    y: 0,
+    layer: 0,
+    content: '',
+  };
+
+
+  const template = [
+    '<div class="note-title">',
+    '   <h6>{{title}}</h6>',
+    '   <a href="javascript:;" title="{{btnCloseTip}}" class="btn-close">&times;</a>',
+    '</div>',
+    '<div class="note-content" contenteditable="true"></div>',
+    '<div class="note-footer">',
+    '   <button class="btn-new">{{textBtnNew}}</button>',
+    '   <button class="btn-remove">{{textBtnRemove}}</button>',
+    '</div>'
+  ].join('\n');
+
+  function addEvent(el, type, fn) {
+    var ieType = 'on' + type;
+    if ('addEventListener' in window) {
+      addEventListener.call(el, type, fn, false);
+    } else if ('attachEvent' in el) {
+      attachEvent.call(el, ieType, fn, false);
+    } else {
+      el[ieType] = fn;
+    }
+  }
+
+  function removeEvent(el, type, fn) {
+    var ieType = 'on' + type;
+    if ('removeEventListener' in window) {
+      removeEventListener.call(el, type, fn, false);
+    } else if ('dispatchEvent' in el) {
+      el.dispatch(ieType, fn);
+    } else {
+      el[ieType] = null;
+    }
+  }
+
+  const store = {
+    appId: 'stickyNote',
+    data: {},
+    get(id) {
+      return store.data ? store.data[id] : {};
+    },
+
+    set(id, value) {
+      store.data[id] = value;
+    },
+
+    remove(id) {
+      delete store.data[id];
+    },
+
+    setup() {
+      try {
+        store.data =  JSON.parse(localStorage[store.appId]) || {};
+      } catch(e) {
+        store.data = {};
+      }
+      var data = store.data;
+      if ( !isEmpty(data) ) {
+        for(var k in data) {
+          new StickyNote({
+            root: document.body,
+            id: k,
+            x: data[k].x,
+            y: data[k].y,
+            layer: data[k].layer,
+            content: data[k].content
+          });
+        }
+      } else {
+        new StickyNote({
+          root:document.body,
+          x: (document.documentElement.clientWidth - config.width) / 2,
+          y: (document.documentElement.clientHeight - config.height) / 2,
+        });
+      }
+      window.onunload = function() {
+        localStorage.setItem(store.appId, JSON.stringify(data));
+      }
+    },
+    
+    unsetup() {
+      store.data = {};
+      localStorage.removeItem(store.appId);
+      window.onunload = null;
+    }
+  };
+
+  function isEmpty(o) {
+    if (typeof o === 'string' || Array.isArray(o) ) {
+      return o.length === 0;
+    } else if (typeof o === 'object') {
+      for(let k in o) {
+        if (!o.hasOwnProperty(k)) continue;
+        return false;
+      }
+      return true;
+    } else {
+      return  o == null;
+    }
+  }
+
+  var domReady = {
+    tasks: [],
+    isReady: false,
+    ready: function(fn) {
+      domReady.tasks.push(fn);
+      if (domReady.isReady) {
+        return domReady.completed();
+      } else {
+        addEvent(document, 'DOMContentLoaded', domReady.completed);
+        addEvent(document, 'readystatechange', function() {
+          if ( /^(?:interactive|complete)$/.test(document.readyState)) {
+            domReady.completed();
+            removeEvent(document, 'readystatechange', arguments.callee);
+          }
+        });
+      }
+    },
+    completed: function() {
+      removeEvent(document, 'DOMContentLoaded', domReady.completed);
+      domReady.isReady = true;
+      domReady.execTasks();
+    },
+    execTasks: function() {
+      while( domReady.tasks.length ) {
+        domReady.tasks.shift()();
+      };
+    }
+  }
+
+  domReady.ready(store.setup);
+
+  window.store = store;
+})();

+ 14 - 5
src/App.vue

@@ -7,7 +7,7 @@
         $route.path == '/note' ||
         $route.path == '/works',
       appNoHeight: $route.path == '/liveRoom',
-      GMBg:this.$route.query.org=='eb2af5e9-ac3d-46b6-9fe3-3c1c364f0217' && ( $route.path != '/courseGM' &&  $route.path != '/course/addCourseGM')
+      GMBg:this.$route.query.org=='eb2af5e9-ac3d-46b6-9fe3-3c1c364f0217' && ( $route.path != '/courseGM' &&  $route.path != '/course/addCourseGM'&&  $route.path != '/dataGM')
     }"
   >
     <!-- <div class="app_head" :class="{stuWidth:$route.path == '/student'}"> -->
@@ -74,6 +74,7 @@ export default {
         "/course",
         "/courseGM",
         "/data",
+        "/dataGM",
         "/notice",
         "/student",
         "/works",
@@ -81,6 +82,7 @@ export default {
         "/worksDetail",
         "/course/courseDetail",
         "/library",
+        "/libraryGM",
         "/classRoom",
         "/liveRoom",
         "/addPPt",
@@ -366,16 +368,23 @@ html::-webkit-scrollbar-thumb {
 }
 
 .btnClassGM {
-  background: #8681b7;
-  border-color: #8681b7;
+  background: #8681b7 !important;
+  border-color: #8681b7 !important;
 }
 
 .btnClassGM:focus, .btnClassGM:hover{
-  background: #8681b7;
-  border-color: #8681b7;
+  background: #8681b7 !important;
+  border-color: #8681b7 !important;
 }
 
 .GMBg{
   background: rgb(184, 181, 202) !important;
 }
+
+.cancelbtnGM:focus,
+.cancelbtnGM:hover {
+  color: rgb(92, 84, 159) !important;
+  border-color: #5c549f !important;
+  background-color: #dbd7ff !important;
+}
 </style>

BIN
src/assets/case.png


+ 682 - 0
src/components/pages/CaseDesignGM.vue

@@ -0,0 +1,682 @@
+<template>
+  <div class="cd_body" style="overflow: auto">
+    <div
+      class="pb_content_body"
+      style="
+        background: #fff;
+        padding: 0px 25px;
+        box-sizing: border-box;
+        width: 95%;
+        margin: 10px auto 0;
+      "
+    >
+      <div class="pb_head">
+        <img
+          src="../../assets/case.png"
+          style="margin-right: 10px; width: 45px;"
+          alt=""
+        />
+        <span>项目数据看板</span>
+      </div>
+      <div class="student_head">
+        <div class="head_left">
+          <span>筛选:</span>
+          <el-select v-model="choose" @change="getData">
+            <el-option label="默认排序" value=""> </el-option>
+            <el-option label="学校名称" value="school"> </el-option>
+            <el-option label="任务数量" value="task"> </el-option>
+            <el-option label="评价" value="eval"> </el-option>
+            <el-option label="工具" value="tool"> </el-option>
+            <el-option label="字数" value="font"> </el-option>
+          </el-select>
+          <el-input
+            v-model="search"
+            class="student_input"
+            placeholder="请输入教师名称或学校名称"
+            @input="getData"
+          ></el-input>
+        </div>
+      </div>
+    </div>
+    <div class="cd_table">
+      <el-table
+        ref="table"
+        :data="tableData"
+        border
+        :fit="true"
+        v-loading="isLoading"
+        style="width: 100%"
+        :header-cell-style="{ background: '#f1f1f1', fontSize: '17px' }"
+        :row-class-name="tableRowClassName"
+        class="table"
+      >
+        <el-table-column label="课程" min-width="15" align="center">
+          <template slot-scope="scope">
+            <div style="max-height: 180px; overflow: auto">
+              <div
+                v-for="(item, index) in scope.row.course"
+                :key="index"
+                class="cd_course"
+                @click="jump(item.courseId)"
+              >
+                <el-tooltip :content="item.title">
+                  <span>{{ item.title }}</span>
+                </el-tooltip>
+              </div>
+            </div>
+          </template>
+        </el-table-column>
+        <el-table-column
+          label="学校"
+          prop="school"
+          min-width="15"
+          align="center"
+        >
+        </el-table-column>
+        <el-table-column
+          label="负责人"
+          prop="username"
+          min-width="15"
+          align="center"
+        >
+        </el-table-column>
+        <el-table-column
+          label="更新时间"
+          prop="time"
+          min-width="15"
+          align="center"
+        >
+        </el-table-column>
+        <el-table-column label="总计" min-width="15" align="center">
+          <template slot-scope="scope">
+            <div class="cd_d_span">
+              <div>
+                <div>
+                  <span>{{ scope.row.jdz.taskC }}</span
+                  ><span>任务</span>
+                </div>
+                <div>
+                  <span>{{ scope.row.jdz.toolC }}</span
+                  ><span>工具</span>
+                </div>
+                <div>
+                  <span>{{ scope.row.jdz.evalC }}</span
+                  ><span>评价</span>
+                </div>
+                <div>
+                  <span>{{ scope.row.jdz.fontC }}</span
+                  ><span>字</span>
+                </div>
+              </div>
+            </div>
+          </template>
+        </el-table-column>
+        <el-table-column label="阶段1" min-width="15" align="center">
+          <template slot-scope="scope">
+            <div v-if="scope.row.jd1">
+              <div class="cd_d_span">
+                <div>
+                  <span>{{ scope.row.jd1.taskC }}</span
+                  ><span>任务</span>
+                </div>
+                <div>
+                  <span>{{ scope.row.jd1.toolC }}</span
+                  ><span>工具</span>
+                </div>
+                <div>
+                  <span>{{ scope.row.jd1.evalC }}</span
+                  ><span>评价</span>
+                </div>
+                <div>
+                  <span>{{ scope.row.jd1.fontC }}</span
+                  ><span>字</span>
+                </div>
+              </div>
+            </div>
+            <div v-else>—</div>
+          </template>
+        </el-table-column>
+        <el-table-column label="阶段2" min-width="15" align="center">
+          <template slot-scope="scope">
+            <div v-if="scope.row.jd2">
+              <div class="cd_d_span">
+                <div>
+                  <span>{{ scope.row.jd2.taskC }}</span
+                  ><span>任务</span>
+                </div>
+                <div>
+                  <span>{{ scope.row.jd2.toolC }}</span
+                  ><span>工具</span>
+                </div>
+                <div>
+                  <span>{{ scope.row.jd2.evalC }}</span
+                  ><span>评价</span>
+                </div>
+                <div>
+                  <span>{{ scope.row.jd2.fontC }}</span
+                  ><span>字</span>
+                </div>
+              </div>
+            </div>
+            <div v-else>—</div>
+          </template>
+        </el-table-column>
+        <el-table-column label="阶段3" min-width="15" align="center">
+          <template slot-scope="scope">
+            <div v-if="scope.row.jd3">
+              <div class="cd_d_span">
+                <div>
+                  <span>{{ scope.row.jd3.taskC }}</span
+                  ><span>任务</span>
+                </div>
+                <div>
+                  <span>{{ scope.row.jd3.toolC }}</span
+                  ><span>工具</span>
+                </div>
+                <div>
+                  <span>{{ scope.row.jd3.evalC }}</span
+                  ><span>评价</span>
+                </div>
+                <div>
+                  <span>{{ scope.row.jd3.fontC }}</span
+                  ><span>字</span>
+                </div>
+              </div>
+            </div>
+            <div v-else>—</div>
+          </template>
+        </el-table-column>
+        <el-table-column label="阶段4" min-width="15" align="center">
+          <template slot-scope="scope">
+            <div v-if="scope.row.jd4">
+              <div class="cd_d_span">
+                <div>
+                  <span>{{ scope.row.jd4.taskC }}</span
+                  ><span>任务</span>
+                </div>
+                <div>
+                  <span>{{ scope.row.jd4.toolC }}</span
+                  ><span>工具</span>
+                </div>
+                <div>
+                  <span>{{ scope.row.jd4.evalC }}</span
+                  ><span>评价</span>
+                </div>
+                <div>
+                  <span>{{ scope.row.jd4.fontC }}</span
+                  ><span>字</span>
+                </div>
+              </div>
+            </div>
+            <div v-else>—</div>
+          </template>
+        </el-table-column>
+        <el-table-column label="阶段5" min-width="15" align="center">
+          <template slot-scope="scope">
+            <div v-if="scope.row.jd5">
+              <div class="cd_d_span">
+                <div>
+                  <span>{{ scope.row.jd5.taskC }}</span
+                  ><span>任务</span>
+                </div>
+                <div>
+                  <span>{{ scope.row.jd5.toolC }}</span
+                  ><span>工具</span>
+                </div>
+                <div>
+                  <span>{{ scope.row.jd5.evalC }}</span
+                  ><span>评价</span>
+                </div>
+                <div>
+                  <span>{{ scope.row.jd5.fontC }}</span
+                  ><span>字</span>
+                </div>
+              </div>
+            </div>
+            <div v-else>—</div>
+          </template>
+        </el-table-column>
+        <el-table-column label="阶段6" min-width="15" align="center">
+          <template slot-scope="scope">
+            <div v-if="scope.row.jd6">
+              <div class="cd_d_span">
+                <div>
+                  <span>{{ scope.row.jd6.taskC }}</span
+                  ><span>任务</span>
+                </div>
+                <div>
+                  <span>{{ scope.row.jd6.toolC }}</span
+                  ><span>工具</span>
+                </div>
+                <div>
+                  <span>{{ scope.row.jd6.evalC }}</span
+                  ><span>评价</span>
+                </div>
+                <div>
+                  <span>{{ scope.row.jd6.fontC }}</span
+                  ><span>字</span>
+                </div>
+              </div>
+            </div>
+            <div v-else>—</div>
+          </template>
+        </el-table-column>
+        <el-table-column label="操作" min-width="15">
+          <template slot-scope="scope">
+            <!-- <div
+              @click="getAll(scope.row)"
+            >
+              查看全部
+            </div> -->
+            <el-button
+              type="primary"
+              size="small"
+              style="background: rgb(147, 125, 223); border: none"
+              @click="getAll(scope.row)"
+              >查看详情</el-button
+            >
+          </template>
+        </el-table-column>
+      </el-table>
+    </div>
+    <el-dialog
+      title="查看"
+      :visible.sync="dialogVisible"
+      :append-to-body="true"
+      width="620px"
+      :before-close="handleClose"
+      class="dialog_diy"
+    >
+      <div v-if="dataArray.length">
+        <div class="cd_d_jd2">
+          <div class="cd_d_box">
+            <span>教师:</span><span>{{ data.username }}</span>
+          </div>
+          <div class="cd_d_box">
+            <span>学校:</span><span>{{ data.school }}</span>
+          </div>
+        </div>
+        <div class="cd_d_jd">
+          <div
+            v-for="(item, index) in dataArray"
+            :key="index"
+            class="cd_d_jd_box"
+          >
+            <div class="cd_d_jd_name">{{ "阶段" + (index + 1) }}</div>
+            <div class="cd_d_jd_content cd_d_span">
+              <div>
+                <span>{{ data[item].taskC }}</span
+                ><span>任务</span>
+              </div>
+              <div>
+                <span>{{ data[item].toolC }}</span
+                ><span>工具</span>
+              </div>
+              <div>
+                <span>{{ data[item].evalC }}</span
+                ><span>评价</span>
+              </div>
+              <div>
+                <span>{{ data[item].fontC }}</span
+                ><span>字</span>
+              </div>
+            </div>
+          </div>
+          <div class="cd_d_jd_box">
+            <div class="cd_d_jd_name">总计</div>
+            <div class="cd_d_jd_content cd_d_span" style="background: #d4d4d4">
+              <div>
+                <span>{{ data["jdz"].taskC }}</span
+                ><span>任务</span>
+              </div>
+              <div>
+                <span>{{ data["jdz"].toolC }}</span
+                ><span>工具</span>
+              </div>
+              <div>
+                <span>{{ data["jdz"].evalC }}</span
+                ><span>评价</span>
+              </div>
+              <div>
+                <span>{{ data["jdz"].fontC }}</span
+                ><span>字</span>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="dialogVisible = false" class="cancelbtnGM"
+          >关闭</el-button
+        >
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      tableData: [],
+      isLoading: false,
+      org: this.$route.query.org,
+      timer: null,
+      dialogVisible: false,
+      data: {},
+      dataArray: [],
+      choose: "",
+      search: "",
+    };
+  },
+  methods: {
+    jump(cid) {
+      window.parent.postMessage({ cid: cid, screenType: "3" }, "*");
+    },
+    handleClose(done) {
+      done();
+    },
+    tableRowClassName({ row, rowIndex }) {
+      if ((rowIndex + 1) % 2 === 0) {
+        return "even_row";
+      } else {
+        return "";
+      }
+    },
+    getData() {
+      let params = {
+        org: this.org,
+        // this.org
+      };
+      this.ajax
+        .get(this.$store.state.api + "selectCase", params)
+        .then((res) => {
+          this.isLoading = false;
+          let _res = res.data[0];
+          let _res2 = res.data[1];
+          for (var i = 0; i < _res.length; i++) {
+            let taskC = 0;
+            let toolC = 0;
+            let evalC = 0;
+            let fontC = 0;
+            let course = [];
+            for (var j = 0; j < _res2.length; j++) {
+              if (_res[i].userid == _res2[j].userid) {
+                course.push({
+                  title: _res2[j].title,
+                  courseId: _res2[j].courseId,
+                });
+                var _chapter = JSON.parse(_res2[j].chapters);
+                for (var k = 0; k < _chapter.length; k++) {
+                  let taskC2 = 0;
+                  let toolC2 = 0;
+                  let evalC2 = 0;
+                  let fontC2 = 0;
+                  fontC2 += _chapter[k].dyName.length;
+                  taskC2 = _chapter[k].chapterInfo[0].taskJson.length;
+                  let _tasks = _chapter[k].chapterInfo[0].taskJson;
+                  for (var task = 0; task < _tasks.length; task++) {
+                    if (_tasks[task].eList) {
+                      evalC2 += _tasks[task].eList.length;
+                    }
+                    if (_tasks[task].toolChoose[0].tool.length > 0) {
+                      toolC2 += _tasks[task].toolChoose.length;
+                    }
+                    fontC2 += _tasks[task].task.length;
+                    fontC2 += _tasks[task].taskDetail
+                      .replace(/<[^<>]+>/g, "")
+                      .replace(/&nbsp;/gi, "").length;
+                    let _tools = _tasks[task].toolChoose;
+                    for (var tool = 0; tool < _tools.length; tool++) {
+                      fontC2 += _tools[tool].toolDetail.length;
+                    }
+                  }
+                  if (_res[i]["jd" + (k + 1)]) {
+                    _res[i]["jd" + (k + 1)].taskC += taskC2;
+                    _res[i]["jd" + (k + 1)].toolC += toolC2;
+                    _res[i]["jd" + (k + 1)].evalC += evalC2;
+                    _res[i]["jd" + (k + 1)].fontC += fontC2;
+                  } else {
+                    _res[i]["jd" + (k + 1)] = {};
+                    _res[i]["jd" + (k + 1)].taskC = taskC2;
+                    _res[i]["jd" + (k + 1)].toolC = toolC2;
+                    _res[i]["jd" + (k + 1)].evalC = evalC2;
+                    _res[i]["jd" + (k + 1)].fontC = fontC2;
+                  }
+                  taskC += taskC2;
+                  toolC += toolC2;
+                  evalC += evalC2;
+                  fontC += fontC2;
+                }
+              }
+              _res[i]["jdz"] = {};
+              _res[i]["jdz"].taskC = taskC;
+              _res[i]["jdz"].toolC = toolC;
+              _res[i]["jdz"].evalC = evalC;
+              _res[i]["jdz"].fontC = fontC;
+              _res[i].course = course;
+            }
+          }
+          if (this.search) {
+            _res = _res.filter((a) => {
+              return (
+                a.school.indexOf(this.search) != -1 ||
+                a.username.indexOf(this.search) != -1
+              );
+            });
+          }
+          if (this.choose == "school") {
+            let array = _res.sort(function (a, b) {
+              return a.school.localeCompare(b.school);
+            });
+            this.tableData = array;
+          } else if (this.choose == "task") {
+            let array = _res.sort(function (a, b) {
+              //   return a.jdz.taskC - b.jdz.taskC;
+              return b.jdz.taskC - a.jdz.taskC;
+            });
+            this.tableData = array;
+          } else if (this.choose == "font") {
+            let array = _res.sort(function (a, b) {
+              //   return a.jdz.fontC - b.jdz.fontC;
+              return b.jdz.fontC - a.jdz.fontC;
+            });
+            this.tableData = array;
+          } else if (this.choose == "eval") {
+            let array = _res.sort(function (a, b) {
+              //   return a.jdz.fontC - b.jdz.fontC;
+              return b.jdz.evalC - a.jdz.evalC;
+            });
+            this.tableData = array;
+          } else if (this.choose == "tool") {
+            let array = _res.sort(function (a, b) {
+              //   return a.jdz.fontC - b.jdz.fontC;
+              return b.jdz.toolC - a.jdz.toolC;
+            });
+            this.tableData = array;
+          } else {
+            this.tableData = _res;
+          }
+        })
+        .catch((err) => {
+          this.isLoading = false;
+          console.error(err);
+        });
+    },
+    getAll(res) {
+      this.data = res;
+      let a = Object.keys(res);
+      a = a.filter((el) => {
+        return el.indexOf("jd") != -1 && el != "jdz";
+      });
+      this.dataArray = a;
+      this.dialogVisible = true;
+    },
+  },
+  beforeDestroy() {
+    clearInterval(this.timer);
+    this.timer = null;
+  },
+  mounted() {
+    this.isLoading = true;
+    this.getData();
+    this.timer = setInterval(() => {
+      this.getData();
+    }, 5000);
+  },
+};
+</script>
+
+<style scoped>
+.student_input {
+  width: 190px;
+  font-size: 13px;
+  padding: 0 10px;
+}
+.cd_body {
+  height: 100%;
+  width: 100%;
+}
+.pb_head {
+  margin: 0 !important;
+  width: 100% !important;
+  display: flex;
+  align-items: center;
+}
+.student_head {
+  margin-top: 10px;
+  padding-bottom: 10px;
+  display: flex;
+  justify-content: space-between;
+}
+.head_left {
+  display: flex;
+  align-items: center;
+}
+.cd_title span {
+  font-size: 25px;
+  font-weight: 700;
+}
+.cd_table {
+  width: 95%;
+  margin: 0 auto;
+  padding: 0 0 10px;
+}
+
+.el-table >>> .even_row {
+  background-color: #f1f1f1 !important;
+}
+.dialog_diy >>> .el-dialog {
+  background: #fafafa;
+}
+.dialog_diy >>> .el-dialog__header {
+  background: #454545 !important;
+  padding: 15px 20px;
+}
+.dialog_diy >>> .el-dialog__body,
+.dialog_diy >>> .el-dialog__footer {
+  background: rgb(184, 181, 202);
+}
+.dialog_diy >>> .el-dialog__body {
+  padding: 30px 10px;
+}
+.dialog_diy >>> .el-dialog__title {
+  color: #fff;
+}
+.dialog_diy >>> .el-dialog__headerbtn {
+  top: 19px;
+}
+.dialog_diy >>> .el-dialog__headerbtn .el-dialog__close {
+  color: #fff;
+}
+.dialog_diy >>> .el-dialog__headerbtn .el-dialog__close:hover {
+  color: #fff;
+}
+
+.cd_d_box {
+  font-size: 16px;
+}
+.cd_d_box + .cd_d_box {
+  margin-top: 10px;
+}
+
+.cd_d_jd {
+  display: flex;
+  flex-wrap: wrap;
+  margin-top: 10px;
+  background: #fff;
+  padding: 10px 15px 25px;
+  box-sizing: border-box;
+}
+.cd_d_jd2 {
+  background: #fff;
+  padding: 10px 15px;
+  box-sizing: border-box;
+}
+.cd_d_jd_box {
+  width: 100px;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  /* background: #eee; */
+  border-radius: 5px;
+  margin: 10px 14px 0 0;
+}
+.cd_d_jd_box {
+}
+.cd_d_jd_content {
+  width: 100px;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  background: #eee;
+  border-radius: 5px;
+  padding: 5px 0;
+}
+.cd_d_jd_content div + div {
+  margin-top: 5px;
+}
+
+.cd_d_jd_content div span + span {
+  margin-left: 5px;
+}
+.cd_d_jd_name {
+  margin-bottom: 5px;
+  color: #222;
+}
+.cd_d_span div:nth-child(1) span:nth-child(1) {
+  color: rgb(147, 125, 223);
+}
+.cd_d_span div:nth-child(2) span:nth-child(1) {
+  color: #fe3987;
+}
+.cd_d_span div:nth-child(3) span:nth-child(1) {
+  color: #10bb6e;
+}
+
+.cd_d_span div:nth-child(4) span:nth-child(1) {
+  color: rgb(147, 125, 223);
+}
+.cd_d_span div span:nth-child(1) {
+  margin-right: 5px;
+}
+
+.cd_course {
+  cursor: pointer;
+  width: 100%;
+  display: flex;
+}
+.cd_course span {
+  width: 100%;
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+
+.table >>> .cell {
+  padding: 0px 3px !important;
+}
+/* .table >>> .el-table .cell, .table >>> .el-table--border td:first-child .cell, .table >>> .el-table--border th:first-child .cell{
+  padding: 0 3px;
+} */
+</style>

+ 374 - 0
src/components/pages/classGM.vue

@@ -0,0 +1,374 @@
+<template>
+  <div
+    class="pb_content"
+    style="background: unset; overflow: auto; height: 100%"
+  >
+    <div
+      class="pb_content_body"
+      style="
+        background: #fff;
+        padding: 0px 25px;
+        box-sizing: border-box;
+        margin: 10px auto 0;
+      "
+    >
+      <div class="pb_head top">
+        <span>班级管理</span>
+        <div class="student_button">
+          <el-button
+            type="primary"
+            class="bgColor btnClassGM"
+            @click="dialogVisible = true"
+            >添加班级</el-button
+          >
+        </div>
+      </div>
+      <div class="student_head">
+        <div class="student_search">
+          <span>
+            <el-input
+              placeholder="请输入班级名称"
+              v-model="sClassName"
+              clearable
+            >
+            </el-input>
+          </span>
+          <el-button class="btnClassGM" type="primary" @click="searchClass">查询</el-button>
+        </div>
+      </div>
+    </div>
+    <div class="pb_content_body" style="margin:0 auto">
+      <div class="student_table">
+        <el-table
+          ref="table"
+          :data="tableData"
+          border
+          :height="tableHeight"
+          :fit="true"
+          v-loading="isLoading"
+          style="width: 100%; height: 60%"
+          :header-cell-style="{ background: '#f1f1f1' }"
+          :row-class-name="tableRowClassName"
+        >
+          <el-table-column
+            prop="name"
+            label="班级名称"
+            min-width="40%"
+            align="center"
+          >
+          </el-table-column>
+          <el-table-column
+            prop="pnum"
+            label="人数"
+            min-width="40%"
+            align="center"
+          >
+          </el-table-column>
+          <el-table-column label="操作" min-width="20%">
+            <template slot-scope="scope">
+              <el-button
+                class="btnClassGM"
+                type="primary"
+                size="small"
+                @click="deleteClass(scope.row.id)"
+                >删除</el-button
+              >
+            </template>
+          </el-table-column>
+        </el-table>
+      </div>
+      <div class="student_page">
+        <el-pagination
+          background
+          layout="prev, pager, next"
+          :page-size="10"
+          :total="total"
+          v-if="page"
+          @current-change="handleCurrentChange"
+        >
+        </el-pagination>
+      </div>
+    </div>
+    <el-dialog
+      title="添加学生"
+      :visible.sync="dialogVisible"
+      :append-to-body="true"
+      width="25%"
+      :before-close="handleClose"
+      class="dialog_diy"
+    >
+      <el-form>
+        <el-form-item label="班级名称" :label-width="formLabelWidth">
+          <el-input
+            v-model="className"
+            auto-complete="off"
+            placeholder="请输入班级..."
+          ></el-input>
+        </el-form-item>
+      </el-form>
+      <span slot="footer" class="dialog-footer">
+        <el-button class="cancelbtnGM" @click="dialogVisible = false">取 消</el-button>
+        <el-button class="btnClassGM" type="primary" @click="insertClass">确 定</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      tableHeight: "500px",
+      isLoading: false,
+      formLabelWidth: "100px",
+      sClassName: "",
+      className: "",
+      dialogVisible: false,
+      tableData: [],
+      page: 1,
+      total: 0,
+      userid: this.$route.query.userid,
+      oid: this.$route.query.oid,
+    };
+  },
+  created() {
+    this.page = 1;
+    this.getClass();
+  },
+  mounted() {
+    this.$nextTick(function () {
+      this.tableHeight =
+        window.innerHeight - this.$refs.table.$el.offsetTop - 200;
+      if (this.tableHeight <= 530) {
+        this.tableHeight = 530;
+      }
+      // 监听窗口大小变化
+      let self = this;
+      window.onresize = function () {
+        self.tableHeight =
+          window.innerHeight - self.$refs.table.$el.offsetTop - 200;
+        if (self.tableHeight <= 530) {
+          self.tableHeight = 530;
+        }
+      };
+    });
+  },
+  methods: {
+    tableRowClassName({ row, rowIndex }) {
+      if ((rowIndex + 1) % 2 === 0) {
+        return "even_row";
+      } else {
+        return "";
+      }
+    },
+    handleCurrentChange(val) {
+      this.page = val;
+      this.getClass();
+    },
+    handleClose(done) {
+      done();
+    },
+    time() {
+      if (!this.now) {
+        this.now = new Date().getTime();
+        return true;
+      } else {
+        let time = new Date().getTime();
+        if (time - this.now > 3000) {
+          this.now = time;
+          return true;
+        } else {
+          return false;
+        }
+      }
+    },
+    searchClass() {
+      this.page = 1;
+      this.getClass();
+    },
+    //新增班级
+    insertClass() {
+      let params = {
+        name: this.className,
+        oid: this.oid,
+        uid: this.userid,
+      };
+      this.ajax
+        .get(this.$store.state.api + "insertClass", params)
+        .then((res) => {
+          this.$message({
+            message: "新增成功",
+            type: "success",
+          });
+          this.dialogVisible = false;
+          this.sClassName = "";
+          this.getClass();
+          this.className = "";
+        })
+        .catch((err) => {
+          this.$message({
+            message: "新增失败",
+            type: "error",
+          });
+          console.error(err);
+        });
+    },
+    //获取班级列表
+    getClass() {
+      this.isLoading = true;
+      let params = {
+        // username: this.$store.state.userInfo.userid,
+        cu: "",
+        oid: this.oid,
+        cn: this.sClassName,
+        page: this.page,
+      };
+      this.ajax
+        .get(this.$store.state.api + "selectClass", params)
+        .then((res) => {
+          this.isLoading = false;
+          this.total = res.data[0].length > 0 ? res.data[0][0].num : 0;
+          this.tableData = res.data[0];
+        })
+        .catch((err) => {
+          this.isLoading = false;
+          console.error(err);
+        });
+    },
+    //删除班级
+    deleteClass(id) {
+      let params = {
+        id: id,
+      };
+      if (this.time()) {
+        this.$confirm("确定删除此课程吗?", "提示", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning",
+        })
+          .then(() => {
+            this.ajax
+              .get(this.$store.state.api + "deleteClass", params)
+              .then((res) => {
+                this.$message({
+                  message: "删除成功",
+                  type: "success",
+                });
+                if (this.page != 1 && this.tableData.length == 1) {
+                  this.page - 1;
+                }
+                this.getClass();
+              })
+              .catch((err) => {
+                this.$message.error("删除失败");
+                console.error(err);
+              });
+          })
+          .catch(() => {});
+      }
+    },
+  },
+};
+</script>
+
+<style scoped>
+.dialog_diy >>> .el-dialog__header {
+  background: #454545 !important;
+  padding: 15px 20px;
+}
+.dialog_diy >>> .el-dialog__title {
+  color: #fff;
+}
+.student_table >>> .el-table--border td {
+  border-right: 0px !important;
+}
+.dialog_diy >>> .el-dialog__headerbtn {
+  top: 19px;
+}
+.dialog_diy >>> .el-dialog__headerbtn .el-dialog__close {
+  color: #fff;
+}
+.dialog_diy >>> .el-dialog__headerbtn .el-dialog__close:hover {
+  color: #fff;
+}
+.student_head >>> .el-button--primary {
+  /* background-color: #2268bc; */
+}
+.xls_button {
+  font-size: 14px;
+  cursor: pointer;
+  text-decoration: underline;
+  color: rgb(34, 104, 188);
+}
+.pb_head {
+  margin: 0 !important;
+  width: 100% !important;
+}
+.student_page {
+  margin-top: 10px;
+}
+.student_head {
+  margin-top: 10px;
+  padding-bottom: 15px;
+  display: flex;
+  justify-content: space-between;
+}
+.student_search {
+  display: flex;
+  width: 300px;
+}
+.student_search span {
+  margin: 0 10px 0 0;
+}
+.student_button {
+  display: flex;
+  overflow: hidden;
+  height: 40px;
+}
+.student_button .el-button--primary {
+  /* margin-right: 10px; */
+}
+.upload-demo {
+  display: flex;
+  flex-direction: column;
+  align-items: end;
+  /* position: relative; */
+  width: 100px;
+  overflow: hidden;
+}
+.student_table {
+  /* margin: 20px 0; */
+}
+
+.el-table >>> .even_row {
+  background-color: #f1f1f1;
+}
+
+.top {
+  display: flex;
+  justify-content: space-between;
+}
+
+.bgColor {
+  /* background: #2167bc; */
+}
+.student_table >>> .el-table,
+.student_table >>> .el-table__body-wrapper {
+  height: auto !important;
+}
+
+.student_page
+  >>> .el-pagination.is-background
+  .el-pager
+  li:not(.disabled).active {
+  background-color: #5c549f;
+  color: #fff !important;
+}
+.student_page
+  >>> .el-pagination.is-background
+  .el-pager
+  li:not(.disabled):hover {
+  color: #5c549f;
+}
+
+</style>

+ 529 - 0
src/components/pages/dataGM.vue

@@ -0,0 +1,529 @@
+<template>
+  <div
+    class="pb_content"
+    style="
+      width: 100%;
+      height: 100%;
+      display: flex;
+      align-items: center;
+      justify-content: center;
+      min-height: 640px;
+      min-width: unset;
+      margin: 0;
+    "
+  >
+    <div class="pb_content_body" style="position: relative; width: 100%">
+      <div style="width: 100%; margin: 0px auto">
+        <div class="formTop">
+          <div class="tx">
+            <img
+              :src="ruleForm.headportrait ? ruleForm.headportrait : tx"
+              alt
+            />
+          </div>
+          <!-- <div class="right">
+            <div class="name">{{ ruleForm.name }}</div>
+            <div class="rightBottom">
+              <div class="emailImg">
+                <img src="../../assets/email.png" alt />
+              </div>
+              <div class="email">{{ ruleForm.mail }}</div>
+            </div>
+          </div> -->
+        </div>
+        <div class="data_nav">
+          <span @click="type = 1" :class="{ active: type == 1 }">我的资料</span>
+          <span @click="type = 2" :class="{ active: type == 2 }">修改密码</span>
+        </div>
+        <el-form
+          v-if="type == 1"
+          :model="ruleForm"
+          :rules="rules"
+          ref="ruleForm"
+          label-width="100px"
+          class="demo-ruleForm"
+        >
+          <!-- <el-form-item label="姓名" prop="teacherName">
+            <el-input
+              v-model="ruleForm.name"
+              style="width: 250px"
+              placeholder="请输入名字"
+            ></el-input>
+          </el-form-item>-->
+          <el-form-item label="性别">
+            <el-radio-group v-model="ruleForm.sex">
+              <el-radio label="男"></el-radio>
+              <el-radio label="女"></el-radio>
+            </el-radio-group>
+          </el-form-item>
+          <el-form-item label="昵称" prop="name">
+            <el-input
+              v-model="ruleForm.name"
+              style="width: 300px"
+              placeholder="请输入昵称"
+            ></el-input>
+          </el-form-item>
+          <!-- <el-form-item label="邮箱" prop="mail">
+            <el-input
+              v-if="ruleForm.mail == ''"
+              v-model="ruleForm.mail"
+              style="width: 300px"
+              placeholder="请输入邮箱"
+            ></el-input>
+            <el-input
+              v-else
+              disabled
+              v-model="ruleForm.mail"
+              style="width: 300px"
+              placeholder="请输入邮箱"
+            ></el-input>
+          </el-form-item> -->
+          <!-- <el-form-item label="手机号码" prop="phone">
+            <el-input
+              v-model="ruleForm.phone"
+              style="width: 300px"
+              placeholder="请输入手机号码"
+            ></el-input>
+          </el-form-item> -->
+          <el-form-item label="组织" prop="org">
+            <el-select
+              v-model="ruleForm.org"
+              clearable
+              placeholder="暂无组织"
+              disabled
+            >
+              <el-option
+                v-for="item in orgJuri"
+                :key="item.id"
+                :label="item.name"
+                :value="item.id"
+              >
+              </el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="学校" prop="sBySchool">
+            <el-select
+              v-model="ruleForm.sBySchool"
+              clearable
+              placeholder="请选择学校"
+              disabled
+            >
+              <!-- <el-option
+                v-for="item in schoolJuri"
+                :key="item.id"
+                :label="item.name"
+                :value="item.id"
+              >
+              </el-option> -->
+              <el-option :value="ruleForm.sBySchool"> </el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="身份" prop="type">
+            <el-select
+              v-model="ruleForm.type"
+              clearable
+              placeholder="请选择身份"
+              disabled
+            >
+              <el-option :value="ruleForm.type"> </el-option>
+              <!-- <el-option >学生 </el-option> -->
+            </el-select>
+          </el-form-item>
+          <el-form-item label="个人简介" prop="intro">
+            <el-input
+              v-model="ruleForm.intro"
+              type="textarea"
+              :rows="5"
+              resize="none"
+              placeholder="想说点什么..."
+              style="width: 300px"
+            ></el-input>
+          </el-form-item>
+          <el-form-item>
+            <el-button
+              class="btnClassGM"
+              type="primary"
+              @click="submitForm('ruleForm')"
+              >修改</el-button
+            >
+          </el-form-item>
+        </el-form>
+        <div class="password" v-if="type == 2">
+          <div class="input_box">
+            <span>原密码</span>
+            <el-input
+              class="input"
+              v-model="opassword"
+              placeholder="请输入原密码"
+            ></el-input>
+          </div>
+          <div class="input_box">
+            <span>修改密码</span>
+            <el-input
+              class="input"
+              v-model="password"
+              placeholder="请输入修改密码"
+            ></el-input>
+          </div>
+          <div class="input_box">
+            <span></span>
+            <div class="input">
+              <el-button
+                class="btnClassGM"
+                type="primary"
+                @click="updatePassword"
+                >修改</el-button
+              >
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    var validatePass = (rule, value, callback) => {
+      if (value == "") {
+        return;
+      }
+      var reg =
+        /^[A-Za-z\d]+([-_.][A-Za-z\d]+)*@([A-Za-z\d]+[-.])+[A-Za-z\d]{2,4}$/;
+      if (!reg.test(value)) {
+        callback(new Error("请输入正确的邮箱"));
+      } else {
+        callback();
+      }
+    };
+    var validatePass1 = (rule, value, callback) => {
+      var reg = /^1\d{10}$/;
+      if (!reg.test(value)) {
+        callback(new Error("请输入正确的手机号码"));
+      } else {
+        callback();
+      }
+    };
+    return {
+      type: 1,
+      ruleForm: {
+        name: "",
+        type: "",
+        sex: "男",
+        intro: "",
+        // mail: "",
+        phone: "",
+        sBySchool: "",
+        org: "",
+        headportrait: "",
+      },
+      opassword: "",
+      password: "",
+      tx: require("../../assets/avatar.png"),
+      userinfo: "",
+      schoolJuri: [],
+      orgJuri: [],
+      userid: this.$route.query.userid,
+      rules: {
+        pass: [{ validator: validatePass, trigger: "blur" }],
+        name: [{ required: true, message: "请输入你的名字", trigger: "blur" }],
+        mail: [
+          {
+            required: true,
+            message: "请输入你的邮箱",
+            trigger: "blur",
+          },
+        ],
+        phone: [
+          // { required: true, message: "请输入你的手机号码", trigger: "blur" },
+
+          {
+            validator: validatePass1,
+            trigger: "blur",
+          },
+        ],
+      },
+    };
+  },
+  methods: {
+    getSchool() {
+      this.isLoading = true;
+      let params = {
+        page: this.page,
+      };
+      this.ajax
+        .get(this.$store.state.api + "selectOrg", params)
+        .then((res) => {
+          this.isLoading = false;
+          this.schoolJuri = res.data[0];
+        })
+        .catch((err) => {
+          this.isLoading = false;
+          console.error(err);
+        });
+    },
+    getOrg() {
+      this.isLoading = true;
+      this.ajax
+        .get(this.$store.state.api + "selectorg2", "")
+        .then((res) => {
+          this.isLoading = false;
+          this.orgJuri = res.data[0];
+        })
+        .catch((err) => {
+          this.isLoading = false;
+          console.error(err);
+        });
+    },
+    submitForm(formName) {
+      this.$refs[formName];
+      let params = [
+        {
+          userid: this.userid,
+          username: this.ruleForm.name,
+          type: this.ruleForm.type == "老师" ? 1 : 2,
+          oid: this.ruleForm.sBySchool,
+          phone: this.ruleForm.phone,
+          intro: this.ruleForm.intro,
+          sex: this.ruleForm.sex == "男" ? "0" : "1",
+        },
+      ];
+      this.ajax
+        .post(this.$store.state.api + "updatePblMessage2", params)
+        .then((res) => {
+          this.$message({
+            message: "修改成功",
+            type: "success",
+          });
+          window.parent.postMessage({ close: "1" }, "*");
+          this.getUser();
+        })
+        .catch((err) => {
+          this.$message.error("修改失败");
+          console.error(err);
+        });
+    },
+    getUser() {
+      let params = { uid: this.userid };
+      this.ajax
+        .get(this.$store.state.api + "getUser", params)
+        .then((res) => {
+          this.userinfo = res.data[0][0];
+          // this.$cookies.set("userInfo", this.userinfo, -1);
+          this.$cookies.set("teacherInfo", res.data[0][0], -1);
+          this.$store.commit("update", ["userInfo", this.userinfo]);
+          console.log(res.data[0][0]);
+        })
+        .catch((err) => {
+          console.error(err);
+        });
+    },
+    getDetail() {
+      let params = { uid: this.userid };
+      this.ajax
+        .get(this.$store.state.api + "getUser", params)
+        .then((res) => {
+          if (res.data[0][0]) {
+            res.data[0][0].sex = res.data[0][0].sex ? "女" : "男";
+            this.ruleForm = res.data[0][0];
+            this.ruleForm.org = res.data[0][0].org
+              ? res.data[0][0].org.split(",")[0]
+              : "";
+            this.ruleForm.type = res.data[0][0].type == 1 ? "老师" : "学生";
+            console.log(res.data[0][0]);
+          }
+        })
+        .catch((err) => {
+          console.error(err);
+        });
+    },
+    updatePassword() {
+      if (this.password.length < 6) {
+        this.$message.error("密码长度不少于6位");
+        return;
+      }
+      let params = [
+        {
+          userid: this.userid,
+          opassword: this.opassword,
+          password: this.password,
+        },
+      ];
+      this.ajax
+        .post(this.$store.state.api + "updatePassword", params)
+        .then((res) => {
+          if (res.data[0] && res.data[0].success == 1) {
+            this.$message.success("修改成功");
+            this.opassword = "";
+            this.password = "";
+          } else {
+            this.$message.error("修改失败,原密码不正确");
+          }
+        })
+        .catch((err) => {
+          this.$message.error("修改失败");
+          console.error(err);
+        });
+    },
+  },
+  created() {
+    this.getSchool();
+    this.getOrg();
+    this.getDetail();
+  },
+};
+</script>
+
+<style scoped>
+.formTop {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  margin: 20px 0;
+}
+.formTop >>> .el-form {
+  margin: 0 auto;
+}
+.tx {
+  width: 100px;
+  /* margin-right: 15px; */
+  min-width: 50px;
+  min-height: 50px;
+}
+.emailImg {
+  width: 30px;
+  margin-right: 5px;
+}
+.tx > img,
+.emailImg > img {
+  width: 100%;
+  height: 100%;
+}
+.right {
+  display: flex;
+  flex-direction: column;
+  align-items: flex-start;
+}
+.name {
+  color: #3c88dd;
+  font-size: 20px;
+  margin-bottom: 10px;
+}
+
+.email {
+  color: #acacac;
+  font-size: 18px;
+}
+.rightBottom {
+  display: flex;
+  align-items: center;
+}
+.demo-ruleForm {
+  width: 100%;
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+  align-items: center;
+  background: #fff;
+}
+/* .demo-ruleForm >>> .el-form-item__label:before {
+  content: "*";
+  color: #f56c6c;
+  margin-right: 4px;
+}
+.demo-ruleForm >>> .el-form-item__label:nth-child(3) {
+  content: "";
+} */
+.demo-ruleForm >>> .el-form-item__content {
+  width: 300px;
+}
+
+.data_nav {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  width: 100%;
+  margin: 10px 0;
+}
+
+.data_nav span {
+  box-sizing: border-box;
+  padding: 8px 5px;
+  cursor: pointer;
+  color: #444444;
+  height: 35px;
+}
+
+.data_nav span + span {
+  margin-left: 10px;
+}
+
+.data_nav .active {
+  color: #5c549f;
+  border-bottom: 2px solid #5c549f;
+}
+
+.password {
+  height: 511px;
+  padding: 50px 0 0 0;
+  box-sizing: border-box;
+  /* display: flex;
+  justify-content: center;
+  align-items: center;
+  flex-direction: column; */
+}
+.input_box {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+.input_box span {
+  width: 100px;
+  font-size: 14px;
+  text-align: right;
+  padding: 0 12px 0 0;
+}
+.input_box .input {
+  width: 300px;
+}
+.input_box + .input_box {
+  margin-top: 20px;
+}
+
+.demo-ruleForm >>> .el-input.is-focus .el-input__inner {
+  border-color: #5c549f;
+}
+.demo-ruleForm >>> .el-input__inner:focus {
+  border-color: #5c549f;
+}
+
+.demo-ruleForm >>> .el-input.is-focus .el-textarea__inner {
+  border-color: #5c549f;
+}
+.demo-ruleForm >>> .el-textarea__inner:focus {
+  border-color: #5c549f;
+}
+
+.password >>> .el-input.is-focus .el-input__inner {
+  border-color: #5c549f;
+}
+.password >>> .el-input__inner:focus {
+  border-color: #5c549f;
+}
+
+.password >>> .el-input.is-focus .el-textarea__inner {
+  border-color: #5c549f;
+}
+.password >>> .el-textarea__inner:focus {
+  border-color: #5c549f;
+}
+
+.demo-ruleForm >>> .el-radio__input.is-checked .el-radio__inner {
+  border-color: #5c549f;
+  background: #5c549f;
+}
+.demo-ruleForm >>> .el-radio__input.is-checked + .el-radio__label {
+  color: #5c549f;
+}
+</style>

+ 5 - 3
src/components/pages/library.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="pb_content">
+  <div class="pb_content" style="overflow: auto;">
     <div class="pb_head top">
       <span>素材库</span>
       <div v-if="choose == 0" @click="addImg($event)">
@@ -123,7 +123,7 @@
           layout="prev, pager, next"
           :page-size="10"
           :total="total"
-          v-if="page"
+          v-if="page && chapInfo.length"
           @current-change="handleCurrentChange"
         >
         </el-pagination>
@@ -361,10 +361,11 @@ export default {
       this.isLoading = true;
       let params = {
         t: parseInt(this.choose),
+        uid: this.userid,
         page: this.page,
       };
       this.ajax
-        .get(this.$store.state.api + "selectMtl", params)
+        .get(this.$store.state.api + "selectMtl2", params)
         .then((res) => {
           this.isLoading = false;
           this.total = res.data[0].length > 0 ? res.data[0][0].num : 0;
@@ -510,5 +511,6 @@ export default {
   display: flex;
   flex-direction: row;
   flex-wrap: wrap;
+  min-height: 250px;
 }
 </style>

+ 528 - 0
src/components/pages/libraryGM.vue

@@ -0,0 +1,528 @@
+<template>
+  <div class="pb_content" style="overflow: auto;">
+    <div class="pb_head top">
+      <span>素材库</span>
+      <div v-if="choose == 0" @click="addImg($event)">
+        <input
+          type="file"
+          accept="image/*"
+          capture="camera"
+          style="display: none"
+          @change="beforeUpload1($event, 1)"
+        />
+        <div class="uploadThing btnClassGM">上传图片</div>
+      </div>
+      <div v-if="choose == 1" @click="addImg($event)">
+        <input
+          type="file"
+          accept="video/mp4,video/quicktime,video/x-msvideo"
+          capture="camera"
+          style="display: none"
+          @change="beforeUpload2($event, 2)"
+        />
+        <div class="uploadThing btnClassGM">上传视频</div>
+      </div>
+      <div v-if="choose == 2" @click="addImg($event)">
+        <input
+          type="file"
+          accept="application/pdf,.ppt,.pptx,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document"
+          style="display: none"
+          @change="beforeUpload2($event, 3)"
+        />
+        <div class="uploadThing btnClassGM">上传附件</div>
+      </div>
+    </div>
+    <div class="pb_content_body" style="height: 70%">
+      <div class="student_head">
+        <div class="three">
+          <div :class="choose == 0 ? 'choose' : ''" @click="sMtl(0)">图片</div>
+          <div :class="choose == 1 ? 'choose' : ''" @click="sMtl(1)">视频</div>
+          <div :class="choose == 2 ? 'choose' : ''" @click="sMtl(2)">附件</div>
+        </div>
+      </div>
+      <div class="student_table">
+        <div v-if="this.choose == 0" class="boxCss">
+          <div class="out_box" v-for="(item, index) in chapInfo" :key="index">
+            <div class="tup">
+              <img
+                :src="
+                  item.chapdataInfo ? JSON.parse(item.chapdataInfo).url : mtp
+                "
+                alt=""
+                @click="
+                  handlePictureCardPreview(JSON.parse(item.chapdataInfo).url)
+                "
+              />
+              <div class="deleteWord" @click="deleteM(item.id)">
+                <img src="../../assets/icon/delete.png" alt="" />
+              </div>
+            </div>
+            <div class="bottom_box">
+              <div>
+                {{
+                  item.chapdataInfo
+                    ? JSON.parse(item.chapdataInfo).name
+                    : "图片暂无名称"
+                }}
+              </div>
+            </div>
+          </div>
+        </div>
+        <div v-if="this.choose == 1" class="boxCss">
+          <div class="out_box" v-for="(item, index) in chapInfo" :key="index">
+            <div class="tup">
+              <img
+                :src="msp"
+                alt=""
+                @click="
+                  handlePictureCardPreview1(JSON.parse(item.chapdataInfo).url)
+                "
+              />
+              <div class="deleteWord" @click="deleteM(item.id)">
+                <img src="../../assets/icon/delete.png" alt="" />
+              </div>
+            </div>
+            <div class="bottom_box">
+              <div>
+                {{
+                  item.chapdataInfo
+                    ? JSON.parse(item.chapdataInfo).name
+                    : "图片暂无名称"
+                }}
+              </div>
+            </div>
+          </div>
+        </div>
+        <div v-if="this.choose == 2" class="boxCss">
+          <div class="out_box" v-for="(item, index) in chapInfo" :key="index">
+            <div class="tup">
+              <img
+                :src="mfj"
+                alt=""
+                @click="downFile(JSON.parse(item.chapdataInfo).url)"
+              />
+              <div class="deleteWord" @click="deleteM(item.id)">
+                <img src="../../assets/icon/delete.png" alt="" />
+              </div>
+            </div>
+            <div class="bottom_box">
+              <div>
+                {{
+                  item.chapdataInfo
+                    ? JSON.parse(item.chapdataInfo).name
+                    : "图片暂无名称"
+                }}
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="student_page">
+        <el-pagination
+          background
+          layout="prev, pager, next"
+          :page-size="10"
+          :total="total"
+          v-if="page && chapInfo.length"
+          @current-change="handleCurrentChange"
+        >
+        </el-pagination>
+      </div>
+    </div>
+    <el-dialog :visible.sync="pictureDialog" size="tiny">
+      <img width="100%" :src="dialogImageUrl" alt="" />
+    </el-dialog>
+    <el-dialog :visible.sync="vedioDialog" size="tiny">
+      <video-player
+        class="video-player vjs-custom-skin"
+        ref="videoPlayer"
+        :playsinline="true"
+        :options="playerO"
+        @play="onPlayerPlay($event)"
+        style="width: 100%; height: 100%"
+      ></video-player>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      choose: 0,
+      chapInfo: [],
+      cImgInfo: [],
+      isLoading: false,
+      noneBtnImg: false,
+      mtp: require("../../assets/tup1.png"),
+      msp: require("../../assets/sp1.png"),
+      mfj: require("../../assets/uploadImg.png"),
+      page: 1,
+      total: 0,
+      dialogImageUrl: "",
+      userid: this.$route.query.userid,
+      pictureDialog: false,
+      vedioDialog: false,
+      playerOptions: {
+        playbackRates: [0.7, 1.0, 1.5, 2.0], //播放速度
+        autoplay: false, //如果true,浏览器准备好时开始回放。
+        muted: false, // 默认情况下将会消除任何音频。
+        loop: false, // 导致视频一结束就重新开始。
+        preload: "auto", // 建议浏览器在<video>加载元素后是否应该开始下载视频数据。auto浏览器选择最佳行为,立即开始加载视频(如果浏览器支持)
+        language: "zh-CN",
+        aspectRatio: "16:9", // 将播放器置于流畅模式,并在计算播放器的动态大小时使用该值。值应该代表一个比例 - 用冒号分隔的两个数字(例如"16:9"或"4:3")
+        fluid: true, // 当true时,Video.js player将拥有流体大小。换句话说,它将按比例缩放以适应其容器。
+        sources: [
+          {
+            type: "video/mp4", //这里的种类支持很多种:基本视频格式、直播、流媒体等,具体可以参看git网址项目   || "video/ogg"|| "video/webm"
+            src: "", //url地址require("../../assets/media/aaa.mp4")
+          },
+        ],
+        // poster: require("../../assets/tu31.png"), //你的封面地址
+        // poster: dataRes.imgUrl, //你的封面地址
+        notSupportedMessage: "此视频暂无法播放,请稍后再试", //允许覆盖Video.js无法播放媒体源时显示的默认信息。
+        controlBar: {
+          timeDivider: true, //当前时间和持续时间的分隔符
+          durationDisplay: true, //显示持续时间
+          remainingTimeDisplay: false, //是否显示剩余时间功能
+          fullscreenToggle: true, //全屏按钮
+        },
+      },
+      playerO: {},
+    };
+  },
+  methods: {
+    handleCurrentChange(val) {
+      this.page = val;
+      this.selectMtl();
+    },
+    addImg(e) {
+      var el = e.currentTarget;
+      el.getElementsByTagName("input")[0].click();
+    },
+    imgChange(file, fileList, type) {
+      var _tmp = this.chapInfo;
+      this.noneBtnImg = _tmp.length >= 1;
+    },
+    downFile(url) {
+      window.open(url);
+    },
+    beforeUpload1(event, type) {
+      var file = event.target.files[0];
+      var credentials = {
+        accessKeyId: "AKIATLPEDU37QV5CHLMH",
+        secretAccessKey: "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",
+      }; //秘钥形式的登录上传
+      window.AWS.config.update(credentials);
+      window.AWS.config.region = "cn-northwest-1"; //设置区域
+
+      var bucket = new window.AWS.S3({ params: { Bucket: "ccrb" } }); //选择桶
+      var _this = this;
+
+      if (file) {
+        var params = {
+          Key:
+            file.name.split(".")[0] +
+            new Date().getTime() +
+            "." +
+            file.name.split(".")[file.name.split(".").length-1],
+          ContentType: file.type,
+          Body: file,
+          "Access-Control-Allow-Credentials": "*",
+          ACL: "public-read",
+        }; //key可以设置为桶的相抵路径,Body为文件, ACL最好要设置
+        var options = {
+          partSize: 2048 * 1024 * 1024,
+          queueSize: 2,
+          leavePartsOnError: true,
+        };
+        bucket
+          .upload(params, options)
+          .on("httpUploadProgress", function (evt) {
+            //这里可以写进度条
+            // console.log("Uploaded : " + parseInt((evt.loaded * 80) / evt.total) + '%');
+          })
+          .send(function (err, data) {
+            if (err) {
+              var a = _this.$refs.upload1.uploadFiles;
+              a.splice(a.length - 1, a.length);
+              _this.$message.error("上传失败");
+            } else {
+              _this.cImgInfo.push({
+                name: file.name,
+                url: data.Location,
+              });
+              _this.addMtl();
+              _this.cImgInfo = [];
+              _this.selectMtl();
+              _this.imgChange(null, null, type);
+              console.log(data.Location);
+            }
+          });
+      }
+    },
+    handlePictureCardPreview(url) {
+      this.dialogImageUrl = url;
+      this.pictureDialog = true;
+    },
+    handlePictureCardPreview1(url) {
+      this.playerO = {};
+      this.playerOptions.poster = "";
+      this.playerOptions.sources[0].src = url;
+      this.playerO = this.playerOptions;
+      // this.dialogImageUrl = url;
+      this.vedioDialog = true;
+    },
+    beforeUpload2(event, type) {
+      var file = event.target.files[0];
+      var credentials = {
+        accessKeyId: "AKIATLPEDU37QV5CHLMH",
+        secretAccessKey: "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",
+      }; //秘钥形式的登录上传
+      window.AWS.config.update(credentials);
+      window.AWS.config.region = "cn-northwest-1"; //设置区域
+
+      var bucket = new window.AWS.S3({ params: { Bucket: "ccrb" } }); //选择桶
+      var _this = this;
+
+      if (file) {
+        var params = {
+          Key:
+            file.name.split(".")[0] +
+            new Date().getTime() +
+            "." +
+            file.name.split(".")[file.name.split(".").length-1],
+          ContentType: file.type,
+          Body: file,
+          "Access-Control-Allow-Credentials": "*",
+          ACL: "public-read",
+        }; //key可以设置为桶的相抵路径,Body为文件, ACL最好要设置
+        var options = {
+          partSize: 2048 * 1024 * 1024,
+          queueSize: 2,
+          leavePartsOnError: true,
+        };
+        bucket
+          .upload(params, options)
+          .on("httpUploadProgress", function (evt) {
+            //这里可以写进度条
+            // console.log("Uploaded : " + parseInt((evt.loaded * 80) / evt.total) + '%');
+          })
+          .send(function (err, data) {
+            if (err) {
+              var a = _this.$refs.upload1.uploadFiles;
+              a.splice(a.length - 1, a.length);
+              _this.$message.error("上传失败");
+            } else {
+              if (type == 2) {
+                _this.cImgInfo.push({
+                  name: file.name,
+                  url: data.Location,
+                });
+                _this.addMtl();
+                _this.cImgInfo = [];
+                _this.selectMtl();
+                _this.imgChange(null, null, type);
+              } else if (type == 3) {
+                _this.cImgInfo.push({
+                  name: file.name,
+                  url: data.Location,
+                });
+                _this.addMtl();
+                _this.cImgInfo = [];
+                _this.selectMtl();
+                _this.imgChange(null, null, type);
+              }
+              console.log(data.Location);
+            }
+          });
+      }
+    },
+    addMtl() {
+      let params = {
+        cInfo: this.cImgInfo[0],
+        t: this.choose,
+        cBy: this.userid,
+      };
+      this.ajax
+        .get(this.$store.state.api + "addMtl", params)
+        .then((res) => {
+          this.$message.success("上传素材成功");
+        })
+        .catch((err) => {
+          console.error(err);
+        });
+    },
+    sMtl(type) {
+      this.choose = type;
+      this.selectMtl();
+    },
+    selectMtl() {
+      this.isLoading = true;
+      let params = {
+        t: parseInt(this.choose),
+        uid: this.userid,
+        page: this.page,
+      };
+      this.ajax
+        .get(this.$store.state.api + "selectMtl2", params)
+        .then((res) => {
+          this.isLoading = false;
+          this.total = res.data[0].length > 0 ? res.data[0][0].num : 0;
+          this.chapInfo = res.data[0];
+        })
+        .catch((err) => {
+          this.isLoading = false;
+          console.error(err);
+        });
+    },
+    deleteM(id) {
+      this.isLoading = true;
+      let params = {
+        id: id,
+      };
+      this.ajax
+        .get(this.$store.state.api + "deleteM", params)
+        .then((res) => {
+          this.isLoading = false;
+          this.$message.success("删除成功");
+          this.selectMtl();
+        })
+        .catch((err) => {
+          this.isLoading = false;
+          console.error(err);
+        });
+    },
+    onPlayerPlay() {},
+  },
+  created() {
+    this.selectMtl();
+  },
+};
+</script>
+
+<style scoped>
+/* .student_button {
+																														display: flex;
+																														overflow: hidden;
+																														height: 40px;
+																													} */
+.student_head {
+  display: flex;
+  justify-content: space-between;
+}
+.three {
+  display: flex;
+  flex-direction: row;
+  justify-content: space-between;
+  width: 200px;
+  height: 30px;
+}
+
+.three > div {
+  cursor: pointer;
+}
+
+.choose {
+  border-bottom: 5px solid #5c549f;
+}
+
+.student_table {
+  width: 100%;
+  height: 100%;
+  background: #f2f2f2;
+  margin-top: 10px;
+}
+
+.tup {
+  width: 200px;
+  height: 191px;
+  margin: 0 auto;
+  position: relative;
+}
+
+.tup:hover .deleteWord {
+  display: block;
+}
+
+.deleteWord {
+  width: 25px;
+  height: 25px;
+  position: absolute;
+  right: -25px;
+  top: -10px;
+  cursor: pointer;
+  display: none;
+}
+
+.tup > img,
+.deleteWord > img {
+  width: 100%;
+  height: 100%;
+}
+
+.out_box {
+  display: flex;
+  flex-direction: column;
+  flex-wrap: nowrap;
+  width: 250px;
+  padding: 10px 0;
+  background: #fff;
+  margin: 0 25px 15px 0;
+}
+
+.bottom_box {
+  display: flex;
+  text-align: center;
+  margin: 0 auto;
+  padding: 10px 0 5px 0;
+}
+.bottom_box > div:nth-child(1) {
+  white-space: nowrap;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  word-break: break-all;
+  width: 200px;
+}
+.uploadThing {
+  background: #2268bc;
+  width: 90px;
+  height: 35px;
+  color: #fff;
+  font-size: 12px;
+  text-align: center;
+  line-height: 35px;
+  cursor: pointer;
+  border-radius: 4px;
+}
+
+.top {
+  display: flex;
+  justify-content: space-between;
+}
+.student_page {
+  margin-top: 30px;
+}
+.boxCss {
+  padding: 15px 5px;
+  display: flex;
+  flex-direction: row;
+  flex-wrap: wrap;
+  min-height: 250px;
+}
+
+.student_page
+  >>> .el-pagination.is-background
+  .el-pager
+  li:not(.disabled).active {
+  background-color: #5c549f;
+  color: #fff !important;
+}
+.student_page
+  >>> .el-pagination.is-background
+  .el-pager
+  li:not(.disabled):hover {
+  color: #5c549f;
+}
+
+</style>

+ 1165 - 0
src/components/pages/studentGM.vue

@@ -0,0 +1,1165 @@
+<template>
+  <div class="pb_content" style="background: unset;height: 100%;overflow: auto;">
+    <div
+      class="pb_content_body"
+      style="
+        background: #fff;
+        padding: 0px 25px;
+        box-sizing: border-box;
+        margin: 10px auto 0;
+        /* border-radius: 5px; */
+      "
+    >
+      <div class="pb_head">
+        <span>我的学生列表</span>
+      </div>
+      <div class="student_head">
+        <div class="head_left">
+          <el-input v-model="sPhoneUser" class="student_input" placeholder="请输入手机号或用户名"></el-input>
+          <el-button class="student_button" @click="searchStudent">查询</el-button>
+        </div>
+        <div class="head_right">
+          <el-button @click="addStudent">添加学生</el-button>
+          <el-upload
+            class="upload-demo newCss"
+            :http-request="handleChange"
+            :on-remove="handleRemove"
+            action="#"
+            :file-list="fileListUpload"
+            accept=".xlsx"
+          >
+            <el-button class="btnClassGM" size="primary" type="primary">批量添加</el-button>
+            <div slot="tip" class="el-upload__tip" style="margin-left:10px;">只能上传xlsx文件,且不超过500kb</div>
+          </el-upload>
+          <!-- <el-button @click="exportExcel">导出学生</el-button> -->
+          <div @click="getExcel">xls 上传样例</div>
+        </div>
+      </div>
+    </div>
+    <div class="pb_content_body" style="margin:0 auto">
+      <div class="student_table">
+        <el-table
+          ref="table"
+          :data="tableData"
+          border
+          :height="tableHeight"
+          :fit="true"
+          v-loading="isLoading"
+          style="width: 100%"
+          :header-cell-style="{ background: '#f1f1f1', fontSize: '17px' }"
+          :row-class-name="tableRowClassName"
+        >
+          <el-table-column label="姓名" min-width="10" align="center">
+            <template slot-scope="scope">
+              <div class="userImg">
+                <div class="tx">
+                  <img
+                    :src="
+                      scope.row.headportrait != null
+                        ? scope.row.headportrait
+                        : tx
+                    "
+                    alt
+                  />
+                </div>
+                <div
+                  style="
+                    width: 50px;
+                    text-align: left;
+                    white-space: nowrap;
+                    overflow: hidden;
+                    text-overflow: ellipsis;
+                  "
+                >{{ scope.row.name }}</div>
+              </div>
+            </template>
+          </el-table-column>
+            <el-table-column label="账号" min-width="15" align="center">
+            <template slot-scope="scope">
+              <div>{{scope.row.un ? scope.row.un : "" }}</div>
+            </template>
+          </el-table-column>
+          <el-table-column label="电话" min-width="15" align="center">
+            <template slot-scope="scope">
+              <div>{{scope.row.phonenumber ? scope.row.phonenumber : "" }}</div>
+            </template>
+          </el-table-column>
+          <el-table-column prop="studentid" label="学号" min-width="10" align="center"></el-table-column>
+          <!-- <el-table-column
+            prop="school"
+            label="学校"
+            min-width="30"
+            align="center"
+          >
+          </el-table-column>-->
+          <!-- <el-table-column
+            prop="classname"
+            label="班级"
+            min-width="15"
+            align="center"
+          >
+          </el-table-column>-->
+          <el-table-column label="操作" min-width="20">
+            <template slot-scope="scope">
+              <!-- <el-button
+                class="de_button"
+                type="primary"
+                size="small"
+                @click="deleteStudent(scope.row.userid, scope.row.state)"
+                >删除</el-button
+              >-->
+              <div class="delete" @click="deleteStudent(scope.row.userid, scope.row.state)">
+                <img src="../../assets/remove.png" alt />
+              </div>
+            </template>
+          </el-table-column>
+        </el-table>
+      </div>
+      <div class="student_page">
+        <el-pagination
+          background
+          layout="prev, pager, next"
+          :page-size="10"
+          :total="total"
+          v-if="page"
+          @current-change="handleCurrentChange"
+        ></el-pagination>
+      </div>
+    </div>
+    <el-dialog
+      :visible.sync="dialogVisible"
+      :append-to-body="true"
+      width="700px"
+      :before-close="handleClose"
+      class="add_student"
+    >
+      <div slot="title" class="header-title">
+        <div class="logoImg">
+          <img src="../../assets/logo.png" alt />
+        </div>
+        <div class="title_add_student">添加学生</div>
+      </div>
+      <el-form class="inputClass">
+        <el-form-item label="学生名称" :label-width="formLabelWidth">
+          <span>
+            <el-input placeholder="请输入学生昵称" clearable v-model="sName" class="add_input"></el-input>
+          </span>
+        </el-form-item>
+        <el-form-item label="学生学号" :label-width="formLabelWidth">
+          <span>
+            <el-input placeholder="请输入学生学号" clearable v-model="sId" class="add_input"></el-input>
+          </span>
+        </el-form-item>
+        <el-form-item label="学生手机号" :label-width="formLabelWidth">
+          <span>
+            <el-input placeholder="请输入学生手机号" clearable v-model="sPhone" class="add_input"></el-input>
+          </span>
+        </el-form-item>
+        <el-form-item label="学生邮箱" :label-width="formLabelWidth">
+          <span>
+            <el-input placeholder="请输入学生邮箱" clearable v-model="sMail" class="add_input"></el-input>
+          </span>
+        </el-form-item>
+        <el-form-item label="所属学校" :label-width="formLabelWidth">
+          <el-input disabled style="width: 300px" v-model="schoolName"></el-input>
+        </el-form-item>
+        <el-form-item label="班级" :label-width="formLabelWidth">
+          <el-select v-model="sByClass" placeholder="请选择班级">
+            <el-option
+              v-for="(item, index) in classJuri"
+              :key="index"
+              :label="item.name"
+              :value="item.id"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <div style="text-align: center; color: #adb3b7">注:添加学生的账号密码为123456</div>
+      </el-form>
+      <span slot="footer" class="dialog-footer flex">
+        <el-button class="right" @click="insertStudent">确认</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import $ from "jquery";
+import pinyin from "../../../node_modules/js-pinyin/index";
+export default {
+  data() {
+    return {
+      tableHeight: "500px",
+      isLoading: false,
+      formLabelWidth: "100px",
+      tableData: [],
+      dialogVisible: false,
+      sName: "",
+      sPhone: "",
+      sId: "",
+      schoolName: "",
+      // sBySchool: [],
+      // sBySchoolName:"",
+      sByClass: "",
+      sMail: "",
+      schoolJuri: [],
+      classJuri: [],
+      fileListUpload: [],
+      page: 1,
+      total: 0,
+      sPhoneUser: "",
+      userid: this.$route.query.userid,
+      oid: this.$route.query.oid,
+      cid: this.$route.query.cid,
+      tx: require("../../assets/avatar.png"),
+    };
+  },
+  mounted() {
+    this.$nextTick(function () {
+      this.tableHeight =
+        window.innerHeight - this.$refs.table.$el.offsetTop - 200;
+      if (this.tableHeight <= 530) {
+        this.tableHeight = 530;
+      }
+      // 监听窗口大小变化
+      let self = this;
+      window.onresize = function () {
+        self.tableHeight =
+          window.innerHeight - self.$refs.table.$el.offsetTop - 200;
+        if (self.tableHeight <= 530) {
+          self.tableHeight = 530;
+        }
+      };
+    });
+  },
+  methods: {
+    tableRowClassName({ row, rowIndex }) {
+      if ((rowIndex + 1) % 2 === 0) {
+        return "even_row";
+      } else {
+        return "";
+      }
+    },
+    searchStudent() {
+      this.page = 1;
+      this.getStudent();
+    },
+    addStudent() {
+      this.dialogVisible = true;
+      (this.sName = ""), (this.sPhone = ""), (this.sByClass = "");
+      this.getClass();
+      // this.getSchool();
+    },
+    handleClose(done) {
+      done();
+    },
+    getExcel(res) {
+      require.ensure([], () => {
+        const { export_json_to_excel } = require("../../common/Export2Excel");
+        const tHeader = ["学号", "学生姓名", "学生邮箱", "学生手机号", "班级"];
+        const data = [];
+        export_json_to_excel(tHeader, data, "上传学生样例");
+      });
+    },
+    handleCurrentChange(val) {
+      this.page = val;
+      this.getStudent();
+    },
+    time() {
+      if (!this.now) {
+        this.now = new Date().getTime();
+        return true;
+      } else {
+        let time = new Date().getTime();
+        if (time - this.now > 3000) {
+          this.now = time;
+          return true;
+        } else {
+          return false;
+        }
+      }
+    },
+    //新增学生
+    insertStudent() {
+      this.dialogVisible = true;
+      if (this.sName === "") {
+        this.$message.error("学生昵称不能为空");
+        return;
+      }  else if (this.sByClass === "") {
+        this.$message.error("请为学生选择班级");
+        return;
+      } else if (this.sId != "" && !/^[1][3,4,5,7,8][0-9]{9}$/.test(this.sPhone)) {
+        this.$message.error("手机号格式不正确");
+        return;
+      } else if (
+        !/^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/.test(this.sMail)
+      ) {
+        this.$message.error("邮箱格式不正确");
+        return;
+      }
+
+      // else if (this.sId === "") {
+      //   this.$message.error("学生学号不能为空");
+      //   return;
+      // } else if (this.sPhone === "") {
+      //   this.$message.error("学生手机号不能为空");
+      //   return;
+      // }
+      if (this.time()) {
+        // let params = { un: this.sPhone };
+        // this.ajax
+        //   .get(this.$store.state.api + "findPhone", params)
+        //   .then((res) => {
+        //     if (res.data[0].length > 0) {
+        //       this.$message.error("此学生手机号码已被注册");
+        //     } else {
+              let params = { un: this.sMail };
+              this.ajax
+                .get(this.$store.state.api + "findMail", params)
+                .then((res) => {
+                  if (res.data[0].length > 0) {
+                    this.$message.error("此学生邮箱已被注册");
+                  } else {
+                    // let params = { un: this.sId };
+                    // this.ajax
+                    //   .get(this.$store.state.api + "findSid", params)
+                    //   .then((res) => {
+                        // if (res.data[0].length > 0) {
+                        //   this.$message.error("此学生学号已被注册");
+                        // } else {
+                          this.add_Student();
+                        // }
+                      // })
+                      // .catch((err) => {
+                      //   console.error(err);
+                      // });
+                  }
+                })
+                .catch((err) => {
+                  console.error(err);
+                });
+            // }
+          // })
+          // .catch((err) => {
+          //   console.error(err);
+          // });
+      }
+    },
+    add_Student() {
+      let params = [
+        {
+          username: this.sMail,
+          userpassword: 123456,
+          alias: this.sName,
+          oid: this.oid,
+          ph: this.sPhone,
+          sid: this.sId,
+          cid: this.sByClass,
+        },
+      ];
+      this.ajax
+        .post(this.$store.state.api + "batchRegistration", params)
+        .then((res) => {
+          // console.log(res.data.uid, res.data.ph, res.data.oid, res.data.cid);
+          // this.isLoading = false;
+
+          let params = [
+            {
+              userid: res.data.uid,
+              username: this.sName,
+              sid: this.sId,
+              type: 2,
+              oid: res.data.oid,
+              phone: res.data.ph,
+              cid: res.data.cid,
+              intro: "",
+              sex: "0",
+            },
+          ];
+          this.ajax
+            // .post(this.$store.state.api + "updateUser", params)
+            .post(this.$store.state.api + "updateUserByEdu", params)
+            .then((res) => {
+              console.log(res);
+            })
+            .catch((err) => {
+              console.error(err);
+            });
+          this.$message({
+            message: "新增成功",
+            type: "success",
+          });
+          this.dialogVisible = false;
+          this.sPhone = "";
+          this.sName = "";
+          // this.sBySchool = [];
+          this.sByClass = [];
+          this.sMail = "";
+          this.getStudent();
+        })
+        .catch((err) => {
+          this.isLoading = false;
+          this.$message({
+            message: "新增失败",
+            type: "error",
+          });
+          console.error(err);
+        });
+    },
+    //获取班级列表
+    getClass() {
+      this.isLoading = true;
+      let params = {
+        oid: this.oid,
+      };
+      this.ajax
+        .get(this.$store.state.api + "selectClassBySchool", params)
+        .then((res) => {
+          this.isLoading = false;
+          this.classJuri = res.data[0];
+        })
+        .catch((err) => {
+          this.isLoading = false;
+          console.error(err);
+        });
+    },
+    // getSchool() {
+    // 	this.isLoading = true;
+    // 	let params = {
+    // 		page: this.page,
+    // 	};
+    // 	this.ajax
+    // 		.get(this.$store.state.api + "selectOrg", params)
+    // 		.then((res) => {
+    // 			this.isLoading = false;
+    // 			this.schoolJuri = res.data[0];
+    // 		})
+    // 		.catch((err) => {
+    // 			this.isLoading = false;
+    // 			console.error(err);
+    // 		});
+    // },
+    getStudent() {
+      this.isLoading = true;
+      let params = {
+        oid: this.oid,
+        cid: this.cid,
+        cu: "",
+        cn: this.sPhoneUser,
+        page: this.page,
+      };
+      this.ajax
+        .get(this.$store.state.api + "selectStudent2", params)
+        .then((res) => {
+          this.isLoading = false;
+          this.total = res.data[0].length > 0 ? res.data[0][0].num : 0;
+          this.tableData = res.data[0];
+        })
+        .catch((err) => {
+          this.isLoading = false;
+          console.error(err);
+        });
+    },
+    handleChange(file) {
+      this.fileTemp = file.file;
+      if (this.fileTemp) {
+        if (
+          this.fileTemp.type ==
+            "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" ||
+          this.fileTemp.type == "application/vnd.ms-excel"
+        ) {
+          this.importCount = 1;
+          this.importfxx(this.fileTemp);
+        } else {
+          this.$message({
+            type: "warning",
+            message: "附件格式错误,请删除后重新上传!",
+          });
+        }
+      } else {
+        this.$message({
+          type: "warning",
+          message: "请上传附件!",
+        });
+      }
+    },
+    handleRemove(file, fileList) {
+      this.fileTemp = null;
+    },
+    exportExcel() {
+      try {
+        let params = {
+          oid: this.oid,
+        };
+        this.ajax
+          .get(this.$store.state.api + "selectUserBySchool", params)
+          .then((res) => {
+            var res = res.data[0];
+            //如果value的json字段的key值和想要的headers值不一致时,可做如下更改
+            //将和下面的Object.fromEntries结合,将json字段的key值改变为要求的excel的header值
+            var array = [];
+            for (var i = 0; i < res.length; i++) {
+              var _json = {};
+              _json["用户名"] = res[i].username;
+              _json["姓名"] = res[i].alias ? res[i].alias : "";
+              _json["班级"] = res[i].classid ? res[i].classid : "";
+              array.push(_json);
+            }
+
+            var XLSX = require("xlsx");
+            const workbook = XLSX.utils.book_new(); //创建一个新的工作簿对象
+            let ws = XLSX.utils.json_to_sheet(array); //将json对象数组转化成工作表
+            ws["!cols"] = [
+              //设置每一列的宽度
+              { wch: 50 },
+              { wch: 50 },
+              { wch: 50 },
+            ];
+            XLSX.utils.book_append_sheet(workbook, ws, "sheet1"); //把sheet添加到workbook里,第三个参数是sheet名
+            XLSX.writeFile(workbook, "学生信息.xlsx");
+            // const wopts = { bookType: "xlsx", bookSST: false, type: "array" };//写入的样式bookType:输出的文件类型,type:输出的数据类型,bookSST: 是否生成Shared String Table,官方解释是,如果开启生成速度会下降,但在低版本IOS设备上有更好的兼容性
+            // const wbout = XLSX.write(workbook, wopts);// 浏览器端和node共有的API,实际上node可以直接使用xlsx.writeFile来写入文件,但是浏览器没有该API
+            // FileSaver.saveAs(new Blob([wbout], { type: "application/octet-stream" }), `${title} demo.xlsx`);//保存文件
+            this.$message({
+              message: "导出成功",
+              type: "success",
+            });
+          })
+          .catch((err) => {
+            console.error(err);
+          });
+      } catch (e) {
+        console.log(e, e.stack);
+      }
+    },
+    importfxx(obj) {
+      const loading = this.$loading.service({
+        background: "rgba(255, 255, 255, 0.7)",
+        target: document.body,
+      });
+      var _$ = $;
+      this.importCount++;
+      let _this = this;
+      // 通过DOM取文件数据
+      this.file = obj;
+      var rABS = false; //是否将文件读取为二进制字符串
+      var f = this.file;
+      var reader = new FileReader();
+      //if (!FileReader.prototype.readAsBinaryString) {
+      FileReader.prototype.readAsBinaryString = function (f) {
+        var binary = "";
+        var rABS = false; //是否将文件读取为二进制字符串
+        var pt = this;
+        var wb; //读取完成的数据
+        var outdata;
+        var reader = new FileReader();
+        reader.onload = function (e) {
+          var bytes = new Uint8Array(reader.result);
+          var length = bytes.byteLength;
+          for (var i = 0; i < length; i++) {
+            binary += String.fromCharCode(bytes[i]);
+          }
+          var XLSX = require("xlsx");
+          if (rABS) {
+            wb = XLSX.read(btoa(fixdata(binary)), {
+              //手动转化
+              type: "base64",
+            });
+          } else {
+            wb = XLSX.read(binary, {
+              type: "binary",
+            });
+          }
+          outdata = XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]]); //outdata就是你想要的东西
+          this.da = [...outdata];
+          let arr = [];
+          this.da.map((v) => {
+            let obj = {};
+            let a = "";
+            var num = "";
+            for (var cj = 0; cj < 3; cj++) {
+              num += Math.floor(Math.random() * 10);
+            }
+            a =
+              pinyin.getFullChars(v["学生姓名"]).toLowerCase() +
+              num +
+              "@cocorobo.cc";
+            obj.sId = v["学号"];
+            obj.name = v["学生姓名"];
+            obj.mail = v["学生邮箱"] ? v["学生邮箱"] : a;
+            obj.phone = v["学生手机号"];
+            obj.class = v["班级"];
+            arr.push(obj);
+          });
+          console.log(arr);
+          let _b = 1;
+          for (var i = 0; i < arr.length; i++) {
+            let item = arr[i];
+            if (item.class === "") {
+              _b = 1;
+              _this.$message.error("学生班级不能为空,请重新上传");
+              break;
+            } else if (item.name === "") {
+              _b = 1;
+              _this.$message.error("学生姓名不能为空,请重新上传");
+              break;
+            } else if (item.sId === "") {
+              _b = 1;
+              _this.$message.error("学生学号不能为空,请重新上传");
+            }
+            // else if (item.phone === "") {
+            //   _b = 1;
+            //   _this.$message.error("学生手机号不能为空,请重新上传");
+            //   break;
+            // } else if (!/^[1][3,4,5,7,8][0-9]{9}$/.test(item.phone)) {
+            //   _b = 1;
+            //   _this.$message.error("有学生手机号格式不正确,请重新上传");
+            //   break;
+            // }
+            else if (item.mail === "") {
+              _b = 1;
+              _this.$message.error("学生邮箱不能为空,请重新上传");
+              break;
+            } else if (
+              !/^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/.test(
+                item.mail
+              )
+            ) {
+              _b = 1;
+              _this.$message.error("有学生邮箱格式不正确,请重新上传");
+              break;
+            }
+            //  else if (item.school === "") {
+            // 	_b = 1;
+            // 	_this.$message.error("学生学校不能为空,请重新上传");
+            // 	break;
+            // }
+            // else if (item.sex === "") {
+            // 	_b = 1;
+            // 	_this.$message.error("学生性别不能为空,请重新上传");
+            // 	break;
+            // }
+            // if (item.class != "") {
+            //   let _a;
+            //   let params = {
+            //     className: item.class,
+            //   };
+
+            //   _$.ajax({
+            //     url: _this.$store.state.api + "selectC", //url路径
+            //     type: "GET", //GET
+            //     async: false, //或false,是否异步
+            //     data: params,
+            //     timeout: 5000, //超时时间
+            //     dataType: "json", //返回的数据格式:
+            //     beforeSend: function (xhr) {},
+            //     success: function (res, textStatus, jqXHR) {
+            //       if (res[0].length == 0) {
+            //         _a = 1;
+            //         _this.$message.error(
+            //           "有学生班级不存在,请去添加后并重新上传"
+            //         );
+            //       } else {
+            //         item.classid = res[0][0].id;
+            //       }
+            //     },
+            //     error: function (xhr, textStatus) {
+            //       console.log(textStatus);
+            //     },
+            //     complete: function () {},
+            //   });
+            //   if (_a == 1) {
+            //     _b = 1;
+            //     break;
+            //   }
+            // }
+            // if (item.school != "") {
+            // 	let _a;
+            // 	let params = {
+            // 		schoolName: item.school,
+            // 	};
+
+            // 	_$.ajax({
+            // 		url: _this.$store.state.api + "selectS", //url路径
+            // 		type: "GET", //GET
+            // 		async: false, //或false,是否异步
+            // 		data: params,
+            // 		timeout: 5000, //超时时间
+            // 		dataType: "json", //返回的数据格式:
+            // 		beforeSend: function (xhr) {},
+            // 		success: function (res, textStatus, jqXHR) {
+            // 			if (res[0].length == 0) {
+            // 				_a = 1;
+            // 				_this.$message.error(
+            // 					"有学生学校不存在,请去添加后并重新上传"
+            // 				);
+            // 			} else {
+            // 				item.schoolid = res[0][0].id;
+            // 			}
+            // 		},
+            // 		error: function (xhr, textStatus) {
+            // 			console.log(textStatus);
+            // 		},
+            // 		complete: function () {},
+            // 	});
+            // 	if (_a == 1) {
+            // 		_b = 1;
+            // 		break;
+            // 	}
+            // }
+            //   for (var k = 0; k < arr.length; k++) {
+            //     if (item.phone != "") {
+            //       let params = { un: item.phone };
+            //       let _a;
+            //       _$.ajax({
+            //         url: _this.$store.state.api + "findPhone", //url路径
+            //         type: "GET", //GET
+            //         async: false, //或false,是否异步
+            //         data: params,
+            //         timeout: 5000, //超时时间
+            //         dataType: "json", //返回的数据格式:
+            //         beforeSend: function (xhr) {},
+            //         success: function (res, textStatus, jqXHR) {
+            //           if (res[0].length > 0) {
+            //             _this.$message.error("有学生手机号码已被注册");
+            //             _a = 1;
+            //           }
+            //         },
+            //         error: function (xhr, textStatus) {
+            //           console.log(textStatus);
+            //         },
+            //         complete: function () {},
+            //       });
+            //       if (_a == 1) {
+            //         _b = 1;
+            //         break;
+            //       }
+            //     }
+            //     if (item.mail != "") {
+            //       let params = { un: item.mail };
+            //       let _a;
+            //       _$.ajax({
+            //         url: _this.$store.state.api + "findMail", //url路径
+            //         type: "GET", //GET
+            //         async: false, //或false,是否异步
+            //         data: params,
+            //         timeout: 5000, //超时时间
+            //         dataType: "json", //返回的数据格式:
+            //         beforeSend: function (xhr) {},
+            //         success: function (res, textStatus, jqXHR) {
+            //           if (res[0].length > 0) {
+            //             _this.$message.error("有学生邮箱已被注册");
+            //             _a = 1;
+            //           }
+            //         },
+            //         error: function (xhr, textStatus) {
+            //           console.log(textStatus);
+            //         },
+            //         complete: function () {},
+            //       });
+            //       if (_a == 1) {
+            //         _b = 1;
+            //         break;
+            //       }
+            //     }
+            //     if (item.sId != "") {
+            //       let params = { un: item.sId };
+            //       let _a;
+            //       _$.ajax({
+            //         url: _this.$store.state.api + "findSid", //url路径
+            //         type: "GET", //GET
+            //         async: false, //或false,是否异步
+            //         data: params,
+            //         timeout: 5000, //超时时间
+            //         dataType: "json", //返回的数据格式:
+            //         beforeSend: function (xhr) {},
+            //         success: function (res, textStatus, jqXHR) {
+            //           if (res[0].length > 0) {
+            //             _this.$message.error("有学生学号重复");
+            //             _a = 1;
+            //           }
+            //         },
+            //         error: function (xhr, textStatus) {
+            //           console.log(textStatus);
+            //         },
+            //         complete: function () {},
+            //       });
+            //       if (_a == 1) {
+            //         _b = 1;
+            //         break;
+            //       }
+            //     }
+            //     _b = 2;
+            //   }
+            // }
+            // if (_b == 2) {
+
+            // for (var i = 0; i < arr.length; i++) {
+            //   let _i = i;
+            //   let item = arr[i];
+            //   let params = [
+            //     {
+            //       alias: item.name,
+            //       username: item.mail,
+            //       userpassword: 123456,
+            //       oid: _this.oid,
+            //       ph: item.phone,
+            //       cid: item.class,
+            //     },
+            //   ];
+
+            //   _this.ajax
+            //     .post(_this.$store.state.api + "batchRegistration", params)
+            //     .then((res) => {
+            //       let params = [
+            //         {
+            //           userid: res.data.uid,
+            //           username: item.name,
+            //           sId: item.sId,
+            //           type: 2,
+            //           oid: res.data.oid,
+            //           phone: res.data.ph ? res.data.ph : "",
+            //           cid: res.data.cid ? res.data.cid : "",
+            //           intro: "",
+            //           sex: "0",
+            //         },
+            //       ];
+            //       _this.ajax
+            //         .post(_this.$store.state.api + "updateUserByEdu", params)
+            //         .then((res) => {
+            //           console.log(res);
+            //         })
+            //         .catch((err) => {
+            //           console.error(err);
+            //         });
+            //       loading.close();
+            //       // _this.$message({
+            //       //   message: "新增成功",
+            //       //   type: "success",
+            //       // });
+            //       _this.getStudent();
+            //       // if (_i == arr.length - 1) {
+            //       //   loading.close();
+            //       //   _this.$message({
+            //       //     message: "上传成功",
+            //       //     type: "success",
+            //       //   });
+            //       //   _this.getStudent();
+            //       // }
+            //     })
+            //     .catch((err) => {
+            //       _this.$message.error("上传失败");
+            //       console.error(err);
+            //     });
+            // }
+            // } else {
+            //   loading.close();
+          }
+          let z = 2;
+          let newArr = JSON.stringify(arr);
+          let params = [
+            {
+              arr: newArr,
+              userpassword: 123456,
+              oid: _this.oid,
+            },
+          ];
+          _this.ajax
+            .post(_this.$store.state.api + "batchRegistrationMore", params)
+            .then((res) => {
+              if (res.data.type == 1) {
+                _this.$message.error("有学生手机号码已被注册");
+                z = 1;
+              }
+              if (res.data.type == 2) {
+                _this.$message.error("有学生邮箱已被注册");
+                z = 1;
+              }
+              if (res.data.type == 3) {
+                _this.$message.error("有学生学号重复");
+                z = 1;
+              }
+              if (z == 2) {
+                _this.$message({
+                  message: "新增成功",
+                  type: "success",
+                });
+                _this.getStudent();
+              }
+              loading.close();
+            })
+            .catch((err) => {
+              console.error(err);
+            });
+          _this.fileListUpload = [];
+        };
+
+        reader.readAsArrayBuffer(f);
+      };
+
+      if (rABS) {
+        reader.readAsArrayBuffer(f);
+      } else {
+        reader.readAsBinaryString(f);
+      }
+    },
+    getSchoolName() {
+      let params = {
+        oid: this.oid,
+      };
+      this.ajax
+        .get(this.$store.state.api + "selectSchoolName2", params)
+        .then((res) => {
+          this.schoolName = res.data[0][0].name;
+        })
+        .catch((err) => {
+          console.error(err);
+        });
+    },
+    deleteStudent(id, state) {
+      state = 0;
+      let params = [{ uid: id, state: state }];
+      this.$confirm("确定" + "删除" + "此学生吗?", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning",
+      })
+        .then(() => {
+          this.ajax
+            .post(this.$store.state.api + "deleteStudent", params)
+            .then((res) => {
+              this.$message({
+                message: "操作成功",
+                type: "success",
+              });
+              this.getStudent();
+            })
+            .catch((err) => {
+              this.$message.error("操作失败");
+              console.error(err);
+            });
+        })
+        .catch(() => {});
+    },
+  },
+  created() {
+    this.page = 1;
+    this.getStudent();
+    this.getSchoolName();
+  },
+};
+</script>
+
+<style scoped>
+.pb_head > span:nth-child(2) {
+  font-size: 20px;
+  margin-left: 5px;
+  color: #828282;
+}
+.pb_head {
+  margin: 0 !important;
+  width: 100% !important;
+}
+.student_page {
+  margin-top: 10px;
+}
+.student_head {
+  margin-top: 10px;
+  padding-bottom: 10px;
+  display: flex;
+  justify-content: space-between;
+}
+.head_left {
+  display: flex;
+  align-items: center;
+}
+.head_right {
+  display: flex;
+  flex-direction: row;
+  flex-wrap: nowrap;
+  align-items: baseline;
+}
+.student_input >>> .el-input__inner {
+  height: 30px;
+  width: 190px;
+  font-size: 13px;
+  padding: 0 10px;
+}
+.student_button {
+  color: #fff;
+  background: #8681b7;
+  border-color: #8681b7;
+  width: 60px;
+  height: 30px;
+  padding: 0 !important;
+  font-size: 12px;
+  line-height: 30px;
+}
+.head_right > button:nth-child(1) {
+  color: #fff;
+  background: #8681b7;
+  border-color: #8681b7;
+  width: 70px;
+  height: 30px;
+  padding: 0 !important;
+  font-size: 12px;
+  line-height: 30px;
+}
+.head_right > button:nth-child(2) {
+  color: #fff;
+  background: #8681b7;
+  width: 70px;
+  height: 30px;
+  padding: 0 !important;
+  font-size: 12px;
+  line-height: 30px;
+}
+.head_right > div {
+  font-size: 12px;
+  line-height: 40px;
+  margin-left: 10px;
+  color: #2a6dbe;
+  text-decoration: underline;
+  cursor: pointer;
+}
+.student_table >>> .el-table--border td {
+  border-right: 0px !important;
+}
+.student_table >>> .el-table,.student_table >>> .el-table__body-wrapper{
+  height: auto !important;
+}
+.el-table >>> .even_row {
+  background-color: #f1f1f1 !important;
+}
+.de_button {
+  color: #fff;
+  background: #5190fd;
+  width: 50px;
+  height: 25px;
+  padding: 0 !important;
+  font-size: 12px;
+  line-height: 25px;
+}
+.add_student >>> .el-dialog__header {
+  padding: 20px 20px 10px;
+  text-align: center;
+  background: #454545;
+}
+.add_student >>> .el-dialog__title {
+  font-size: 14px !important;
+  color: #fff !important;
+}
+.add_student >>> .el-dialog__headerbtn {
+  font-size: 20px !important;
+}
+.add_student >>> .el-form-item__label {
+  margin-left: 65px;
+}
+.add_student >>> .el-form-item {
+  display: flex;
+}
+.add_student >>> .el-form-item__content {
+  margin: 0 !important;
+}
+.add_input {
+  width: 365px;
+}
+.add_student >>> .el-dialog__footer {
+  text-align: center !important;
+}
+.right {
+  width: 250px;
+  color: #fff;
+  background: #8681b7;
+  margin-bottom: 20px;
+}
+.header-title {
+  display: flex;
+}
+.logoImg {
+  width: 30px;
+}
+.logoImg > img {
+  width: 100%;
+  height: 100%;
+}
+.title_add_student {
+  margin: 0 auto;
+  color: #fff;
+}
+.upload-demo {
+  line-height: 0px !important;
+}
+.upload-demo >>> .el-button {
+  color: #fff;
+  background: #8681b7;
+  width: 70px;
+  height: 30px;
+  padding: 0 !important;
+  font-size: 12px;
+  line-height: 0 !important;
+}
+
+.userImg {
+  display: flex;
+  flex-direction: row;
+  justify-content: center;
+  align-items: center;
+}
+
+.tx {
+  width: 40px;
+  margin-right: 10px;
+}
+
+.delete {
+  width: 25px;
+  cursor: pointer;
+}
+
+.tx > img,
+.delete > img {
+  width: 100%;
+  height: 100%;
+}
+
+.newCss {
+  display: flex;
+  flex-direction: row;
+  flex-wrap: nowrap;
+  align-items: baseline;
+}
+
+
+.student_page
+  >>> .el-pagination.is-background
+  .el-pager
+  li:not(.disabled).active {
+  background-color: #5c549f;
+  color: #fff !important;
+}
+.student_page
+  >>> .el-pagination.is-background
+  .el-pager
+  li:not(.disabled):hover {
+  color: #5c549f;
+}
+
+
+
+.el-select-dropdown__item.selected {
+  color: #5c549f;
+}
+
+.inputClass.is-active >>> .el-input__inner,
+.inputClass  >>> .el-input__inner:focus {
+  border-color: #5c549f;
+}
+
+.inputClass >>> .el-select .el-input.is-focus .el-input__inner {
+  border-color: #5c549f;
+}
+.inputClass >>> .el-select .el-input__inner:focus {
+  border-color: #5c549f;
+}
+
+</style>

+ 44 - 1
src/router/index.js

@@ -3,12 +3,15 @@ import Router from 'vue-router'
 import ElementUI from 'element-ui'
 import 'element-ui/lib/theme-chalk/index.css'
 import classA from '@/components/pages/class'
+import classGM from '@/components/pages/classGM'
 import course from '@/components/pages/course'
 import courseGM from '@/components/pages/courseGM'
 import courseDetail from '@/components/pages/courseDetail'
 import data from '@/components/pages/data'
+import dataGM from '@/components/pages/dataGM'
 import notice from '@/components/pages/notice'
 import student from '@/components/pages/student'
+import studentGM from '@/components/pages/studentGM'
 import works from '@/components/pages/works'
 import worksGM from '@/components/pages/worksGM'
 import worksDetail from '@/components/pages/worksDetail'
@@ -17,6 +20,7 @@ import ask from '@/components/pages/ask'
 import addCourse from '@/components/pages/addCourse'
 import addCourseGM from '@/components/pages/addCourseGM'
 import library from '@/components/pages/library'
+import libraryGM from '@/components/pages/libraryGM'
 import note from '@/components/pages/note'
 import Grid from '@/components/pages/Grid'
 import demo from '@/components/pages/demo'
@@ -34,6 +38,7 @@ import audioDemo from '@/components/pages/audioDemo'
 import Ttype from '@/components/pages/Ttype'
 import banner from '@/components/pages/banner'
 import CaseDesign from '@/components/pages/CaseDesign'
+import CaseDesignGM from '@/components/pages/CaseDesignGM'
 import eventCenter from '@/components/pages/race/eventCenter'
 import addRace from '@/components/pages/race/addRace'
 import anliDetail from '@/components/pages/race/eventCenter/anliDetail'
@@ -48,6 +53,13 @@ export default new Router({
             meta: {
                 requireAuth: ''
             }
+        },{
+            path: '/classGM',
+            name: 'classGM',
+            component: classGM,
+            meta: {
+                requireAuth: ''
+            }
         },
         // {
         //   path: '/',
@@ -95,7 +107,15 @@ export default new Router({
             meta: {
                 requireAuth: '' // 是否需要判断是否登录,这里是需要判断
             }
-        }, {
+        },
+        {
+            path: '/dataGM',
+            name: 'dataGM',
+            component: dataGM,
+            meta: {
+                requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+            }
+        },  {
             path: '/notice',
             name: 'notice',
             component: notice,
@@ -111,6 +131,14 @@ export default new Router({
                 requireAuth: '' // 是否需要判断是否登录,这里是需要判断
             }
         },
+        {
+            path: '/studentGM',
+            name: 'studentGM',
+            component: studentGM,
+            meta: {
+                requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+            }
+        },
         {
             path: '/ask',
             name: 'ask',
@@ -158,6 +186,14 @@ export default new Router({
                 requireAuth: '' // 是否需要判断是否登录,这里是需要判断
             }
         },
+        {
+            path: '/libraryGM',
+            name: 'libraryGM',
+            component: libraryGM,
+            meta: {
+                requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+            }
+        },
         {
             path: '/login',
             name: 'login',
@@ -294,6 +330,13 @@ export default new Router({
             meta: {
                 requireAuth: '' // 不需要鉴权
             }
+        },{
+            path: '/CaseDesignGM',
+            name: 'CaseDesignGM',
+            component: CaseDesignGM,
+            meta: {
+                requireAuth: '' // 不需要鉴权
+            }
         }, {
             path: '/eventCenter',
             name: 'eventCenter',

この差分においてかなりの量のファイルが変更されているため、一部のファイルを表示していません