likeku vor 8 Jahren
Commit
0fe76b938c
100 geänderte Dateien mit 22505 neuen und 0 gelöschten Zeilen
  1. BIN
      avatar/1475052283/1475052283.png
  2. BIN
      avatar/1475113309/1475113309.png
  3. BIN
      avatar/1476237670/1476237670.png
  4. 335 0
      global/css/Adminstyle.css
  5. 1109 0
      global/css/bootstrap-responsive.css
  6. 9 0
      global/css/bootstrap-responsive.min.css
  7. 430 0
      global/css/bootstrap-theme.css
  8. 10 0
      global/css/bootstrap-theme.min.css
  9. 6167 0
      global/css/bootstrap.css
  10. 14 0
      global/css/bootstrap.min.css
  11. BIN
      global/css/fonts/iconMenu.eot
  12. 16 0
      global/css/fonts/iconMenu.svg
  13. BIN
      global/css/fonts/iconMenu.ttf
  14. BIN
      global/css/fonts/iconMenu.woff
  15. 7 0
      global/css/iconMenu/Read Me.txt
  16. 152 0
      global/css/iconMenu/demo-files/demo.css
  17. 30 0
      global/css/iconMenu/demo-files/demo.js
  18. 135 0
      global/css/iconMenu/demo.html
  19. BIN
      global/css/iconMenu/fonts/iconMenu.eot
  20. 16 0
      global/css/iconMenu/fonts/iconMenu.svg
  21. BIN
      global/css/iconMenu/fonts/iconMenu.ttf
  22. BIN
      global/css/iconMenu/fonts/iconMenu.woff
  23. 223 0
      global/css/iconMenu/selection.json
  24. 45 0
      global/css/iconMenu/style.css
  25. 9 0
      global/css/main.css
  26. 1 0
      global/css/nep.min.css
  27. 265 0
      global/css/recharge-style.css
  28. 908 0
      global/css/style.css
  29. 788 0
      global/css/style1.css
  30. 918 0
      global/css/style2.css
  31. BIN
      global/css/u27.jpg
  32. BIN
      global/css/u27Bg.jpg
  33. BIN
      global/css/u27Bg.png
  34. 9 0
      global/css/video.css
  35. 29 0
      global/css/webuploader.css
  36. BIN
      global/file/HWSetUp.exe
  37. BIN
      global/fonts/glyphicons-halflings-regular.eot
  38. 288 0
      global/fonts/glyphicons-halflings-regular.svg
  39. BIN
      global/fonts/glyphicons-halflings-regular.ttf
  40. BIN
      global/fonts/glyphicons-halflings-regular.woff
  41. BIN
      global/fonts/glyphicons-halflings-regular.woff2
  42. BIN
      global/images/009.gif
  43. BIN
      global/images/01.jpg
  44. BIN
      global/images/01.png
  45. BIN
      global/images/background.jpg
  46. BIN
      global/images/logo.ico
  47. BIN
      global/images/logo.jpg
  48. BIN
      global/images/u27.jpg
  49. BIN
      global/images/课堂logo.jpg
  50. BIN
      global/img/edge.jpg
  51. BIN
      global/img/glyphicons-halflings-white.png
  52. BIN
      global/img/glyphicons-halflings.png
  53. BIN
      global/img/os/win-1.png
  54. BIN
      global/img/os/win-2.png
  55. BIN
      global/img/os/win-3.png
  56. BIN
      global/img/os/win-4.png
  57. BIN
      global/img/os/win-5.png
  58. BIN
      global/img/os/win-6.png
  59. BIN
      global/img/soft/soft-1.png
  60. BIN
      global/img/soft/soft-2.png
  61. BIN
      global/jquery-ui/images/animated-overlay.gif
  62. BIN
      global/jquery-ui/images/ui-bg_flat_0_aaaaaa_40x100.png
  63. BIN
      global/jquery-ui/images/ui-bg_flat_75_ffffff_40x100.png
  64. BIN
      global/jquery-ui/images/ui-bg_glass_55_fbf9ee_1x400.png
  65. BIN
      global/jquery-ui/images/ui-bg_glass_65_ffffff_1x400.png
  66. BIN
      global/jquery-ui/images/ui-bg_glass_75_dadada_1x400.png
  67. BIN
      global/jquery-ui/images/ui-bg_glass_75_e6e6e6_1x400.png
  68. BIN
      global/jquery-ui/images/ui-bg_glass_95_fef1ec_1x400.png
  69. BIN
      global/jquery-ui/images/ui-bg_highlight-soft_75_cccccc_1x100.png
  70. BIN
      global/jquery-ui/images/ui-icons_222222_256x240.png
  71. BIN
      global/jquery-ui/images/ui-icons_2e83ff_256x240.png
  72. BIN
      global/jquery-ui/images/ui-icons_454545_256x240.png
  73. BIN
      global/jquery-ui/images/ui-icons_888888_256x240.png
  74. BIN
      global/jquery-ui/images/ui-icons_cd0a0a_256x240.png
  75. 2 0
      global/jquery-ui/jquery-ui.min.css
  76. 9 0
      global/jquery-ui/jquery-ui.min.js
  77. 2280 0
      global/js/bootstrap.js
  78. 12 0
      global/js/bootstrap.min.js
  79. 21 0
      global/js/global.js
  80. 33 0
      global/js/global2.js
  81. 5 0
      global/js/jquery-1.9.1.min.js
  82. 174 0
      global/js/sha1.js
  83. 74 0
      global/js/timer.js
  84. 821 0
      global/js/videoupload.js
  85. 33 0
      index.php
  86. 47 0
      protected/class/alipay/alipay.config.php
  87. 3920 0
      protected/class/alipay/cacert.pem
  88. 167 0
      protected/class/alipay/lib/alipay_core.function.php
  89. 40 0
      protected/class/alipay/lib/alipay_md5.function.php
  90. 163 0
      protected/class/alipay/lib/alipay_notify.class.php
  91. 163 0
      protected/class/alipay/lib/alipay_submit.class.php
  92. 661 0
      protected/class/client.php
  93. 473 0
      protected/class/video.php
  94. 120 0
      protected/config/common.conf.php
  95. 39 0
      protected/config/db.conf.php
  96. 107 0
      protected/config/routes.conf.php
  97. 807 0
      protected/controller/AdminController.php
  98. 240 0
      protected/controller/BaseController.php
  99. 181 0
      protected/controller/CommonController.php
  100. 0 0
      protected/controller/MainController.php

BIN
avatar/1475052283/1475052283.png


BIN
avatar/1475113309/1475113309.png


BIN
avatar/1476237670/1476237670.png


+ 335 - 0
global/css/Adminstyle.css

@@ -0,0 +1,335 @@
+body{
+  font-family:"微软雅黑","Tahoma";
+  height:100%;
+  background: #fff;
+  overflow-x: hidden;
+}
+ul, ol, li, h1 {
+  line-height:normal;
+  list-style-image:none;
+  list-style-position:outside;
+  list-style-type:none;
+}
+dl,ul {
+  margin:0;
+  padding:0;
+}
+dd {
+  margin-left:0
+}
+a {
+  outline:none;
+  text-decoration: none;
+}
+a img {
+  border:0 none
+}
+img {
+  vertical-align:middle;
+  border:0px
+}
+table {
+  border-collapse:collapse
+}
+.fL {float:left}
+.fR {float:right}
+.clearfix:after {
+  content:".";
+  display:block;
+  height:0;
+  clear:both;
+  visibility:hidden
+}
+.clearfix {
+  display:inline-block;
+  overflow:hidden
+}
+.clearfix {
+  display:block
+}
+@font-face {
+    font-family: 'iconMenu';
+    src:    url('fonts/iconMenu.eot?ambimp');
+    src:    url('fonts/iconMenu.eot?ambimp#iefix') format('embedded-opentype'),
+        url('fonts/iconMenu.ttf?ambimp') format('truetype'),
+        url('fonts/iconMenu.woff?ambimp') format('woff'),
+        url('fonts/iconMenu.svg?ambimp#iconMenu') format('svg');
+    font-weight: normal;
+    font-style: normal;
+}
+
+[class^="icon-"], [class*=" icon-"] {
+    /* use !important to prevent issues with browser extensions that change fonts */
+    font-family: 'iconMenu' !important;
+    speak: none;
+    font-style: normal;
+    font-weight: normal;
+    font-variant: normal;
+    text-transform: none;
+    line-height: 1;
+
+    /* Better Font Rendering =========== */
+    -webkit-font-smoothing: antialiased;
+    -moz-osx-font-smoothing: grayscale;
+}
+
+
+.topWrap{
+  background:#0aa770;
+  height:55px;
+  line-height: 55px;
+  /*border-bottom: 3px solid #FF6501;*/
+}
+.topWrap .logoTitle{
+  margin:10px 25px;
+  color:#fff;
+}
+.topWrap .clogoTitle{
+  margin:10px 0;
+  color:#fff;
+}
+.topWrap .logoWrap p{
+  margin:0 20px 0 0;
+  text-align: right;
+  color:#fff;
+}
+.topWrap .logoWrap p b{
+  margin-right:5px;
+}
+.topWrap .logoWrap p a{
+  color:#fff;
+}
+.mainWrap{
+}
+.menuLeft{
+  float:left;
+  margin:0 20px 0 25px;
+  width: 180px;
+  border:1px solid #ddd;
+}
+.mainMenu li{
+  border-bottom: 1px solid #ddd;
+}
+.mainMenu li:last-child{
+  border-bottom: none;
+}
+.mainMenu li a{
+  display:block;
+  padding:0 15px;
+  height:45px;
+  line-height: 45px;
+}
+.mainMenu li a .caret{
+  margin-left:10px;
+}
+.mainMenu li a:hover{
+  text-decoration: none;
+  color:#333;
+  border-left: 3px solid #0aa770;
+  background:#eee;
+}
+.mainMenu li .active{
+  color:#333;
+  border-left: 3px solid #0aa770;
+  background:#eee;
+}
+.subMenu{
+  display:none;
+}
+.mainMenu .subMenu ul li{
+  border-bottom: none;
+}
+.mainMenu .subMenu ul li a{
+  padding-left: 20px;
+  font-size: 12px;
+}
+.mainContent{
+  margin:0 25px 0 230px;
+}
+.pageHeader{
+  margin: 30px 0 20px;
+}
+.year,.month,.sort{
+  width:90px;
+  margin-right: 10px;
+}
+.tableContent{
+  margin:20px 0;
+}
+.breadcrumbNot{
+  background:none;
+  margin:0;
+  padding:0 15px 0 0;
+}
+.tableContent .userInfo span{
+  font-size: 16px;
+  margin-right: 50px;
+}
+.classList{
+  margin:25px 0;
+  border:1px solid #ddd;
+}
+.classList h5{
+  position:relative;
+  margin:0;
+  padding:0 10px;
+  height:45px;
+  line-height: 45px;
+  background:#f0f0f0;
+}
+.progressNot{
+  margin-bottom: 0;
+}
+.classInfoWrap{
+  margin:0 0 20px 0;
+}
+.text-orange{
+  color:#FF6633;
+}
+.classInfoWrap .table tr td{
+  padding:15px 8px;
+}
+.tableForm tr td{
+  padding-bottom: 10px;
+}
+.classInfoWrap p span{
+  font-size: 16px;
+  margin-right: 50px;
+}
+.btn-track{
+  position:absolute;
+  right:-1px;
+  top:-1px;
+  padding:0 20px;
+  background:#337ab7;
+  color:#fff;
+  border:1px solid #2e6da4;
+}
+.btn-track:hover{
+  background:#286090;
+  color:#fff;
+  text-decoration: none;
+}
+.classSection{
+  margin:20px 0;
+}
+.classSection dt{
+  height:50px;
+  line-height: 50px;
+  padding:0 20px 0 0;
+  background:#e7e7e7;
+  margin-bottom: 5px;
+}
+.classSection dd{
+  border-bottom: 1px dashed #ddd;
+}
+.classSection .chapterName{
+  width:75px;
+  text-align: center;
+  background:#666;
+  color:#fff;
+  margin:0 10px 0 0;
+  /*padding:0 15px;*/
+  display:inline-block;
+}
+.sectionTitle{
+  width:50%;
+}
+.sectionTitle a{
+  cursor:pointer;
+}
+.operateSection{
+  display:none;
+}
+.classSection dd .operateNone{
+  position:absolute;
+  top:15px;
+  right:20px;
+  display:none;
+}
+.sectionList{
+  min-height:26px;
+  line-height: 26px;
+  padding:10px 20px 10px 20px;
+  margin:0;
+}
+.sectionList:hover{
+  background:#f3f3f3;
+}
+.videoInfo:hover{
+  background:none;
+}
+.sectionListVideo{
+  position:relative;
+  padding:5px 20px 5px 20px;
+}
+/*.num{
+  background:#bbb;
+  color:#fff;
+  margin:0 5px 0 0;
+  padding:0 15px;
+  display:inline-block;
+}*/
+/*.sectionListVideo:hover{
+  background:#f3f3f3;
+}*/
+.videoState{
+  margin:0 20% 0 50%;
+  padding: 12px 0;
+}
+.sectionTitle p{
+  margin:0;
+}
+.videoInfo{
+  color:#999;
+}
+.videoMTB{
+  margin:10px 0;
+}
+.mUpload{
+  position:relative;
+}
+.uploadVideo{
+  position:absolute;
+  top:-5px;
+  left:5px;
+  width:70px;
+  height:30px;
+  display:inline-block !important;
+  opacity:0;
+  filter:alpha(Opacity=0);
+  cursor: pointer;
+}
+.videoMT{
+  margin:0 0 20px 0;
+}
+.progressInfo{
+  margin:20px 0;
+}
+.progressInfo span{
+  margin:0 15px;
+  color:#999;
+}
+.progressInfo .text-danger{
+  color:#a94442;
+}
+.cloginWrap{
+  position:absolute;
+  left:50%;
+  top:50%;
+  margin-left:-210px;
+  margin-top:-170px;
+  width:420px;
+  height:340px;
+  padding:30px;
+  border:1px solid #ddd;
+  border-radius: 5px;
+}
+.cloginWrap .commonTitle{
+  margin:20px 0;
+  text-align: center;
+}
+.width1000{
+  width:1000px;
+  margin:0 auto;
+}

Datei-Diff unterdrückt, da er zu groß ist
+ 1109 - 0
global/css/bootstrap-responsive.css


Datei-Diff unterdrückt, da er zu groß ist
+ 9 - 0
global/css/bootstrap-responsive.min.css


+ 430 - 0
global/css/bootstrap-theme.css

@@ -0,0 +1,430 @@
+/*!
+ * Bootstrap v3.3.0 (http://getbootstrap.com)
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+
+/*!
+ * Generated using the Bootstrap Customizer (http://v3.bootcss.com/customize/?id=141a9989408a80880a21)
+ * Config saved to config.json and https://gist.github.com/141a9989408a80880a21
+ */
+.btn-default,
+.btn-primary,
+.btn-success,
+.btn-info,
+.btn-warning,
+.btn-danger {
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);
+  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);
+  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+.btn-default:active,
+.btn-primary:active,
+.btn-success:active,
+.btn-info:active,
+.btn-warning:active,
+.btn-danger:active,
+.btn-default.active,
+.btn-primary.active,
+.btn-success.active,
+.btn-info.active,
+.btn-warning.active,
+.btn-danger.active {
+  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+}
+.btn-default .badge,
+.btn-primary .badge,
+.btn-success .badge,
+.btn-info .badge,
+.btn-warning .badge,
+.btn-danger .badge {
+  text-shadow: none;
+}
+.btn:active,
+.btn.active {
+  background-image: none;
+}
+.btn-default {
+  background-image: -webkit-linear-gradient(top, #ffffff 0%, #e0e0e0 100%);
+  background-image: -o-linear-gradient(top, #ffffff 0%, #e0e0e0 100%);
+  background-image: linear-gradient(to bottom, #ffffff 0%, #e0e0e0 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+  border-color: #dbdbdb;
+  text-shadow: 0 1px 0 #fff;
+  border-color: #ccc;
+}
+.btn-default:hover,
+.btn-default:focus {
+  background-color: #e0e0e0;
+  background-position: 0 -15px;
+}
+.btn-default:active,
+.btn-default.active {
+  background-color: #e0e0e0;
+  border-color: #dbdbdb;
+}
+.btn-default:disabled,
+.btn-default[disabled] {
+  background-color: #e0e0e0;
+  background-image: none;
+}
+.btn-primary {
+  background-image: -webkit-linear-gradient(top, #428bca 0%, #2d6ca2 100%);
+  background-image: -o-linear-gradient(top, #428bca 0%, #2d6ca2 100%);
+  background-image: linear-gradient(to bottom, #428bca 0%, #2d6ca2 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff2d6ca2', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+  border-color: #2b669a;
+}
+.btn-primary:hover,
+.btn-primary:focus {
+  background-color: #2d6ca2;
+  background-position: 0 -15px;
+}
+.btn-primary:active,
+.btn-primary.active {
+  background-color: #2d6ca2;
+  border-color: #2b669a;
+}
+.btn-primary:disabled,
+.btn-primary[disabled] {
+  background-color: #2d6ca2;
+  background-image: none;
+}
+.btn-success {
+  background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);
+  background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%);
+  background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+  border-color: #3e8f3e;
+}
+.btn-success:hover,
+.btn-success:focus {
+  background-color: #419641;
+  background-position: 0 -15px;
+}
+.btn-success:active,
+.btn-success.active {
+  background-color: #419641;
+  border-color: #3e8f3e;
+}
+.btn-success:disabled,
+.btn-success[disabled] {
+  background-color: #419641;
+  background-image: none;
+}
+.btn-info {
+  background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);
+  background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);
+  background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+  border-color: #28a4c9;
+}
+.btn-info:hover,
+.btn-info:focus {
+  background-color: #2aabd2;
+  background-position: 0 -15px;
+}
+.btn-info:active,
+.btn-info.active {
+  background-color: #2aabd2;
+  border-color: #28a4c9;
+}
+.btn-info:disabled,
+.btn-info[disabled] {
+  background-color: #2aabd2;
+  background-image: none;
+}
+.btn-warning {
+  background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);
+  background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);
+  background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+  border-color: #e38d13;
+}
+.btn-warning:hover,
+.btn-warning:focus {
+  background-color: #eb9316;
+  background-position: 0 -15px;
+}
+.btn-warning:active,
+.btn-warning.active {
+  background-color: #eb9316;
+  border-color: #e38d13;
+}
+.btn-warning:disabled,
+.btn-warning[disabled] {
+  background-color: #eb9316;
+  background-image: none;
+}
+.btn-danger {
+  background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);
+  background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);
+  background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+  border-color: #b92c28;
+}
+.btn-danger:hover,
+.btn-danger:focus {
+  background-color: #c12e2a;
+  background-position: 0 -15px;
+}
+.btn-danger:active,
+.btn-danger.active {
+  background-color: #c12e2a;
+  border-color: #b92c28;
+}
+.btn-danger:disabled,
+.btn-danger[disabled] {
+  background-color: #c12e2a;
+  background-image: none;
+}
+.thumbnail,
+.img-thumbnail {
+  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);
+  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);
+}
+.dropdown-menu > li > a:hover,
+.dropdown-menu > li > a:focus {
+  background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
+  background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
+  background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);
+  background-color: #e8e8e8;
+}
+.dropdown-menu > .active > a,
+.dropdown-menu > .active > a:hover,
+.dropdown-menu > .active > a:focus {
+  background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%);
+  background-image: -o-linear-gradient(top, #428bca 0%, #357ebd 100%);
+  background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);
+  background-color: #357ebd;
+}
+.navbar-default {
+  background-image: -webkit-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);
+  background-image: -o-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);
+  background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  border-radius: 4px;
+  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);
+  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);
+}
+.navbar-default .navbar-nav > .open > a,
+.navbar-default .navbar-nav > .active > a {
+  background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);
+  background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);
+  background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);
+  -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);
+  box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);
+}
+.navbar-brand,
+.navbar-nav > li > a {
+  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);
+}
+.navbar-inverse {
+  background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222222 100%);
+  background-image: -o-linear-gradient(top, #3c3c3c 0%, #222222 100%);
+  background-image: linear-gradient(to bottom, #3c3c3c 0%, #222222 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+}
+.navbar-inverse .navbar-nav > .open > a,
+.navbar-inverse .navbar-nav > .active > a {
+  background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);
+  background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);
+  background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);
+  -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);
+  box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);
+}
+.navbar-inverse .navbar-brand,
+.navbar-inverse .navbar-nav > li > a {
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+}
+.navbar-static-top,
+.navbar-fixed-top,
+.navbar-fixed-bottom {
+  border-radius: 0;
+}
+.alert {
+  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2);
+  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);
+  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);
+}
+.alert-success {
+  background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);
+  background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);
+  background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);
+  border-color: #b2dba1;
+}
+.alert-info {
+  background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);
+  background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);
+  background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);
+  border-color: #9acfea;
+}
+.alert-warning {
+  background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);
+  background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);
+  background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);
+  border-color: #f5e79e;
+}
+.alert-danger {
+  background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);
+  background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);
+  background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);
+  border-color: #dca7a7;
+}
+.progress {
+  background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);
+  background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);
+  background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);
+}
+.progress-bar {
+  background-image: -webkit-linear-gradient(top, #428bca 0%, #3071a9 100%);
+  background-image: -o-linear-gradient(top, #428bca 0%, #3071a9 100%);
+  background-image: linear-gradient(to bottom, #428bca 0%, #3071a9 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0);
+}
+.progress-bar-success {
+  background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);
+  background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);
+  background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);
+}
+.progress-bar-info {
+  background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);
+  background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);
+  background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);
+}
+.progress-bar-warning {
+  background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);
+  background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);
+  background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);
+}
+.progress-bar-danger {
+  background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);
+  background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);
+  background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);
+}
+.progress-bar-striped {
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+}
+.list-group {
+  border-radius: 4px;
+  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);
+  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);
+}
+.list-group-item.active,
+.list-group-item.active:hover,
+.list-group-item.active:focus {
+  text-shadow: 0 -1px 0 #3071a9;
+  background-image: -webkit-linear-gradient(top, #428bca 0%, #3278b3 100%);
+  background-image: -o-linear-gradient(top, #428bca 0%, #3278b3 100%);
+  background-image: linear-gradient(to bottom, #428bca 0%, #3278b3 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0);
+  border-color: #3278b3;
+}
+.list-group-item.active .badge,
+.list-group-item.active:hover .badge,
+.list-group-item.active:focus .badge {
+  text-shadow: none;
+}
+.panel {
+  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
+  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
+}
+.panel-default > .panel-heading {
+  background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
+  background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
+  background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);
+}
+.panel-primary > .panel-heading {
+  background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%);
+  background-image: -o-linear-gradient(top, #428bca 0%, #357ebd 100%);
+  background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);
+}
+.panel-success > .panel-heading {
+  background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);
+  background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);
+  background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);
+}
+.panel-info > .panel-heading {
+  background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);
+  background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);
+  background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);
+}
+.panel-warning > .panel-heading {
+  background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);
+  background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);
+  background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);
+}
+.panel-danger > .panel-heading {
+  background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);
+  background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);
+  background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);
+}
+.well {
+  background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);
+  background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);
+  background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);
+  border-color: #dcdcdc;
+  -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);
+  box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);
+}

Datei-Diff unterdrückt, da er zu groß ist
+ 10 - 0
global/css/bootstrap-theme.min.css


Datei-Diff unterdrückt, da er zu groß ist
+ 6167 - 0
global/css/bootstrap.css


Datei-Diff unterdrückt, da er zu groß ist
+ 14 - 0
global/css/bootstrap.min.css


BIN
global/css/fonts/iconMenu.eot


Datei-Diff unterdrückt, da er zu groß ist
+ 16 - 0
global/css/fonts/iconMenu.svg


BIN
global/css/fonts/iconMenu.ttf


BIN
global/css/fonts/iconMenu.woff


+ 7 - 0
global/css/iconMenu/Read Me.txt

@@ -0,0 +1,7 @@
+Open *demo.html* to see a list of all the glyphs in your font along with their codes/ligatures.
+
+To use the generated font in desktop programs, you can install the TTF font. In order to copy the character associated with each icon, refer to the text box at the bottom right corner of each glyph in demo.html. The character inside this text box may be invisible; but it can still be copied. See this guide for more info: https://icomoon.io/#docs/local-fonts
+
+You won't need any of the files located under the *demo-files* directory when including the generated font in your own projects.
+
+You can import *selection.json* back to the IcoMoon app using the *Import Icons* button (or via Main Menu → Manage Projects) to retrieve your icon selection.

+ 152 - 0
global/css/iconMenu/demo-files/demo.css

@@ -0,0 +1,152 @@
+body {
+    padding: 0;
+    margin: 0;
+    font-family: sans-serif;
+    font-size: 1em;
+    line-height: 1.5;
+    color: #555;
+    background: #fff;
+}
+h1 {
+    font-size: 1.5em;
+    font-weight: normal;
+}
+small {
+    font-size: .66666667em;
+}
+a {
+    color: #e74c3c;
+    text-decoration: none;
+}
+a:hover, a:focus {
+    box-shadow: 0 1px #e74c3c;
+}
+.bshadow0, input {
+    box-shadow: inset 0 -2px #e7e7e7;
+}
+input:hover {
+    box-shadow: inset 0 -2px #ccc;
+}
+input, fieldset {
+    font-family: sans-serif;
+    font-size: 1em;
+    margin: 0;
+    padding: 0;
+    border: 0;
+}
+input {
+    color: inherit;
+    line-height: 1.5;
+    height: 1.5em;
+    padding: .25em 0;
+}
+input:focus {
+    outline: none;
+    box-shadow: inset 0 -2px #449fdb;
+}
+.glyph {
+    font-size: 16px;
+    width: 15em;
+    padding-bottom: 1em;
+    margin-right: 4em;
+    margin-bottom: 1em;
+    float: left;
+    overflow: hidden;
+}
+.liga {
+    width: 80%;
+    width: calc(100% - 2.5em);
+}
+.talign-right {
+    text-align: right;
+}
+.talign-center {
+    text-align: center;
+}
+.bgc1 {
+    background: #f1f1f1;
+}
+.fgc1 {
+    color: #999;
+}
+.fgc0 {
+    color: #000;
+}
+p {
+    margin-top: 1em;
+    margin-bottom: 1em;
+}
+.mvm {
+    margin-top: .75em;
+    margin-bottom: .75em;
+}
+.mtn {
+    margin-top: 0;
+}
+.mtl, .mal {
+    margin-top: 1.5em;
+}
+.mbl, .mal {
+    margin-bottom: 1.5em;
+}
+.mal, .mhl {
+    margin-left: 1.5em;
+    margin-right: 1.5em;
+}
+.mhmm {
+    margin-left: 1em;
+    margin-right: 1em;
+}
+.mls {
+    margin-left: .25em;
+}
+.ptl {
+    padding-top: 1.5em;
+}
+.pbs, .pvs {
+    padding-bottom: .25em;
+}
+.pvs, .pts {
+    padding-top: .25em;
+}
+.unit {
+    float: left;
+}
+.unitRight {
+    float: right;
+}
+.size1of2 {
+    width: 50%;
+}
+.size1of1 {
+    width: 100%;
+}
+.clearfix:before, .clearfix:after {
+    content: " ";
+    display: table;
+}
+.clearfix:after {
+    clear: both;
+}
+.hidden-true {
+    display: none;
+}
+.textbox0 {
+    width: 3em;
+    background: #f1f1f1;
+    padding: .25em .5em;
+    line-height: 1.5;
+    height: 1.5em;
+}
+#testDrive {
+    display: block;
+    padding-top: 24px;
+    line-height: 1.5;
+}
+.fs0 {
+    font-size: 16px;
+}
+.fs1 {
+    font-size: 32px;
+}
+

+ 30 - 0
global/css/iconMenu/demo-files/demo.js

@@ -0,0 +1,30 @@
+if (!('boxShadow' in document.body.style)) {
+    document.body.setAttribute('class', 'noBoxShadow');
+}
+
+document.body.addEventListener("click", function(e) {
+    var target = e.target;
+    if (target.tagName === "INPUT" &&
+        target.getAttribute('class').indexOf('liga') === -1) {
+        target.select();
+    }
+});
+
+(function() {
+    var fontSize = document.getElementById('fontSize'),
+        testDrive = document.getElementById('testDrive'),
+        testText = document.getElementById('testText');
+    function updateTest() {
+        testDrive.innerHTML = testText.value || String.fromCharCode(160);
+        if (window.icomoonLiga) {
+            window.icomoonLiga(testDrive);
+        }
+    }
+    function updateSize() {
+        testDrive.style.fontSize = fontSize.value + 'px';
+    }
+    fontSize.addEventListener('change', updateSize, false);
+    testText.addEventListener('input', updateTest, false);
+    testText.addEventListener('change', updateTest, false);
+    updateSize();
+}());

+ 135 - 0
global/css/iconMenu/demo.html

@@ -0,0 +1,135 @@
+<!doctype html>
+<html>
+<head>
+    <meta charset="utf-8">
+    <title>IcoMoon Demo</title>
+    <meta name="description" content="An Icon Font Generated By IcoMoon.io">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+    <link rel="stylesheet" href="demo-files/demo.css">
+    <link rel="stylesheet" href="style.css"></head>
+<body>
+    <div class="bgc1 clearfix">
+        <h1 class="mhmm mvm"><span class="fgc1">Font Name:</span> iconMenu <small class="fgc1">(Glyphs:&nbsp;6)</small></h1>
+    </div>
+    <div class="clearfix mhl ptl">
+        <h1 class="mvm mtn fgc1">Grid Size: 16</h1>
+        <div class="glyph fs1">
+            <div class="clearfix bshadow0 pbs">
+                <span class="icon-paste">
+                
+                </span>
+                <span class="mls"> icon-paste</span>
+            </div>
+            <fieldset class="fs0 size1of1 clearfix hidden-false">
+                <input type="text" readonly value="41" class="unit size1of2" />
+                <input type="text" maxlength="1" readonly value="&#x41;" class="unitRight size1of2 talign-right" />
+            </fieldset>
+            <div class="fs0 bshadow0 clearfix hidden-true">
+                <span class="unit pvs fgc1">liga: </span>
+                <input type="text" readonly value="paste, clipboard-file" class="liga unitRight" />
+            </div>
+        </div>
+        <div class="glyph fs1">
+            <div class="clearfix bshadow0 pbs">
+                <span class="icon-coin-yen">
+                
+                </span>
+                <span class="mls"> icon-coin-yen</span>
+            </div>
+            <fieldset class="fs0 size1of1 clearfix hidden-false">
+                <input type="text" readonly value="42" class="unit size1of2" />
+                <input type="text" maxlength="1" readonly value="&#x42;" class="unitRight size1of2 talign-right" />
+            </fieldset>
+            <div class="fs0 bshadow0 clearfix hidden-true">
+                <span class="unit pvs fgc1">liga: </span>
+                <input type="text" readonly value="coin-yen, money4" class="liga unitRight" />
+            </div>
+        </div>
+        <div class="glyph fs1">
+            <div class="clearfix bshadow0 pbs">
+                <span class="icon-calendar">
+                
+                </span>
+                <span class="mls"> icon-calendar</span>
+            </div>
+            <fieldset class="fs0 size1of1 clearfix hidden-false">
+                <input type="text" readonly value="43" class="unit size1of2" />
+                <input type="text" maxlength="1" readonly value="&#x43;" class="unitRight size1of2 talign-right" />
+            </fieldset>
+            <div class="fs0 bshadow0 clearfix hidden-true">
+                <span class="unit pvs fgc1">liga: </span>
+                <input type="text" readonly value="calendar, date" class="liga unitRight" />
+            </div>
+        </div>
+        <div class="glyph fs1">
+            <div class="clearfix bshadow0 pbs">
+                <span class="icon-user">
+                
+                </span>
+                <span class="mls"> icon-user</span>
+            </div>
+            <fieldset class="fs0 size1of1 clearfix hidden-false">
+                <input type="text" readonly value="44" class="unit size1of2" />
+                <input type="text" maxlength="1" readonly value="&#x44;" class="unitRight size1of2 talign-right" />
+            </fieldset>
+            <div class="fs0 bshadow0 clearfix hidden-true">
+                <span class="unit pvs fgc1">liga: </span>
+                <input type="text" readonly value="user, profile2" class="liga unitRight" />
+            </div>
+        </div>
+        <div class="glyph fs1">
+            <div class="clearfix bshadow0 pbs">
+                <span class="icon-cog">
+                
+                </span>
+                <span class="mls"> icon-cog</span>
+            </div>
+            <fieldset class="fs0 size1of1 clearfix hidden-false">
+                <input type="text" readonly value="46" class="unit size1of2" />
+                <input type="text" maxlength="1" readonly value="&#x46;" class="unitRight size1of2 talign-right" />
+            </fieldset>
+            <div class="fs0 bshadow0 clearfix hidden-true">
+                <span class="unit pvs fgc1">liga: </span>
+                <input type="text" readonly value="cog, gear" class="liga unitRight" />
+            </div>
+        </div>
+        <div class="glyph fs1">
+            <div class="clearfix bshadow0 pbs">
+                <span class="icon-tree">
+                
+                </span>
+                <span class="mls"> icon-tree</span>
+            </div>
+            <fieldset class="fs0 size1of1 clearfix hidden-false">
+                <input type="text" readonly value="45" class="unit size1of2" />
+                <input type="text" maxlength="1" readonly value="&#x45;" class="unitRight size1of2 talign-right" />
+            </fieldset>
+            <div class="fs0 bshadow0 clearfix hidden-true">
+                <span class="unit pvs fgc1">liga: </span>
+                <input type="text" readonly value="tree, branches" class="liga unitRight" />
+            </div>
+        </div>
+  </div>
+
+    <!--[if gt IE 8]><!-->
+    <div class="mhl clearfix mbl">
+        <h1>Font Test Drive</h1>
+        <label>
+            Font Size: <input id="fontSize" type="number" class="textbox0 mbm"
+            min="8" value="48" />
+            px
+        </label>
+        <input id="testText" type="text" class="phl size1of1 mvl"
+        placeholder="Type some text to test..." value=""/>
+        </label>
+        <div id="testDrive" class="icon-">&nbsp;
+        </div>
+    </div>
+    <!--<![endif]-->
+    <div class="bgc1 clearfix">
+        <p class="mhl">Generated by <a href="https://icomoon.io/app">IcoMoon</a></p>
+    </div>
+
+    <script src="demo-files/demo.js"></script>
+</body>
+</html>

BIN
global/css/iconMenu/fonts/iconMenu.eot


Datei-Diff unterdrückt, da er zu groß ist
+ 16 - 0
global/css/iconMenu/fonts/iconMenu.svg


BIN
global/css/iconMenu/fonts/iconMenu.ttf


BIN
global/css/iconMenu/fonts/iconMenu.woff


Datei-Diff unterdrückt, da er zu groß ist
+ 223 - 0
global/css/iconMenu/selection.json


+ 45 - 0
global/css/iconMenu/style.css

@@ -0,0 +1,45 @@
+@font-face {
+    font-family: 'iconMenu';
+    src:    url('fonts/iconMenu.eot?ambimp');
+    src:    url('fonts/iconMenu.eot?ambimp#iefix') format('embedded-opentype'),
+        url('fonts/iconMenu.ttf?ambimp') format('truetype'),
+        url('fonts/iconMenu.woff?ambimp') format('woff'),
+        url('fonts/iconMenu.svg?ambimp#iconMenu') format('svg');
+    font-weight: normal;
+    font-style: normal;
+}
+
+[class^="icon-"], [class*=" icon-"] {
+    /* use !important to prevent issues with browser extensions that change fonts */
+    font-family: 'iconMenu' !important;
+    speak: none;
+    font-style: normal;
+    font-weight: normal;
+    font-variant: normal;
+    text-transform: none;
+    line-height: 1;
+
+    /* Better Font Rendering =========== */
+    -webkit-font-smoothing: antialiased;
+    -moz-osx-font-smoothing: grayscale;
+}
+
+.icon-paste:before {
+    content: "\41";
+}
+.icon-coin-yen:before {
+    content: "\42";
+}
+.icon-calendar:before {
+    content: "\43";
+}
+.icon-user:before {
+    content: "\44";
+}
+.icon-cog:before {
+    content: "\46";
+}
+.icon-tree:before {
+    content: "\45";
+}
+

Datei-Diff unterdrückt, da er zu groß ist
+ 9 - 0
global/css/main.css


Datei-Diff unterdrückt, da er zu groß ist
+ 1 - 0
global/css/nep.min.css


+ 265 - 0
global/css/recharge-style.css

@@ -0,0 +1,265 @@
+/*Reset 样式初始化*/
+html, body, form, fieldset, p, a, ul, ol, li, div, legend, label,
+br, input, button, textarea, h1, h2, h3, h4, h5,em{
+  padding: 0;
+  margin: 0;
+	font-weight: normal;
+	font-style: normal;
+	font-size: 12px;
+	font-family:"微软雅黑","Tahoma";
+	vertical-align: baseline;
+	text-align:justify;
+	word-wrap:break-word;
+	text-justify:inter-ideograph
+}
+body{text-align:center}
+ul, ol, li, h1 {
+	line-height:normal;
+	list-style-image:none;
+	list-style-position:outside;
+	list-style-type:none
+}
+dl {
+	margin:0
+}
+dd {
+	margin-left:0
+}
+a {
+	outline:none;
+}
+a img {
+	border:0 none
+}
+img {
+	vertical-align:middle;
+	border:0px
+}
+table {
+	border-collapse:collapse
+}
+.clearfix:after {
+	content:".";
+	display:block;
+	height:0;
+	clear:both;
+	visibility:hidden
+}
+.clearfix {
+	display:inline-block;
+	overflow:hidden
+}
+.clearfix {
+	display:block
+}
+body {color:#333}
+a {color:#0063db;text-decoration:none}
+a:hover {color:#333}
+/**/
+.clearB {clearfix:both}
+.fL {float:left}
+.fR {float:right}
+.colRed {color:#f70000}
+.colOrange {color:#ed8b00}
+.width960 {width:960px;margin-left:auto;margin-right:auto}
+/*css*/
+body{background:#F2F2F2}
+.warpPay {
+	background:#fff;
+	margin-top:5px;
+	border:1px solid #ccc;
+	padding:1px
+}
+.payHeader {
+	padding:10px 20px;
+	background:#849b2f;
+	color:#fff;
+	margin:0 0 5px 0
+}
+.payHeader .logo {
+	font-size:22px
+}
+.payContent {
+	margin:5px 0
+}
+.payContent .payWayTab ul{
+	padding:0 20px;
+	background:#eeeee2 url(pxline.png) repeat-x left bottom
+}
+.payContent .payWayTab li {
+	display:inline-block;
+	*display:inline;
+	zoom:1;
+	height:40px;
+	line-height:40px;
+	margin:0 10px;
+	padding:0 15px;
+	background:#f7f7f1;
+	border-bottom:1px solid #849B2F;
+	cursor:pointer;
+	font-size:16px
+}
+.payContent .payWayTab li.hover{
+	background:#fff
+}
+.payContent .payWayTab li.now {
+	border:1px solid #849B2F;
+	border-bottom:1px solid #fff;
+	background:#fff;
+	cursor:default;
+	font-weight:600
+}
+.payContent .wayItem {
+	padding:20px 30px 30px 30px;
+	position:relative
+}
+.bankWayStep {
+	margin:0 0 20px 0
+}
+.bankWayStep span{
+	font-size:18px;
+	color:#ed8b00
+}
+.bankWayStep b{
+	font-size:18px;
+	color:#ccc;
+	margin:0 10px
+}
+.bankWayStep span.til{
+	color:#333
+}
+.bankList dl {
+	float:left;
+	width:280px;
+	margin:0 10px;
+	background:#f2f2f2
+}
+.bankList dl dt {
+	background:#e1e1e1;
+	padding:5px 0 5px 10px;
+	font-weight:600;
+}
+.bankList dl dd {
+	margin:10px 0
+}
+.bankList dl dd span{
+	display:inline-block;
+	*display:inline;
+	zoom:1;
+	width:60px;
+	text-align:right;
+	font-weight:600
+}
+.wayForm {
+	margin:20px 0 0 0
+}
+.wayForm p{
+	background:#FFFBCC;
+	border:1px solid #E6DB55;
+	color:#666452;
+	padding:8px 12px
+}
+.wayForm dt {
+	font-size:14px;
+	margin:10px 0;
+}
+.wayForm dd input{
+	height:30px;
+	line-height:30px;
+	font-size:24px;
+	padding:0 5px
+}
+a.subButton,input.subButton {
+	background:#4787ed; 
+	background:-webkit-gradient(linear,center bottom,center top,from(#ff6501),to(#fe7d2a)); 
+	background:-moz-linear-gradient(90deg, #ff6501, #fe7d2a); 
+	border:1px solid #f05e00; 
+	color:#f2f2f2;
+	padding:8px 24px;
+	float:left;
+	margin:20px 0;
+	cursor:pointer
+}
+a.subButton:hover,input.subButton:hover {
+	background:-webkit-gradient(linear,center bottom,center top,from(#fe7d2a),to(#ff6501)); 
+	background:-moz-linear-gradient(90deg, #fe7d2a, #ff6501);
+	color:#fff;
+	font-weight:600;
+	border-color:#ca5000
+}
+a.backButton,input.backButton {
+	background:#4787ed; 
+	background:-webkit-gradient(linear,center bottom,center top,from(#4787ed),to(#4d90fe)); 
+	background:-moz-linear-gradient(90deg, #4787ed, #4d90fe); 
+	border:1px solid #3079ed;
+	margin-right:20px 
+}
+a.backButton:hover,input.backButton {
+	background:#4787ed; 
+	background:-webkit-gradient(linear,center bottom,center top,from(#4d90fe),to(#4787ed)); 
+	background:-moz-linear-gradient(90deg, #4d90fe, #4787ed); 
+	border:1px solid #3079ed
+}
+.rcInput {font-size:20px}
+.rcInput ul{
+	margin:10px 0 0 8px
+}
+.rcInput li{
+	float:left;
+	padding:0px 5px;
+	font-size:20px;
+	margin:0 10px 0 0
+}
+.rcInput li.focus {
+	background: #ff6501;
+	color:#fff
+}
+.rcBankTitle{
+	font-size:20px;
+	margin:20px 0 0 0
+}
+.rcBankList li{
+	float:left;
+	margin:5px 2px;
+	padding:5px 10px
+}
+.rcBankList li.focus{
+	background: #ff6501;
+}
+.padySusscusTips {
+	margin:100px 0 100px 250px
+}
+.padySusscusTips h1{
+	font-size:24px;
+	color:#17ab0c
+}
+.padySusscusTips h2{
+	font-size:18px
+}
+.promoCode {
+	position:absolute;
+	width:455px;
+	right:30px;
+	top:50px;
+	border:1px solid #9ADF8F;
+	padding:10px 20px;
+	background:#f0ffee
+}
+.promoCode h2{
+	font-size:24px
+}
+.promoCode input{
+	height:30px;
+	line-height:30px;
+	padding:0 5px;
+	margin:10px 0;
+	font-size:24px
+}
+.promoCode p{
+	background:none;
+	border:none;
+	padding:0
+}
+.bankPromo {
+	top:250px
+}

+ 908 - 0
global/css/style.css

@@ -0,0 +1,908 @@
+html{
+    margin:0;
+    padding:0;
+    height:100%;
+}
+body{
+    margin:0;
+    padding:0;
+    font-family:"微软雅黑","Tahoma";
+    background: #f3f3f3;
+    position:relative;
+    min-height: 100%;
+    padding-bottom: 50px;
+}
+ul, ol, li, h1 {
+    line-height:normal;
+    list-style-image:none;
+    list-style-position:outside;
+    list-style-type:none;
+}
+dl,ul,div{
+    padding: 0;
+    margin: 0;
+    font-weight: normal;
+    font-style: normal;
+}
+dd {
+    margin-left:0
+}
+a {
+    outline:none;
+    text-decoration: none;
+}
+a img {
+    border:0 none
+}
+img {
+    vertical-align:middle;
+    border:0px
+}
+table {
+    border-collapse:collapse
+}
+.fL {float:left}
+.fR {float:right}
+.clearfix:after {
+    content:".";
+    display:block;
+    height:0;
+    clear:both;
+    visibility:hidden
+}
+.clearfix {
+    display:inline-block;
+    overflow:hidden
+}
+.clearfix {
+    display:block
+}
+@font-face {
+    font-family: 'iconMenu';
+    src:    url('fonts/iconMenu.eot?ambimp');
+    src:    url('fonts/iconMenu.eot?ambimp#iefix') format('embedded-opentype'),
+    url('fonts/iconMenu.ttf?ambimp') format('truetype'),
+    url('fonts/iconMenu.woff?ambimp') format('woff'),
+    url('fonts/iconMenu.svg?ambimp#iconMenu') format('svg');
+    font-weight: normal;
+    font-style: normal;
+}
+
+[class^="icon-"], [class*=" icon-"] {
+    /* use !important to prevent issues with browser extensions that change fonts */
+    font-family: 'iconMenu' !important;
+    speak: none;
+    font-style: normal;
+    font-weight: normal;
+    font-variant: normal;
+    text-transform: none;
+    line-height: 1;
+
+    /* Better Font Rendering =========== */
+    -webkit-font-smoothing: antialiased;
+    -moz-osx-font-smoothing: grayscale;
+}
+
+.topWrap{
+  width:100%;
+  height:80px;
+  background:#fff;
+  line-height: 75px;
+  border-bottom: 2px solid #0aa770;
+}
+.width1000{
+  width: 1000px;
+  margin:0 auto;
+}
+.logo{
+  margin:0 150px 0 0;
+  width:250px;
+  height:60px;
+}
+.logo h3{
+  margin:0;
+  padding:15px 0;
+}
+.topRight{
+  position:relative;
+  height:80px;
+  color: #aaa;
+}
+.topRight span img{
+  border-radius: 16px;
+}
+.topRight img{
+  border-radius: 16px;
+}
+.topRight a{
+  margin:0 5px;
+  cursor: pointer;
+}
+.userOperations{
+  position:absolute;
+  top:78px;
+  right:0;
+  z-index: 999;
+  background:#fff;
+  border:1px solid #00925f;
+  width:115px;
+  display:none;
+}
+.userOperations li a{
+  display:block;
+  margin:0;
+  padding:7px 10px;
+  color:#333;
+}
+.userOperations li a:hover{
+  background:#f0f0f0;
+  text-decoration: none;
+  color:#23527c;
+}
+.footerWrap{
+    position:absolute;
+    left:0;
+    bottom:0;
+    width:100%;
+    padding:12px 0;
+    /*height:50px;
+    line-height: 50px;*/
+    background:#fff;
+    border-top:1px solid #ddd;
+    text-align: center;
+    color:#999;
+}
+/*.footerInfo{
+    height:50px;
+    line-height: 50px;
+}*/
+.mainCon{
+    margin:20px 0;
+}
+.mainWrap{
+    padding:0 0 20px 0;
+    margin:20px 0 0 0;
+}
+.mainInfo{
+    padding:20px;
+    background:#fff;
+    border:1px solid #ddd;
+}
+.mainImg{
+    position:relative;
+    width:1000px;
+    height:500px;
+    background:#f0f0f0;
+    background:url(u27Bg.jpg) center center no-repeat;
+}
+.wrapBg{
+    background: rgba(0,0,0,0.5);
+    height:100%;
+}
+.wrapBgBlack{
+    background: rgba(0,0,0,0.7);
+    height:100%;
+}
+.classMain{
+    position:absolute;
+    top:30%;
+    left:50%;
+    /*margin-top:-95px;*/
+    margin-left: -300px;
+    width:600px;
+    color:#fff;
+}
+.classTitle{
+    font-size: 28px;
+}
+.classTitle a{
+    color:#fff;
+}
+.classInfo{
+    margin:10px 0;
+    height:50px;
+    line-height: 50px;
+}
+.classInfo span{
+    margin:0 30px 0 0;
+}
+.btnWrap{
+    position:absolute;
+    top:60%;
+    left:50%;
+    margin-left: -110px;
+}
+.btnApply{
+    padding:12px 60px;
+    font-size: 24px;
+    border-radius: 5px;
+}
+.btnBlue{
+  position:relative;
+  border:1px solid #00925f;
+  background:#079e69;
+  /*background:#428BCA;
+  border:1px solid #307ec1; 
+  width:220px;
+  height:60px;*/
+}
+.btnGreen{
+  border:1px solid #00925f;
+  background:#079e69;
+}
+.btnGreen:hover{
+  border:1px solid #008858;
+  background:#00925f;
+  color:#fff;
+}
+.btnGreen:focus,
+.btnGreen.focus {
+  color: #ffffff;
+  background-color: #00925f;
+  border-color: #008858;
+}
+.btnGreen:active,
+.btnGreen.active,
+.open > .dropdown-toggle.btnGreen {
+  color: #ffffff;
+  background-color: #00925f;
+  border-color: #008858;
+}
+.btnGreen:active:hover,
+.btnGreen.active:hover,
+.open > .dropdown-toggle.btnGreen:hover,
+.btnGreen:active:focus,
+.btnGreen.active:focus,
+.open > .dropdown-toggle.btnGreen:focus,
+.btnGreen:active.focus,
+.btnGreen.active.focus,
+.open > .dropdown-toggle.btnGreen.focus {
+  color: #ffffff;
+  background-color: #00925f;
+  border-color: #008858;
+}
+.btnGreen:active,
+.btnGreen.active,
+.open > .dropdown-toggle.btnGreen {
+  background-image: none;
+}
+.btnGreen.disabled,
+.btnGreen[disabled],
+fieldset[disabled] .btnGreen,
+.btnGreen.disabled:hover,
+.btnGreen[disabled]:hover,
+fieldset[disabled] .btnGreen:hover,
+.btnGreen.disabled:focus,
+.btnGreen[disabled]:focus,
+fieldset[disabled] .btnGreen:focus,
+.btnGreen.disabled.focus,
+.btnGreen[disabled].focus,
+fieldset[disabled] .btnGreen.focus,
+.btnGreen.disabled:active,
+.btnGreen[disabled]:active,
+fieldset[disabled] .btnGreen:active,
+.btnGreen.disabled.active,
+.btnGreen[disabled].active,
+fieldset[disabled] .btnGreen.active {
+  background-color: #00925f;
+  border-color: #008858;
+}
+/*.btnBlue:before,.btnBlue:after{
+      content: " ";
+      display: block;
+      position: absolute;
+      width:218px;
+      height:60px;
+      top: -1px;
+      left: -1px;
+      -webkit-box-shadow:0 0 10px 7px #307ec1;  
+      -moz-box-shadow:0 0 10px 7px #307ec1;  
+       box-shadow:0 0 10px 7px #307ec1;  
+      border-radius: 10px;
+      z-index:10;
+      box-sizing: border-box;
+      -webkit-animation: clipAni 5s infinite linear;
+}
+.btnBlue:before{
+      -webkit-animation-delay: -5s;
+    } 
+    @keyframes  clipAni{
+      0%,100%{
+        opacity: 0;);
+      }
+      25%{
+        opacity:0.3;);
+      }
+      50%{
+        opacity:0;);
+      }
+      75%{
+        opacity:0.3;);
+      }   
+}*/
+.btnBlue:hover{
+  border:1px solid #008858;
+  background:#00925f;
+  color:#fff;
+  /*border:1px solid #307ec1;
+  background:#4897dc;
+  color:#fff;*/
+}
+.btnLogin{
+    background:#1abc9c;
+}
+.btnLogin:hover{
+    background:#17b092;
+    border:1px solid #12a88a;
+}
+.mainLogin{
+    margin:0 auto;
+    width:350px;
+}
+.identity{
+    background: #fff;
+    border:1px solid #ddd;
+}
+.tips{
+    padding:10px 20px;
+    background:#fafafa;
+    border-bottom: 1px solid #ddd;
+}
+.idFrom{
+    padding:20px 10px;
+}
+.idFrom .form-horizontal{
+    width:550px;
+}
+.shopdetail{
+    position:relative;
+    width:100%;
+    border:1px solid #ddd;
+    border-top: 2px solid #aaa;
+    background:#fff;
+    margin-top: 70px;
+}
+.shopProcess{
+  position:absolute;
+  right:0;
+  top:-55px;
+}
+.shopProcess li span{
+  float:left;
+  width:100%;
+  height:36px;
+  line-height: 36px;
+  color:#999;
+}
+.shopProcess li span.number{
+  font:bold 16px/38px "arial";  
+}
+.shopProcess li span.text{
+  font: normal  "simsun";
+}
+.shopProcess .redHover .number{
+  position:relative;
+  width:36px;
+  height:36px;
+  background:#079e69;
+  border:2px solid #079e69;
+  color:#fff;
+}
+/*.shopProcess .redHover .number i{
+  width:36px;
+  height:36px;
+  line-height: 36px;
+  border:2px solid #079e69;
+  background:#079e69;
+  color:#fff;
+  transform:rotate(-45deg);
+  -ms-transform:rotate(-45deg);
+  -moz-transform:rotate(-45deg);
+  -webkit-transform:rotate(-45deg);
+  -o-transform:rotate(-45deg);
+  background: url(shop-big-bg.png) center -46px no-repeat;
+}*/
+/*#triangleRright {
+  position:absolute;
+  top:13px;
+  left:92px;
+  font-style: normal;
+  font-size: 0;
+  width: 0;
+  height: 0;
+  border-top: 5px solid transparent;
+  border-left: 7px solid #f97825;
+  border-bottom: 5px solid transparent;
+}*/
+.shopProcess .redHover .text{
+  color:#079e69;
+}
+.shopProcess li{
+  display:inline;
+  float:left;
+  width:150px;
+  position:relative;
+}
+.shopProcess .number{
+  width:36px;
+  height:36px;
+  text-align: center;
+  line-height: 36px;
+  border:2px solid #dcdcdc;
+  background:#fff;
+  transform:rotate(45deg);
+  -ms-transform:rotate(45deg);
+  -moz-transform:rotate(45deg);
+  -webkit-transform:rotate(45deg);
+  -o-transform:rotate(45deg);
+}
+.number i{
+  font-style: normal; 
+  display:inline-block;
+  transform:rotate(-45deg);
+  -ms-transform:rotate(-45deg);
+  -moz-transform:rotate(-45deg);
+  -webkit-transform:rotate(-45deg);
+  -o-transform:rotate(-45deg);
+  /*background: url(shop-big-bg.png) center 0 no-repeat;*/
+}
+.shopProcess li span.lineRed{
+  width: 114px;
+  height: 2px;
+  background: #079e69;
+  position: absolute;
+  right: 0;
+  top: 53px;
+}
+.shopdetail h4{
+    padding:20px;
+    margin:0;
+}
+.shopdetailInfo{
+    margin:0 20px 30px 20px;
+    border:1px solid #f0f0f0;
+}
+.shopdetailInfo h4{
+    font-size: 16px;
+    padding:15px;
+    background:#f0f0f0;
+    border-bottom: 1px solid #f0f0f0;
+}
+.shopdetailInfo span{
+    float:left;
+    height:50px;
+    line-height: 50px;
+    width:33.3333%;
+    padding:0 20px;
+}
+.detailShow{
+    margin:0;
+    color:#999;
+    cursor:pointer;
+}
+.detailMode{
+    border:1px solid #ddd;
+}
+.detailMain{
+    padding:15px;
+}
+.detailWay{
+    background:#f0f0f0;
+    /*padding:10px;*/
+    border-bottom: 1px solid #ddd;
+}
+.detailWay ul li{
+    position:relative;
+    float:left;
+    width:33.3333%;
+    background:#e6e6e6;
+}
+.detailWay div{
+    min-height:55px;
+    line-height: 55px;
+}
+.detailWayNum{
+    padding:0 20px;
+    font-size: 30px;
+    background:#0aa770;
+    color:#fff;
+}
+.triangleRight {
+    position:absolute;
+    top:16px;
+    left:57px;
+    width: 0;
+    height: 0;
+    border-top: 12px solid transparent;
+    border-left: 10px solid #0aa770;
+    border-bottom: 12px solid transparent;
+}
+.detailWayInfo{
+    padding:0 25px;
+    font-size: 20px;
+    background:#e6e6e6;
+    color:#FF6600;
+}
+.detailWayCode{
+    font-size: 60px;
+    color:#fff;
+}
+/*.detailWay span{
+  margin:0 3px;
+  color:#FF6600;
+}*/
+.zhifubao{
+    padding:5px 0;
+}
+.detailR{
+    margin-right: 20px;
+}
+.price-orange{
+    font-size: 24px;
+    color:#FF6600;
+}
+.payBtn{
+    margin:20px 0;
+}
+.detailBody{
+    width:100%;
+    text-align: center;
+}
+.detailBody h5{
+    margin:0 25px;
+    text-align: left;
+}
+.modaBtnGroup{
+    margin:20px 0;
+    width:100%;
+    text-align: center;
+}
+.classInfoR{
+    position:relative;
+    margin:0 0 0 480px;
+}
+.classInfoR p{
+    margin:15px 0;
+}
+.classInfoR span{
+    margin-right: 60px;
+}
+.btnClassApply{
+    position:absolute;
+    top:174px;
+    left:0;
+}
+.classInfoBttom{
+    margin:20px 0 0 0;
+}
+.tab-content{
+    margin:20px 0;
+}
+.classList h4{
+    background:#f3f3f3;
+    height:50px;
+    line-height: 50px;
+    margin:15px 0;
+    font-size: 14px;
+    font-weight: bold;
+}
+.classList h4 span{
+  min-width: 72px;
+  text-align: center;
+  padding:0 15px;
+  background:#666;
+  color:#fff;
+  margin:0 5px 0 0;
+  display:inline-block;
+}
+.classSection{
+    margin-bottom: 15px;
+    background:#f6f6f6;
+}
+.classSection dt{
+    font-weight: 500;
+    padding:10px 20px 5px 20px;
+}
+.classSection dd .classVideo{
+    position:relative;
+    height:35px;
+    line-height: 35px;
+    /*padding-left: 20px;*/
+}
+.classSection dd .classVideo a{
+    padding-left: 20px;
+}
+.classSection dd .classVideo.now{
+    background:#d7eed0;
+}
+.classSection dd .classVideo.now .glyphicon{
+    font-size: 16px;
+    padding-right: 10px;
+}
+.classSection dd a{
+    display:block;
+}
+.classSection dd a:hover{
+    background:#d7eed0;
+    text-decoration: none;
+}
+.classTime{
+    margin:0 25px 0 0;
+    color:#999;
+}
+.btnClassGroup{
+    position:absolute;
+    top:-2px;
+    right:15px;
+    display:none;
+}
+.btnClassGroup2{
+    position:absolute;
+    top:-2px;
+    right:15px;
+    z-index: 10;
+    display: none;
+}
+.btnClass{
+    height:35px;
+    line-height: 32px;
+    padding:0 20px;
+    /*border:1px solid #eee;*/
+    /*border-radius: 3px;*/
+}
+.videoImg{
+    position:relative;
+    width:960px;
+    height:500px;
+    background:#000;
+}
+.videoCon{
+    width:960px;
+    height:500px;
+    background:#000;
+}
+.videoShadow,.videoShadow2{
+    position:absolute;
+    top:0;
+    left:0;
+    width:100%;
+    height:100%;
+    background:#000;
+    z-index: 1;
+}
+.videoShCon{
+    position:absolute;
+    width:530px;
+    top:50%;
+    left:50%;
+    margin-left: -265px;
+    margin-top: -125px;
+    color:#fff;
+}
+.videoShCon h3 span{
+    margin-right: 5px;
+    color:#f00;
+}
+.videoShCon h3 .videoFinished{
+    margin:0 10px;
+    padding:5px;
+    border-radius: 18px;
+    border:2px solid #0aa770;
+    color:#0aa770;
+}
+.videoShCon p{
+    margin:15px 0;
+    font-size: 16px;
+    color:#666;
+}
+.btnShWrap{
+    margin:30px 0;
+    width:100%;
+    text-align: center;
+}
+.btnShWrap .btn{
+    margin:0 20px;
+}
+.classConVLeft{
+    width:750px;
+}
+.classConVRight{
+    margin:0 0 0 780px;
+}
+.classConVRight .progress{
+    margin-top: 20px;
+    height:26px;
+}
+.classConVRight .progress .progress-bar{
+    line-height: 26px;
+}
+.classConLeft span{
+    margin-right: 60px;
+}
+.classConLeftInfo span{
+    color:#666;
+}
+.classConVRight .classConLeftInfo span{
+    font-weight: bold;
+    color:#0aa770;
+}
+.spl{
+    margin:0 30px;
+    font-style: normal;
+    color:#bbb;
+}
+.classCVideo{
+    margin:20px 0;
+}
+.profileTitle{
+    background:#ddd;
+    padding:10px;
+}
+.leftMenu{
+    float:left;
+    width:180px;
+    background:#fff;
+    border:1px solid #ddd;
+}
+.leftMenu li{
+    border-bottom:1px solid #ddd;
+}
+.leftMenu li a{
+    display:block;
+    padding:0 15px;
+    color:#333;
+    height:45px;
+    line-height: 45px;
+}
+.leftMenu li:last-child{
+    border-bottom: none;
+}
+.leftMenu li:hover{
+    background:#f7f7f7;
+}
+.leftMenu li a:hover{
+    text-decoration: none;
+}
+.leftMenu li .active{
+    background:#0aa770;
+    color:#fff;
+}
+.rightMain{
+    background:#fff;
+    margin:0 0 0 200px;
+    border:1px solid #ddd;
+}
+.userTitle{
+    height:45px;
+    border-bottom: 1px solid #ddd;
+}
+.userTitle h5{
+    font-size: 16px;
+    font-weight: bold;
+    padding:0 15px;
+    margin:0;
+    line-height: 45px;
+}
+/*.userClass ul{*/
+    /*margin:25px 0;*/
+/*}*/
+.userClass ul li{
+    padding:25px;
+    border-bottom: 1px solid #f0f0f0;
+}
+.userClass ul li:last-child{
+    border-bottom: none;
+}
+.userClass ul li .progressNot{
+    margin-bottom: 0;
+}
+.classInfoCon{
+    position:relative;
+    margin:0 0 0 200px;
+}
+.btnPlay{
+    position:absolute;
+    top:35px;
+    right:0;
+}
+.classPro{
+    margin:23px 0 0 0;
+    font-size: 12px;
+}
+.orderList ul li{
+    margin:25px;
+    border:1px solid #f0f0f0;
+}
+.orderList .attBar{
+    height:40px;
+    line-height: 40px;
+    border-bottom: 1px solid #ddd;
+    /*background:#e1e1e1;*/
+}
+.orderList .attBarList{
+    padding:15px;
+    font-size: 16px;
+    background:#f0f0f0;
+    border-bottom: 1px solid #f0f0f0;
+}
+.orderList .subOrder{
+    padding:15px;
+}
+.orderList .subOrder span{
+    float:left;
+    width:30%;
+}
+.orderList .subOrder span:last-child{
+    width:10%;
+}
+.bodyBg{
+    position:fixed;
+    top:0;
+    bottom:0;
+    left:0;
+    right:0;
+    width:100%;
+    height:100%;
+    background: rgba(0,0,0,0.5);
+    z-index: 1040;
+}
+#videoTips,#videoValidate{
+    position:fixed;
+    top:40%;
+    left:50%;
+    margin-left: -300px;
+    margin-top: -125px;
+    min-height:250px;
+    z-index: 9999;
+}
+.warning ul li{
+    padding:5px 0;
+}
+.modal-content .bg-warning{
+    border-radius: 6px 6px 0 0;
+}
+.val-dialog{
+    width: 400px;
+    margin: 30px auto;
+    position: relative;
+}
+.val-footer{
+    padding: 10px;
+    text-align: center;
+    border-top: 1px solid #e5e5e5;
+}
+.playing{
+    z-index: 10;
+    /*display: none;*/
+}
+.mainWrap nav a{
+    padding: 5px 10px;
+    font-size: 12px;
+    line-height: 1.5px;
+    text-decoration:none;
+    color: #337ab7;
+    background-color: #ffffff;
+    border: 1px solid #dddddd;
+    margin-left: -1px;
+}
+.mainWrap nav a.current {
+    background: #ccc;
+    color: #fff;
+    font-weight: 600;
+    cursor: default;
+}
+.formItem {
+    color:#666;
+    padding:5px 20px 30px;
+}
+.formItem dl dt{
+    font-weight: 500;
+    font-size:14px;
+    margin:20px 0 5px;
+}
+.formItem dl dd{
+    margin:10px 0;
+}
+.formItem dl dd b{
+    margin-right: 10px;
+}

+ 788 - 0
global/css/style1.css

@@ -0,0 +1,788 @@
+body{
+  font-family:"微软雅黑","Tahoma";
+  height:100%;
+  background: #f3f3f3;
+  overflow-x: hidden;
+}
+ul, ol, li, h1 {
+  line-height:normal;
+  list-style-image:none;
+  list-style-position:outside;
+  list-style-type:none;
+}
+dl,ul {
+  margin:0;
+  padding:0;
+}
+dd {
+  margin-left:0
+}
+a {
+  outline:none;
+  text-decoration: none;
+}
+a img {
+  border:0 none
+}
+img {
+  vertical-align:middle;
+  border:0px
+}
+table {
+  border-collapse:collapse
+}
+.fL {float:left}
+.fR {float:right}
+.clearfix:after {
+  content:".";
+  display:block;
+  height:0;
+  clear:both;
+  visibility:hidden
+}
+.clearfix {
+  display:inline-block;
+  overflow:hidden
+}
+.clearfix {
+  display:block
+}
+@font-face {
+    font-family: 'iconMenu';
+    src:    url('fonts/iconMenu.eot?ambimp');
+    src:    url('fonts/iconMenu.eot?ambimp#iefix') format('embedded-opentype'),
+        url('fonts/iconMenu.ttf?ambimp') format('truetype'),
+        url('fonts/iconMenu.woff?ambimp') format('woff'),
+        url('fonts/iconMenu.svg?ambimp#iconMenu') format('svg');
+    font-weight: normal;
+    font-style: normal;
+}
+
+[class^="icon-"], [class*=" icon-"] {
+    /* use !important to prevent issues with browser extensions that change fonts */
+    font-family: 'iconMenu' !important;
+    speak: none;
+    font-style: normal;
+    font-weight: normal;
+    font-variant: normal;
+    text-transform: none;
+    line-height: 1;
+
+    /* Better Font Rendering =========== */
+    -webkit-font-smoothing: antialiased;
+    -moz-osx-font-smoothing: grayscale;
+}
+
+
+
+.topWrap{
+  width:100%;
+  height:80px;
+  background:#fff;
+  line-height: 75px;
+  border-bottom: 2px solid #0aa770;
+}
+.width1000{
+  width: 1000px;
+  margin:0 auto;
+}
+.logo{
+  margin:0 150px 0 0;
+  width:250px;
+  height:60px;
+}
+.logo h3{
+  margin:0;
+  padding:15px 0;
+}
+.topRight{
+  position:relative;
+  height:80px;
+  color: #aaa;
+}
+.topRight span img{
+  border-radius: 16px;
+}
+.topRight a{
+  margin:0 5px;
+  cursor: pointer;
+}
+.userOperations{
+  position:absolute;
+  top:78px;
+  right:0;
+  z-index: 999;
+  background:#fff;
+  border:1px solid #00925f;
+  width:115px;
+  display:none;
+}
+.userOperations li a{
+  display:block;
+  margin:0;
+  padding:7px 10px;
+  color:#333;
+}
+.userOperations li a:hover{
+  background:#f0f0f0;
+  text-decoration: none;
+  color:#23527c;
+}
+.footerWrap{
+  position:absolute;
+  bottom:0;
+  left:0;
+  right:0;
+  width:100%;
+  background:#fff;
+  border-top:1px solid #ddd;
+  text-align: center;
+  color:#999;
+}
+.footerInfo{
+  height:50px;
+  line-height: 50px;
+}
+.mainCon{
+  margin:20px 0;
+}
+.mainWrap{
+  margin:20px 0 70px 0;
+}
+.mainInfo{
+  padding:20px;
+  background:#fff;
+  border:1px solid #ddd;
+}
+.mainImg{
+  position:relative;
+  width:1000px;
+  height:500px;
+  background:#f0f0f0;
+  background:url(u27Bg.jpg) center center no-repeat;
+}
+.wrapBg{
+  background: rgba(0,0,0,0.5);
+  height:100%;
+}
+.wrapBgBlack{
+  background: rgba(0,0,0,0.7);
+  height:100%;
+}
+.classMain{
+  position:absolute;
+  top:30%;
+  left:50%;  
+  /*margin-top:-95px;*/
+  margin-left: -300px;
+  width:600px;
+  color:#fff;
+}
+.classTitle{
+  font-size: 28px;
+}
+.classTitle a{
+  color:#fff;
+}
+.classInfo{
+  margin:10px 0;
+  height:50px;
+  line-height: 50px;
+}
+.classInfo span{
+  margin:0 30px 0 0;
+}
+.btnWrap{
+  position:absolute;
+  top:60%;
+  left:50%;
+  margin-left: -110px;
+}
+.btnApply{
+  padding:12px 60px;
+  font-size: 24px;
+  border-radius: 5px;
+}
+.btnBlue{
+  position:relative;
+  border:1px solid #00925f;
+  background:#079e69;
+  /*background:#428BCA;
+  border:1px solid #307ec1; 
+  width:220px;
+  height:60px;*/
+}
+.btnGreen{
+  border:1px solid #00925f;
+  background:#079e69;
+}
+.btnGreen:hover{
+  border:1px solid #008858;
+  background:#00925f;
+  color:#fff;
+}
+/*.btnBlue:before,.btnBlue:after{
+      content: " ";
+      display: block;
+      position: absolute;
+      width:218px;
+      height:60px;
+      top: -1px;
+      left: -1px;
+      -webkit-box-shadow:0 0 10px 7px #307ec1;  
+      -moz-box-shadow:0 0 10px 7px #307ec1;  
+       box-shadow:0 0 10px 7px #307ec1;  
+      border-radius: 10px;
+      z-index:10;
+      box-sizing: border-box;
+      -webkit-animation: clipAni 5s infinite linear;
+}
+.btnBlue:before{
+      -webkit-animation-delay: -5s;
+    } 
+    @keyframes  clipAni{
+      0%,100%{
+        opacity: 0;);
+      }
+      25%{
+        opacity:0.3;);
+      }
+      50%{
+        opacity:0;);
+      }
+      75%{
+        opacity:0.3;);
+      }   
+}*/
+.btnBlue:hover{
+  border:1px solid #008858;
+  background:#00925f;
+  color:#fff;
+  /*border:1px solid #307ec1;
+  background:#4897dc;
+  color:#fff;*/
+}
+.btnLogin{
+  background:#1abc9c;
+}
+.btnLogin:hover{
+  background:#17b092;
+  border:1px solid #12a88a;
+}
+.mainLogin{
+  margin:0 auto;
+  width:350px;
+}
+.identity{
+  background: #fff;
+  border:1px solid #ddd;
+}
+.tips{
+  padding:10px 20px;
+  background:#fafafa;
+  border-bottom: 1px solid #ddd;
+}
+.idFrom{
+  padding:20px 10px;
+}
+.idFrom .form-horizontal{
+  width:550px;
+}
+.shopdetail{
+  position:relative;
+  width:100%;
+  border:1px solid #ddd;
+  border-top: 2px solid #aaa;
+  background:#fff;
+  margin-top: 70px;
+}
+.borderBreen{
+  position:absolute;
+  width:400px;
+  left:0;
+  top:-2px;
+  border-top: 2px solid #079e69;
+}
+.shopProcess{
+  position:absolute;
+  right:0;
+  top:-55px;
+}
+.shopProcess li span{
+  float:left;
+  width:100%;
+  height:36px;
+  line-height: 36px;
+  color:#999;
+}
+.shopProcess li span.number{
+  font:bold 16px/38px "arial";  
+}
+.shopProcess li span.text{
+  font: normal  "simsun";
+}
+.shopProcess .redHover .number{
+  position:relative;
+  width:36px;
+  height:36px;
+  background:#079e69;
+  border:2px solid #079e69;
+  color:#fff;
+}
+/*.shopProcess .redHover .number i{
+  width:36px;
+  height:36px;
+  line-height: 36px;
+  border:2px solid #079e69;
+  background:#079e69;
+  color:#fff;
+  transform:rotate(-45deg);
+  -ms-transform:rotate(-45deg);
+  -moz-transform:rotate(-45deg);
+  -webkit-transform:rotate(-45deg);
+  -o-transform:rotate(-45deg);
+  background: url(shop-big-bg.png) center -46px no-repeat;
+}*/
+/*#triangleRright {
+  position:absolute;
+  top:13px;
+  left:92px;
+  font-style: normal;
+  font-size: 0;
+  width: 0;
+  height: 0;
+  border-top: 5px solid transparent;
+  border-left: 7px solid #f97825;
+  border-bottom: 5px solid transparent;
+}*/
+.shopProcess .redHover .text{
+  color:#079e69;
+}
+.shopProcess li{
+  display:inline;
+  float:left;
+  width:150px;
+  position:relative;
+}
+.shopProcess .number{
+  width:36px;
+  height:36px;
+  text-align: center;
+  line-height: 36px;
+  border:2px solid #dcdcdc;
+  background:#fff;
+  transform:rotate(45deg);
+  -ms-transform:rotate(45deg);
+  -moz-transform:rotate(45deg);
+  -webkit-transform:rotate(45deg);
+  -o-transform:rotate(45deg);
+}
+.number i{
+  font-style: normal; 
+  display:inline-block;
+  transform:rotate(-45deg);
+  -ms-transform:rotate(-45deg);
+  -moz-transform:rotate(-45deg);
+  -webkit-transform:rotate(-45deg);
+  -o-transform:rotate(-45deg);
+  /*background: url(shop-big-bg.png) center 0 no-repeat;*/
+}
+.shopProcess li span.lineRed{
+  width: 114px;
+  height: 2px;
+  background: #079e69;
+  position: absolute;
+  right: 0;
+  top: 53px;
+}
+.shopdetail h4{
+  padding:20px;
+  margin:0;
+}
+.shopdetailInfo{
+  margin:0 20px 30px 20px;
+  border:1px solid #f0f0f0;
+}
+.shopdetailInfo h4{
+  font-size: 16px;
+  padding:15px;
+  background:#f0f0f0;
+  border-bottom: 1px solid #f0f0f0;
+}
+.shopdetailInfo span{
+  float:left;
+  height:50px;
+  line-height: 50px;
+  width:33.3333%;
+  padding:0 20px;
+}
+.detailShow{
+  margin:0;
+  color:#999;
+  cursor:pointer;
+}
+.detailMode{
+  border:1px solid #ddd;
+}
+.detailMain{
+  padding:15px;
+}
+.detailWay{
+  background:#f0f0f0;
+  /*padding:10px;*/
+  border-bottom: 1px solid #ddd;
+}
+.detailWay ul li{
+  position:relative;
+  float:left;
+  width:33.3333%;
+  background:#e6e6e6;
+}
+.detailWay div{
+  min-height:55px;
+  line-height: 55px;
+}
+.detailWayNum{
+  padding:0 20px;
+  font-size: 30px;
+  background:#0aa770;
+  color:#fff;
+}
+.triangleRight {
+  position:absolute;
+  top:16px;
+  left:57px;
+  width: 0;
+  height: 0;
+  border-top: 12px solid transparent;
+  border-left: 10px solid #0aa770;
+  border-bottom: 12px solid transparent;
+}
+.detailWayInfo{
+  padding:0 25px;
+  font-size: 20px;
+  background:#e6e6e6;
+  color:#FF6600;
+}
+.detailWayCode{
+  font-size: 60px;
+  color:#fff;
+}
+/*.detailWay span{
+  margin:0 3px;
+  color:#FF6600;
+}*/
+.zhifubao{
+  padding:5px 0;
+}
+.detailR{
+  margin-right: 20px;
+}
+.price-orange{
+  font-size: 24px;
+  color:#FF6600;
+}
+.payBtn{
+  margin:20px 0;
+}
+.detailBody{
+  width:100%;
+  text-align: center;
+}
+.detailBody h5{
+  margin:0 25px;
+  text-align: left;
+}
+.modaBtnGroup{
+  margin:20px 0;
+  width:100%;
+  text-align: center;
+}
+.classInfoR{
+  position:relative;
+  margin:0 0 0 480px;
+}
+.classInfoR p{
+  margin:15px 0;
+}
+.classInfoR span{
+  margin-right: 60px;
+}
+.btnClassApply{
+  position:absolute;
+  top:174px;
+  left:0;
+}
+.classInfoBttom{
+  margin:20px 0 0 0;
+}
+.tab-content{
+  margin:20px 0;
+}
+.classList h4{
+  background:#f3f3f3;
+  height:50px;
+  line-height: 50px;
+  margin:15px 0;
+  font-size: 14px;
+  font-weight: bold;
+}
+.classList h4 span{
+  min-width: 72px;
+  text-align: center;
+  padding:0 15px;
+  background:#666;
+  color:#fff;
+  margin:0 5px 0 0;
+  display:inline-block;
+}
+.classSection{
+  margin-bottom: 15px;
+  background:#f6f6f6;
+}
+.classSection dt{
+  font-weight: 500;
+  padding:10px 15px 5px 15px;
+}
+.classSection dd .classVideo{
+  position:relative;
+  height:35px;
+  line-height: 35px;
+  text-indent: 15px;
+}
+.classSection dd a{
+  display:block;
+}
+.classSection dd a:hover{ 
+  background:#d7eed0;
+  text-decoration: none;
+}
+.classTime{
+  margin:0 25px 0 0;
+  color:#999;
+}
+.videoPrice{
+  position:absolute;
+  top:0;
+  left:500px;
+  color:#FF6633;
+}
+.btnClassGroupShow{
+  position:absolute;
+  top:-2px;
+  right:15px;
+}
+.btnClassGroup{
+  position:absolute;
+  top:-2px;
+  right:15px;
+  display:none;
+}
+.btnClass{
+  height:35px;
+  line-height: 32px;
+  padding:0 20px;
+  /*border:1px solid #eee;
+  border-radius: 3px;*/
+}
+.videoImg{
+  position:relative;
+  width:960px;
+  height:500px;
+  background:#000;
+}
+.videoCon{
+  width:960px;
+  height:500px;
+  background:#000;
+}
+.videoShadow{
+  position:absolute;
+  top:0;
+  left:0;
+  width:100%;
+  height:100%;
+  background:#000;
+}
+.videoShCon{
+  position:absolute;
+  width:530px;
+  top:50%;
+  left:50%;
+  margin-left: -265px;
+  margin-top: -125px;
+  color:#fff;
+}
+.videoShCon h3 span{
+  margin-right: 5px;
+  color:#f00;
+}
+.videoShCon h3 .videoFinished{
+  margin:0 10px;
+  padding:5px;
+  border-radius: 18px;
+  border:2px solid #0aa770;
+  color:#0aa770;
+}
+.videoShCon p{
+  margin:15px 0;
+  font-size: 16px;
+  color:#666;
+}
+.btnShWrap{
+  margin:30px 0;
+  width:100%;
+  text-align: center;
+}
+.btnShWrap .btn{
+  margin:0 20px;
+}
+.classConVLeft{
+  width:750px;
+}
+.classConVRight{
+  margin:0 0 0 780px;
+}
+.classConVRight .progress{
+  margin-top: 20px;
+  height:26px;
+}
+.classConVRight .progress .progress-bar{
+  line-height: 26px;
+}
+.classConLeft span{
+  margin-right: 60px;
+}
+.classConLeftInfo span{
+  color:#666;
+}
+.classConVRight .classConLeftInfo span{
+  font-weight: bold;
+  color:#0aa770;
+}
+.spl{
+  margin:0 30px;
+  font-style: normal;
+  color:#bbb;
+}
+.classCVideo{
+  margin:20px 0;
+}
+.profileTitle{
+  background:#ddd;
+  padding:10px;
+}
+.leftMenu{
+  float:left;
+  width:180px;
+  background:#fff;
+  border:1px solid #ddd;
+}
+.leftMenu li{
+  border-bottom:1px solid #ddd;
+}
+.leftMenu li a{
+  display:block;
+  padding:0 15px;
+  color:#333;
+  height:45px;
+  line-height: 45px;  
+}
+.leftMenu li:last-child{
+  border-bottom: none;
+}
+.leftMenu li:hover{
+  background:#f7f7f7;
+}
+.leftMenu li a:hover{
+  text-decoration: none;
+}
+.leftMenu li .active{
+  background:#0aa770;
+  color:#fff;
+}
+.rightMain{
+  background:#fff;
+  margin:0 0 0 200px;
+  border:1px solid #ddd;
+}
+.userTitle{
+  height:45px;
+  border-bottom: 1px solid #ddd;
+}
+.userTitle h5{
+  font-size: 16px;
+  font-weight: bold;
+  padding:0 15px;
+  margin:0;
+  line-height: 45px;
+}
+.userClass ul li{
+  padding:25px;
+  border-bottom: 1px solid #f0f0f0;
+}
+.userClass ul li:last-child{
+  border-bottom: none;
+}
+.userClass ul li .progressNot{
+  margin-bottom: 0;
+}
+.classInfoCon{
+  position:relative;
+  margin:0 0 0 200px;
+}
+.btnPlay{
+  position:absolute;
+  top:35px;
+  right:0;
+}
+.classPro{
+  margin:23px 0 0 0;
+  font-size: 12px;
+}
+.orderList ul li{
+  margin:25px;
+  border:1px solid #f0f0f0;
+}
+.orderList .attBarList{
+  padding:15px;
+  font-size: 16px;
+  background:#f0f0f0;
+  border-bottom: 1px solid #f0f0f0;
+}
+.orderList .subOrder{
+  padding:15px;
+}
+.orderList .subOrder span{
+  float:left;
+  width:30%;
+}
+.orderList .subOrder span:last-child{
+  width:10%;
+}
+.bodyBg{
+  position:fixed;
+  top:0;
+  bottom:0;
+  left:0;
+  right:0;
+  width:100%;
+  height:100%;
+  background: rgba(0,0,0,0.5);
+  z-index: 1040;
+}
+#videoTips{
+  position:absolute;
+  top:40%;
+  left:50%;
+  margin-left: -300px;
+  margin-top: -125px;
+  min-height:250px;
+  z-index: 9999;
+}
+.warning ul li{
+  padding:5px 0;
+}
+.modal-content .bg-warning{
+  border-radius: 6px 6px 0 0;
+}

+ 918 - 0
global/css/style2.css

@@ -0,0 +1,918 @@
+html{
+    margin:0;
+    padding:0;
+    height:100%;
+}
+body{
+    margin:0;
+    padding:0;
+    font-family:"微软雅黑","Tahoma";
+    background: #f3f3f3;
+    position:relative;
+    min-height: 100%;
+    padding-bottom: 50px;
+}
+ul, ol, li, h1 {
+    line-height:normal;
+    list-style-image:none;
+    list-style-position:outside;
+    list-style-type:none;
+}
+dl,ul,div{
+    padding: 0;
+    margin: 0;
+    font-weight: normal;
+    font-style: normal;
+}
+dd {
+    margin-left:0
+}
+a {
+    outline:none;
+    text-decoration: none;
+}
+a img {
+    border:0 none
+}
+img {
+    vertical-align:middle;
+    border:0px
+}
+table {
+    border-collapse:collapse
+}
+.fL {float:left}
+.fR {float:right}
+.clearfix:after {
+    content:".";
+    display:block;
+    height:0;
+    clear:both;
+    visibility:hidden
+}
+.clearfix {
+    display:inline-block;
+    overflow:hidden
+}
+.clearfix {
+    display:block
+}
+@font-face {
+    font-family: 'iconMenu';
+    src:    url('fonts/iconMenu.eot?ambimp');
+    src:    url('fonts/iconMenu.eot?ambimp#iefix') format('embedded-opentype'),
+    url('fonts/iconMenu.ttf?ambimp') format('truetype'),
+    url('fonts/iconMenu.woff?ambimp') format('woff'),
+    url('fonts/iconMenu.svg?ambimp#iconMenu') format('svg');
+    font-weight: normal;
+    font-style: normal;
+}
+
+[class^="icon-"], [class*=" icon-"] {
+    /* use !important to prevent issues with browser extensions that change fonts */
+    font-family: 'iconMenu' !important;
+    speak: none;
+    font-style: normal;
+    font-weight: normal;
+    font-variant: normal;
+    text-transform: none;
+    line-height: 1;
+
+    /* Better Font Rendering =========== */
+    -webkit-font-smoothing: antialiased;
+    -moz-osx-font-smoothing: grayscale;
+}
+
+.topWrap{
+  width:100%;
+  height:80px;
+  background:#fff;
+  line-height: 75px;
+  border-bottom: 2px solid #0aa770;
+}
+.width1000{
+  width: 1000px;
+  margin:0 auto;
+}
+.logo{
+  margin:0 150px 0 0;
+  width:250px;
+  height:60px;
+}
+.logo h3{
+  margin:0;
+  padding:15px 0;
+}
+.topRight{
+  position:relative;
+  height:80px;
+  color: #aaa;
+}
+.topRight span img{
+  border-radius: 16px;
+}
+.topRight img{
+  border-radius: 16px;
+}
+.topRight a{
+  margin:0 5px;
+  cursor: pointer;
+}
+.userOperations{
+  position:absolute;
+  top:78px;
+  right:0;
+  z-index: 999;
+  background:#fff;
+  border:1px solid #00925f;
+  width:115px;
+  display:none;
+}
+.userOperations li a{
+  display:block;
+  margin:0;
+  padding:7px 10px;
+  color:#333;
+}
+.userOperations li a:hover{
+  background:#f0f0f0;
+  text-decoration: none;
+  color:#23527c;
+}
+.footerWrap{
+    position:absolute;
+    left:0;
+    bottom:0;
+    width:100%;
+    padding:12px 0;
+    /*height:50px;
+    line-height: 50px;*/
+    background:#fff;
+    border-top:1px solid #ddd;
+    text-align: center;
+    color:#999;
+}
+/*.footerInfo{
+    height:50px;
+    line-height: 50px;
+}*/
+.mainCon{
+    margin:20px 0;
+}
+.mainWrap{
+    padding:0 0 20px 0;
+    margin:20px 0 0 0;
+}
+.mainInfo{
+    padding:20px;
+    background:#fff;
+    border:1px solid #ddd;
+}
+.mainImg{
+    position:relative;
+    width:1000px;
+    height:500px;
+    background:#f0f0f0;
+    background:url(u27Bg.jpg) center center no-repeat;
+}
+.wrapBg{
+    background: rgba(0,0,0,0.5);
+    height:100%;
+}
+.wrapBgBlack{
+    background: rgba(0,0,0,0.7);
+    height:100%;
+}
+.classMain{
+    position:absolute;
+    top:30%;
+    left:50%;
+    /*margin-top:-95px;*/
+    margin-left: -300px;
+    width:600px;
+    color:#fff;
+}
+.classTitle{
+    font-size: 28px;
+}
+.classTitle a{
+    color:#fff;
+}
+.classInfo{
+    margin:10px 0;
+    height:50px;
+    line-height: 50px;
+}
+.classInfo span{
+    margin:0 30px 0 0;
+}
+.btnWrap{
+    position:absolute;
+    top:60%;
+    left:50%;
+    margin-left: -110px;
+}
+.btnApply{
+    padding:12px 60px;
+    font-size: 24px;
+    border-radius: 5px;
+}
+.btnBlue{
+  position:relative;
+  border:1px solid #00925f;
+  background:#079e69;
+  /*background:#428BCA;
+  border:1px solid #307ec1; 
+  width:220px;
+  height:60px;*/
+}
+.btnGreen{
+  border:1px solid #00925f;
+  background:#079e69;
+}
+.btnGreen:hover{
+  border:1px solid #008858;
+  background:#00925f;
+  color:#fff;
+}
+.btnGreen:focus,
+.btnGreen.focus {
+  color: #ffffff;
+  background-color: #00925f;
+  border-color: #008858;
+}
+.btnGreen:active,
+.btnGreen.active,
+.open > .dropdown-toggle.btnGreen {
+  color: #ffffff;
+  background-color: #00925f;
+  border-color: #008858;
+}
+.btnGreen:active:hover,
+.btnGreen.active:hover,
+.open > .dropdown-toggle.btnGreen:hover,
+.btnGreen:active:focus,
+.btnGreen.active:focus,
+.open > .dropdown-toggle.btnGreen:focus,
+.btnGreen:active.focus,
+.btnGreen.active.focus,
+.open > .dropdown-toggle.btnGreen.focus {
+  color: #ffffff;
+  background-color: #00925f;
+  border-color: #008858;
+}
+.btnGreen:active,
+.btnGreen.active,
+.open > .dropdown-toggle.btnGreen {
+  background-image: none;
+}
+.btnGreen.disabled,
+.btnGreen[disabled],
+fieldset[disabled] .btnGreen,
+.btnGreen.disabled:hover,
+.btnGreen[disabled]:hover,
+fieldset[disabled] .btnGreen:hover,
+.btnGreen.disabled:focus,
+.btnGreen[disabled]:focus,
+fieldset[disabled] .btnGreen:focus,
+.btnGreen.disabled.focus,
+.btnGreen[disabled].focus,
+fieldset[disabled] .btnGreen.focus,
+.btnGreen.disabled:active,
+.btnGreen[disabled]:active,
+fieldset[disabled] .btnGreen:active,
+.btnGreen.disabled.active,
+.btnGreen[disabled].active,
+fieldset[disabled] .btnGreen.active {
+  background-color: #00925f;
+  border-color: #008858;
+}
+/*.btnBlue:before,.btnBlue:after{
+      content: " ";
+      display: block;
+      position: absolute;
+      width:218px;
+      height:60px;
+      top: -1px;
+      left: -1px;
+      -webkit-box-shadow:0 0 10px 7px #307ec1;  
+      -moz-box-shadow:0 0 10px 7px #307ec1;  
+       box-shadow:0 0 10px 7px #307ec1;  
+      border-radius: 10px;
+      z-index:10;
+      box-sizing: border-box;
+      -webkit-animation: clipAni 5s infinite linear;
+}
+.btnBlue:before{
+      -webkit-animation-delay: -5s;
+    } 
+    @keyframes  clipAni{
+      0%,100%{
+        opacity: 0;);
+      }
+      25%{
+        opacity:0.3;);
+      }
+      50%{
+        opacity:0;);
+      }
+      75%{
+        opacity:0.3;);
+      }   
+}*/
+.btnBlue:hover{
+  border:1px solid #008858;
+  background:#00925f;
+  color:#fff;
+  /*border:1px solid #307ec1;
+  background:#4897dc;
+  color:#fff;*/
+}
+.btnLogin{
+    background:#1abc9c;
+}
+.btnLogin:hover{
+    background:#17b092;
+    border:1px solid #12a88a;
+}
+.mainLogin{
+    margin:0 auto;
+    width:350px;
+}
+.identity{
+    background: #fff;
+    border:1px solid #ddd;
+}
+.tips{
+    padding:10px 20px;
+    background:#fafafa;
+    border-bottom: 1px solid #ddd;
+}
+.idFrom{
+    padding:20px 10px;
+}
+.idFrom .form-horizontal{
+    width:550px;
+}
+.shopdetail{
+    position:relative;
+    width:100%;
+    border:1px solid #ddd;
+    border-top: 2px solid #aaa;
+    background:#fff;
+    margin-top: 70px;
+}
+.shopProcess{
+  position:absolute;
+  right:0;
+  top:-55px;
+}
+.shopProcess li span{
+  float:left;
+  width:100%;
+  height:36px;
+  line-height: 36px;
+  color:#999;
+}
+.shopProcess li span.number{
+  font:bold 16px/38px "arial";  
+}
+.shopProcess li span.text{
+  font: normal  "simsun";
+}
+.shopProcess .redHover .number{
+  position:relative;
+  width:36px;
+  height:36px;
+  background:#079e69;
+  border:2px solid #079e69;
+  color:#fff;
+}
+/*.shopProcess .redHover .number i{
+  width:36px;
+  height:36px;
+  line-height: 36px;
+  border:2px solid #079e69;
+  background:#079e69;
+  color:#fff;
+  transform:rotate(-45deg);
+  -ms-transform:rotate(-45deg);
+  -moz-transform:rotate(-45deg);
+  -webkit-transform:rotate(-45deg);
+  -o-transform:rotate(-45deg);
+  background: url(shop-big-bg.png) center -46px no-repeat;
+}*/
+/*#triangleRright {
+  position:absolute;
+  top:13px;
+  left:92px;
+  font-style: normal;
+  font-size: 0;
+  width: 0;
+  height: 0;
+  border-top: 5px solid transparent;
+  border-left: 7px solid #f97825;
+  border-bottom: 5px solid transparent;
+}*/
+.shopProcess .redHover .text{
+  color:#079e69;
+}
+.shopProcess li{
+  display:inline;
+  float:left;
+  width:150px;
+  position:relative;
+}
+.shopProcess .number{
+  width:36px;
+  height:36px;
+  text-align: center;
+  line-height: 36px;
+  border:2px solid #dcdcdc;
+  background:#fff;
+  transform:rotate(45deg);
+  -ms-transform:rotate(45deg);
+  -moz-transform:rotate(45deg);
+  -webkit-transform:rotate(45deg);
+  -o-transform:rotate(45deg);
+}
+.number i{
+  font-style: normal; 
+  display:inline-block;
+  transform:rotate(-45deg);
+  -ms-transform:rotate(-45deg);
+  -moz-transform:rotate(-45deg);
+  -webkit-transform:rotate(-45deg);
+  -o-transform:rotate(-45deg);
+  /*background: url(shop-big-bg.png) center 0 no-repeat;*/
+}
+.shopProcess li span.lineRed{
+  width: 114px;
+  height: 2px;
+  background: #079e69;
+  position: absolute;
+  right: 0;
+  top: 53px;
+}
+.shopdetail h4{
+    padding:20px;
+    margin:0;
+}
+.shopdetailInfo{
+    margin:0 20px 30px 20px;
+    border:1px solid #f0f0f0;
+}
+.shopdetailInfo h4{
+    font-size: 16px;
+    padding:15px;
+    background:#f0f0f0;
+    border-bottom: 1px solid #f0f0f0;
+}
+.shopdetailInfo span{
+    float:left;
+    height:50px;
+    line-height: 50px;
+    width:33.3333%;
+    padding:0 20px;
+}
+.detailShow{
+    margin:0;
+    color:#999;
+    cursor:pointer;
+}
+.detailMode{
+    border:1px solid #ddd;
+}
+.detailMain{
+    padding:15px;
+}
+.detailWay{
+    background:#f0f0f0;
+    /*padding:10px;*/
+    border-bottom: 1px solid #ddd;
+}
+.detailWay ul li{
+    position:relative;
+    float:left;
+    width:33.3333%;
+    background:#e6e6e6;
+}
+.detailWay div{
+    min-height:55px;
+    line-height: 55px;
+}
+.detailWayNum{
+    padding:0 20px;
+    font-size: 30px;
+    background:#0aa770;
+    color:#fff;
+}
+.triangleRight {
+    position:absolute;
+    top:16px;
+    left:57px;
+    width: 0;
+    height: 0;
+    border-top: 12px solid transparent;
+    border-left: 10px solid #0aa770;
+    border-bottom: 12px solid transparent;
+}
+.detailWayInfo{
+    padding:0 25px;
+    font-size: 20px;
+    background:#e6e6e6;
+    color:#FF6600;
+}
+.detailWayCode{
+    font-size: 60px;
+    color:#fff;
+}
+/*.detailWay span{
+  margin:0 3px;
+  color:#FF6600;
+}*/
+.zhifubao{
+    padding:5px 0;
+}
+.detailR{
+    margin-right: 20px;
+}
+.price-orange{
+    font-size: 24px;
+    color:#FF6600;
+}
+.payBtn{
+    margin:20px 0;
+}
+.detailBody{
+    width:100%;
+    text-align: center;
+}
+.detailBody h5{
+    margin:0 25px;
+    text-align: left;
+}
+.modaBtnGroup{
+    margin:20px 0;
+    width:100%;
+    text-align: center;
+}
+.classInfoR{
+    position:relative;
+    margin:0 0 0 480px;
+}
+.classInfoR p{
+    margin:15px 0;
+}
+.classInfoR span{
+    margin-right: 60px;
+}
+.btnClassApply{
+    position:absolute;
+    top:174px;
+    left:0;
+}
+.classInfoBttom{
+    margin:20px 0 0 0;
+}
+.tab-content{
+    margin:20px 0;
+}
+.classList h4{
+    background:#f3f3f3;
+    height:50px;
+    line-height: 50px;
+    margin:15px 0;
+    font-size: 14px;
+    font-weight: bold;
+}
+.classList h4 span{
+  min-width: 72px;
+  text-align: center;
+  padding:0 15px;
+  background:#666;
+  color:#fff;
+  margin:0 5px 0 0;
+  display:inline-block;
+}
+.classSection{
+    margin-bottom: 15px;
+    background:#f6f6f6;
+}
+.classSection dt{
+    font-weight: 500;
+    padding:10px 20px 5px 20px;
+}
+.classSection dd .classVideo{
+    position:relative;
+    height:35px;
+    line-height: 35px;
+    /*padding-left: 20px;*/
+}
+.classSection dd .classVideo a{
+    padding-left: 20px;
+}
+.classSection dd .classVideo.now{
+    background:#d7eed0;
+}
+.classSection dd .classVideo.now .glyphicon{
+    font-size: 16px;
+    padding-right: 10px;
+}
+.classSection dd a{
+    display:block;
+}
+.classSection dd a:hover{
+    background:#d7eed0;
+    text-decoration: none;
+}
+.classTime{
+    margin:0 25px 0 0;
+    color:#999;
+}
+.btnClassGroup{
+    position:absolute;
+    top:-2px;
+    right:15px;
+    display:none;
+}
+.btnClassGroup2{
+    position:absolute;
+    top:-2px;
+    right:15px;
+    z-index: 10;
+    display: none;
+}
+.btnClass{
+    height:35px;
+    line-height: 32px;
+    padding:0 20px;
+    /*border:1px solid #eee;*/
+    /*border-radius: 3px;*/
+}
+.videoImg{
+    position:relative;
+    width:960px;
+    height:500px;
+    background:#000;
+}
+.videoCon{
+    width:960px;
+    height:500px;
+    background:#000;
+}
+.videoShadow,.videoShadow2{
+    position:absolute;
+    top:0;
+    left:0;
+    width:100%;
+    height:100%;
+    background:#000;
+    z-index: 1;
+}
+.videoShCon{
+    position:absolute;
+    width:530px;
+    top:50%;
+    left:50%;
+    margin-left: -265px;
+    margin-top: -125px;
+    color:#fff;
+}
+.videoShCon h3 span{
+    margin-right: 5px;
+    color:#f00;
+}
+.videoShCon h3 .videoFinished{
+    margin:0 10px;
+    padding:5px;
+    border-radius: 18px;
+    border:2px solid #0aa770;
+    color:#0aa770;
+}
+.videoShCon p{
+    margin:15px 0;
+    font-size: 16px;
+    color:#666;
+}
+.btnShWrap{
+    margin:30px 0;
+    width:100%;
+    text-align: center;
+}
+.btnShWrap .btn{
+    margin:0 20px;
+}
+.classConVLeft{
+    width:750px;
+}
+.classConVRight{
+    margin:0 0 0 780px;
+}
+.classConVRight .progress{
+    margin-top: 20px;
+    height:26px;
+}
+.classConVRight .progress .progress-bar{
+    line-height: 26px;
+}
+.classConLeft span{
+    margin-right: 60px;
+}
+.classConLeftInfo span{
+    color:#666;
+}
+.classConVRight .classConLeftInfo span{
+    font-weight: bold;
+    color:#0aa770;
+}
+.spl{
+    margin:0 30px;
+    font-style: normal;
+    color:#bbb;
+}
+.classCVideo{
+    margin:20px 0;
+}
+.profileTitle{
+    background:#ddd;
+    padding:10px;
+}
+.leftMenu{
+    float:left;
+    width:180px;
+    background:#fff;
+    border:1px solid #ddd;
+}
+.leftMenu li{
+    border-bottom:1px solid #ddd;
+}
+.leftMenu li a{
+    display:block;
+    padding:0 15px;
+    color:#333;
+    height:45px;
+    line-height: 45px;
+}
+.leftMenu li:last-child{
+    border-bottom: none;
+}
+.leftMenu li:hover{
+    background:#f7f7f7;
+}
+.leftMenu li a:hover{
+    text-decoration: none;
+}
+.leftMenu li .active{
+    background:#0aa770;
+    color:#fff;
+}
+.rightMain{
+    background:#fff;
+    margin:0 0 0 200px;
+    border:1px solid #ddd;
+}
+.userTitle{
+    height:45px;
+    border-bottom: 1px solid #ddd;
+}
+.userTitle h5{
+    font-size: 16px;
+    font-weight: bold;
+    padding:0 15px;
+    margin:0;
+    line-height: 45px;
+}
+/*.userClass ul{*/
+    /*margin:25px 0;*/
+/*}*/
+.userClass ul li{
+    padding:25px;
+    border-bottom: 1px solid #f0f0f0;
+}
+.userClass ul li:last-child{
+    border-bottom: none;
+}
+.userClass ul li .progressNot{
+    margin-bottom: 0;
+}
+.classInfoCon{
+    position:relative;
+    margin:0 0 0 200px;
+}
+.btnPlay{
+    position:absolute;
+    top:35px;
+    right:0;
+}
+.classPro{
+    margin:23px 0 0 0;
+    font-size: 12px;
+}
+.orderList ul li{
+    margin:25px;
+    border:1px solid #f0f0f0;
+}
+.orderList .attBar{
+    height:40px;
+    line-height: 40px;
+    border-bottom: 1px solid #ddd;
+    /*background:#e1e1e1;*/
+}
+.orderList .attBarList{
+    padding:15px;
+    font-size: 16px;
+    background:#f0f0f0;
+    border-bottom: 1px solid #f0f0f0;
+}
+.orderList .subOrder{
+    padding:15px;
+}
+.orderList .subOrder span{
+    float:left;
+    width:30%;
+}
+.orderList .subOrder span:last-child{
+    width:10%;
+}
+.bodyBg{
+    position:fixed;
+    top:0;
+    bottom:0;
+    left:0;
+    right:0;
+    width:100%;
+    height:100%;
+    background: rgba(0,0,0,0.5);
+    z-index: 1040;
+}
+#videoTips,#videoValidate{
+    position:fixed;
+    top:40%;
+    left:50%;
+    margin-left: -300px;
+    margin-top: -125px;
+    min-height:250px;
+    z-index: 9999;
+}
+.warning ul li{
+    padding:5px 0;
+}
+.modal-content .bg-warning{
+    border-radius: 6px 6px 0 0;
+}
+.val-dialog{
+    width: 400px;
+    margin: 30px auto;
+    position: relative;
+}
+.val-footer{
+    padding: 10px;
+    text-align: center;
+    border-top: 1px solid #e5e5e5;
+}
+.playing{
+    z-index: 10;
+    /*display: none;*/
+}
+.mainWrap nav a{
+    padding: 5px 10px;
+    font-size: 12px;
+    line-height: 1.5px;
+    text-decoration:none;
+    color: #337ab7;
+    background-color: #ffffff;
+    border: 1px solid #dddddd;
+    margin-left: -1px;
+}
+.mainWrap nav a.current {
+    background: #ccc;
+    color: #fff;
+    font-weight: 600;
+    cursor: default;
+}
+.formItem {
+    color:#666;
+    padding:5px 20px 30px;
+}
+.formItem dl dt{
+    font-weight: 500;
+    font-size:14px;
+    margin:20px 0 5px;
+}
+.formItem dl dd{
+    margin:10px 0;
+}
+.formItem dl dd b{
+    margin-right: 10px;
+}
+.bar-gary {
+    background-color: #bbb;
+    background-image: -moz-linear-gradient(top, #ccc, #bbb);
+    background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ccc), to(#bbb));
+    background-image: -webkit-linear-gradient(top, #ccc, #bbb);
+    background-image: -o-linear-gradient(top, #ccc, #bbb);
+    background-image: linear-gradient(to bottom, #ccc, #bbb);
+    background-repeat: repeat-x;
+    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ccc', endColorstr='#bbb', GradientType=0);
+}

BIN
global/css/u27.jpg


BIN
global/css/u27Bg.jpg


BIN
global/css/u27Bg.png


Datei-Diff unterdrückt, da er zu groß ist
+ 9 - 0
global/css/video.css


+ 29 - 0
global/css/webuploader.css

@@ -0,0 +1,29 @@
+.webuploader-container {
+	position: relative;
+}
+.webuploader-element-invisible {
+	position: absolute !important;
+	clip: rect(1px 1px 1px 1px); /* IE6, IE7 */
+    clip: rect(1px,1px,1px,1px);
+}
+.webuploader-pick {
+	position: relative;
+	display: inline-block;
+	cursor: pointer;
+	background: #337ab7;
+	border: 1px solid #2e6da4;
+	padding: 10px 15px;
+	color: #fff;
+	text-align: center;
+	border-radius: 4px;
+	overflow: hidden;
+}
+.webuploader-pick-hover {
+	background: #2e6da4;
+}
+
+.webuploader-pick-disable {
+	opacity: 0.6;
+	pointer-events:none;
+}
+

BIN
global/file/HWSetUp.exe


BIN
global/fonts/glyphicons-halflings-regular.eot


Datei-Diff unterdrückt, da er zu groß ist
+ 288 - 0
global/fonts/glyphicons-halflings-regular.svg


BIN
global/fonts/glyphicons-halflings-regular.ttf


BIN
global/fonts/glyphicons-halflings-regular.woff


BIN
global/fonts/glyphicons-halflings-regular.woff2


BIN
global/images/009.gif


BIN
global/images/01.jpg


BIN
global/images/01.png


BIN
global/images/background.jpg


BIN
global/images/logo.ico


BIN
global/images/logo.jpg


BIN
global/images/u27.jpg


BIN
global/images/课堂logo.jpg


BIN
global/img/edge.jpg


BIN
global/img/glyphicons-halflings-white.png


BIN
global/img/glyphicons-halflings.png


BIN
global/img/os/win-1.png


BIN
global/img/os/win-2.png


BIN
global/img/os/win-3.png


BIN
global/img/os/win-4.png


BIN
global/img/os/win-5.png


BIN
global/img/os/win-6.png


BIN
global/img/soft/soft-1.png


BIN
global/img/soft/soft-2.png


BIN
global/jquery-ui/images/animated-overlay.gif


BIN
global/jquery-ui/images/ui-bg_flat_0_aaaaaa_40x100.png


BIN
global/jquery-ui/images/ui-bg_flat_75_ffffff_40x100.png


BIN
global/jquery-ui/images/ui-bg_glass_55_fbf9ee_1x400.png


BIN
global/jquery-ui/images/ui-bg_glass_65_ffffff_1x400.png


BIN
global/jquery-ui/images/ui-bg_glass_75_dadada_1x400.png


BIN
global/jquery-ui/images/ui-bg_glass_75_e6e6e6_1x400.png


BIN
global/jquery-ui/images/ui-bg_glass_95_fef1ec_1x400.png


BIN
global/jquery-ui/images/ui-bg_highlight-soft_75_cccccc_1x100.png


BIN
global/jquery-ui/images/ui-icons_222222_256x240.png


BIN
global/jquery-ui/images/ui-icons_2e83ff_256x240.png


BIN
global/jquery-ui/images/ui-icons_454545_256x240.png


BIN
global/jquery-ui/images/ui-icons_888888_256x240.png


BIN
global/jquery-ui/images/ui-icons_cd0a0a_256x240.png


Datei-Diff unterdrückt, da er zu groß ist
+ 2 - 0
global/jquery-ui/jquery-ui.min.css


Datei-Diff unterdrückt, da er zu groß ist
+ 9 - 0
global/jquery-ui/jquery-ui.min.js


Datei-Diff unterdrückt, da er zu groß ist
+ 2280 - 0
global/js/bootstrap.js


Datei-Diff unterdrückt, da er zu groß ist
+ 12 - 0
global/js/bootstrap.min.js


+ 21 - 0
global/js/global.js

@@ -0,0 +1,21 @@
+// JavaScript Document
+$(function () {
+    $('[data-toggle="tooltip"]').tooltip();
+});
+$(document).ready(function(){
+  $(".mainMenu li").hover(function(){
+    $(this).children(".subMenu").show();
+  },function(){
+    $(this).children(".subMenu").hide();
+  });
+  $(".sectionList").hover(function(){
+    $(this).children(".operateSection").show();
+  },function(){
+    $(this).children(".operateSection").hide();
+  });
+  $(".videoName").hover(function(){
+    $(this).children(".operateNone").show();
+  },function(){
+    $(this).children(".operateNone").hide();
+  });
+})

+ 33 - 0
global/js/global2.js

@@ -0,0 +1,33 @@
+/**
+ * Created by smartcost on 2016/10/12.
+ */
+// JavaScript Document
+$(function () {
+    $('[data-toggle="tooltip"]').tooltip();
+    $('#myTab a:last').tab('show');
+});
+$(document).ready(function(){
+    $(".topRight").hover(function(){
+        $(".userOperations").show();
+    },function(){
+        $(".userOperations").hide();
+    });
+    $(".mainImg").hover(function(){
+        $(".wrapBg").addClass("wrapBgBlack");
+    },function(){
+        $(".wrapBg").removeClass("wrapBgBlack");
+    })
+    $(".classSection dd a").hover(function(){
+        if($(this).parent('div').hasClass('now')){
+            $(this).children(".btnClassGroup").hide();
+        }else{
+            $(this).children(".btnClassGroup").show();
+        }
+    },function(){
+        $(this).children(".btnClassGroup").hide();
+    });
+    $(".btnClose").click(function(){
+        $("#videoTips").hide();
+        $(".bodyBg").hide();
+    })
+})

Datei-Diff unterdrückt, da er zu groß ist
+ 5 - 0
global/js/jquery-1.9.1.min.js


+ 174 - 0
global/js/sha1.js

@@ -0,0 +1,174 @@
+/**
+ *
+ *  Secure Hash Algorithm (SHA1)
+ *  http://www.webtoolkit.info/
+ *
+ **/
+
+function SHA1 (msg) {
+
+    function rotate_left(n,s) {
+        var t4 = ( n<<s ) | (n>>>(32-s));
+        return t4;
+    };
+
+    function lsb_hex(val) {
+        var str="";
+        var i;
+        var vh;
+        var vl;
+
+        for( i=0; i<=6; i+=2 ) {
+            vh = (val>>>(i*4+4))&0x0f;
+            vl = (val>>>(i*4))&0x0f;
+            str += vh.toString(16) + vl.toString(16);
+        }
+        return str;
+    };
+
+    function cvt_hex(val) {
+        var str="";
+        var i;
+        var v;
+
+        for( i=7; i>=0; i-- ) {
+            v = (val>>>(i*4))&0x0f;
+            str += v.toString(16);
+        }
+        return str;
+    };
+
+
+    function Utf8Encode(string) {
+        string = string.replace(/\r\n/g,"\n");
+        var utftext = "";
+
+        for (var n = 0; n < string.length; n++) {
+
+            var c = string.charCodeAt(n);
+
+            if (c < 128) {
+                utftext += String.fromCharCode(c);
+            }
+            else if((c > 127) && (c < 2048)) {
+                utftext += String.fromCharCode((c >> 6) | 192);
+                utftext += String.fromCharCode((c & 63) | 128);
+            }
+            else {
+                utftext += String.fromCharCode((c >> 12) | 224);
+                utftext += String.fromCharCode(((c >> 6) & 63) | 128);
+                utftext += String.fromCharCode((c & 63) | 128);
+            }
+
+        }
+
+        return utftext;
+    };
+
+    var blockstart;
+    var i, j;
+    var W = new Array(80);
+    var H0 = 0x67452301;
+    var H1 = 0xEFCDAB89;
+    var H2 = 0x98BADCFE;
+    var H3 = 0x10325476;
+    var H4 = 0xC3D2E1F0;
+    var A, B, C, D, E;
+    var temp;
+
+    msg = Utf8Encode(msg);
+
+    var msg_len = msg.length;
+
+    var word_array = new Array();
+    for( i=0; i<msg_len-3; i+=4 ) {
+        j = msg.charCodeAt(i)<<24 | msg.charCodeAt(i+1)<<16 |
+            msg.charCodeAt(i+2)<<8 | msg.charCodeAt(i+3);
+        word_array.push( j );
+    }
+
+    switch( msg_len % 4 ) {
+        case 0:
+            i = 0x080000000;
+            break;
+        case 1:
+            i = msg.charCodeAt(msg_len-1)<<24 | 0x0800000;
+            break;
+
+        case 2:
+            i = msg.charCodeAt(msg_len-2)<<24 | msg.charCodeAt(msg_len-1)<<16 | 0x08000;
+            break;
+
+        case 3:
+            i = msg.charCodeAt(msg_len-3)<<24 | msg.charCodeAt(msg_len-2)<<16 | msg.charCodeAt(msg_len-1)<<8  | 0x80;
+            break;
+    }
+
+    word_array.push( i );
+
+    while( (word_array.length % 16) != 14 ) word_array.push( 0 );
+
+    word_array.push( msg_len>>>29 );
+    word_array.push( (msg_len<<3)&0x0ffffffff );
+
+
+    for ( blockstart=0; blockstart<word_array.length; blockstart+=16 ) {
+
+        for( i=0; i<16; i++ ) W[i] = word_array[blockstart+i];
+        for( i=16; i<=79; i++ ) W[i] = rotate_left(W[i-3] ^ W[i-8] ^ W[i-14] ^ W[i-16], 1);
+
+        A = H0;
+        B = H1;
+        C = H2;
+        D = H3;
+        E = H4;
+
+        for( i= 0; i<=19; i++ ) {
+            temp = (rotate_left(A,5) + ((B&C) | (~B&D)) + E + W[i] + 0x5A827999) & 0x0ffffffff;
+            E = D;
+            D = C;
+            C = rotate_left(B,30);
+            B = A;
+            A = temp;
+        }
+
+        for( i=20; i<=39; i++ ) {
+            temp = (rotate_left(A,5) + (B ^ C ^ D) + E + W[i] + 0x6ED9EBA1) & 0x0ffffffff;
+            E = D;
+            D = C;
+            C = rotate_left(B,30);
+            B = A;
+            A = temp;
+        }
+
+        for( i=40; i<=59; i++ ) {
+            temp = (rotate_left(A,5) + ((B&C) | (B&D) | (C&D)) + E + W[i] + 0x8F1BBCDC) & 0x0ffffffff;
+            E = D;
+            D = C;
+            C = rotate_left(B,30);
+            B = A;
+            A = temp;
+        }
+
+        for( i=60; i<=79; i++ ) {
+            temp = (rotate_left(A,5) + (B ^ C ^ D) + E + W[i] + 0xCA62C1D6) & 0x0ffffffff;
+            E = D;
+            D = C;
+            C = rotate_left(B,30);
+            B = A;
+            A = temp;
+        }
+
+        H0 = (H0 + A) & 0x0ffffffff;
+        H1 = (H1 + B) & 0x0ffffffff;
+        H2 = (H2 + C) & 0x0ffffffff;
+        H3 = (H3 + D) & 0x0ffffffff;
+        H4 = (H4 + E) & 0x0ffffffff;
+
+    }
+
+    var temp = cvt_hex(H0) + cvt_hex(H1) + cvt_hex(H2) + cvt_hex(H3) + cvt_hex(H4);
+
+    return temp.toLowerCase();
+
+}

+ 74 - 0
global/js/timer.js

@@ -0,0 +1,74 @@
+var videotimer = md5($('#time').val());
+var HH = 0;
+var mm = 0;
+var ss = 0;
+var x=1;
+var str = '';
+//var timer = setInterval(gettimer,1000);
+var timer;
+
+function gettimer(){
+    str = "";
+    if(++ss==60)
+    {
+        if(++mm==60)
+        {
+            HH++;
+            mm=0;
+        }
+        ss=0;
+    }
+    str+=HH<10?"0"+HH:HH;
+    str+=":";
+    str+=mm<10?"0"+mm:mm;
+    str+=":";
+    str+=ss<10?"0"+ss:ss;
+    document.getElementById("dtime").innerHTML = str;
+    localStorage.setItem(videotimer,HH*3600+mm*60+ss);
+
+    var doness = $('#doness').val();
+    var nowss = parseInt(doness)+1;
+    var now = Math.floor(nowss/3600*100)/100;
+    var totalss = $('#totalss').val();
+    var progress = Math.floor(nowss/totalss*100);
+    $('.done_progress').text(progress);
+    $('.done_noprogress').text(100-parseInt(progress));
+    $('#noprogresstar').css('width',(100-parseInt(progress))+'%');
+    $('#progresstar').css('width',progress+'%');
+    $('.done_hh').text(now);
+    $('#doness').val(nowss);
+    if(nowss == totalss){
+        $('#finishClass').show();
+        $('#classStatus').html('已完成本课程学习');
+        clearInterval(timer);
+        myPlayer.pause();
+        updatedata();
+    }
+
+    if(HH*3600+mm*60+ss == 60*5*x){
+        updatedata();
+        if(x%2 == 0) {
+            clearInterval(timer);
+            $('#videoValidate').show();
+            $('.bodyBg').show();
+            myPlayer.pause();
+        }
+        x++;
+    }
+}
+
+function starttimer(){
+    timer = setInterval(gettimer,1000);
+    myPlayer.play();
+    $('#videoValidate').hide();
+    $('.bodyBg').hide();
+}
+
+function startclass(){
+    $('#videoTips').hide();
+    $('.bodyBg').hide();
+    timer = setInterval(gettimer,1000);
+    myPlayer.setDataSource({type: videotype, src: videosrc});
+    myPlayer.seekTo(parseInt(videotime)*1000);
+    myPlayer.play();
+}

+ 821 - 0
global/js/videoupload.js

@@ -0,0 +1,821 @@
+/*global $,console,FileReader,md5*/
+/*jslint white: true*/
+/**
+ * 文件上传SDK
+ *     1、兼容性说明:
+ *         仅兼容IE10+、Firefox、Chrome等支持slice和localStorage的浏览器。
+ *     2、SDK依赖于jQuery和md5插件,请提前引入。
+ *     3、执行getInitInfo初始化前需要先调用鉴权接口(应用服务器自行实现):http://vcloud.163.com/docs/api.html(API token校验)。
+ *     4、获取鉴权信息后,请修改getInitInfo函数,传入获取的鉴权信息,并修改AJAX回调实现。
+ *     5、调用方法:Uploader().init({
+ *         //配置对象,将覆盖默认配置
+ *         fileInputId: '',
+ *         fileUploadId: '',
+ *         getInitInfo: function(file, callback){
+ *             ...
+ *         }
+ *         ...
+ *     })
+ *     其中,配置对象的fileInputId、fileUploadId、getInitInfo,以及所有onXxx等回调函数需要自行修改实现(以配置对象参数方式传入init函数)。
+ * @module uploader
+ * @class Uploader
+ * @static
+ * @param {Object} options 配置项对象
+ * @return {Object} 接口对象
+ * @author luoweiping
+ * @version 1.0.0
+ */
+var AppSecret = 'dbb0e89f0e9943b5b7e837731a8deacd';
+var Nonce;
+var CurTime;
+var CheckSum;
+const   HEX_DIGITS = "0123456789abcdef";
+function checkSumBuilder(){
+    //此部分生成随机字符串
+    var hex_digits = HEX_DIGITS;
+    Nonce = '';
+    for(var i=0;i<128;i++){           //随机字符串最大128个字符,也可以小于该数
+        Nonce += hex_digits[Math.floor(Math.random()*16)];
+    }
+    CurTime = Date.parse(new Date())/1000;   //当前时间戳,以秒为单位
+
+    var join_string = AppSecret+Nonce+CurTime;
+    CheckSum = SHA1(join_string);
+
+}
+
+function Uploader(options) {
+    'use strict';
+    var defaults = {
+            /**
+             * 分片大小
+             * @attribute trunkSize
+             * @writeOnce
+             * @type {Number}
+             */
+            trunkSize: 4 * 1024 * 1024,
+            /**
+             * 获取dns列表的URL
+             * @attribute urlDns
+             * @writeOnce
+             * @type {String}
+             */
+            urlDns: 'http://wanproxy.127.net/lbs',
+            /**
+             * 上传输入框元素ID
+             * @attribute fileInputId
+             * @writeOnce
+             * @type {String}
+             */
+            fileInputId: 'fileInput',
+            /**
+             * 上传按钮ID
+             * @attribute fileUploadId
+             * @writeOnce
+             * @type {String}
+             */
+            fileUploadId: 'fileUpload',
+            /**
+             * 删除按钮ID
+             * @attribute fileRemoveId
+             * @writeOnce
+             * @type {String}
+             */
+            //fileRemoveId: 'fileRemove',
+            fileExts: ['JPG','PNG','WMV','ASF','AVI','3GP','MKV','MP4','DVD','OGM','MOV','MPG','MPEG','MPE','FLV','F4V','SWF','M4V','QT','DAT','VOB','RMVB','RM','OGM','M2TS','MTS','TS','TP','WEBM'],
+            /**
+             * 获取初始化信息
+             *     发送请求到视频云服务端或应用服务器,参数见代码注释;
+             *     其中,typeId和presetId需自行获取(接口文档暂未发布,请联系客服),headers参数为API token校验返回的结果(必填)
+             * @method fileUploadId
+             * @static
+             * @param  {Object}   file     文件对象
+             *      fileKey: 对文件名和文件大小进行md5后的结果
+             *      file: File对象
+             *      fileName: 文件名(作为file.name的备份)
+             *      fileSizeMb: 文件大小(MB)
+             *      format: 文件后缀
+             *      status: 上传状态(0:待上传,1:上传中;2:上传完成)
+             *      checked: 是否选中(用于列表)
+             *      progress: 上传进度
+             * @param  {Function} callback 回调函数
+             *      回调函数的参数包括:
+             *      bucketName: 桶名
+             *      objectName: 对象名
+             *      nosToken: x-nos-token
+             * @return {void}
+             * @version 1.0.0
+             */
+            getInitInfo: function(file, callback) {
+                var context;
+                checkSumBuilder();
+                context = localStorage.getItem(file.fileKey + '_context');
+                if (!context) {
+                    $.ajax({
+                        type: 'post',
+                        url: 'http://vcloud.163.com/app/vod/upload/init',
+                        data: JSON.stringify({
+                            originFileName: file.file.name,     //上传文件的原始名称(包含后缀名)(必填)(规则同Windows文件名规则)
+                            userFileName: file.file.name,       //用户命名的上传文件名称(规则同Windows文件名规则)
+                            typeId: 27143,                       //视频所属的类别ID,继续教育
+                            presetId: 78477,                     //视频所需转码模板ID
+                            watermarkId: 5724,                  //水印
+                            callbackUrl: null,                  //转码成功后回调客户端的URL地址
+                            description: null                   //上传视频的描述信息
+                        }),
+                        //headers参数为API token校验返回的结果,全部均为必须
+                        headers: {
+                            'AppKey': 'f277356253794d16bbef1f2107c3e84e',   //开发者平台分配的appkey
+                            'Nonce': Nonce,    //随机数(随机数,最大长度128个字符)
+                            'CurTime': CurTime,  //当前UTC时间戳,从1970年1月1日0点0分0秒开始到现在的秒数
+                            'CheckSum': CheckSum  //服务器认证需要,SHA1(AppSecret+Nonce+CurTime),16进制字符小写
+                        },
+                        dataType: 'json',
+                        contentType: 'application/json',
+                        success: function(data, s, xhr) {
+                            /*
+                             data格式:
+                             "Content-Type": "application/json; charset=utf-8"
+                             {
+                             "code": 200,
+                             "msg": "",
+                             "ret": {
+                             "xNosToken": "xxsfsgdsgetret",
+                             "bucket": "origv10000",
+                             "object": "qrwr-eete-dsft-vdfg.mp4"
+                             }
+                             }
+                             */
+                            if (data.code === 200) {
+                                localStorage.setItem(file.fileKey + '_bucket', data.ret.bucket);
+                                localStorage.setItem(file.fileKey + '_object', data.ret.object);
+                                localStorage.setItem(file.fileKey + '_xNosToken', data.ret.xNosToken);
+                                callback({
+                                    'bucketName': data.ret.bucket,
+                                    'objectName': data.ret.object,
+                                    'nosToken': data.ret.xNosToken
+                                });
+                            } else {
+                                opts.onError({
+                                    errCode: data.Code,
+                                    errMsg: data.msg
+                                });
+                            }
+                        },
+                        error: function(xhr, s, err) {
+                            opts.onError(err);
+                        }
+                    });
+                } else {
+                    callback({
+                        'bucketName': localStorage.getItem(file.fileKey + '_bucket'),
+                        'objectName': localStorage.getItem(file.fileKey + '_object'),
+                        'nosToken': localStorage.getItem(file.fileKey + '_xNosToken')
+                    });
+                }
+            },
+            /**
+             * 错误处理回调
+             * @method onError
+             * @static
+             * @param  {Object} errObj 带errCode和errMsg的Object或XHR错误对象
+             * @return {void}
+             * @version 1.0.0
+             */
+            onError: function(errObj) {
+                //alert(errObj);
+                console.log(errObj);
+            },
+            /**
+             * 上传进度回调
+             * @method onProgress
+             * @static
+             * @param  {Object} curFile 文件对象
+             * @return {void}
+             * @version 1.0.0
+             */
+            onProgress: function(curFile) {
+                var $li = $( '#'+curFile.fileKey ),
+                    $percent = $li.find('.progress .progress-bar');
+                // 避免重复创建
+                if ( !$percent.length ) {
+                    $percent = $('<div class="progress progress-striped active">' +
+                        '<div class="progress-bar" role="progressbar" style="width: '+ curFile.progress +'%">' +
+                        '</div>' +
+                        '</div>').appendTo( $li ).find('.progress-bar');
+                }
+                $percent.css( 'width', curFile.progress + '%' );
+                $li.find('p.state').text(curFile.progress + '%');
+                //console.log(curFile.status);
+                //console.log(curFile.progress);
+            },
+            /**
+             * 单文件上传成功回调
+             * @method onUploaded
+             * @static
+             * @param  {Object} curFile 文件对象
+             * @return {void}
+             * @version 1.0.0
+             */
+            onUploaded: function(curFile) {
+                //$( '#'+ curFile.fileKey ).find('p.state').html('<span style="color: #5cb85c">上传成功</span>');
+                //console.log('File: ' + curFile.fileName + ' is uploaded.');
+                // 将文件信息存入上传成功列表
+                service.successList.push(curFile);
+                checkSumBuilder();
+                /**
+                 * 用于获取vid等信息,暂只支持在单个文件上传成功后的回调中进行
+                 * 在全部上传成功的回调中发起请求会导致在上传失败时无法执行请求(接口的URL、参数格式、响应格式等均相同)
+                 */
+                $.ajax({
+                    type: 'post',
+                    url: 'http://vcloud.163.com/app/vod/video/query',
+                    data: JSON.stringify({
+                        objectNames: [curFile.objectName]
+                    }),
+                    dataType: 'json',
+                    contentType: 'application/json',
+                    //headers参数为API token校验返回的结果,全部均为必须
+                    headers: {
+                        'AppKey': 'f277356253794d16bbef1f2107c3e84e',   //开发者平台分配的appkey
+                        'Nonce': Nonce,    //随机数(随机数,最大长度128个字符)
+                        'CurTime': CurTime,  //当前UTC时间戳,从1970年1月1日0点0分0秒开始到现在的秒数
+                        'CheckSum': CheckSum  //服务器认证需要,SHA1(AppSecret+Nonce+CurTime),16进制字符小写
+                    },
+                    success: function(data, s, xhr) {
+                        if(data.code === 200){
+                            $( '#'+ curFile.fileKey ).find('p.state').html('<span style="color: #5cb85c">上传成功</span>');
+                            $( '#'+ curFile.fileKey ).find('div.progress').remove();
+                            var videomsg;
+                            videomsg = {
+                                fileName:curFile.fileName,
+                                objectname:curFile.objectName,
+                                wyvideoid:data.ret.list[0].vid,
+                                classid:curFile.classid,
+                                typeid:curFile.type,
+                                seid:curFile.section,
+                                //wytypeid:curFile.wytype,
+                                ext:curFile.format,
+                                size:curFile.file.size
+                            };
+                            $.ajax({
+                                type : 'POST',
+                                url : '/m/uploadVideo',
+                                data: {videomsg:videomsg},
+                                dataType:'json',
+                                success: function(result){
+
+                                }
+                            });
+                            /**
+                             * 根据需要进行处理,返回的data格式:
+                             * "Content-Type": "application/json; charset=utf-8"
+                             * {
+                         *     "code" : 200,
+                         *     "msg": "",
+                         *     "ret" : {
+                         *         "count": 1,
+                         *         "list" : [{
+                         *             "objectName" : "33cf71b1-86ac-4555-a071-d70db07b9685.mp4",
+                         *             "vid" : 1008
+                         *         },
+                         *         ...
+                         *         ]
+                         *     }
+                         * }
+                             */
+                        } else {
+                            opts.onError({
+                                errCode: data.Code,
+                                errMsg: data.msg
+                            });
+                        }
+                    },
+                    error: function(xhr, s, err) {
+                        opts.onError(err);
+                    }
+                });
+            },
+            /**
+             * 全部文件上传成功回调
+             * @method onAllUploaded
+             * @static
+             * @return {void}
+             * @version 1.0.0
+             */
+            onAllUploaded: function() {
+                //setTimeout(window.location.href = '/m/classinfo/'+$('#video_class').val(),3000);
+                //alert('所有文件上传完成,请刷新页面获取视频信息');
+                console.log('所有文件上传完成,请刷新页面获取视频信息');
+                if(window.confirm('所有文件上传完成,请刷新页面获取视频信息')){
+                    //alert("确定");
+                    var fun = function(){
+                        window.location.href = '/m/classinfo/'+$('#video_class').val();
+                    };
+                    setTimeout(fun,500);
+                    return true;
+                }else{
+                    //alert("取消");
+                    return false;
+                }
+                //location.reload();
+                //console.log('All done.');
+            },
+            /**
+             * 文件添加成功回调
+             * @method onAddonAdd
+             * @static
+             * @param  {File} fileObj 文件对象
+             * @return {void}
+             * @version 1.0.0
+             */
+            onAdd: function(curFile) {
+                if(curFile.progress != 0){
+                    $('#thelist').append( '<div id="' + curFile.fileKey + '" class="item" >' +
+                        '<h4 class="info">' + curFile.file.name + '</h4>' +
+                        '<p class="state">'+ curFile.progress + '%</p>' +
+                        '</div>' );
+                    var $li = $( '#'+curFile.fileKey ),
+                        $percent = $li.find('.progress .progress-bar');
+                    // 避免重复创建
+                    if ( !$percent.length ) {
+                        $percent = $('<div class="progress progress-striped active">' +
+                            '<div class="progress-bar" role="progressbar" style="width: '+ curFile.progress +'%">' +
+                            '</div>' +
+                            '</div>').appendTo( $li ).find('.progress-bar');
+                    }
+                    $li.find('p.state').text(curFile.progress + '%');
+
+                }else{
+                    $('#thelist').append( '<div id="' + curFile.fileKey + '" class="item">' +
+                        '<h4 class="info">' + curFile.file.name + '</h4>' +
+                        '<p class="state">等待上传...'+ curFile.fileSizeMb + ' MB' +'</p>' +
+                        '</div>' );
+                }
+                //console.log(curFile);
+
+            },
+            /**
+             * 无文件上传时的处理函数
+             * @method noUploadFn
+             * @static
+             * @return {void}
+             * @version 1.0.0
+             */
+            noUploadFn: function() {
+                alert('请选择待上传的文件');
+                //console.log('请选择待上传的文件');
+            },
+            /**
+             * 文件已存在列表中的处理函数
+             * @method existFn
+             * @static
+             * @return {void}
+             * @version 1.0.0
+             */
+            existFn: function() {
+                alert('文件已存在列表中');
+                //console.log('文件已存在列表中');
+            },
+            /**
+             * 文件格式不匹配的处理函数
+             * @method existFn
+             * @static
+             * @return {void}
+             * @version 1.0.0
+             */
+            mismatchFn: function() {
+                $('#progressInfo').html('不是有效的视频或图片格式');
+            }
+        },
+        opts,
+        service;
+
+    opts = $.extend({}, defaults, options);
+
+    service = {
+        /**
+         * @property {Array} fileList 文件列表
+         */
+        fileList: [],
+        /**
+         * @property {Array} successList 上传成功的文件列表
+         */
+        successList: [],
+        /**
+         * @property {Array} dnsList DNS列表
+         */
+        dnsList: null,
+        /**
+         * 获取上传DNS地址
+         * @method getDNS
+         * @static
+         * @param  {Object}   param    AJAX参数
+         * @param  {Function} callback 成功回调
+         * @return {void}
+         * @version 1.0.0
+         */
+        getDNS: function(param, callback) {
+            if (service.dnsList) {//已缓存则直接取缓存数据
+                callback(service.dnsList);
+            } else {
+                $.ajax({
+                    type: 'get',
+                    url: opts.urlDns,
+                    data: {
+                        version: '1.0',
+                        bucketname: param.bucketName
+                    },
+                    dataType: 'json',
+                    success: function(data, s, xhr) {
+                        if (data.code) {
+                            opts.onError({
+                                errCode: data.Code,
+                                errMsg: data.Message
+                            });
+                        } else {
+                            service.dnsList = data.upload;
+                            callback(data.upload);
+                        }
+                    },
+                    error: function(xhr, s, err) {
+                        opts.onError(err);
+                    }
+                });
+            }
+        },
+        /**
+         * 删除文件,终止上传并从列表中移除(进度保持不变)
+         * @method removeFile
+         * @static
+         * @param  {Object} file 文件对象
+         * @return {void}
+         * @version 1.0.0
+         */
+        removeFile: function(file) {
+            $.each(service.fileList, function(i, v) {
+                if (v.fileKey === file.fileKey) {
+                    if (v.xhr) {
+                        v.xhr.upload.onprogress = $.noop;
+                        v.xhr.onreadystatechange = $.noop;
+                        v.xhr.abort();
+
+                        v.xhr = null;
+                    }
+                    service.fileList.splice(i, 1);
+
+                    if (v.status === 1) {
+                        service.upload(i);
+                    }
+                    return false;
+                }
+            });
+        },
+        /**
+         * 根据fileKey获取指定文件对象
+         * @method getFile
+         * @static
+         * @param  {String} fileKey 文件名和文件大小md5值
+         * @return {Obejct}         文件对象
+         * @version 1.0.0
+         */
+        getFile: function(fileKey) {
+            var curFile;
+
+            $.each(service.fileList, function(i, v) {
+                if (v.fileKey === fileKey) {
+                    curFile = v;
+                    return false;
+                }
+            });
+
+            return curFile;
+        },
+        /**
+         * 上传分片
+         * @method uploadTrunk
+         * @static
+         * @param  {Object}   param     AJAX参数
+         * @param  {Object}   trunkData 分片数据
+         * @param  {Function} callback  文件(非分片)上传成功回调函数
+         * @return {void}
+         * @version 1.0.0
+         */
+        uploadTrunk: function(param, trunkData, callback) {
+            var xhr,
+                xhrParam = '',
+                curFile,
+                context;
+            curFile = service.getFile(trunkData.fileKey);
+            context = localStorage.getItem(trunkData.fileKey + '_context');
+
+            if (curFile.xhr) {
+                xhr = curFile.xhr;
+            } else {
+                xhr = new XMLHttpRequest();
+                curFile.xhr = xhr;
+            }
+
+            xhr.upload.onprogress = function(e) {
+                var progress = 0;
+
+                if (e.lengthComputable) {
+                    progress = (trunkData.offset + e.loaded) / trunkData.file.size;
+                    curFile.progress = (progress * 100).toFixed(2);
+
+                    if (progress > 0 && progress < 1) {
+                        curFile.status = 1;
+                    } else if (progress === 1) {
+                        curFile.status = 2;
+                    }
+                    localStorage.setItem(trunkData.fileKey + '_progress', curFile.progress);
+                    opts.onProgress(curFile);
+                } else {
+                    opts.onError({
+                        errCode: 501,
+                        errMsg: '浏览器不支持进度事件'
+                    });
+                }
+            };
+
+            xhr.onreadystatechange = function() {
+                if (xhr.readyState !== 4) {
+                    return;
+                }
+                var result;
+                try {
+                    result = JSON.parse(xhr.responseText);
+                } catch (e) {
+                    result = {
+                        errCode: 500,
+                        errMsg: '未知错误'
+                    };
+                }
+                if (xhr.status === 200) {
+                    if (!result.errCode) {
+                        localStorage.setItem(trunkData.fileKey + '_context', result.context);
+
+                        if (result.offset < trunkData.file.size) {//上传下一片
+                            service.uploadTrunk(param, $.extend({}, trunkData, {
+                                offset: result.offset,
+                                trunkEnd: result.offset + trunkData.trunkSize,
+                                context: context || result.context
+                            }), callback);
+                        } else {//单文件上传结束
+                            callback(trunkData);
+                        }
+                    } else {
+                        service.clearStorage(trunkData.fileKey);
+                        opts.onError({
+                            errCode: result.errCode,
+                            errMsg: result.errMsg
+                        });
+                    }
+                } else {
+                    if(xhr.status){//nos error
+                        service.clearStorage(trunkData.fileKey);
+                    }
+                    //取消、关闭情况
+                    opts.onError(xhr.responseText);
+                }
+            };
+            xhrParam = '?offset=' + trunkData.offset + '&complete=' + (trunkData.trunkEnd >= trunkData.file.size) + '&context=' + (context || trunkData.context) + '&version=1.0';
+
+            xhr.open('post', param.serveIp + '/' + param.bucketName + '/' + param.objectName + xhrParam);
+            xhr.setRequestHeader('x-nos-token', param.nosToken);
+            xhr.send(trunkData.file.slice(trunkData.offset, trunkData.trunkEnd));
+        },
+        /**
+         * 获取上传断点位置
+         * @method getOffset
+         * @static
+         * @param  {Object}   param    AJAX参数
+         * @param  {Function} callback 获取成功回调
+         * @return {void}
+         * @version 1.0.0
+         */
+        getOffset: function(param, callback) {
+            var context;
+            context = localStorage.getItem(param.fileKey + '_context');
+            if (!context) {
+                return callback(0);
+            }
+            $.ajax({
+                type: 'get',
+                url: param.serveIp + '/' + param.bucketName + '/' + param.objectName + '?uploadContext',
+                data: {
+                    version: '1.0',
+                    context: context
+                },
+                dataType: 'json',
+                beforeSend: function(xhr) {
+                    xhr.setRequestHeader('x-nos-token', param.nosToken);
+                },
+                success: function(data, s, xhr) {
+                    if (data.errCode) {
+                        opts.onError({
+                            errCode: data.errCode,
+                            errMsg: data.errMsg
+                        });
+                    } else {
+                        callback(data.offset);
+                    }
+                },
+                error: function(xhr, s, err) {
+                    opts.onError(err);
+                }
+            });
+        },
+        clearStorage: function(fileKey){
+            localStorage.removeItem(fileKey + '_progress');
+            localStorage.removeItem(fileKey + '_context');
+            localStorage.removeItem(fileKey + '_created');
+            localStorage.removeItem(fileKey + '_bucket');
+            localStorage.removeItem(fileKey + '_object');
+            localStorage.removeItem(fileKey + '_xNosToken');
+            localStorage.removeItem(fileKey + '_typeid');
+            //localStorage.removeItem(fileKey + '_wytypeid');
+            localStorage.removeItem(fileKey + '_classid');
+            localStorage.removeItem(fileKey + '_sectionid');
+        },
+        /**
+         * 上传文件操作
+         * @method upload
+         * @static
+         * @param  {Number} fileIdx 文件索引
+         * @return {void}
+         * @version 1.0.0
+         */
+        upload: function(fileIdx) {
+            if (fileIdx < service.fileList.length) {
+                if (service.fileList[fileIdx].status === 2 || !service.fileList[fileIdx].checked) {//上传完成或未勾选
+                    return service.upload(fileIdx + 1);
+                }
+                opts.getInitInfo(service.fileList[fileIdx], function(data) {
+                    var curFile = service.fileList[fileIdx];
+                    curFile.objectName = data.objectName;
+                    curFile.bucketName = data.bucketName;
+
+                    service.getDNS(data, function(dnsList) {
+                        var curFile = service.fileList[fileIdx];
+                        service.getOffset({
+                            serveIp: dnsList[0],
+                            bucketName: data.bucketName,
+                            objectName: data.objectName,
+                            nosToken: data.nosToken,
+                            fileKey: service.fileList[fileIdx].fileKey
+                        }, function(offset) {
+                            service.uploadTrunk({
+                                serveIp: dnsList[0],
+                                bucketName: data.bucketName,
+                                objectName: data.objectName,
+                                nosToken: data.nosToken
+                            }, {
+                                file: service.fileList[fileIdx].file,
+                                fileKey: service.fileList[fileIdx].fileKey,
+                                fileIdx: fileIdx,
+                                offset: offset || 0,
+                                trunkSize: opts.trunkSize,
+                                trunkEnd: (offset || 0) + opts.trunkSize,
+                                context: ''
+                            }, function(trunkData) {
+                                service.clearStorage(trunkData.fileKey);
+                                opts.onUploaded(curFile);
+                                service.upload(fileIdx + 1);
+                            });
+                        });
+                    });
+                });
+            } else {
+                opts.onAllUploaded();
+            }
+        },
+        /**
+         * 添加文件
+         * @method addFile
+         * @static
+         * @param {Element}   fileInput 上传输入框元素
+         * @param {Function} callback  添加成功回调
+         * @return {void}
+         * @version 1.0.0
+         */
+        addFile: function(fileInput, callback) {
+            var file = fileInput.files[0],
+                fileKey = md5(file.name + ':' + file.size),
+                fileObj;
+            localStorage.setItem(fileKey + '_typeid', $('#video_type').val());
+            localStorage.setItem(fileKey + '_classid', $('#video_class').val());
+            localStorage.setItem(fileKey + '_sectionid', $('#video_section').val());
+            //localStorage.setItem(fileKey + '_wytypeid', $('#video_wytype').val());
+            fileObj = {
+                fileKey: fileKey,
+                file: file,
+                fileName: file.name,
+                fileSizeMb: (file.size / 1024 / 1024).toFixed(2),
+                format: file.name.split('.').pop(),
+                status: 0,
+                checked: true,
+                progress: localStorage.getItem(fileKey + '_progress') || 0,
+                type:localStorage.getItem(fileKey + '_typeid') || null,
+                //wytype:localStorage.getItem(fileKey + '_wytypeid') || null,
+                classid:localStorage.getItem(fileKey + '_classid') || null,
+                section:localStorage.getItem(fileKey + '_sectionid') || null
+            };
+            service.fileList.push(fileObj);
+            localStorage.setItem(fileKey + '_created', +new Date());
+            callback(fileInput, fileObj);
+        },
+        /**
+         * 判断文件是否已存在列表中
+         * @method checkExist
+         * @static
+         * @param  {File} file File对象
+         * @return {Boolean}      存在:true,不存在:false
+         * @version 1.0.0
+         */
+        checkExist: function(file) {
+            var exist = false,
+                curKey = md5(file.name + ':' + file.size);
+            $.each(service.fileList, function(i, v) {
+                if (curKey === v.fileKey) {
+                    exist = true;
+                    return false;
+                }
+            });
+            return exist;
+        },
+        /**
+         * 判断是否有待上传(已选中且上传未完成)的文件
+         * @method checkedPending
+         * @static
+         * @return {Boolean} 有:true,无:false
+         * @version 1.0.0
+         */
+        checkedPending: function() {
+            var checked = false;
+            $.each(service.fileList, function(i, v) {
+                if (v.checked && v.status === 0) {
+                    checked = true;
+                    return false;
+                }
+            });
+            return checked;
+        },
+        /**
+         * 事件绑定
+         * @method initEvent
+         * @static
+         * @return {void}
+         * @version 1.0.0
+         */
+        initEvent: function() {
+            $('#' + opts.fileInputId).on('change', function(e) {
+                var fileExt = '';
+                if (e.target.files) {
+                    if (!service.checkExist(e.target.files[0])) {
+                        fileExt = e.target.files[0].name.split('.').pop();
+                        fileExt = fileExt.toUpperCase();
+                        if($.inArray(fileExt, opts.fileExts) < 0){
+                            return opts.mismatchFn();
+                        }
+                        service.addFile(e.target, function(fileInput, fileObj) {
+                            opts.onAdd(fileObj);
+                            fileInput.value = '';
+                        });
+                    } else {
+                        this.value = '';
+                        opts.existFn();
+                    }
+                }
+            });
+            $('#' + opts.fileUploadId).on('click', function() {
+                if (!service.checkedPending()) {
+                    opts.noUploadFn();
+                    return false;
+                }
+                service.upload(0);
+                return false;
+            });
+            //$('#' + opts.fileRemoveId).on('click', function() {
+            //    if (!service.checkedPending()) {
+            //        opts.noUploadFn();
+            //        return false;
+            //    }
+            //    service.upload(0);
+            //    return false;
+            //});
+        },
+        /**
+         * 初始化
+         * @method init
+         * @static
+         * @return {void}
+         * @version 1.0.0
+         */
+        init: function() {
+            service.initEvent();
+        }
+    };
+
+    return service;
+}

+ 33 - 0
index.php

@@ -0,0 +1,33 @@
+<?php
+
+include './protected/config/common.conf.php';
+include './protected/config/routes.conf.php';
+include './protected/config/db.conf.php';
+#Just include this for production mode
+//include $config['BASE_PATH'].'deployment/deploy.php';
+include $config['BASE_PATH'] . 'Doo.php';
+include $config['BASE_PATH'] . 'app/DooConfig.php';
+
+# Uncomment for auto loading the framework classes.
+spl_autoload_register('Doo::autoload');
+
+Doo::conf()->set($config);
+
+# remove this if you wish to see the normal PHP error view.
+//include $config['BASE_PATH'] . 'diagnostic/debug.php';
+
+# database usage
+//Doo::useDbReplicate();	#for db replication master-slave usage
+//Doo::db()->setMap($dbmap);
+Doo::db()->setDb($dbconfig, $config['APP_MODE']);
+//Doo::db()->sql_tracking = true;	#for debugging/profiling purpose
+
+Doo::app()->route = $route;
+
+# Uncomment for DB profiling
+//Doo::logger()->beginDbProfile('doowebsite');
+Doo::app()->run();
+//Doo::logger()->endDbProfile('doowebsite');
+//Doo::logger()->rotateFile(20);
+//Doo::logger()->writeDbProfiles();
+?>

+ 47 - 0
protected/class/alipay/alipay.config.php

@@ -0,0 +1,47 @@
+<?php
+/* *
+ * 配置文件
+ * 版本:3.3
+ * 日期:2012-07-19
+ * 说明:
+ * 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
+ * 该代码仅供学习和研究支付宝接口使用,只是提供一个参考。
+	
+ * 提示:如何获取安全校验码和合作身份者id
+ * 1.用您的签约支付宝账号登录支付宝网站(www.alipay.com)
+ * 2.点击“商家服务”(https://b.alipay.com/order/myorder.htm)
+ * 3.点击“查询合作者身份(pid)”、“查询安全校验码(key)”
+	
+ * 安全校验码查看时,输入支付密码后,页面呈灰色的现象,怎么办?
+ * 解决方法:
+ * 1、检查浏览器配置,不让浏览器做弹框屏蔽设置
+ * 2、更换浏览器或电脑,重新登录查询。
+ */
+ 
+//↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
+//合作身份者id,以2088开头的16位纯数字
+$alipay_config['partner']		= '2088911958018392';
+
+//收款支付宝账号
+$alipay_config['seller_email']	= '5883242@qq.com';
+
+//安全检验码,以数字和字母组成的32位字符
+$alipay_config['key']			= 'znqqprmp6rn5l7oljajmml1txc1vv4w9';
+
+
+//↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
+
+
+//签名方式 不需修改
+$alipay_config['sign_type']    = strtoupper('MD5');
+
+//字符编码格式 目前支持 gbk 或 utf-8
+$alipay_config['input_charset']= strtolower('utf-8');
+
+//ca证书路径地址,用于curl中ssl校验
+//请保证cacert.pem文件在当前文件夹目录中
+$alipay_config['cacert']    = getcwd().'\\protected\\class\\alipay\\cacert.pem';
+
+//访问模式,根据自己的服务器是否支持ssl访问,若支持请选择https;若不支持请选择http
+$alipay_config['transport']    = 'http';
+?>

Datei-Diff unterdrückt, da er zu groß ist
+ 3920 - 0
protected/class/alipay/cacert.pem


+ 167 - 0
protected/class/alipay/lib/alipay_core.function.php

@@ -0,0 +1,167 @@
+<?php
+
+/**
+ * 把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串
+ * @param $para 需要拼接的数组
+ * return 拼接完成以后的字符串
+ */
+function createLinkstring($para) {
+	$arg  = "";
+	while (list ($key, $val) = each ($para)) {
+		$arg.=$key."=".$val."&";
+	}
+	//去掉最后一个&字符
+	$arg = substr($arg,0,count($arg)-2);
+	
+	//如果存在转义字符,那么去掉转义
+	if(get_magic_quotes_gpc()){$arg = stripslashes($arg);}
+	
+	return $arg;
+}
+/**
+ * 把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串,并对字符串做urlencode编码
+ * @param $para 需要拼接的数组
+ * return 拼接完成以后的字符串
+ */
+function createLinkstringUrlencode($para) {
+	$arg  = "";
+	while (list ($key, $val) = each ($para)) {
+		$arg.=$key."=".urlencode($val)."&";
+	}
+	//去掉最后一个&字符
+	$arg = substr($arg,0,count($arg)-2);
+	
+	//如果存在转义字符,那么去掉转义
+	if(get_magic_quotes_gpc()){$arg = stripslashes($arg);}
+	
+	return $arg;
+}
+/**
+ * 除去数组中的空值和签名参数
+ * @param $para 签名参数组
+ * return 去掉空值与签名参数后的新签名参数组
+ */
+function paraFilter($para) {
+	$para_filter = array();
+	while (list ($key, $val) = each ($para)) {
+		if($key == "sign" || $key == "sign_type" || $val == "")continue;
+		else	$para_filter[$key] = $para[$key];
+	}
+	return $para_filter;
+}
+/**
+ * 对数组排序
+ * @param $para 排序前的数组
+ * return 排序后的数组
+ */
+function argSort($para) {
+	ksort($para);
+	reset($para);
+	return $para;
+}
+/**
+ * 写日志,方便测试(看网站需求,也可以改成把记录存入数据库)
+ * 注意:服务器需要开通fopen配置
+ * @param $word 要写入日志里的文本内容 默认值:空值
+ */
+function logResult($word='') {
+	$fp = fopen("log.txt","a");
+	flock($fp, LOCK_EX) ;
+	fwrite($fp,"执行日期:".strftime("%Y%m%d%H%M%S",time())."\n".$word."\n");
+	flock($fp, LOCK_UN);
+	fclose($fp);
+}
+
+/**
+ * 远程获取数据,POST模式
+ * 注意:
+ * 1.使用Crul需要修改服务器中php.ini文件的设置,找到php_curl.dll去掉前面的";"就行了
+ * 2.文件夹中cacert.pem是SSL证书请保证其路径有效,目前默认路径是:getcwd().'\\cacert.pem'
+ * @param $url 指定URL完整路径地址
+ * @param $cacert_url 指定当前工作目录绝对路径
+ * @param $para 请求的数据
+ * @param $input_charset 编码格式。默认值:空值
+ * return 远程输出的数据
+ */
+function getHttpResponsePOST($url, $cacert_url, $para, $input_charset = '') {
+
+	if (trim($input_charset) != '') {
+		$url = $url."_input_charset=".$input_charset;
+	}
+	$curl = curl_init($url);
+	curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);//SSL证书认证
+	curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);//严格认证
+	curl_setopt($curl, CURLOPT_CAINFO,$cacert_url);//证书地址
+	curl_setopt($curl, CURLOPT_HEADER, 0 ); // 过滤HTTP头
+	curl_setopt($curl,CURLOPT_RETURNTRANSFER, 1);// 显示输出结果
+	curl_setopt($curl,CURLOPT_POST,true); // post传输数据
+	curl_setopt($curl,CURLOPT_POSTFIELDS,$para);// post传输数据
+	$responseText = curl_exec($curl);
+	//var_dump( curl_error($curl) );//如果执行curl过程中出现异常,可打开此开关,以便查看异常内容
+	curl_close($curl);
+	
+	return $responseText;
+}
+
+/**
+ * 远程获取数据,GET模式
+ * 注意:
+ * 1.使用Crul需要修改服务器中php.ini文件的设置,找到php_curl.dll去掉前面的";"就行了
+ * 2.文件夹中cacert.pem是SSL证书请保证其路径有效,目前默认路径是:getcwd().'\\cacert.pem'
+ * @param $url 指定URL完整路径地址
+ * @param $cacert_url 指定当前工作目录绝对路径
+ * return 远程输出的数据
+ */
+function getHttpResponseGET($url,$cacert_url) {
+	$curl = curl_init($url);
+	curl_setopt($curl, CURLOPT_HEADER, 0 ); // 过滤HTTP头
+	curl_setopt($curl,CURLOPT_RETURNTRANSFER, 1);// 显示输出结果
+	curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);//SSL证书认证
+	curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);//严格认证
+	curl_setopt($curl, CURLOPT_CAINFO,$cacert_url);//证书地址
+	$responseText = curl_exec($curl);
+	//var_dump( curl_error($curl) );//如果执行curl过程中出现异常,可打开此开关,以便查看异常内容
+	curl_close($curl);
+	
+	return $responseText;
+}
+
+/**
+ * 实现多种字符编码方式
+ * @param $input 需要编码的字符串
+ * @param $_output_charset 输出的编码格式
+ * @param $_input_charset 输入的编码格式
+ * return 编码后的字符串
+ */
+function charsetEncode($input,$_output_charset ,$_input_charset) {
+	$output = "";
+	if(!isset($_output_charset) )$_output_charset  = $_input_charset;
+	if($_input_charset == $_output_charset || $input ==null ) {
+		$output = $input;
+	} elseif (function_exists("mb_convert_encoding")) {
+		$output = mb_convert_encoding($input,$_output_charset,$_input_charset);
+	} elseif(function_exists("iconv")) {
+		$output = iconv($_input_charset,$_output_charset,$input);
+	} else die("sorry, you have no libs support for charset change.");
+	return $output;
+}
+/**
+ * 实现多种字符解码方式
+ * @param $input 需要解码的字符串
+ * @param $_output_charset 输出的解码格式
+ * @param $_input_charset 输入的解码格式
+ * return 解码后的字符串
+ */
+function charsetDecode($input,$_input_charset ,$_output_charset) {
+	$output = "";
+	if(!isset($_input_charset) )$_input_charset  = $_input_charset ;
+	if($_input_charset == $_output_charset || $input ==null ) {
+		$output = $input;
+	} elseif (function_exists("mb_convert_encoding")) {
+		$output = mb_convert_encoding($input,$_output_charset,$_input_charset);
+	} elseif(function_exists("iconv")) {
+		$output = iconv($_input_charset,$_output_charset,$input);
+	} else die("sorry, you have no libs support for charset changes.");
+	return $output;
+}
+?>

+ 40 - 0
protected/class/alipay/lib/alipay_md5.function.php

@@ -0,0 +1,40 @@
+<?php
+/* *
+ * MD5
+ * 详细:MD5加密
+ * 版本:3.3
+ * 日期:2012-07-19
+ * 说明:
+
+ */
+
+/**
+ * 签名字符串
+ * @param $prestr 需要签名的字符串
+ * @param $key 私钥
+ * return 签名结果
+ */
+function md5Sign($prestr, $key) {
+	$prestr = $prestr . $key;
+	return md5($prestr);
+}
+
+/**
+ * 验证签名
+ * @param $prestr 需要签名的字符串
+ * @param $sign 签名结果
+ * @param $key 私钥
+ * return 签名结果
+ */
+function md5Verify($prestr, $sign, $key) {
+	$prestr = $prestr . $key;
+	$mysgin = md5($prestr);
+
+	if($mysgin == $sign) {
+		return true;
+	}
+	else {
+		return false;
+	}
+}
+?>

+ 163 - 0
protected/class/alipay/lib/alipay_notify.class.php

@@ -0,0 +1,163 @@
+<?php
+/* *
+ * 类名:AlipayNotify
+ * 功能:支付宝通知处理类
+ * 详细:处理支付宝各接口通知返回
+ * 版本:3.2
+ * 日期:2011-03-25
+ * 说明:
+ * 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
+ * 该代码仅供学习和研究支付宝接口使用,只是提供一个参考
+
+ *************************注意*************************
+ * 调试通知返回时,可查看或改写log日志的写入TXT里的数据,来检查通知返回是否正常
+ */
+
+require_once(Doo::conf()->SITE_PATH."protected/class/alipay/lib/alipay_core.function.php");
+require_once(Doo::conf()->SITE_PATH."protected/class/alipay/lib/alipay_md5.function.php");
+
+class AlipayNotify {
+    /**
+     * HTTPS形式消息验证地址
+     */
+	var $https_verify_url = 'https://mapi.alipay.com/gateway.do?service=notify_verify&';
+	/**
+     * HTTP形式消息验证地址
+     */
+	var $http_verify_url = 'http://notify.alipay.com/trade/notify_query.do?';
+	var $alipay_config;
+
+	function __construct($alipay_config){
+		$this->alipay_config = $alipay_config;
+	}
+    function AlipayNotify($alipay_config) {
+    	$this->__construct($alipay_config);
+    }
+    /**
+     * 针对notify_url验证消息是否是支付宝发出的合法消息
+     * @return 验证结果
+     */
+	function verifyNotify(){
+		if(empty($_POST)) {//判断POST来的数组是否为空
+			return false;
+		}
+		else {
+			//生成签名结果
+			$isSign = $this->getSignVeryfy($_POST, $_POST["sign"]);
+			//获取支付宝远程服务器ATN结果(验证是否是支付宝发来的消息)
+			$responseTxt = 'true';
+			if (! empty($_POST["notify_id"])) {$responseTxt = $this->getResponse($_POST["notify_id"]);}
+			
+			//写日志记录
+			//if ($isSign) {
+			//	$isSignStr = 'true';
+			//}
+			//else {
+			//	$isSignStr = 'false';
+			//}
+			//$log_text = "responseTxt=".$responseTxt."\n notify_url_log:isSign=".$isSignStr.",";
+			//$log_text = $log_text.createLinkString($_POST);
+			//logResult($log_text);
+			
+			//验证
+			//$responsetTxt的结果不是true,与服务器设置问题、合作身份者ID、notify_id一分钟失效有关
+			//isSign的结果不是true,与安全校验码、请求时的参数格式(如:带自定义参数等)、编码格式有关
+			if (preg_match("/true$/i",$responseTxt) && $isSign) {
+				return true;
+			} else {
+				return false;
+			}
+		}
+	}
+	
+    /**
+     * 针对return_url验证消息是否是支付宝发出的合法消息
+     * @return 验证结果
+     */
+	function verifyReturn(){
+		if(empty($_GET)) {//判断POST来的数组是否为空
+			return false;
+		}
+		else {
+			//生成签名结果
+			$isSign = $this->getSignVeryfy($_GET, $_GET["sign"]);
+			//获取支付宝远程服务器ATN结果(验证是否是支付宝发来的消息)
+			$responseTxt = 'true';
+			if (! empty($_GET["notify_id"])) {$responseTxt = $this->getResponse($_GET["notify_id"]);}
+			
+			//写日志记录
+			//if ($isSign) {
+			//	$isSignStr = 'true';
+			//}
+			//else {
+			//	$isSignStr = 'false';
+			//}
+			//$log_text = "responseTxt=".$responseTxt."\n return_url_log:isSign=".$isSignStr.",";
+			//$log_text = $log_text.createLinkString($_GET);
+			//logResult($log_text);
+			
+			//验证
+			//$responsetTxt的结果不是true,与服务器设置问题、合作身份者ID、notify_id一分钟失效有关
+			//isSign的结果不是true,与安全校验码、请求时的参数格式(如:带自定义参数等)、编码格式有关
+			if (preg_match("/true$/i",$responseTxt) && $isSign) {
+				return true;
+			} else {
+				return false;
+			}
+		}
+	}
+	
+    /**
+     * 获取返回时的签名验证结果
+     * @param $para_temp 通知返回来的参数数组
+     * @param $sign 返回的签名结果
+     * @return 签名验证结果
+     */
+	function getSignVeryfy($para_temp, $sign) {
+		//除去待签名参数数组中的空值和签名参数
+		$para_filter = paraFilter($para_temp);
+		
+		//对待签名参数数组排序
+		$para_sort = argSort($para_filter);
+		
+		//把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串
+		$prestr = createLinkstring($para_sort);
+		
+		$isSgin = false;
+		switch (strtoupper(trim($this->alipay_config['sign_type']))) {
+			case "MD5" :
+				$isSgin = md5Verify($prestr, $sign, $this->alipay_config['key']);
+				break;
+			default :
+				$isSgin = false;
+		}
+		
+		return $isSgin;
+	}
+
+    /**
+     * 获取远程服务器ATN结果,验证返回URL
+     * @param $notify_id 通知校验ID
+     * @return 服务器ATN结果
+     * 验证结果集:
+     * invalid命令参数不对 出现这个错误,请检测返回处理中partner和key是否为空 
+     * true 返回正确信息
+     * false 请检查防火墙或者是服务器阻止端口问题以及验证时间是否超过一分钟
+     */
+	function getResponse($notify_id) {
+		$transport = strtolower(trim($this->alipay_config['transport']));
+		$partner = trim($this->alipay_config['partner']);
+		$veryfy_url = '';
+		if($transport == 'https') {
+			$veryfy_url = $this->https_verify_url;
+		}
+		else {
+			$veryfy_url = $this->http_verify_url;
+		}
+		$veryfy_url = $veryfy_url."partner=" . $partner . "&notify_id=" . $notify_id;
+		$responseTxt = getHttpResponseGET($veryfy_url, $this->alipay_config['cacert']);
+		
+		return $responseTxt;
+	}
+}
+?>

+ 163 - 0
protected/class/alipay/lib/alipay_submit.class.php

@@ -0,0 +1,163 @@
+<?php
+/* *
+ * 类名:AlipaySubmit
+ * 功能:支付宝各接口请求提交类
+ * 详细:构造支付宝各接口表单HTML文本,获取远程HTTP数据
+ * 版本:3.3
+ * 日期:2012-07-23
+
+ */
+require_once(Doo::conf()->SITE_PATH."protected/class/alipay/lib/alipay_core.function.php");
+require_once(Doo::conf()->SITE_PATH."protected/class/alipay/lib/alipay_md5.function.php");
+
+class AlipaySubmit {
+
+	var $alipay_config;
+	/**
+	 *支付宝网关地址(新)
+	 */
+	var $alipay_gateway_new = 'https://mapi.alipay.com/gateway.do?';
+
+	function __construct($alipay_config){
+		$this->alipay_config = $alipay_config;
+	}
+    function AlipaySubmit($alipay_config) {
+    	$this->__construct($alipay_config);
+    }
+	
+	/**
+	 * 生成签名结果
+	 * @param $para_sort 已排序要签名的数组
+	 * return 签名结果字符串
+	 */
+	function buildRequestMysign($para_sort) {
+		//把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串
+		$prestr = createLinkstring($para_sort);
+		
+		$mysign = "";
+		switch (strtoupper(trim($this->alipay_config['sign_type']))) {
+			case "MD5" :
+				$mysign = md5Sign($prestr, $this->alipay_config['key']);
+				break;
+			default :
+				$mysign = "";
+		}
+		
+		return $mysign;
+	}
+
+	/**
+     * 生成要请求给支付宝的参数数组
+     * @param $para_temp 请求前的参数数组
+     * @return 要请求的参数数组
+     */
+	function buildRequestPara($para_temp) {
+		//除去待签名参数数组中的空值和签名参数
+		$para_filter = paraFilter($para_temp);
+
+		//对待签名参数数组排序
+		$para_sort = argSort($para_filter);
+
+		//生成签名结果
+		$mysign = $this->buildRequestMysign($para_sort);
+		
+		//签名结果与签名方式加入请求提交参数组中
+		$para_sort['sign'] = $mysign;
+		$para_sort['sign_type'] = strtoupper(trim($this->alipay_config['sign_type']));
+		
+		return $para_sort;
+	}
+
+	/**
+     * 生成要请求给支付宝的参数数组
+     * @param $para_temp 请求前的参数数组
+     * @return 要请求的参数数组字符串
+     */
+	function buildRequestParaToString($para_temp) {
+		//待请求参数数组
+		$para = $this->buildRequestPara($para_temp);
+		
+		//把参数组中所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串,并对字符串做urlencode编码
+		$request_data = createLinkstringUrlencode($para);
+		
+		return $request_data;
+	}
+	
+    /**
+     * 建立请求,以表单HTML形式构造(默认)
+     * @param $para_temp 请求参数数组
+     * @param $method 提交方式。两个值可选:post、get
+     * @param $button_name 确认按钮显示文字
+     * @return 提交表单HTML文本
+     */
+	function buildRequestForm($para_temp, $method, $button_name) {
+		//待请求参数数组
+		$para = $this->buildRequestPara($para_temp);
+		
+		$sHtml = "<form id='alipaysubmit' name='alipaysubmit' action='".$this->alipay_gateway_new."_input_charset=".trim(strtolower($this->alipay_config['input_charset']))."' method='".$method."'>";
+		while (list ($key, $val) = each ($para)) {
+            $sHtml.= "<input type='hidden' name='".$key."' value='".$val."'/>";
+        }
+
+		//submit按钮控件请不要含有name属性
+        $sHtml = $sHtml."<input type='submit' value='".$button_name."'></form>";
+		
+		$sHtml = $sHtml."<script>document.forms['alipaysubmit'].submit();</script>";
+		
+		return $sHtml;
+	}
+	
+	/**
+     * 建立请求,以模拟远程HTTP的POST请求方式构造并获取支付宝的处理结果
+     * @param $para_temp 请求参数数组
+     * @return 支付宝处理结果
+     */
+	function buildRequestHttp($para_temp) {
+		$sResult = '';
+		
+		//待请求参数数组字符串
+		$request_data = $this->buildRequestPara($para_temp);
+
+		//远程获取数据
+		$sResult = getHttpResponsePOST($this->alipay_gateway_new, $this->alipay_config['cacert'],$request_data,trim(strtolower($this->alipay_config['input_charset'])));
+
+		return $sResult;
+	}
+	
+	/**
+     * 建立请求,以模拟远程HTTP的POST请求方式构造并获取支付宝的处理结果,带文件上传功能
+     * @param $para_temp 请求参数数组
+     * @param $file_para_name 文件类型的参数名
+     * @param $file_name 文件完整绝对路径
+     * @return 支付宝返回处理结果
+     */
+	function buildRequestHttpInFile($para_temp, $file_para_name, $file_name) {
+		
+		//待请求参数数组
+		$para = $this->buildRequestPara($para_temp);
+		$para[$file_para_name] = "@".$file_name;
+		
+		//远程获取数据
+		$sResult = getHttpResponsePOST($this->alipay_gateway_new, $this->alipay_config['cacert'],$para,trim(strtolower($this->alipay_config['input_charset'])));
+
+		return $sResult;
+	}
+	
+	/**
+     * 用于防钓鱼,调用接口query_timestamp来获取时间戳的处理函数
+	 * 注意:该功能PHP5环境及以上支持,因此必须服务器、本地电脑中装有支持DOMDocument、SSL的PHP配置环境。建议本地调试时使用PHP开发软件
+     * return 时间戳字符串
+	 */
+	function query_timestamp() {
+		$url = $this->alipay_gateway_new."service=query_timestamp&partner=".trim(strtolower($this->alipay_config['partner']))."&_input_charset=".trim(strtolower($this->alipay_config['input_charset']));
+		$encrypt_key = "";		
+
+		$doc = new DOMDocument();
+		$doc->load($url);
+		$itemEncrypt_key = $doc->getElementsByTagName( "encrypt_key" );
+		$encrypt_key = $itemEncrypt_key->item(0)->nodeValue;
+		
+		return $encrypt_key;
+	}
+}
+?>

+ 661 - 0
protected/class/client.php

@@ -0,0 +1,661 @@
+<?php
+
+class client {
+
+    private $ps_api_url, $ps_auth_key, $ps_vsersion;
+
+    /**
+     * 析构函数
+     * @param $ps_api_url 接口域名
+     * @param $ps_auth_key 加密密匙
+     */
+    public function __construct($ps_api_url = '127.0.0.1', $ps_auth_key = '', $ps_vsersion = '1') {
+        $this->ps_api_url = $ps_api_url;
+        $this->ps_auth_key = $ps_auth_key;
+        $this->ps_vsersion = $ps_vsersion;
+    }
+
+    /**
+     * 用户注册
+     * @param string $username 	用户名
+     * @param string $password 	密码
+     * @param string $email		email
+     * @param string $regip		注册ip
+     * @param string $random	密码随机数
+     * @return int {-1:用户名已经存在 ;-2:email已存在;-3:email格式错误;-4:用户名禁止注册;-5:邮箱禁止注册;int(uid):成功}
+     */
+    public function ps_member_register($username, $password, $email, $regip = '', $random = '') {
+        if (!$this->_is_email($email)) {
+            return -3;
+        }
+
+        return $this->_ps_send('register', array('username' => $username, 'password' => $password, 'email' => $email, 'regip' => $regip, 'random' => $random));
+    }
+
+    /**
+     * 用户登陆
+     * @param string $username 	用户名
+     * @param string $password 	密码
+     * @param int $isemail	email
+     * @return int {-2;密码错误;-1:用户名不存在;array(userinfo):用户信息}
+     */
+    public function zhsso_member_login($username, $password, $isemail = 0) {
+        if ($isemail == 1) {
+            if (!$this->_is_email($username)) {
+                return -3;
+            }
+            $return = $this->_ps_send('login', array('email' => $username, 'userpasswd' => $password));
+        } else if($isemail == 2 ) {
+            if (!$this->_is_mobile($username)) {
+                return -3;
+            }
+            $return = $this->_ps_send('login', array('mobile' => $username, 'userpasswd' => $password));
+        } else {
+
+            $return = $this->_ps_send('login', array('username' => $username, 'userpasswd' => $password));
+        }
+        return $return;
+    }
+
+    /**
+     * 获取用户信息通过COOKIE UID
+     */
+    public function zhsso_getuserinfo_by_uid($uid=0) {
+
+        return $this->_ps_send('getuserinfo', array('uid' => $uid));
+    }
+
+    public function zhsso_checkauth($auth="") {
+
+        return $this->_ps_send('checkauth', array('auth' => $auth));
+    }
+
+
+    /**
+     * 同步登陆
+     * @param string $uid
+     * @return string javascript用户同步登陆js
+     */
+    public function ps_member_synlogin($uid) {
+        $uid = intval($uid);
+        return $this->_ps_send('synlogin', array('uid' => $uid));
+    }
+
+    /**
+     * 同步退出
+     * @param string $uid
+     * @return string javascript用户同步退出js
+     */
+    public function ps_member_synlogout() {
+        return $this->_ps_send('synlogout', array());
+    }
+
+    /**
+     * 编辑用户
+     * @param string $username		用户名
+     * @param string $email			email
+     * @param string $password		旧密码
+     * @param string $newpassword	新密码
+     * @param int $uid				phpsso用户uid
+     * @param string $random	 	密码随机数
+     * @return int {-1:用户不存在;-2:旧密码错误;-3:email已经存在 ;-4:email格式错误;1:成功;0:未作修改}
+     */
+    public function zhsso_member_edit($uid = '', $password = '', $newpassword = '', $useranswer = '') {
+///	if ($email && !$this->_is_email($email)) {
+//	    return -4;
+//	}
+        // TODO:增加判断输出返回值
+        return $this->_ps_send('edit', array('uid' => $uid, 'password' => $password, 'newpassword' => $newpassword, 'useranswer' => $useranswer));
+    }
+
+    public function setPayWay($uid, $idcards, $alipay, $tenpay) {
+        return $this->_ps_send('payway', array('uid' => $uid, 'idbank' => $idcards, 'alipay' => $alipay, 'tenpay' => $tenpay));
+    }
+
+    /**
+     * 删除用户头像
+     * @param int $uid				phpsso用户uid
+     * @return int {1:成功;0:失败}
+     */
+    public function ps_deleteavatar($uid) {
+        return $this->_ps_send('deleteavatar', array('uid' => $uid));
+    }
+
+    /**
+     * 获取用户信息
+     * @param $mix 用户id/用户名/email
+     * @param $type {1:用户id;2:用户名;3:email}
+     * @return $mix {-1:用户不存在;userinfo:用户信息}
+     */
+    public function ps_get_member_info($mix, $type = 1) {
+        if ($type == 1) {
+            $userinfo = $this->_ps_send('getuserinfo', array('uid' => $mix));
+        } elseif ($type == 2) {
+            $userinfo = $this->_ps_send('getuserinfo', array('username' => $mix));
+        } elseif ($type == 3) {
+            if (!$this->_is_email($mix)) {
+                return -4;
+            }
+            $userinfo = $this->_ps_send('getuserinfo', array('email' => $mix));
+        }
+        if ($userinfo) {
+            return $userinfo;
+        } else {
+            return -1;
+        }
+    }
+
+    function url_exists($url) {
+        $h = get_headers($url);
+        if (!$h || !isset($h[0]))
+            return false;
+        $status = $h[0];
+        return preg_match("/.*200\s{1}OK/i", $status) ? true : false;
+    }
+
+    /**
+     * 删除用户
+     * @param mix {1:用户id;2:用户名;3:email} 如果是用户id可以为数组
+     * @return int {-1:用户不存在;1:删除成功}
+     */
+    public function ps_delete_member($mix, $type = 1) {
+        if ($type == 1) {
+            $res = $this->_ps_send('delete', array('uid' => $mix));
+        } elseif ($type == 2) {
+            $res = $this->_ps_send('delete', array('username' => $mix));
+        } elseif ($type == 3) {
+            if (!$this->_is_email($mix)) {
+                return -4;
+            }
+            $res = $this->_ps_send('delete', array('email' => $mix));
+        }
+        return $res;
+    }
+
+    /**
+     * 检查用户是否可以注册
+     * @param string $username
+     * @return int {-4:用户名禁止注册;-1:用户名已经存在 ;1:成功}
+     */
+    public function ps_checkname($username) {
+        return $this->_ps_send('checkname', array('username' => $username));
+    }
+
+    /**
+     * 检查邮箱是否可以注册
+     * @param string $email
+     * @return int {-1:email已经存在 ;-5:邮箱禁止注册;1:成功}
+     */
+    public function ps_checkemail($email) {
+        return $this->_ps_send('checkemail', array('email' => $email));
+    }
+
+    /**
+     * 获取应用列表信息
+     */
+    public function zhsso_getuserinfo() {
+        $uid = $this->authcode($_COOKIE[Doo::conf()->COOKIEPRE_WK . '_userid']);
+        return $this->_ps_send('getuserinfo', array('uid' => $uid));
+    }
+
+    /**
+     * 获取积分兑换比例列表
+     */
+    public function ps_getcreditlist() {
+        return $this->_ps_send('getcredit', array());
+    }
+
+    /**
+     * 兑换积分
+     * 用于何其他应用之间积分兑换
+     * @param int $uid			phpssouid
+     * @param int $from			本系统积分类型id
+     * @param int $toappid 		目标系统应用appid
+     * @param int $to			目标系统积分类型id
+     * @param int $credit		本系统扣除积分数
+     * @return bool 			{1:成功;0:失败}
+     */
+    public function ps_changecredit($uid, $from, $toappid, $to, $credit) {
+        return $this->_ps_send('changecredit', array('uid' => $uid, 'from' => $from, 'toappid' => $toappid, 'to' => $to, 'credit' => $credit));
+    }
+
+    /**
+     * 根据phpsso uid获取头像url
+     * @param int $uid 用户id
+     * @return array 四个尺寸用户头像数组
+     */
+    public function ps_getavatar($uid) {
+        $dir1 = ceil($uid / 10000);
+        $dir2 = ceil($uid % 10000 / 1000);
+        $url = $this->ps_api_url . 'data/avatar/' . $dir1 . '/' . $dir2 . '/' . $uid . '/';
+        $avatar = array('180' => $url . '180x180.jpg', '90' => $url . '90x90.jpg', '45' => $url . '45x45.jpg', '30' => $url . '30x30.jpg');
+        return $avatar;
+    }
+
+    /**
+     * 获取上传头像flash的html代码
+     * @param int $uid 用户id
+     */
+    public function ps_getavatar_upload_html($uid) {
+        $auth_data = $this->authcode($uid, 'ENCODE');
+//	echo $auth_data;
+//	list($a, $encodestr) = explode('=', $auth_data);
+        $upurl = base64_encode($this->ps_api_url . 'api/uploadavatar/' . rawurlencode($auth_data));
+//	$upurl = base64_encode($this->ps_api_url . '/index.php?m=phpsso&c=index&a=uploadavatar&auth_data=' . $auth_data);
+        $str = <<<EOF
+				<div id="phpsso_uploadavatar_flash"></div>
+				<script language="javascript" type="text/javascript" src="{$this->ps_api_url}global/v1/js/swfobject.js"></script>
+				<script type="text/javascript">
+					var flashvars = {
+						'upurl':"{$upurl}&callback=return_avatar&"
+					};
+					var params = {
+						'align':'middle',
+						'play':'true',
+						'loop':'false',
+						'scale':'showall',
+						'wmode':'window',
+						'devicefont':'true',
+						'id':'Main',
+						'bgcolor':'#ffffff',
+						'name':'Main',
+						'allowscriptaccess':'always'
+					};
+					var attributes = {
+
+					};
+					swfobject.embedSWF("{$this->ps_api_url}global/v1/swf/main.swf", "phpsso_uploadavatar_flash", "490", "434", "9.0.0","{$this->ps_api_url}global/v1/swf/expressInstall.swf", flashvars, params, attributes);
+
+					function return_avatar(data) {
+						if(data == 1) {
+							window.location.reload();
+						}
+					}
+				</script>
+EOF;
+        return $str;
+    }
+
+    /**
+     * 字符串加密、解密函数
+     *
+     *
+     * @param	string	$txt		字符串
+     * @param	string	$operation	ENCODE为加密,DECODE为解密,可选参数,默认为ENCODE,
+     * @param	string	$key		密钥:数字、字母、下划线
+     * @param	string	$expiry		过期时间
+     * @return	string
+     */
+    function sys_auth($string, $operation = 'ENCODE', $key = '', $expiry = 0) {
+        $key_length = 4;
+        $key = md5($key != '' ? $key : $this->ps_auth_key);
+        $fixedkey = hash('md5', $key);
+        $egiskeys = md5(substr($fixedkey, 16, 16));
+        $runtokey = $key_length ? ($operation == 'ENCODE' ? substr(hash('md5', microtime(true)), -$key_length) : substr($string, 0, $key_length)) : '';
+        $keys = hash('md5', substr($runtokey, 0, 16) . substr($fixedkey, 0, 16) . substr($runtokey, 16) . substr($fixedkey, 16));
+        $string = $operation == 'ENCODE' ? sprintf('%010d', $expiry ? $expiry + time() : 0) . substr(md5($string . $egiskeys), 0, 16) . $string : base64_decode(substr($string, $key_length));
+
+        $i = 0;
+        $result = '';
+        $string_length = strlen($string);
+        for ($i = 0; $i < $string_length; $i++) {
+            $result .= chr(ord($string{$i}) ^ ord($keys{$i % 32}));
+        }
+        if ($operation == 'ENCODE') {
+            return $runtokey . str_replace('=', '', base64_encode($result));
+        } else {
+            if ((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26) . $egiskeys), 0, 16)) {
+                return substr($result, 26);
+            } else {
+                return '';
+            }
+        }
+    }
+
+    /**
+     * 获取应用列表信息
+     */
+    public function zhsso_getUserbyName($uname) {
+        return $this->_ps_send('getuserinfo', array('username' => $uname));
+    }
+
+    /**
+     * 将数组转换为字符串
+     *
+     * @param	array	$data		数组
+     * @param	bool	$isformdata	如果为0,则不使用new_stripslashes处理,可选参数,默认为1
+     * @return	string	返回字符串,如果,data为空,则返回空
+     */
+    public function array2string($data, $isformdata = 1) {
+        if ($data == '')
+            return '';
+        if ($isformdata)
+            $data = new_stripslashes($data);
+        return var_export($data, TRUE);
+    }
+
+    public function auth_data($data) {
+        $s = $sep = '';
+//	foreach ($data as $k => $v) {
+//	    if (is_array($v)) {
+//		$s2 = $sep2 = '';
+//		foreach ($v as $k2 => $v2) {
+//		    $s2 .= "$sep2{$k}[$k2]=" . $this->_ps_stripslashes($v2);
+//		    $sep2 = '&';
+//		}
+//		$s .= $sep . $s2;
+//	    } else {
+//		$s .= "$sep$k=" . $this->_ps_stripslashes($v);
+//	    }
+//	    $sep = '&';
+//	}
+        $s = http_build_query($data);
+        $auth_s = 'data=' . urlencode($this->authcode($s, 'ENCODE'));
+        return $auth_s;
+    }
+
+    /**
+     * 发送数据
+     * @param $action 操作
+     * @param $data 数据
+     */
+    private function _ps_send($action, $data = null) {
+
+        return $this->_ps_post($this->ps_api_url . "api/" . $action, 500000, $this->auth_data($data));
+    }
+
+    /**
+     *  post数据
+     *  @param string $url		post的url
+     *  @param int $limit		返回的数据的长度
+     *  @param string $post		post数据,字符串形式username='dalarge'&password='123456'
+     *  @param string $cookie	模拟 cookie,字符串形式username='dalarge'&password='123456'
+     *  @param string $ip		ip地址
+     *  @param int $timeout		连接超时时间
+     *  @param bool $block		是否为阻塞模式
+     *  @return string			返回字符串
+     */
+    private function _ps_post($url, $limit = 0, $post = '', $cookie = '', $ip = '', $timeout = 15, $block = true) {
+        $return = '';
+        $matches = parse_url($url);
+        $host = $matches['host'];
+//	$path = $matches['path'] ? $matches['path'] . ($matches['query'] ? '?' . $matches['query'] : '') : '/';
+        $path = $matches['path'] ? $matches['path'] : '/';
+        $port = !empty($matches['port']) ? $matches['port'] : 80;
+        $siteurl = $this->_get_url();
+        if ($post) {
+            $out = "POST $path HTTP/1.1\r\n";
+            $out .= "Accept: */*\r\n";
+            $out .= "Referer: " . $siteurl . "\r\n";
+            $out .= "Accept-Language: zh-cn\r\n";
+            $out .= "Content-Type: application/x-www-form-urlencoded\r\n";
+            $out .= "User-Agent: $_SERVER[HTTP_USER_AGENT]\r\n";
+            $out .= "Host: $host\r\n";
+            $out .= 'Content-Length: ' . strlen($post) . "\r\n";
+            $out .= "Connection: Close\r\n";
+            $out .= "Cache-Control: no-cache\r\n";
+            $out .= "Cookie: $cookie\r\n\r\n";
+            $out .= $post;
+        } else {
+            $out = "GET $path HTTP/1.1\r\n";
+            $out .= "Accept: */*\r\n";
+            $out .= "Referer: " . $siteurl . "\r\n";
+            $out .= "Accept-Language: zh-cn\r\n";
+            $out .= "User-Agent: $_SERVER[HTTP_USER_AGENT]\r\n";
+            $out .= "Host: $host\r\n";
+            $out .= "Connection: Close\r\n";
+            $out .= "Cookie: $cookie\r\n\r\n";
+        }
+        $fp = @fsockopen(($ip ? $ip : $host), $port, $errno, $errstr, $timeout);
+        if (!$fp)
+            return '';
+
+        stream_set_blocking($fp, $block);
+        stream_set_timeout($fp, $timeout);
+        @fwrite($fp, $out);
+        $status = stream_get_meta_data($fp);
+
+        if ($status['timed_out'])
+            return '';
+        while (!feof($fp)) {
+            if (($header = @fgets($fp)) && ($header == "\r\n" || $header == "\n"))
+                break;
+        }
+
+        $stop = false;
+        while (!feof($fp) && !$stop) {
+            $data = fread($fp, ($limit == 0 || $limit > 8192 ? 8192 : $limit));
+            $return .= $data;
+            if ($limit) {
+                $limit -= strlen($data);
+                $stop = $limit <= 0;
+            }
+        }
+        @fclose($fp);
+
+        //部分虚拟主机返回数值有误,暂不确定原因,过滤返回数据格式
+        $return_arr = explode("\n", $return);
+        if (isset($return_arr[1])) {
+            $return = trim($return_arr[1]);
+        }
+        unset($return_arr);
+
+        return $return;
+    }
+
+    /**
+     * 过滤字符串
+     * @param $string
+     */
+    private function _ps_stripslashes($string) {
+        !defined('MAGIC_QUOTES_GPC') && define('MAGIC_QUOTES_GPC', get_magic_quotes_gpc());
+        if (MAGIC_QUOTES_GPC) {
+            return stripslashes($string);
+        } else {
+            return $string;
+        }
+    }
+
+    /**
+     * 获取当前页面完整URL地址
+     */
+    private function _get_url() {
+        $sys_protocal = isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == '443' ? 'https://' : 'http://';
+        $php_self = $_SERVER['PHP_SELF'] ? $this->_safe_replace($_SERVER['PHP_SELF']) : $this->_safe_replace($_SERVER['SCRIPT_NAME']);
+        $path_info = isset($_SERVER['PATH_INFO']) ? $this->_safe_replace($_SERVER['PATH_INFO']) : '';
+        $relate_url = isset($_SERVER['REQUEST_URI']) ? $this->_safe_replace($_SERVER['REQUEST_URI']) : $php_self . (isset($_SERVER['QUERY_STRING']) ? '?' . $this->_safe_replace($_SERVER['QUERY_STRING']) : $path_info);
+        return $sys_protocal . (isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : '') . $relate_url;
+    }
+
+    /**
+     * 安全过滤函数
+     *
+     * @param $string
+     * @return string
+     */
+    private function _safe_replace($string) {
+        $string = str_replace('%20', '', $string);
+        $string = str_replace('%27', '', $string);
+        $string = str_replace('%2527', '', $string);
+        $string = str_replace('*', '', $string);
+        $string = str_replace('"', '&quot;', $string);
+        $string = str_replace("'", '', $string);
+        $string = str_replace('"', '', $string);
+        $string = str_replace(';', '', $string);
+        $string = str_replace('<', '&lt;', $string);
+        $string = str_replace('>', '&gt;', $string);
+        $string = str_replace("{", '', $string);
+        $string = str_replace('}', '', $string);
+        $string = str_replace('\\', '', $string);
+        return $string;
+    }
+
+    /**
+     * 金额增加
+     * @param string $userid 	用户唯一标示符
+     * @param string $m 	操作金额
+     * @param int $appid	应用程序ID,标示操作来源{wenku,ask}
+     * @return int {0;金额增加失败;1:金额增加成功;}
+     */
+    public function zhsso_member_madd($userid, $m, $appid) {
+        if (empty($userid) || empty($m) || empty($appid))
+            return false;
+        return $this->_ps_send('madd', array('uid' => $userid, 'bank' => $m, 'appid' => $appid));
+    }
+
+    /**
+     * 获取充值订单数据
+     * @param unknown_type $userid
+     */
+    public function getPayOrder($userid) {
+        if (empty($userid))
+            return false;
+        return $this->_ps_send('getPayOrder', array('uid' => $userid));
+    }
+
+    /**
+     * 金额减少
+     * @param string $userid 	用户唯一标示符
+     * @param string $m 	操作金额
+     * @param int $appid	应用程序ID,标示操作来源{wenku,ask}
+     * @return int {-1;金额不够减;0;金额减少失败;1:金额减少成功;}
+     */
+    public function zhsso_member_msub($userid, $m, $appid) {
+        if (empty($userid) || empty($m) || empty($appid))
+            return false;
+        return $this->_ps_send('msub', array('uid' => $userid, 'bank' => $m, 'appid' => $appid));
+    }
+
+    /**
+     * 判断email格式是否正确
+     * @param $string email
+     */
+    private function _is_email($email) {
+        return strlen($email) > 6 && preg_match("/^[\w\-\.]+@[\w\-\.]+(\.\w+)+$/", $email);
+    }
+
+    /**
+     * 判断手机格式是否正确
+     * @param $string email
+     */
+    private function _is_mobile($mobile) {
+        if(preg_match("/^1[34578]{1}\d{9}$/",$mobile)){
+            return TRUE;
+        } else {
+            return FALSE;
+        }
+    }
+
+    /**
+     * 判断email格式是否正确
+     * @param $string email
+     */
+    public function getUserName() {
+        $username = self::get_cookie('_username');
+        if ($username) {
+            return $username;
+        } else {
+            return FALSE;
+        }
+    }
+
+    /**
+     * 判断email格式是否正确
+     * @param $string email
+     */
+    public function getAuth() {
+        $auth = self::get_cookie('auth');
+        if ($auth) {
+            return $auth;
+        } else {
+            return FALSE;
+        }
+    }
+
+    /**
+     * 判断email格式是否正确
+     * @param $string email
+     */
+    public function getUserID() {
+        $userid = self::get_cookie('_userid');
+        if ($userid) {
+            return $userid;
+        } else {
+            return FALSE;
+        }
+    }
+
+    public function get_cookie($var, $default = '') {
+
+        $varvar = COOKIEPRE_WD . $var;
+
+        return isset($_COOKIE[$varvar]) ? $this->authcode($_COOKIE[$varvar]) : $default;
+    }
+
+    /**
+     *
+     * 网络传输、cookie加密函数
+     * @param type $string
+     * @param type $operation
+     * @param type $key
+     * @param type $expiry
+     * @return string
+     */
+    function authcode($string, $operation = 'DECODE', $key = '', $expiry = 0) {
+        $ckey_length = 4;
+        $key = md5($key != '' ? $key : AUTHKEY);
+        $keya = md5(substr($key, 0, 16));
+        $keyb = md5(substr($key, 16, 16));
+        $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length) : substr(md5(microtime()), -$ckey_length)) : '';
+
+        $cryptkey = $keya . md5($keya . $keyc);
+        $key_length = strlen($cryptkey);
+
+        $string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) : sprintf('%010d', $expiry ? $expiry + time() : 0) . substr(md5($string . $keyb), 0, 16) . $string;
+        $string_length = strlen($string);
+
+        $result = '';
+        $box = range(0, 255);
+
+        $rndkey = array();
+        for ($i = 0; $i <= 255; $i++) {
+            $rndkey[$i] = ord($cryptkey[$i % $key_length]);
+        }
+
+        for ($j = $i = 0; $i < 256; $i++) {
+            $j = ($j + $box[$i] + $rndkey[$i]) % 256;
+            $tmp = $box[$i];
+            $box[$i] = $box[$j];
+            $box[$j] = $tmp;
+        }
+
+        for ($a = $j = $i = 0; $i < $string_length; $i++) {
+            $a = ($a + 1) % 256;
+            $j = ($j + $box[$a]) % 256;
+            $tmp = $box[$a];
+            $box[$a] = $box[$j];
+            $box[$j] = $tmp;
+            $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
+        }
+
+        if ($operation == 'DECODE') {
+            if ((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26) . $keyb), 0, 16)) {
+                return substr($result, 26);
+            } else {
+                return '';
+            }
+        } else {
+            return $keyc . str_replace('=', '', base64_encode($result));
+        }
+    }
+
+    public function logoutz() {
+//	header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');
+        setcookie(Doo::conf()->COOKIEPRE_WK . 'auth', '', 0, '/', 'localhost', 0);
+        setcookie(Doo::conf()->COOKIEPRE_WK . '_username', '', 0, '/', 'localhost', 0);
+        setcookie(Doo::conf()->COOKIEPRE_WK . '_userid', '', 0, '/', 'localhost', 0);
+    }
+
+}
+
+?>

+ 473 - 0
protected/class/video.php

@@ -0,0 +1,473 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: ellisran
+ * Date: 2016/9/21
+ * Time: 14:41
+ */
+class video {
+    private $AppKey = 'f277356253794d16bbef1f2107c3e84e';        //开发者平台分配的AppKey
+    private $AppSecret = 'dbb0e89f0e9943b5b7e837731a8deacd';     //开发者平台分配的AppSecret,可刷新
+    private $Nonce;         //随机数(最大长度128个字符)
+    private $CurTime;       //当前UTC时间戳,从1970年1月1日0点0 分0 秒开始到现在的秒数(String)
+    private $CheckSum;      //SHA1(AppSecret + Nonce + CurTime),三个参数拼接的字符串,进行SHA1哈希计算,转化成16进制字符(String,小写)
+    const   HEX_DIGITS = "0123456789abcdef";
+    private $baseUrl = 'https://vcloud.163.com';    //网易上传地址
+
+    /**
+     * 析构函数
+     * @param $AppKey 网易视频云提供的key
+     * @param $AppSecret 网易视频云提供的AppSecret
+     */
+    function __construct() {
+
+    }
+
+//    function __construct($AppKey,$AppSecret) {
+//        $this->AppKey    = $AppKey;
+//        $this->AppSecret = $AppSecret;
+//    }
+
+    /**
+     *  生成验证码
+     */
+    public function checkSumBuilder(){
+        //此部分生成随机字符串
+        $hex_digits = self::HEX_DIGITS;
+        $this->Nonce;
+        for($i=0;$i<128;$i++){           //随机字符串最大128个字符,也可以小于该数
+            $this->Nonce.= $hex_digits[rand(0,15)];
+        }
+        $this->CurTime = (string)(time());   //当前时间戳,以秒为单位
+
+        $join_string = $this->AppSecret.$this->Nonce.$this->CurTime;
+        $this->CheckSum = sha1($join_string);
+
+    }
+
+    /**
+     *  post 获取网易视频云接口信息
+     *  获取上传加速节点、文件数据上传、断点续传查询断点三个接口,不使用本方法。
+     */
+    public function postDataCurl($url,$data=array()){
+        $this->checkSumBuilder();        //发送请求前需先生成checkSum
+        if(!empty($data)){
+            $json=json_encode($data);
+        }else{
+            $json="";
+        }
+        $timeout = 5000;
+        $http_header = array(
+            'AppKey:'.$this->AppKey,
+            'Nonce:'.$this->Nonce,
+            'CurTime:'.$this->CurTime,
+            'CheckSum:'.$this->CheckSum,
+            'Content-Type: application/json;charset=utf-8;',
+            'Content-Length: ' . strlen($json)
+        );
+        $ch = curl_init();
+        curl_setopt ($ch, CURLOPT_URL, $url);
+        curl_setopt ($ch, CURLOPT_POST, 1);
+        curl_setopt ($ch, CURLOPT_POSTFIELDS, $json);
+        curl_setopt ($ch, CURLOPT_HEADER, false);
+        curl_setopt ($ch, CURLOPT_HTTPHEADER,$http_header);
+        curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER,false);
+        curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
+        curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
+
+        $result = curl_exec($ch);
+        if (false === $result) {
+            $result =  curl_errno($ch);
+        }
+        curl_close($ch);
+        return json_decode($result,true) ;
+    }
+
+    //start 视频分类管理
+
+    /**
+     *  获取视频分类列表信息
+     * @currentPage   获取视频分类列表分页后的索引
+     * @pageSize      获取视频分类列表一页的记录数(若为-1,表示不用分页)
+     */
+    public function videoTypeList($currentPage, $pageSize){
+        $url = $this->baseUrl.'/app/vod/type/list';
+        return $this->postDataCurl($url,array('currentPage' => $currentPage, 'pageSize' => $pageSize));
+    }
+
+    /**
+     *  创建视频分类
+     * @typeName      视频分类的名称
+     * @description   视频分类的描述信息
+     */
+    public function videoTypeCreate($typeName, $description = ''){
+        $url = $this->baseUrl.'/app/vod/type/create';
+        if($description != ''){
+            return $this->postDataCurl($url,array('typeName' => $typeName, 'description' => $description));
+        }else{
+            return $this->postDataCurl($url,array('typeName' => $typeName));
+        }
+    }
+
+    /**
+     *  获取视频分类信息
+     * @typeId   视频分类的Id
+     */
+    public function videoTypeGet($typeId){
+        $url = $this->baseUrl.'/app/vod/type/get';
+        return $this->postDataCurl($url,array('typeId' => $typeId));
+    }
+
+    /**
+     *  修改视频分类信息
+     * @typeId        视频分类的Id
+     * @typeName      视频分类的名称
+     * @description   视频分类的描述信息
+     */
+    public function videoTypeUpdate($typeId, $typeName, $description = ''){
+        $url = $this->baseUrl.'/app/vod/type/update';
+        if($description != ''){
+            return $this->postDataCurl($url,array('typeId' => $typeId, 'typeName' => $typeName, 'description' => $description));
+        }else{
+            return $this->postDataCurl($url,array('typeId' => $typeId, 'typeName' => $typeName));
+        }
+    }
+
+    /**
+     *  删除视频分类
+     * @typeId        视频分类的Id
+     */
+    public function videoTypeDelete($typeId){
+        $url = $this->baseUrl.'/app/vod/type/typeDelete';
+        return $this->postDataCurl($url,array('typeId' => $typeId));
+    }
+
+    //end 视频分类管理
+
+
+    //start 视频管理
+
+    /**
+     *  获取视频文件信息
+     * @vid   视频Id
+     */
+    public function videoGet($vid){
+        $url = $this->baseUrl.'/app/vod/video/get';
+        return $this->postDataCurl($url,array('vid' => $vid));
+    }
+
+    /**
+     *  获取视频文件信息列表
+     * @currentPage     获取视频列表分页后的索引
+     * @pageSize        获取视频列表一页的记录数(若为-1,表示不用分页)
+     * @statys          根据视频状态过滤选择(0表示获取所有状态视频,10表示初始,20表示失败,30表示处理中,40表示成功,50表示屏蔽)
+     * @typeId          根据视频分类过滤选择(0表示获取所有分类视频)
+     */
+    public function videoList($currentPage, $pageSize, $status, $type){
+        $url = $this->baseUrl.'/app/vod/video/list';
+        return $this->postDataCurl($url,array('currentPage' => $currentPage, 'pageSize' => $pageSize, 'status' => $status, 'type' => $type));
+    }
+
+    /**
+     *  修改视频文件信息
+     * @vid             视频Id
+     * @videoName       视频的名称
+     * @typeId          视频分类Id
+     * @description     视频的描述信息
+     */
+    public function videoEdit($vid, $videoName, $typeId, $description = ''){
+        $url = $this->baseUrl.'/app/vod/video/edit';
+        if($description != ''){
+            return $this->postDataCurl($url,array('vid' => $vid, 'videoName' => $videoName, 'typeId' => $typeId, 'description' => $description));
+        }else{
+            return $this->postDataCurl($url,array('vid' => $vid, 'videoName' => $videoName, 'typeId' => $typeId));
+        }
+    }
+
+    /**
+     *  删除视频文件
+     * @vid             视频Id
+     */
+    public function videoDetele($vid){
+        $url = $this->baseUrl.'/app/vod/video/videoDelete';
+        return $this->postDataCurl($url,array('vid' => $vid));
+    }
+
+    //end 视频管理
+
+
+    //start 视频上传管理
+
+/**
+* 检测文件编码
+* @param string $file 文件路径
+* @return string|null 返回 编码名 或 null
+*/
+    function detect_encoding($file) {
+        $list = array('GBK', 'UTF-8', 'UTF-16LE', 'UTF-16BE', 'ISO-8859-1');
+        $str = file_get_contents($file);
+        foreach ($list as $item) {
+            $tmp = mb_convert_encoding($str, $item, $item);
+            if (md5($tmp) == md5($str)) {
+                return $item;
+            }
+        }
+        return null;
+    }
+
+    /**
+     *  get curl 方法
+     *  断点续传查询断点,获取上传加速节点地址   使用本方法
+     */
+    public function GetUrlMsg($url, $xNosToken = ''){
+        $ch = curl_init();
+        curl_setopt ($ch, CURLOPT_URL, $url);
+        if($xNosToken != ''){
+            $header = array(
+                'x-nos-token:'. $xNosToken
+            );
+            curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
+        }
+        curl_setopt ($ch, CURLOPT_HEADER, false);
+        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
+
+        $result = curl_exec($ch);
+        if (false === $result) {
+            $result =  curl_errno($ch);
+        }
+        curl_close($ch);
+        return json_decode($result,true);
+    }
+
+    /**
+     *  上传视频初始化
+     * @originFileName    上传文件的原始名称(包含后缀名)(必填)
+     * @userFileName      用户命名的上传文件名称
+     * @typeId            视频所属的类别Id(不填写为默认分类)
+     */
+    public function videoInit($oname, $uname = '', $type = ''){
+        $url = $this->baseUrl.'/app/vod/upload/init';
+        return $this->postDataCurl($url,array('originFileName' => $oname, 'userFileName' => $uname, 'typeId' => $type));
+    }
+
+    /**
+     *  获取上传加速节点地址
+     * @version         API版本号,填写固定值1.0
+     * @bucketname      存储上传文件的桶名,可在视频上传初始化接口的返回参数bucket获取
+     */
+    public function videoLbsGet($bucketname){
+        $url = 'http://wanproxy.127.net/lbs?version=1.0&bucketname='.$bucketname;
+        return $this->GetUrlMsg($url);
+    }
+
+    /**
+     *  上传视频
+     *  @url        上传地址格式:POST {UploadHost}/{bucket}/{object}?offset=0&complete=false&version=1.0
+                        {UploadHost}值为获取的上传加速节点地址,{bucket}值为存储对象的桶名,{object}值为生成的唯一对象名。
+     *  @file       服务器缓存文件
+     *
+     * 请求参数
+     * @x-nos-token   请求头参数,上传token
+     * @bucket        存储对象的桶名
+     * @object        生成的唯一对象名
+     * @offset        当前分片在整个对象中的起始偏移量,单位:字节(Byte)
+     * @complete      是否为最后一块数据。合法值:true/false
+     * @version       http api版本号。这里是固定值1.0
+     * @context       上传上下文。本字段是只能被上传服务器解读使用的不透明字段,
+                        上传端不应修改其内容。
+                        注意:用户第一次上传应不带此参数或置为空字符串,
+                        之后上传剩余部分数据都需要带上这个参数。
+                        context对应的桶名或者对象名不匹配返回400 code
+     *
+     * 响应参数(返回结果)
+     * @requestId       uuid字符串,服务器端生成的唯一UUID
+     * @offset          下一个上传片在上传块中的偏移。
+                          注意:偏移从0开始,比如:用户上传0-128字节后,
+                          服务器返回的offset为128,下一次上传offset值应置为128
+     * @context         上传上下文
+     * @callbackRetMsg  上传回调信息
+     */
+    public function videoUpload($url,$token,$file){
+//        return $this->sendStreamFile($url,$token,$file);
+//        if(file_exists($file)){
+//            $filesize=filesize($file);
+//            $handle  =  fopen ($file ,  "rb" );
+//            $contents  =  fread ( $handle , $filesize);
+////            var_dump($this->detect_encoding($file));
+////            $contents = mb_convert_encoding($contents ,'utf-8', 'ISO-8859-1');
+//            fclose ( $handle );
+//            x-www-form-urlencoded
+//            $header = array(
+//                'Content-Type:application/json;charset=utf-8',
+//                'Content-Length:'.strlen($file),
+//                'x-nos-token:'.$token,
+//                'Content-MD5:'.md5($file)
+////                'Access-Control-Allow-Origin: *'
+//            );
+            $headers = array('x-nos-token' => $token,'Content-type'=>'application/json;charset=UTF-8');
+            $t1 = microtime(true);
+            $ch = curl_init();
+            $options = array(
+                CURLOPT_RETURNTRANSFER => true,
+                CURLOPT_SSL_VERIFYPEER => false,
+                CURLOPT_SSL_VERIFYHOST => false,
+                CURLOPT_HEADER => true,
+                CURLOPT_NOBODY => false,
+                CURLOPT_CUSTOMREQUEST => 'POST',
+                CURLOPT_URL => $url
+            );
+
+//            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
+//            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
+//            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
+//            curl_setopt($ch, CURLOPT_HEADER, true);
+//            curl_setopt($ch, CURLOPT_NOBODY, false);
+//            curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
+//            curl_setopt($ch, CURLOPT_URL, $url);
+
+            // Handle open_basedir & safe mode
+            if (!ini_get('safe_mode') && !ini_get('open_basedir')) {
+                $options[CURLOPT_FOLLOWLOCATION] = true;
+            }
+            $header = array();
+            foreach ($headers as $key => $val) {
+                array_push($header, "$key: $val");
+            }
+            $options[CURLOPT_HTTPHEADER] = $header;
+            curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:'));
+            $options[CURLOPT_POSTFIELDS] = $file;
+            curl_setopt_array($ch, $options);
+//            curl_setopt($ch, CURLOPT_POSTFIELDS, $file);
+            // curl_getinfo($ch);
+            $return_data = curl_exec($ch);
+//            curl_close($ch);
+            $t2 = microtime(true);
+            $duration = round($t2-$t1, 3);
+            $ret = curl_errno($ch);
+            if ($ret !== 0) {
+                $r = new Response(-1, $duration, array(), null, curl_error($ch));
+                curl_close($ch);
+                return $r;
+            }
+            $code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
+            $header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
+            $headers = self::parseHeaders(substr($return_data, 0, $header_size));
+            $body = substr($return_data, $header_size);
+            curl_close($ch);
+//            var_dump($return_data);
+//            var_dump($code);
+//            var_dump($duration);
+//            var_dump($headers);
+            var_dump($body);
+//            exit;
+            return json_decode($return_data,true);
+
+
+//            $opts = array(
+//                'http' => array(
+//                    'method' => 'POST',
+//                    'header' => array("Content-Type: application/x-www-form-urlencoded;charset=utf-8","x-nos-token:".$token,"Content-Length:".strlen($contents)),
+//                    'content' => $contents
+//                )
+//            );
+//            $context = stream_context_create($opts);
+//            $response = file_get_contents($url, false, $context);
+//            $ret = json_decode($response, true);
+////            return $ret['success'];
+////            var_dump($ret);
+////            exit;
+//            return $ret;
+//        }else{
+//            return false;
+//        }
+    }
+
+    private static function parseHeaders($raw)
+    {
+        $headers = array();
+        $headerLines = explode("\r\n", $raw);
+        foreach ($headerLines as $line) {
+            $headerLine = trim($line);
+            $kv = explode(':', $headerLine);
+            if (count($kv) >1) {
+                $headers[$kv[0]] = trim($kv[1]);
+            }
+        }
+        return $headers;
+    }
+
+    /**
+     *  断点续传查询断点
+     * @url           上传地址格式:GET {UploadHost}/{bucket}/{object}?uploadContext
+     *
+     * 请求参数
+     * @x-nos-token   请求头参数,上传token
+     * @bucket        存储对象的桶名
+     * @object        生成的唯一对象名
+     * @context       上传上下文。本字段是只能被上传服务器解读使用的不透明字段,
+                        上传端不应修改其内容。对应context在服务端不存在则返回404。
+                        context对应的桶名或者对象名不匹配返回400 code。
+     * @version       http api版本号。这里是固定值1.0
+     */
+    public function videoUploadContext($url,$token,$context){
+        $url = $url.'?uploadContext&context='.$context.'&version=1.0';
+        return $this->GetUrlMsg($url,$token);
+    }
+
+    /**
+     *  视频上传完成查询视频主id,存在id则表示上传完成
+     * @objectNames           上传文件的对象名列表
+     *
+     */
+    public function videoQuery($objectName){
+        $url = $this->baseUrl.'/app/vod/video/query';
+        return $this->postDataCurl($url,array('objectNames' => array($objectName)));
+    }
+
+    /**
+     *  设置上传回调地址接口     用于视频上传,设置上传成功后的回调地址。
+     * @callbackUrl         上传成功后回调客户端的URL地址
+     *
+     */
+    public function videoCallback($cburl){
+        $url = $this->baseUrl.'/app/vod/upload/setcallback';
+        return $this->postDataCurl($url,array('callbackUrl' => $cburl));
+    }
+
+
+
+    /**
+     *  获取视频封面
+     * @id      视频Id
+     * @size    截图尺寸,包含以下几种值:1表示640X360,2表示400X300,3表示320X180,4表示200X150
+     * @offset  截图偏移,包含以下几种值:
+                0表示视频第一帧,1表示时间轴10%位置,2表示时间轴20%位置,3表示时间轴30%位置,
+                4表示时间轴40%位置,5表示时间轴50%位置,6表示时间轴60%位置,
+                7表示时间轴70%位置,8表示时间轴80%位置,9表示时间轴90%位置
+     */
+    public function videoSnapshotCreate($id, $size, $offset){
+        $url = $this->baseUrl.'/app/vod/snapshot/create';
+        return $this->postDataCurl($url,array('vid' => $id, 'size' => $size, 'offset' => $offset));
+    }
+
+    /**
+     *  设置视频封面
+     * @id      视频Id
+     * @typeId    封面设置方法:1表示使用截图URL,2表示使用本地上传图片
+     * @path    type值为1,则代表截图URL;type值为2,则代表本地图片路径
+     * @data    type值为2时,需填写,代表本地图片数据的base64编码字符串数据
+     */
+    public function videoSnapshotSet($id, $typeId, $path, $data = ''){
+        $url = $this->baseUrl.'/app/vod/snapshot/set';
+        if($data != ''){
+            return $this->postDataCurl($url,array('vid' => $id, 'type' => $typeId, 'path' => $path, 'data' => $data));
+        }else{
+            return $this->postDataCurl($url,array('vid' => $id, 'type' => $typeId, 'path' => $path));
+        }
+    }
+
+    //end 视频上传管理
+
+}
+
+?>

+ 120 - 0
protected/config/common.conf.php

@@ -0,0 +1,120 @@
+<?php
+
+/*
+ * Common configuration that can be used throughout the application
+ * Please refer to DooConfig class in the API doc for a complete list of configurations
+ * Access via Singleton, eg. Doo::conf()->BASE_PATH;
+ */
+error_reporting(E_ALL | E_STRICT);
+date_default_timezone_set('Asia/Shanghai');
+
+/**
+ * for benchmark purpose, call Doo::benchmark() for time used.
+ */
+//$config['START_TIME'] = microtime(true);
+//For framework use. Must be defined. Use full absolute paths and end them with '/'      eg. /var/www/project/
+$config['SITE_PATH'] = realpath('..') . '/zhkt/';
+//$config['PROTECTED_FOLDER'] = 'protected/';
+$config['BASE_PATH'] = realpath('..') . '/dooframework/';
+
+//for production mode use 'prod'
+$config['APP_MODE'] = 'dev';
+
+//----------------- optional, if not defined, default settings are optimized for production mode ----------------
+//if your root directory is /var/www/ and you place this in a subfolder eg. 'app', define SUBFOLDER = '/app/'
+
+$config['SUBFOLDER'] = str_replace($_SERVER['DOCUMENT_ROOT'], '', str_replace('\\', '/', $config['SITE_PATH']));
+if (strpos($config['SUBFOLDER'], '/') !== 0) {
+    $config['SUBFOLDER'] = '/' . $config['SUBFOLDER'];
+}
+
+$config['APP_URL'] = 'http://' . $_SERVER['HTTP_HOST'] . $config['SUBFOLDER'];
+//$config['AUTOROUTE'] = TRUE;
+$config['DEBUG_ENABLED'] = TRUE;
+
+//$config['TEMPLATE_COMPILE_ALWAYS'] = TRUE;
+//register functions to be used with your template files
+//$config['TEMPLATE_GLOBAL_TAGS'] = array('url', 'url2', 'time', 'isset', 'empty');
+
+/**
+ * Path to store logs/profiles when using with the logger tool. This is needed for writing log files and using the log viewer tool
+ */
+//$config['LOG_PATH'] = '/var/logs/';
+
+
+/**
+ * defined either Document or Route to be loaded/executed when requested page is not found
+ * A 404 route must be one of the routes defined in routes.conf.php (if autoroute on, make sure the controller and method exist)
+ * Error document must be more than 512 bytes as IE sees it as a normal 404 sent if < 512b
+ */
+//$config['ERROR_404_DOCUMENT'] = 'error.php';
+$config['ERROR_404_ROUTE'] = '/error';
+
+
+/**
+ * Settings for memcache server connections, you don't have to set if using localhost only.
+ * host, port, persistent, weight
+ * $config['MEMCACHE'] = array(
+ *                       array('192.168.1.31', '11211', true, 40),
+ *                       array('192.168.1.23', '11211', true, 80)
+ *                     );
+ */
+/**
+ * Defines modules that are allowed to be accessed from an auto route URI.
+ * Example, we have a module in SITE_PATH/PROTECTED_FOLDER/module/example
+ * It can be accessed via http://localhost/example/controller/method/parameters
+ *
+ * $config['MODULES'] = array('example');
+ *
+ */
+/**
+ * Unique string ID of the application to be used with PHP 5.3 namespace and auto loading of namespaced classes
+ * If you wish to use namespace with the framework, your classes must have a namespace starting with this ID.
+ * Example below is located at /var/www/app/protected/controller/test and can be access via autoroute http://localhost/test/my/method
+ * <?php
+ * namespace myapp\controller\test;
+ * class MyController extends \DooController {
+ *     .....
+ * } ?>
+ *
+ * You would need to enable autoload to use Namespace classes in index.php
+ * spl_autoload_register('Doo::autoload');
+ *
+ * $config['APP_NAMESPACE_ID'] = 'myapp';
+ *
+ */
+/**
+ * To enable autoloading, add directories which consist of the classes needed in your application.
+ *
+ * $config['AUTOLOAD'] = array(
+  //internal directories, live in the app
+  'class', 'model', 'module/example/controller',
+  //external directories, live outside the app
+  '/var/php/library/classes'
+  );
+ */
+/**
+ * you can include self defined config, retrieved via Doo::conf()->variable
+ * Use lower case for you own settings for future Compability with DooPHP
+ */
+//$config['pagesize'] = 10;
+$config['AUTHKEY'] = 'z685b7q4V8ifR7F9T71eUdH8p9k5i135G6p6C9Mek4m3q7y7Uba2XbXdKfXbr9Af';
+//$config['COOKIEPRE'] = 'p6C4m3_NZ_';
+//$config['COOKIEPRE_WK'] = 'GLgxZR_WK_';
+// 最后的斜杠要带
+$config['ZHSSO'] = 'http://zhsso.com/';
+define ( "COOKIE_WEB_SITE", "zhkt.com" );
+
+
+//用户默认头像
+define ( "DEF_AVATAR", "/global/images/01.png" );
+
+define ( 'SYSTEM_DAILY_LOGIN', 2);
+define ( "USERNAME_ONFINE", - 1 );
+define ( "PASSWORD_ERROR", - 2 );
+define ( "WEB_SITE", "http://zhkt.com" );
+define ( "REAL_PATH", realpath ( '..' ) );
+define ( "SITE_PATH", REAL_PATH . "/zhkt/" );
+define ( "ZHSSO", "http://zhsso.com/" );
+define ( "BASE_PATH", REAL_PATH . "/dooframework/" );
+define ( "AUTHKEY", "z685b7q4V8ifR7F9T71eUdH8p9k5i135G6p6C9Mek4m3q7y7Uba2XbXdKfXbr9Af" );

+ 39 - 0
protected/config/db.conf.php

@@ -0,0 +1,39 @@
+<?php
+
+/**
+ * Example Database connection settings and DB relationship mapping
+ * $dbmap[Table A]['has_one'][Table B] = array('foreign_key'=> Table B's column that links to Table A );
+ * $dbmap[Table B]['belongs_to'][Table A] = array('foreign_key'=> Table A's column where Table B links to );
+
+
+  //Food relationship
+  $dbmap['Food']['belongs_to']['FoodType'] = array('foreign_key'=>'id');
+  $dbmap['Food']['has_many']['Article'] = array('foreign_key'=>'food_id');
+  $dbmap['Food']['has_one']['Recipe'] = array('foreign_key'=>'food_id');
+  $dbmap['Food']['has_many']['Ingredient'] = array('foreign_key'=>'food_id', 'through'=>'food_has_ingredient');
+
+  //Food Type
+  $dbmap['FoodType']['has_many']['Food'] = array('foreign_key'=>'food_type_id');
+
+  //Article
+  $dbmap['Article']['belongs_to']['Food'] = array('foreign_key'=>'id');
+
+  //Recipe
+  $dbmap['Recipe']['belongs_to']['Food'] = array('foreign_key'=>'id');
+
+  //Ingredient
+  $dbmap['Ingredient']['has_many']['Food'] = array('foreign_key'=>'ingredient_id', 'through'=>'food_has_ingredient');
+
+ */
+//$dbconfig[ Environment or connection name] = array(Host, Database, User, Password, DB Driver, Make Persistent Connection?);
+/**
+ * Database settings are case sensitive.
+ * To set collation and charset of the db connection, use the key 'collate' and 'charset'
+ * array('localhost', 'database', 'root', '1234', 'mysql', true, 'collate'=>'utf8_unicode_ci', 'charset'=>'utf8');
+ */
+$dbconfig['dev'] = array('192.168.73.139','zhclass','root','root','mysql',false, 'collate' => 'utf8_unicode_ci', 'charset' => 'utf8');
+//$dbconfig['dev'] = array('localhost','zhclass','zhclass','DkY1mPoWKD2UOvWL','mysql',false, 'collate' => 'utf8_unicode_ci', 'charset' => 'utf8');
+//$dbconfig['dev'] = array('localhost', 'zhwenku', 'zhwenku', 'zhwenku.3850', 'mysql', false, 'collate' => 'utf8_unicode_ci', 'charset' => 'utf8');
+//$dbconfig['zhzdjg'] = array('localhost', 'glzj.com.cn', 'glzjcomcn', 'glzjcomcn.3850888', 'mysql', true, 'collate' => 'utf8_unicode_ci', 'charset' => 'utf8');
+//$dbconfig['prod'] = array('localhost', 'zhwenku', 'root', '', 'mysql', true, 'charset' => 'utf8');
+?>

+ 107 - 0
protected/config/routes.conf.php

@@ -0,0 +1,107 @@
+<?php
+
+$route['*']['/'] = array('MainController', 'index');
+$route['*']['/index'] = array('MainController', 'index');
+$route['*']['/login'] = array('MainController', 'login');
+$route['*']['/setId'] = array('MainController', 'exitId');
+$route['*']['/setId/do'] = array('MainController', 'do_setid');
+$route['*']['/exit'] = array('MainController', 'user_exit');
+$route['*']['/classlist'] = array('MainController', 'classlist');
+$route['*']['/orderlist'] = array('MainController', 'orderlist');
+$route['*']['/orderlist/page/:pindex'] = array('MainController', 'orderlist');
+$route['*']['/classinfo/:classid'] = array('MainController', 'classinfo');
+$route['*']['/payStatus/:classid'] = array('MainController', 'paydetail');
+$route['*']['/videoinfo/:classid'] = array('MainController', 'videoInfo');
+$route['*']['/userinfo'] = array('MainController', 'userInfo');
+$route['*']['/updateId'] = array('MainController', 'updateId');
+$route['*']['/changeAvatar'] = array('MainController', 'changeAvatar');
+$route['*']['/playVideo'] = array('MainController', 'playVideo');
+$route['*']['/finishClass'] = array('MainController', 'finishClass');
+$route['*']['/updateClassAndVideo'] = array('MainController', 'saveClassAndVideo');
+$route['*']['/alipay/:classid'] = array('MainController', 'alipay');
+$route['*']['/api/smartcost/sso/return_url'] = array('MainController', 'returnAlipay');
+//$route['*']['/api/smartcost/sso/return_url.php'] = array('MainController', 'returnAlipay');
+$route['*']['/api/smartcost/sso/notify_url'] = array('MainController', 'notifyAlipay');
+//$route['*']['/api/smartcost/sso/notify_url.php'] = array('MainController', 'notifyAlipay');
+
+
+/*后台*/
+$route['*']['/m'] = array('BaseController', 'alogin');
+$route['*']['/m/login'] = array('BaseController', 'alogin');
+$route['*']['/m/login/do'] = array('BaseController', 'do_login');
+$route['*']['/m/exit'] = array('AdminController', 'admin_exit');
+
+//用户管理
+$route['*']['/m/userlist'] = array('AdminController', 'userlist');
+$route['*']['/m/userlist/page/:pindex'] = array('AdminController', 'userlist');
+$route['*']['/m/userlist/status/:status'] = array('AdminController', 'userlist');
+$route['*']['/m/userlist/status/:status/page/:pindex'] = array('AdminController', 'userlist');
+$route['*']['/m/userinfo'] = array('AdminController', 'userSearch');
+
+//继续教育管理
+$route['*']['/m/classlist'] = array('AdminController', 'classlist');
+$route['*']['/m/classlist/page/:pindex'] = array('AdminController', 'classlist');
+$route['*']['/m/classinfo/:classid'] = array('AdminController', 'classInfo');
+$route['*']['/m/uploadVideo'] = array('AdminController', 'addVideo');
+$route['*']['/m/updateVideo'] = array('AdminController', 'updateVideo');
+$route['*']['/m/showVideo/:videoid/:classid'] = array('AdminController', 'showVideo');
+$route['*']['/m/delVideo/:videoid/:classid'] = array('AdminController', 'delVideo');
+$route['*']['/m/playVideo'] = array('AdminController', 'playVideo');
+$route['*']['/m/showonline'] = array('AdminController', 'showOnline');
+$route['*']['/m/addclass'] = array('AdminController', 'editClass');
+$route['*']['/m/updateclass/:classid'] = array('AdminController', 'editClass');
+$route['*']['/m/deleteclass/:classid'] = array('AdminController', 'deleteClass');
+$route['*']['/m/doclass'] = array('AdminController', 'do_class');
+$route['*']['/m/addtype'] = array('AdminController', 'addType');
+$route['*']['/m/exittype'] = array('AdminController', 'ExitType');
+$route['*']['/m/deletetype/:typeid/:classid'] = array('AdminController', 'deleteType');
+$route['*']['/m/addsection'] = array('AdminController', 'addSection');
+$route['*']['/m/exitsection'] = array('AdminController', 'exitSection');
+$route['*']['/m/deletesection/:seid/:classid'] = array('AdminController', 'deleteSection');
+$route['*']['/m/isshowVideo'] = array('AdminController', 'isshowVideo');
+
+//课程进度
+$route['*']['/m/tracklist'] = array('AdminController', 'tracklist');
+$route['*']['/m/tracklist/page/:pindex'] = array('AdminController', 'tracklist');
+$route['*']['/m/trackinfo/:classid'] = array('AdminController', 'trackInfo');
+$route['*']['/m/trackinfo/:classid/sort/:sort'] = array('AdminController', 'trackInfo');
+$route['*']['/m/trackinfo/:classid/sort/:sort/page/:pindex'] = array('AdminController', 'trackInfo');
+$route['*']['/m/trackinfo/:classid/page/:pindex'] = array('AdminController', 'trackInfo');
+$route['*']['/m/tracksearch'] = array('AdminController', 'trackSearch');
+
+//订单列表
+$route['*']['/m/orderlist'] = array('AdminController', 'orderlist');
+$route['*']['/m/orderinfo/result/:search'] = array('AdminController', 'orderlist');
+$route['*']['/m/orderinfo/result/:search/page/:pindex'] = array('AdminController', 'orderlist');
+$route['*']['/m/orderinfo/status/:status/result/:search'] = array('AdminController', 'orderlist');
+$route['*']['/m/orderinfo/status/:status/result/:search/page/:pindex'] = array('AdminController', 'orderlist');
+$route['*']['/m/orderlist/page/:pindex'] = array('AdminController', 'orderlist');
+$route['*']['/m/orderlist/status/:status'] = array('AdminController', 'orderlist');
+$route['*']['/m/orderlist/status/:status/page/:pindex'] = array('AdminController', 'orderlist');
+
+//发票列表
+$route['*']['/m/receiptlist'] = array('AdminController', 'receiptlist');
+
+//测试,到时删
+//$route['*']['/typelist'] = array('AdminController', 'showTypeList');
+//$route['*']['/upload'] = array('AdminController', 'upload');
+//$route['*']['/upload2'] = array('AdminController', 'upload2');
+//$route['*']['/upload3'] = array('AdminController', 'upload3');
+//$route['*']['/upload4'] = array('AdminController', 'upload4');
+//$route['*']['/backurl'] = array('AdminController', 'backurl');
+//$route['*']['/videoupload'] = array('AdminController', 'videoupload');
+
+
+/*公共查询*/
+$route['*']['/common'] = array('BaseController', 'clogin');
+$route['*']['/common/login'] = array('BaseController', 'clogin');
+$route['*']['/common/login/do'] = array('BaseController', 'do_clogin');
+$route['*']['/common/exit'] = array('CommonController', 'common_exit');
+$route['*']['/common/classlist'] = array('CommonController', 'classlist');
+$route['*']['/common/classlist/page/:pindex'] = array('CommonController', 'classlist');
+$route['*']['/common/classinfo/:classid'] = array('CommonController', 'classinfo');
+$route['*']['/common/classinfo/:classid/status/:status'] = array('CommonController', 'classinfo');
+$route['*']['/common/classinfo/:classid/status/:status/page/:pindex'] = array('CommonController', 'classinfo');
+$route['*']['/common/classinfo/:classid/page/:pindex'] = array('CommonController', 'classinfo');
+$route['*']['/common/userinfo'] = array('CommonController', 'userSearch');
+?>

+ 807 - 0
protected/controller/AdminController.php

@@ -0,0 +1,807 @@
+<?php
+
+/**
+ * Created by PhpStorm.
+ * User: Ellisran
+ * Date: 2016/9/21
+ * Time: 16:05
+ */
+class AdminController extends DooController {
+
+    public $data;
+//    public $appKey = '';
+//    public $AppSecret = '';
+
+    function __construct() {
+        $this->data['rootUrl'] = Doo::conf()->APP_URL;
+        include ('./protected/controller/BaseController.php');
+        $this->base = new BaseController ();
+       	$this->base->admin_init();
+//        require_once (Doo::conf()->SITE_PATH . '/protected/class/video.php');
+//        $video = new video (  );
+    }
+
+    /**
+     * 用户登出
+     */
+    function admin_exit() {
+
+        setcookie ( "auth_main", "", time () + 3600 * 24, "/", COOKIE_WEB_SITE );
+
+        $this->render ( "admin-login", $this->data, TRUE);
+    }
+
+    /**
+     * 用户管理
+     */
+    public function userlist(){
+        Doo::loadModel('user');
+        Doo::loadModel('classuser');
+        $user = new User();
+        $class_user = new Classuser();
+        $totalArchive = $user->count();
+        if(isset($this->params['status'])){
+            $pager = new DooPager(Doo::conf()->APP_URL . "m/userlist/status/".$this->params['status']."/page", $totalArchive, 20, 10);
+        }else{
+            $pager = new DooPager(Doo::conf()->APP_URL . "m/userlist/page", $totalArchive, 20, 10);
+        }
+        if (isset($this->params['pindex']))
+            $pager->paginate(intval($this->params['pindex']));
+        else
+            $pager->paginate(1);
+        if ($pager->limit != ' -20,20')
+            if(isset($this->params['status'])){
+                $this->data['userlist'] = $user->getResultbysort($this->params['status'],$pager->limit);
+                $this->data['status'] = $this->params['status'];
+            }else{
+                $this->data['userlist'] = $user->getAllRow($pager->limit);
+            }
+        if(isset($this->data['userlist']) && !empty($this->data['userlist'])){
+            foreach($this->data['userlist'] as $k => $v){
+                $cnum = $class_user->getNumbyuserid($v['userid']);
+                $this->data['userlist'][$k]['cnum'] = $cnum;
+                $this->data['userlist'][$k]['allprice'] = $class_user->getAllpricebyid($v['userid']);
+                $idcard = strlen($v['idcard'])==15?substr_replace($v['idcard'],"******",2,6):(strlen($v['idcard'])==18?substr_replace($v['idcard'],"*********",3,9):"身份证位数不正常!");
+                $this->data['userlist'][$k]['idcard'] = $idcard;
+            }
+        }
+        $this->data['pager'] = $pager->output;
+        $this->data['user'] = TRUE;
+        $this->render ( "admin-userlist", $this->data, TRUE);
+    }
+
+    /**
+     * 搜索用户
+     */
+    public function userSearch(){
+        if(isset($_POST['search']) && !empty($_POST['search'])){
+            Doo::loadModel('user');
+            $user = new User();
+            if(is_numeric(trim($_POST['search'])) && strlen(trim($_POST['search'])) == 6){
+                $result = $user->getUserMsgbyidcard(trim($_POST['search']));
+            }else{
+                $result = $user->getUserMsgbySearch(trim($_POST['search']));
+            }
+            if(!empty($result)) {
+                $this->data['userinfo'] = $result;
+                Doo::loadModel('classuser');
+                $class_user = new Classuser();
+                $classlist = $class_user->getclassbyuserid($result['userid']);
+                if(!empty($classlist)){
+                    $this->data['classlist'] = $classlist;
+                    Doo::loadModel('ktclass');
+                    $ktclass = new Ktclass();
+                    foreach($classlist as $k => $v){
+                        $bum = $class_user->getNumbyClassid($v['classid']);
+                        $this->data['classlist'][$k]['bnum'] = $bum;
+                        $classinfo = $ktclass->getRowbyId($v['classid']);
+                        $hadbuy = $class_user->gethasbyuserandclass($result['userid'],$v['classid']);
+                        $this->data['classlist'][$k]['user_progress'] = $this->getPersonProgress($classinfo,$hadbuy);
+                        $this->data['classlist'][$k]['classname'] = $classinfo['classname'];
+                        $this->data['classlist'][$k]['cnum'] = $classinfo['classnum'];
+                        $this->data['classlist'][$k]['totalnum'] = sprintf('%.2f',$classinfo['classnum']*$classinfo['classtime']/60);
+                    }
+                }
+            }else{
+                $this->data['search'] = $_POST['search'];
+            }
+            $this->render('admin-usersearch', $this->data, TRUE);
+        }else{
+            return '/m/userlist';
+        }
+    }
+
+    /**
+     * 继续教育管理
+     */
+    public function classlist(){
+        Doo::loadModel('ktclass');
+        Doo::loadModel('classuser');
+        Doo::loadHelper('DooPager');
+        $ktclass = new Ktclass();
+        $class_user = new Classuser();
+        $totalArchive = $ktclass->count();
+        $pager = new DooPager(Doo::conf()->APP_URL . "m/classlist/page", $totalArchive, 8, 10);
+        if (isset($this->params['pindex']))
+            $pager->paginate(intval($this->params['pindex']));
+        else
+            $pager->paginate(1);
+        if ($pager->limit != ' -8,8')
+            $this->data['classlist'] = $ktclass->getclasslist($pager->limit);
+        foreach($this->data['classlist'] as $k => $v){
+            $bum = $class_user->getNumbyClassid($v['classid']);
+            $this->data['classlist'][$k]['bnum'] = $bum;
+
+        }
+        $this->data['pager'] = $pager->output;
+        $this->data['jiaoyu'] = TRUE;
+        $this->render ( "admin-classlist", $this->data, TRUE);
+    }
+
+    /**
+     * 课程进度
+     */
+    public function tracklist(){
+        Doo::loadModel('ktclass');
+        Doo::loadModel('classuser');
+        Doo::loadHelper('DooPager');
+        $ktclass = new Ktclass();
+        $class_user = new Classuser();
+        $totalArchive = $ktclass->count(array('where' => 'ishow=1'));
+        $pager = new DooPager(Doo::conf()->APP_URL . "m/tracklist/page", $totalArchive, 8, 10);
+        if (isset($this->params['pindex']))
+            $pager->paginate(intval($this->params['pindex']));
+        else
+            $pager->paginate(1);
+        if ($pager->limit != ' -8,8')
+            $this->data['classlist'] = $ktclass->getclasslistbyshow($pager->limit);
+        foreach($this->data['classlist'] as $k => $v){
+            $bum = $class_user->getNumbyClassid($v['classid']);
+            $this->data['classlist'][$k]['bnum'] = $bum;
+            $this->data['classlist'][$k]['totalnum'] = sprintf('%.2f',$v['classnum']*$v['classtime']/60);
+            $this->data['classlist'][$k]['class_progress'] = $this->getClassProgress($v['classid'],$this->data['classlist'][$k]['totalnum'],$bum);
+        }
+
+        $this->data['pager'] = $pager->output;
+        $this->data['kecheng'] = TRUE;
+        $this->render ( "admin-classtracklist", $this->data, TRUE);
+    }
+
+    public function trackInfo(){
+        Doo::loadModel('ktclass');
+        Doo::loadModel('user');
+        Doo::loadModel('classuser');
+        Doo::loadHelper('DooPager');
+        $ktclass = new Ktclass();
+        $class_user = new Classuser();
+        $user = new User();
+        $class = $ktclass->getRowbyId($this->params['classid']);
+        $this->data['totalnum'] = sprintf("%.2f", $class['classnum']*$class['classtime']/60);
+        $this->data['classname'] = $ktclass->getnamebyId($this->params['classid'])['classname'];
+        $this->data['classid'] = $this->params['classid'];
+        $totalArchive = $class_user->getNumbyClassid($this->params['classid']);
+        if(isset($this->params['sort'])){
+            $pager = new DooPager(Doo::conf()->APP_URL . "m/trackinfo/".$this->params['classid']."/sort/".$this->params['sort']."/page", $totalArchive, 20, 10);
+        }else{
+            $pager = new DooPager(Doo::conf()->APP_URL . "m/trackinfo/".$this->params['classid']."/page", $totalArchive, 20, 10);
+        }
+        if (isset($this->params['pindex']))
+            $pager->paginate(intval($this->params['pindex']));
+        else
+            $pager->paginate(1);
+        if ($pager->limit != ' -20,20'){
+            if(isset($this->params['sort'])){
+                $this->data['userlist'] = $class_user->getuserlist2($this->params['classid'],$pager->limit,$this->params['sort']);
+                $this->data['sort'] = $this->params['sort'];
+            }else{
+                $this->data['userlist'] = $class_user->getuserlist($this->params['classid'],$pager->limit);
+            }
+        }
+
+        if(isset($this->data['userlist'])){
+            foreach($this->data['userlist'] as $k => $v){
+                $this->data['userlist'][$k]['username'] = $user->getNamebyId($v['userid'])['username'];
+                $hadbuy = $class_user->gethasbyuserandclass($v['userid'],$this->params['classid']);
+                $this->data['userlist'][$k]['user_progress'] = $this->getPersonProgress($class,$hadbuy);
+            }
+        }
+        $this->data['pager'] = $pager->output;
+        $this->render('admin-classtrack', $this->data, true);
+    }
+
+    //进度课程搜索
+    public function trackSearch(){
+        if(isset($_POST['search']) && !empty($_POST['search'])){
+            Doo::loadModel('ktclass');
+            Doo::loadModel('classuser');
+            $ktclass = new Ktclass();
+            $class_user = new Classuser();
+            $this->data['classlist'] = $ktclass->getclassbySearch($_POST['search']);
+            if(!empty($this->data['classlist'])){
+                foreach($this->data['classlist'] as $k => $v){
+                    $bum = $class_user->getNumbyClassid($v['classid']);
+                    $this->data['classlist'][$k]['bnum'] = $bum;
+                    $this->data['classlist'][$k]['totalnum'] = $v['classnum']*($v['classtime']/60);
+                    $this->data['classlist'][$k]['class_progress'] = $this->getClassProgress($v['classid'],$this->data['classlist'][$k]['totalnum'],$bum);
+                }
+            }else{
+                $this->data['searchResult'] = $_POST['search'];
+            }
+            $this->data['kecheng'] = TRUE;
+            $this->render ( "admin-classtracklist", $this->data, TRUE);
+        }else{
+            return '/m/tracklist';
+        }
+
+    }
+
+    /**
+     * 订单列表
+     */
+    public function orderlist(){
+        Doo::loadModel('order');
+        Doo::loadHelper('DooPager');
+        $ktorder = new Order();
+        if(isset($this->params['search']) && !empty($this->params['search']) && !isset($this->params['status'])){
+            $search = urldecode(trim($this->params['search']));
+            $totalArchive = $ktorder->count(array('where' => 'trade_sn=? or username=? or useremail=? or mobile=? or classname=?', 'param' => array($search,$search,$search,$search,$search), 'asArray' => TRUE));
+            $pager = new DooPager(Doo::conf()->APP_URL . "m/orderinfo/result/".$search."/page", $totalArchive, 20, 10);
+            if (isset($this->params['pindex']))
+                $pager->paginate(intval($this->params['pindex']));
+            else
+                $pager->paginate(1);
+            if ($pager->limit != ' -20,20')
+                $this->data['orderlist'] = $ktorder->getorderlistbySearch($search, $pager->limit);
+            $this->data['search'] = $search;
+        }elseif(isset($this->params['search']) && !empty($this->params['search']) && isset($this->params['status']) && !empty($this->params['status'])){
+            $search = urldecode(trim($this->params['search']));
+            $totalArchive = $ktorder->count(array('where' => '(trade_sn=? or username=? or useremail=? or mobile=? or classname=?) and status=?', 'param' => array($search,$search,$search,$search,$search,$this->params['status']), 'asArray' => TRUE));
+
+            $pager = new DooPager(Doo::conf()->APP_URL . "m/orderinfo/status/".$this->params['status']."/result/".$search."/page", $totalArchive, 20, 10);
+            if (isset($this->params['pindex']))
+                $pager->paginate(intval($this->params['pindex']));
+            else
+                $pager->paginate(1);
+            if ($pager->limit != ' -20,20')
+                $this->data['orderlist'] = $ktorder->getorderlistbySearch($search, $pager->limit, $this->params['status']);
+            $this->data['search'] = $search;
+            $this->data['status'] = $this->params['status'];
+        }elseif(isset($this->params['status']) && !empty($this->params['status']) && !isset($this->params['search'])){
+            $totalArchive = $ktorder->count(array('where' => 'status='.$this->params['status'], 'asArray' => TRUE));
+            $pager = new DooPager(Doo::conf()->APP_URL . "m/orderlist/status/".$this->params['status']."/page", $totalArchive, 20, 10);
+            if (isset($this->params['pindex']))
+                $pager->paginate(intval($this->params['pindex']));
+            else
+                $pager->paginate(1);
+            if ($pager->limit != ' -20,20')
+                $this->data['orderlist'] = $ktorder->getorderlist($pager->limit,$this->params['status']);
+            $this->data['status'] = $this->params['status'];
+        }else{
+            $totalArchive = $ktorder->count();
+            $pager = new DooPager(Doo::conf()->APP_URL . "m/orderlist/page", $totalArchive, 20, 10);
+            if (isset($this->params['pindex']))
+                $pager->paginate(intval($this->params['pindex']));
+            else
+                $pager->paginate(1);
+            if ($pager->limit != ' -20,20')
+                $this->data['orderlist'] = $ktorder->getorderlist($pager->limit);
+        }
+        if(isset($this->data['orderlist'])){
+            foreach($this->data['orderlist'] as $k => $v){
+                $this->data['orderlist'][$k]['createtime'] = date('Y-m-d H:i',$v['createtime']);
+            }
+        }
+        $this->data['pager'] = $pager->output;
+        $this->data['order'] = TRUE;
+        $this->render ( "admin-orderlist", $this->data, TRUE);
+    }
+
+
+    /**
+     * 发票列表
+     */
+    public function receiptlist(){
+        $this->data['order'] = TRUE;
+        $this->render ( "admin-receiptlist", $this->data, TRUE);
+    }
+
+
+    public function upload(){
+        $this->render('upload', $this->data, TRUE);
+    }
+
+    //添加或编辑课程
+    public function editClass(){
+        if(isset($this->params['classid'])){
+            Doo::loadModel('ktclass');
+            $ktclass = new Ktclass();
+            $this->data['classinfo'] = $ktclass->getRowbyId($this->params['classid']);
+            $this->data['classinfo']['stoptime'] = date("Y-m-d",$this->data['classinfo']['stoptime']);
+            $this->data['edit'] = true;
+        }
+        $this->data['jiaoyu'] = TRUE;
+        $this->render('admin-editclass', $this->data, true);
+    }
+
+
+    //添加和编辑课程
+    public function do_class(){
+
+        if(empty($_POST['classname'])){
+            exit('课程名不能为空');
+        }
+
+        if(empty($_POST['price'])){
+            exit('价格不能为空');
+        }
+
+        if(empty($_POST['totalnum'])){
+            exit('总课时不能为空');
+        }
+
+        if(empty($_POST['classtime'])){
+            exit('课程时长不能为空');
+        }
+
+        if(empty($_POST['stoptime'])){
+            exit('截止日期不能为空');
+        }
+
+        if(empty($_POST['desc'])){
+            exit('简介不能为空');
+        }
+
+        $price = $_POST['price'];
+        $name = $_POST['classname'];
+        $totalnum = $_POST['totalnum'];
+        $classtime = $_POST['classtime'];
+        $stop = strtotime($_POST['stoptime']);
+        $desc = $_POST['desc'];
+        if(!empty($_POST['createtime'])){
+            $createTime = $_POST['createtime'];
+        }else{
+            $createTime = time();
+        }
+        var_dump($stop);
+
+        $avatar = '';
+        if(!empty($_FILES["avatar"]['name'])){
+            if ((($_FILES["avatar"]["type"] == "image/gif")
+                    || ($_FILES["avatar"]["type"] == "image/jpeg")
+                    || ($_FILES["avatar"]["type"] == "image/pjpeg")
+                    || ($_FILES["avatar"]["type"] == "image/png"))
+                && ($_FILES["avatar"]["size"] < 1048576))
+            {
+                if ($_FILES["avatar"]["error"] > 0) {
+                    echo "Return Code: " . $_FILES["avatar"]["error"];
+                    return false;
+                }
+                else {
+                    include (DOO::conf()->SITE_PATH . 'protected/plugin/io.han.php');
+                    $this->IoHandler = new IoHandler();
+
+                    $filedir = $createTime;
+
+                    //调用定义物理路径
+					$t=DOO::conf()->SITE_PATH."avatar/".$filedir;
+//                    $t='/opt/www/wenku/report/'.$filedir."/thumb";
+                    $this->IoHandler->MakeDir($t);
+
+                    $upload_dir = $t."/".$createTime.".png";
+                    $k=move_uploaded_file($_FILES["avatar"]["tmp_name"], $upload_dir);
+                    if($k) {
+                        $avatar = 'avatar/'.$createTime.'/'.$createTime.".png";
+                    }
+                }
+            }else{
+                echo '预览图片文件过大或格式不对';
+                return false;
+            }
+        }elseif(empty($_FILES["avatar"]['name']) && empty($_POST['hadavatar'])){
+            exit('请上传预览图');
+        }
+
+
+        Doo::loadModel('ktclass');
+        $ktclass = new Ktclass();
+        if(isset($_POST['classid']) && !empty($_POST['classid'])){
+            $ktclass->classid = $_POST['classid'];
+            $ktclass->classname = $name;
+            $ktclass->price = $price;
+            $ktclass->classnum = $totalnum;
+            $ktclass->classtime = $classtime;
+            $ktclass->stoptime = $stop;
+            $ktclass->description = $desc;
+            $ktclass->update();
+        }else{
+            $ktclass->classname = $name;
+            $ktclass->price = $price;
+            $ktclass->classnum = $totalnum;
+            $ktclass->classtime = $classtime;
+            $ktclass->stoptime = $stop;
+            $ktclass->description = $desc;
+            $ktclass->createtime = $createTime;
+            $ktclass->avatar = $avatar;
+            $ktclass->ishow = 0;
+            $ktclass->insert();
+        }
+        return '/m/classlist';
+    }
+
+    //发布课程
+    public function showOnline(){
+        if(isset($_POST['classid']) && !empty($_POST['classid'])){
+            Doo::loadModel('ktclass');
+            $ktclass = new Ktclass();
+            $ktclass->classid = $_POST['classid'];
+            $ktclass->ishow = 1;
+            $result = $ktclass->update();
+            if($result){
+                echo '1';
+                exit();
+            }
+        }else{
+            echo '0';
+            exit();
+        }
+    }
+
+    //课程详情页
+    public function classInfo(){
+        Doo::loadModel('ktclass');
+        Doo::loadModel('classuser');
+        Doo::loadModel('kttype');
+        $ktclass = new Ktclass();
+        $ktype = new Kttype();
+        $class_user = new Classuser();
+
+        $this->data['kttype'] = $ktype->getTypebyClassid($this->params['classid']);
+        foreach($this->data['kttype'] as $k => $v){
+            Doo::loadModel('ktsection');
+            $ktsection = new Ktsection();
+            $section = $ktsection->getSecbyTypeid($v['typeid']);
+            $this->data['kttype'][$k]['section'] = $section;
+            foreach($section as $sk => $sv){
+                Doo::loadModel('ktvideo');
+                $ktvideo = new Ktvideo();
+                $video = $ktvideo->getVideobySec($sv['seid']);
+                $this->data['kttype'][$k]['section'][$sk]['video'] = $video;
+            }
+        }
+
+        $this->data['bnum'] = $class_user->getNumbyClassid($this->params['classid']);
+        $this->data['classinfo'] = $ktclass->getRowbyId($this->params['classid']);
+        $this->data['jiaoyu'] = TRUE;
+        $this->render('admin-classinfo', $this->data, true);
+    }
+
+    //添加课程里的章
+    public function addType(){
+//        require_once (Doo::conf()->SITE_PATH . '/protected/class/video.php');
+//        $video = new video ( );
+        $typeprefix = $_POST['typeprefix'];
+        $typeName = $_POST['typename'];
+        $classid = $_POST['classid'];
+        if($typeprefix == '' || $typeName == ''){
+            exit('请输入章号或章名!');
+        }
+//        $data = $video->videoTypeCreate($typeName);
+//        if($data['code'] == '200'){
+//            $video_type_id = $data['ret']['typeId'];
+//        }else{
+//            exit('网易视频云 - 创建分类失败,请联系管理员');
+//        }
+        Doo::loadModel('kttype');
+        $kttype = new Kttype();
+        $kttype->typeprefix = $typeprefix;
+        $kttype->typename = $typeName;
+//        $kttype->video_typeid = $video_type_id;
+        $kttype->createtime = time();
+        $kttype->classid = $classid;
+        $kttype->insert();
+
+        return '/m/classinfo/'.$classid;
+    }
+
+    //编辑章
+    public function ExitType(){
+//        require_once (Doo::conf()->SITE_PATH . '/protected/class/video.php');
+//        $video = new video ( );
+        $typeprefix = $_POST['exprefix'];
+        $typeName = $_POST['typename'];
+        $classid = $_POST['classid'];
+        $typeid = $_POST['typeid'];
+//        $wytypeid = $_POST['wytypeid'];
+        if($typeprefix == '' || $typeName == ''){
+            exit('请输入章号或章名!');
+        }
+
+//        $data = $video->videoTypeUpdate($wytypeid, $typeName);
+//        if($data['code'] == '200'){
+        Doo::loadModel('kttype');
+        $kttype = new Kttype();
+        $kttype->typeprefix = $typeprefix;
+        $kttype->typename = $typeName;
+        $kttype->typeid = $typeid;
+        $kttype->update();
+//        }else{
+//            exit('网易视频云 - 修改分类失败,请联系管理员');
+//        }
+
+        return '/m/classinfo/'.$classid;
+    }
+
+    //删除章
+    public function deleteType(){
+//        require_once (Doo::conf()->SITE_PATH . '/protected/class/video.php');
+//        $video = new video ( );
+        $classid = $this->params['classid'];
+        $typeid = $this->params['typeid'];
+        Doo::loadModel('kttype');
+        $kttype = new Kttype();
+//        $wytype = $kttype->getwyidBytypeid($typeid);
+//        $data = $video->videoTypeDelete($wytype['video_typeid']);
+//        if($data['code'] == '200'){
+        $kttype->typeid = $typeid;
+        $kttype->delete();
+        Doo::loadModel('ktsection');
+        $ktsection = new Ktsection();
+        $section = $ktsection->getSecbyTypeid($typeid);
+        foreach($section as $k => $v){
+            $ktsection->seid = $v['seid'];
+            $ktsection->delete();
+        }
+//        }else{
+//            exit('网易视频云 - 删除分类失败,请联系管理员');
+//        }
+        return '/m/classinfo/'.$classid;
+    }
+
+    //添加章里的节
+    public function addSection(){
+        $seprefix = $_POST['seprefix'];
+        $seName = $_POST['sename'];
+        $typeid = $_POST['typeid'];
+        $classid = $_POST['classid'];
+        if($seprefix == '' || $seName == ''){
+            exit('请输入节号或节名!');
+        }
+        Doo::loadModel('ktsection');
+        $ktsection = new Ktsection();
+        $ktsection->seprefix = $seprefix;
+        $ktsection->sename = $seName;
+        $ktsection->createtime = time();
+        $ktsection->typeid = $typeid;
+        $ktsection->insert();
+
+        return '/m/classinfo/'.$classid;
+    }
+
+    public function exitSection(){
+        $seprefix = $_POST['seprefix'];
+        $seName = $_POST['sename'];
+        $ishow = $_POST['sectionshow'];
+        $seid = $_POST['seid'];
+        $classid = $_POST['classid'];
+        if($seprefix == '' || $seName == ''){
+            exit('请输入节号或节名!');
+        }
+        Doo::loadModel('ktsection');
+        $ktsection = new Ktsection();
+        $ktsection->seprefix = $seprefix;
+        $ktsection->sename = $seName;
+        $ktsection->ishow = $ishow;
+        $ktsection->seid = $seid;
+        $ktsection->update();
+
+        return '/m/classinfo/'.$classid;
+    }
+
+    //删除节
+    public function deleteSection(){
+        $seid = $this->params['seid'];
+        $classid = $this->params['classid'];
+        Doo::loadModel('ktsection');
+        $ktsection = new Ktsection();
+        $ktsection->seid = $seid;
+        $ktsection->delete();
+        return '/m/classinfo/'.$classid;
+    }
+
+    //添加视频
+    public function addVideo(){
+        if(isset($_POST['videomsg']) && !empty($_POST['videomsg'])){
+            $videodata = $_POST['videomsg'];
+            require_once (Doo::conf()->SITE_PATH . '/protected/class/video.php');
+            $video = new video ( );
+            $result = $video->videoGet($videodata['wyvideoid']);
+            if($result['code'] == 200){
+                Doo::loadModel('ktvideo');
+                $ktvideo = new Ktvideo();
+                $ktvideo->videoname = basename($videodata['fileName'],".".substr(strrchr($videodata['fileName'], '.'), 1));//不带后缀的视频名
+                $ktvideo->objectname = $videodata['objectname'];
+                $ktvideo->wy_video_id = $videodata['wyvideoid'];
+                $ktvideo->classid = $videodata['classid'];
+                $ktvideo->typeid = $videodata['typeid'];
+                $ktvideo->seid = $videodata['seid'];
+                $ktvideo->type_video_id = 27143;
+                $ktvideo->file_time = $result['ret']['duration'];
+                $ktvideo->file_ext = $videodata['ext'];
+                $ktvideo->file_size = $videodata['size'];
+                $ktvideo->isshow = 0;
+                $ktvideo->addtime = time();
+                $res = $ktvideo->insert();
+            }
+        }else{
+            echo 0;
+            exit();
+        }
+
+    }
+
+    //修改视频
+    public function updateVideo(){
+        if(isset($_POST['videoId']) && !empty($_POST['videoId'])){
+            $videoid = $_POST['videoId'];
+            Doo::loadModel('ktvideo');
+            $ktvideo = new Ktvideo();
+            $wyvideo = $ktvideo->getvideobyid($videoid);
+            if(!empty($wyvideo)){
+                $ktvideo->videoid = $_POST['videoId'];
+                $ktvideo->videoname = $_POST['videoName'];
+                $ktvideo->isshow = $_POST['isshow'];
+                $ktvideo->update();
+
+                $section = $ktvideo->getsecbyid($_POST['videoId']);
+                $num = $ktvideo->count(array('where' => 'seid='.$section['seid'],'asArray'));
+                if($num == 1){
+                    Doo::loadModel('ktsection');
+                    $ktsection = new Ktsection();
+                    if($_POST['isshow'] == 1){
+                        $ktsection->ishow = 1;
+                    }else{
+                        $ktsection->ishow = 0;
+                    }
+                    $ktsection->seid = $section['seid'];
+                    $ktsection->update();
+                }
+
+                require_once (Doo::conf()->SITE_PATH . '/protected/class/video.php');
+                $video = new video ( );
+                $result = $video->videoEdit($wyvideo['wy_video_id'],$_POST['videoName'].'.'.$wyvideo['file_ext'],$wyvideo['type_video_id']);
+                if($result['code'] == 200){
+                    return '/m/classinfo/'.$_POST['classid'];
+                }else{
+                    return '/m/classinfo/'.$_POST['classid'];
+                }
+            }else{
+                return '/m/classinfo/'.$_POST['classid'];
+            }
+        }else{
+            return '/m/classinfo/'.$_POST['classid'];
+        }
+    }
+
+    //发布视频
+    public function showVideo(){
+        $videoid = $this->params['videoid'];
+        $classid = $this->params['classid'];
+        Doo::loadModel('ktvideo');
+        $ktvideo = new Ktvideo();
+        $section = $ktvideo->getsecbyid($videoid);
+        $num = $ktvideo->count(array('where' => 'seid='.$section['seid'],'asArray'));
+        if($num == 1){
+            Doo::loadModel('ktsection');
+            $ktsection = new Ktsection();
+            $ktsection->ishow = 1;
+            $ktsection->seid = $section['seid'];
+            $ktsection->update();
+        }
+
+        $ktvideo->videoid = $videoid;
+        $ktvideo->isshow = 1;
+        $ktvideo->update();
+        return '/m/classinfo/'.$classid;
+    }
+
+    //判断视频是否可以发布
+    public function isShowVideo(){
+        require_once (Doo::conf()->SITE_PATH . '/protected/class/video.php');
+        $video = new video ( );
+        $result = $video->videoGet($_GET['video']);
+        if($result['code'] == 200) {
+            if(empty($result['ret']['shdMp4Url'])){
+                echo '0';
+                exit;
+            }else{
+                echo '1';
+                exit;
+            }
+        }else{
+            echo '0';
+            exit;
+        }
+    }
+
+    //删除视频
+    public function delVideo(){
+        $videoid = $this->params['videoid'];
+        $classid = $this->params['classid'];
+        Doo::loadModel('ktvideo');
+        $ktvideo = new Ktvideo();
+        $result = $ktvideo->getvideobyid($videoid);
+        if(!empty($result)) {
+            require_once(Doo::conf()->SITE_PATH . '/protected/class/video.php');
+            $video = new video ( );
+            $delvideo = $video->videoDetele($result['wy_video_id']);
+            $ktvideo->videoid = $videoid;
+            $ktvideo->delete();
+        }
+        return '/m/classinfo/'.$classid;
+    }
+
+    //播放转码后视频
+    public function playVideo(){
+        require_once (Doo::conf()->SITE_PATH . '/protected/class/video.php');
+        $video = new video ( );
+        if(isset($_GET['video'])){
+            $result = $video->videoGet($_GET['video']);
+            if($result['code'] == 200){
+                $play_url = !empty($result['ret']['shdMp4Url']) ? $result['ret']['shdMp4Url'] : '';
+                $play_type = substr(strrchr($play_url, '.'), 1);
+                if ($play_type == 'mp4'){
+                    $type = 'video/mp4';
+                }else {
+                    echo json_encode(array( 'code' => 400));
+                    exit;
+                }
+                echo json_encode(array( 'code' => 200, 'url' => $play_url, 'type' => $type));
+                exit;
+            }
+            echo json_encode(array( 'code' => 400));
+            exit;
+        }
+        echo json_encode(array( 'code' => 400));
+        exit;
+    }
+
+    //获取个人的学习进度
+    private function getPersonProgress($class,$classuser){
+        $totalss = $class['classnum']*$class['classtime']*60;       //课程总秒数
+        $userss = $classuser['seetime'];                            //已完成的秒数
+
+        $nodonehh = sprintf('%.2f',($totalss-$userss)/3600);        //未完成的小时数
+        $donehh = sprintf('%.2f',$classuser['seetime']/3600);       //已完成的小时数
+        $doneclassnum = intval($userss/($class['classtime']*60));   //已完成的课时数,取整
+        if($doneclassnum<10 && $doneclassnum != 0){
+            $doneclassnum = '0'.$doneclassnum;
+        }
+        $progress = sprintf('%.2f',$userss/$totalss) *100;          //已完成占总课程的百分比showVideo
+        $noprogress = 100-$progress;                                //未完成占总课程的百分比
+        return array('progress' => $progress, 'noprogress' => $noprogress, 'donehh' => $donehh, 'doneclassnum' => $doneclassnum, 'nodonehh' => $nodonehh);
+    }
+
+    //获取课程的平均进度
+    private function getClassProgress($classid,$totalnum,$bnum){
+        if($bnum != 0){
+            Doo::loadModel('classuser');
+            $classuser = new Classuser();
+            $classtrack = $classuser->gettimebyClassid($classid);
+            $doness = 0;
+            foreach($classtrack as $k => $v){
+                $doness += $v['seetime'];  //已完成的总秒数
+            }
+            $donehh = sprintf('%.2f',sprintf('%.2f',$doness/3600)/$bnum);         //已完成的平均小时数
+            $nodonehh = $totalnum-$donehh;                                        //未完成的小时数
+            $progress = sprintf('%.2f',$donehh/$totalnum) *100;                   //已完成占总课程的百分比
+            $noprogress = 100-$progress;                                          //未完成占总课程的百分比
+        }else{
+            $progress = 0;
+            $noprogress = 100;
+            $donehh = 0;
+            $nodonehh = $totalnum;
+        }
+        return array('progress' => $progress, 'noprogress' => $noprogress, 'donehh' => $donehh, 'nodonehh' => $nodonehh);
+    }
+
+}

+ 240 - 0
protected/controller/BaseController.php

@@ -0,0 +1,240 @@
+<?php
+/**
+ * 核心控制
+ * @author cp
+ */
+
+class BaseController extends DooController {
+
+	public $data;
+	public $userinfo;
+
+	function __construct() {
+		$this->data['rootUrl'] = Doo::conf()->APP_URL;
+	}
+
+	public function clogin() {
+		$this->data['message'] = '';
+		$this->render('common-login', $this->data);
+	}
+
+	public function alogin() {
+		$this->render('admin-login', $this->data);
+	}
+
+	/**
+	 * 进入后台
+	 */
+	function do_login() {
+
+		$data ['name'] = $_POST['name'];
+
+		$data ['password'] = $_POST['password'];
+
+
+		Doo::loadModel('adminuser');
+		$users = new Adminuser();
+
+		$user = $users->getRowByUsername($data);
+
+
+		if (!empty ( $user )) {
+
+			$userinfo = $this->authcode ( $user ['username'], "tr" );
+
+			setcookie ( "auth_main", $userinfo, time () + 3600 * 12, "/", COOKIE_WEB_SITE );
+
+			return '/m/userlist';
+//			header ( 'Content-Type:text/html;charset=utf-8' );
+//			@header ( "Location: " . COOKIE_WEB_SITE . "/m/userlist" );
+		}else{
+			return '/m/login';
+//			header ( 'Content-Type:text/html;charset=utf-8' );
+//			@header ( "Location: " . COOKIE_WEB_SITE . "/m/login" );
+		}
+	}
+	
+	/**
+	 * 后台登录
+	 */
+	function admin_init(){
+	//是否已经登录纵横
+		$rs=array();
+
+		if (isset ( $_COOKIE ['auth_main'] )) {
+
+			$userinfo=$this->authcode ($_COOKIE ['auth_main']);
+
+			Doo::loadModel('adminuser');
+        	$users = new Adminuser();
+
+			$this->userinfo=$users->getRowByuser($userinfo);
+
+		}else{
+			setcookie ( "auth_main", "", time () + 3600 * 12, "/", COOKIE_WEB_SITE );
+			//无权限进入后台
+			header ( 'Content-Type:text/html;charset=utf-8' );
+			@header ( "Location: /m/login");
+		}
+
+		if (!empty ( $this->userinfo )) {
+			//跳转前台登录
+			$userinfo = $this->authcode ( $this->userinfo['username'], "tr" );
+			//header ( 'Content-Type:text/html;charset=utf-8' );
+			//@header ( "Location: /"  );
+			setcookie ( "auth_main", $userinfo, time () + 3600 * 12, "/", COOKIE_WEB_SITE );
+
+		} else {
+			setcookie ( "auth_main", "", time () + 3600 * 12, "/", COOKIE_WEB_SITE );
+			//无权限进入后台
+			header ( 'Content-Type:text/html;charset=utf-8' );
+			@header ( "Location: /m/login");
+		}
+	}
+
+	public function do_clogin() {
+
+		if(!isset($_POST['name']) || empty($_POST['name'])){
+			$this->data['message'] = '帐号不能为空';
+			$this->render('common-login',$this->data);die;
+		}
+
+		if(!isset($_POST['password']) || empty($_POST['password'])){
+			$this->data['message'] = '密码不能为空';
+			$this->render('common-login',$this->data);die;
+		}
+
+		$data ['name'] = $_POST['name'];
+
+		$data ['password'] = $_POST['password'];
+
+
+		Doo::loadModel('commonuser');
+		$users = new Commonuser();
+
+		$user = $users->getRowByUsername($data);
+
+		if (!empty ( $user )) {
+
+			$userinfo = $this->authcode ( $user ['username'], "tr" );
+
+			setcookie ( "common_main", $userinfo, time () + 3600 * 12, "/", COOKIE_WEB_SITE );
+
+			header ( 'Content-Type:text/html;charset=utf-8' );
+			@header ( "Location: /common/classlist");
+//			return '/common/classlist';
+		}else{
+			$this->data['message'] = '账号或密码错误!';
+			$this->render('common-login',$this->data);die;
+		}
+
+	}
+
+
+	/**
+	 * 查询登录
+	 */
+	function common_init(){
+		if (isset ( $_COOKIE ['common_main'] )) {
+
+			$userinfo=$this->authcode ($_COOKIE ['common_main']);
+
+			Doo::loadModel('commonuser');
+			$users = new Commonuser();
+
+			$this->userinfo=$users->getRowByUser($userinfo);
+
+		}else{
+			setcookie ( "common_main", "", time () + 3600 * 12, "/", COOKIE_WEB_SITE );
+			//无权限进入后台
+			header ( 'Content-Type:text/html;charset=utf-8' );
+			@header ( "Location: /common/login");
+		}
+
+		if (!empty ( $this->userinfo )) {
+			//跳转前台登录
+			$userinfo = $this->authcode ( $this->userinfo['username'], "tr" );
+			//header ( 'Content-Type:text/html;charset=utf-8' );
+			//@header ( "Location: /"  );
+			setcookie ( "common_main", $userinfo, time () + 3600 * 12, "/", COOKIE_WEB_SITE );
+			return $this->userinfo['username'];
+		} else {
+			setcookie ( "common_main", "", time () + 3600 * 12, "/", COOKIE_WEB_SITE );
+			//无权限进入后台
+			header ( 'Content-Type:text/html;charset=utf-8' );
+			@header ( "Location: /common/login");
+		}
+	}
+
+	function authcode($string, $operation = 'DECODE', $key = '', $expiry = 0) {
+		$ckey_length = 4;
+		if (! $key) {
+			$key = "ZHKT";
+		}
+		$key = md5 ( $key );
+		$keya = md5 ( substr ( $key, 0, 16 ) );
+		$keyb = md5 ( substr ( $key, 16, 16 ) );
+		$keyc = $ckey_length ? ($operation == 'DECODE' ? substr ( $string, 0, $ckey_length ) : substr ( md5 ( microtime () ), - $ckey_length )) : '';
+
+		$cryptkey = $keya . md5 ( $keya . $keyc );
+		$key_length = strlen ( $cryptkey );
+
+		$string = $operation == 'DECODE' ? base64_decode ( substr ( $string, $ckey_length ) ) : sprintf ( '%010d', $expiry ? $expiry + time () : 0 ) . substr ( md5 ( $string . $keyb ), 0, 16 ) . $string;
+		$string_length = strlen ( $string );
+
+		$result = '';
+		$box = range ( 0, 255 );
+
+		$rndkey = array ();
+		for($i = 0; $i <= 255; $i ++) {
+			$rndkey [$i] = ord ( $cryptkey [$i % $key_length] );
+		}
+
+		for($j = $i = 0; $i < 256; $i ++) {
+			$j = ($j + $box [$i] + $rndkey [$i]) % 256;
+			$tmp = $box [$i];
+			$box [$i] = $box [$j];
+			$box [$j] = $tmp;
+		}
+
+		for($a = $j = $i = 0; $i < $string_length; $i ++) {
+			$a = ($a + 1) % 256;
+			$j = ($j + $box [$a]) % 256;
+			$tmp = $box [$a];
+			$box [$a] = $box [$j];
+			$box [$j] = $tmp;
+			$result .= chr ( ord ( $string [$i] ) ^ ($box [($box [$a] + $box [$j]) % 256]) );
+		}
+
+		if ($operation == 'DECODE') {
+			if ((substr ( $result, 0, 10 ) == 0 || substr ( $result, 0, 10 ) - time () > 0) && substr ( $result, 10, 16 ) == substr ( md5 ( substr ( $result, 26 ) . $keyb ), 0, 16 )) {
+				return substr ( $result, 26 );
+			} else {
+				return '';
+			}
+		} else {
+			return $keyc . str_replace ( '=', '', base64_encode ( $result ) );
+		}
+	}
+
+	// 检测手机格式
+	function checkMobile($mobile) {
+		if(preg_match("/^1[34578]{1}\d{9}$/",$mobile)){
+			return TRUE;
+		} else {
+			return FALSE;
+		}
+	}
+
+	function checkMail($mail) {
+		//if (preg_match("/^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9\-\.])+/", $mail))
+		if (filter_var($mail, FILTER_VALIDATE_EMAIL))
+			return true;
+		else
+			return false;
+	}
+	
+	
+
+}
+?>

+ 181 - 0
protected/controller/CommonController.php

@@ -0,0 +1,181 @@
+<?php
+
+/**
+ * Created by PhpStorm.
+ * User: Ellisran
+ * Date: 2016/10/11
+ * Time: 10:18
+ */
+class CommonController extends DooController {
+
+    public $data;
+//    public $appKey = '';
+//    public $AppSecret = '';
+
+    function __construct() {
+        $this->data['rootUrl'] = Doo::conf()->APP_URL;
+        include ('./protected/controller/BaseController.php');
+        $this->base = new BaseController ();
+        $username = $this->base->common_init();
+        $this->data['username'] = $username;
+//        require_once (Doo::conf()->SITE_PATH . '/protected/class/video.php');
+//        $video = new video (  );
+    }
+
+    public function common_exit() {
+
+        setcookie ( "common_main", "", time () + 3600 * 24, "/", COOKIE_WEB_SITE );
+        $this->data['message'] = '';
+        $this->render ( "common-login", $this->data, TRUE);
+    }
+
+    public function classlist() {
+        Doo::loadModel('ktclass');
+        Doo::loadModel('classuser');
+        Doo::loadHelper('DooPager');
+        $ktclass = new Ktclass();
+        $class_user = new Classuser();
+        $totalArchive = $ktclass->count(array('where' => 'ishow=1'));
+        $pager = new DooPager(Doo::conf()->APP_URL . "common/classlist/page", $totalArchive, 8, 10);
+        if (isset($this->params['pindex']))
+            $pager->paginate(intval($this->params['pindex']));
+        else
+            $pager->paginate(1);
+        if ($pager->limit != ' -8,8')
+            $this->data['classlist'] = $ktclass->getclasslistbyshow($pager->limit);
+        foreach($this->data['classlist'] as $k => $v){
+            $bum = $class_user->getNumbyClassid($v['classid']);
+            $this->data['classlist'][$k]['bnum'] = $bum;
+            $this->data['classlist'][$k]['totalnum'] = sprintf("%.2f",$v['classnum']*($v['classtime']/60));
+            $this->data['classlist'][$k]['class_progress'] = $this->getClassProgress($v['classid'],$this->data['classlist'][$k]['totalnum'],$bum);
+        }
+        $this->data['pager'] = $pager->output;
+        $this->render('common-classlist',$this->data);
+    }
+
+
+
+    public function classinfo() {
+        if(isset($this->params['classid'])){
+            Doo::loadModel('classuser');
+            Doo::loadModel('ktclass');
+            $classuser = new Classuser();
+            $ktclass = new Ktclass();
+            $class = $ktclass->getRowishowbyId($this->params['classid']);
+            $this->data['classname'] = $class['classname'];
+            $this->data['classid'] = $class['classid'];
+            $this->data['totalnum'] = sprintf("%.2f",$class['classnum']*($class['classtime']/60));
+            $totalArchive = $classuser->count(array('where' => 'classid='.$this->params['classid']));
+            if(isset($this->params['status']) && $this->params['status'] == 1){
+                $pager = new DooPager(Doo::conf()->APP_URL . "common/classinfo/".$this->params['classid']."/status/1/page", $totalArchive, 8, 10);
+            }else{
+                $pager = new DooPager(Doo::conf()->APP_URL . "common/classinfo/".$this->params['classid']."/page", $totalArchive, 8, 10);
+            }
+            if (isset($this->params['pindex']))
+                $pager->paginate(intval($this->params['pindex']));
+            else
+                $pager->paginate(1);
+            if ($pager->limit != ' -8,8'){
+                if(isset($this->params['status']) && $this->params['status'] == 1){
+                    $this->data['status'] = 1;
+                    $this->data['userlist'] = $classuser->getuserlist($this->params['classid'], $pager->limit,1);
+                }else{
+                    $this->data['userlist'] = $classuser->getuserlist($this->params['classid'], $pager->limit,0);
+                }
+            }
+            if(isset($this->data['userlist']) && !empty($this->data['userlist'])){
+                Doo::loadModel('user');
+                $users = new User();
+                foreach($this->data['userlist'] as $k => $v){
+                    $user = $users->getNamebyId($v['userid']);
+                    $this->data['userlist'][$k]['username'] = $user['username'];
+                    $this->data['userlist'][$k]['realname'] = $user['realname'];
+                    $idcard = strlen($user['idcard'])==15?substr_replace($user['idcard'],"******",2,6):(strlen($user['idcard'])==18?substr_replace($user['idcard'],"*********",3,9):"身份证位数不正常!");
+                    $this->data['userlist'][$k]['idcard'] = $idcard;
+                    $hadbuy = $classuser->gethasbyuserandclass($v['userid'],$this->params['classid']);
+                    $this->data['userlist'][$k]['user_progress'] = $this->getPersonProgress($class,$hadbuy);
+                }
+            }
+            $this->data['pager'] = $pager->output;
+            $this->render('common-classinfo', $this->data, TRUE);
+        }else{
+            return '/common';
+        }
+    }
+
+    public function userSearch(){
+        if(isset($_POST['search']) && !empty($_POST['search'])){
+            Doo::loadModel('user');
+            $user = new User();
+            if(is_numeric(trim($_POST['search'])) && strlen(trim($_POST['search'])) == 6){
+                $result = $user->getUserMsgbyidcard(trim($_POST['search']));
+            }else{
+                $result = $user->getUserMsgbySearch(trim($_POST['search']));
+            }
+            if(!empty($result)) {
+                Doo::loadModel('classuser');
+                $class_user = new Classuser();
+                $classlist = $class_user->gethasbyuserandclass($result['userid'],$_POST['classid']);
+                if(!empty($classlist)){
+                    Doo::loadModel('ktclass');
+                    $ktclass = new Ktclass();
+                    $classinfo = $ktclass->getRowishowbyId($_POST['classid']);
+                    $this->data['userinfo'] = array(
+                        'realname' => $result['realname'],
+                        'username' => $result['username'],
+                        'mobile' => $result['mobile'],
+                        'useremail' => $result['useremail'],
+                        'idcard' => $result['idcard'],
+                    );
+                    $this->data['user_progress'] = $this->getPersonProgress($classinfo,$classlist);
+                    $this->data['classinfo'] =  $classinfo;
+                    $this->data['totalnum'] = sprintf("%.2f",$classinfo['classnum']*($classinfo['classtime']/60));
+                    $usernum = $class_user->getNumbyClassid($_POST['classid']);
+                    $this->data['usernum'] = $usernum;
+                    $this->render('common-usersearch', $this->data, TRUE);die;
+                }
+            }
+        }
+        return '/common/classinfo/'.$_POST['classid'];
+    }
+
+    //获取个人的学习进度
+    private function getPersonProgress($class,$classuser){
+        $totalss = $class['classnum']*$class['classtime']*60;       //课程总秒数
+        $userss = $classuser['seetime'];                            //已完成的秒数
+
+        $nodonehh = sprintf('%.2f',($totalss-$userss)/3600);        //未完成的小时数
+        $donehh = sprintf('%.2f',$classuser['seetime']/3600);       //已完成的小时数
+        $doneclassnum = intval($userss/($class['classtime']*60));   //已完成的课时数,取整
+        if($doneclassnum<10 && $doneclassnum != 0){
+            $doneclassnum = '0'.$doneclassnum;
+        }
+        $progress = sprintf('%.2f',$userss/$totalss) *100;          //已完成占总课程的百分比
+        $noprogress = 100-$progress;                                //未完成占总课程的百分比
+        return array('progress' => $progress, 'noprogress' => $noprogress, 'donehh' => $donehh, 'doneclassnum' => $doneclassnum, 'nodonehh' => $nodonehh);
+    }
+
+    //获取课程的平均进度
+    private function getClassProgress($classid,$totalnum,$bnum){
+        if($bnum != 0){
+            Doo::loadModel('classuser');
+            $classuser = new Classuser();
+            $classtrack = $classuser->gettimebyClassid($classid);
+            $doness = 0;
+            foreach($classtrack as $k => $v){
+                $doness += $v['seetime'];  //已完成的总秒数
+            }
+            $donehh = sprintf('%.2f',sprintf('%.2f',$doness/3600)/$bnum);         //已完成的平均小时数
+            $nodonehh = $totalnum-$donehh;                                        //未完成的小时数
+            $progress = sprintf('%.2f',$donehh/$totalnum) *100;                   //已完成占总课程的百分比
+            $noprogress = 100-$progress;                                          //未完成占总课程的百分比
+        }else{
+            $progress = 0;
+            $noprogress = 100;
+            $donehh = 0;
+            $nodonehh = $totalnum;
+        }
+        return array('progress' => $progress, 'noprogress' => $noprogress, 'donehh' => $donehh, 'nodonehh' => $nodonehh);
+    }
+
+}

+ 0 - 0
protected/controller/MainController.php


Einige Dateien werden nicht angezeigt, da zu viele Dateien in diesem Diff geändert wurden.